fix(okr): B1 KB/doc-hygiene + referanse-integritetstest (1.7.1-lane)

- Ny tests/reference-integrity.test.mjs: alle ${CLAUDE_PLUGIN_ROOT}-stier i
  commands/agents må finnes på disk OG være shippbare (aldri under gitignored
  .claude/). Fanger død-referanse-klassen permanent (TDD: rød på
  freshen-references før fiks). Suite 135 -> 138.
- Døde referanser lukket: freshen-references peker nå på metrics-library
  «Review-kadens»; metrics-library-provenanslinje uten død relativ sti.
- Kryssref-isolasjon: «Ressurser/Interne referanser»-seksjon i de 5 isolerte
  KB-filene (examples, oboard-guide, meeting-guides, calculator, cfr).
- «Sist oppdatert»-markør på alle 17 referansefiler (var 4).
- 19 -> 20 antipatterns (SKILL, kvalitet x2, help — help-forekomst funnet i
  sweep utover review-lista); «15. oktober» -> tidlig oktober (arshjul x2,
  framework); garblet prognoseformel rettet mot calculator-kanon (framework).
- Typonits: schuld/Næste (meeting-guides), resultatmål (dfo-mapping),
  sandbagging (trendanalytiker), Q1-2026 -> T1-2026 (fremdriftssporer).
- README: hooks-badge 4 -> 3, død Stop-rad fjernet.
- BACKLOG.md foldet inn i docs/roadmap.md (tema-nivå, ingen interne
  plandetaljer) og slettet; .gitignore ROADMAP.md ankret til rot (/ROADMAP.md)
  så docs/roadmap.md kan trackes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-07-17 03:43:22 +02:00
commit 6028ac2f90
25 changed files with 214 additions and 53 deletions

2
.gitignore vendored
View file

@ -30,7 +30,7 @@ node_modules/
# --- session/local state (gitignored per ~/.claude polyrepo-konvensjon) ---
STATE.md
REMEMBER.md
ROADMAP.md
/ROADMAP.md
TODO.md
NEXT-SESSION-PROMPT*.local.md
*.local.md

View file

@ -1,29 +0,0 @@
# OKR Plugin Backlog
Forbedringsoppgaver for fremtidige versjoner.
## v1.1 - Planlagt
### OKR-1: Forbedre /okr:oppsett wizard
**Beskrivelse:** Steg-for-steg wizard med fremdriftsindikator, input-validering, og "Quick start" vs "Full setup".
**Akseptansekriterier:**
- Ny bruker kan sette opp plugin uten dokumentasjon
- Alle obligatoriske felt valideres
- "Quick start" hopper over valgfrie steg
### OKR-4: SubagentStop quality gate
**Beskrivelse:** Hook på SubagentStop som blokkerer kvalitetssjekker-agent hvis OKR ikke møter minimumskvalitet.
**Akseptansekriterier:**
- Exit 2 hvis score < 3/10 på noe element
- Feilmelding forklarer hva som må forbedres
- Kan deaktiveres via konfig
## Fremtidige ideer (ikke prioritert)
- **OKR-3:** Flere konkrete norske offentlig sektor-eksempler
- **OKR-6:** Integration med flere verktøy (Notion, Confluence)
- **OKR-7:** Notification hook for OKR-deadline påminnelser

View file

@ -10,7 +10,7 @@
![Platform](https://img.shields.io/badge/platform-Claude_Code_Plugin-purple)
![Agents](https://img.shields.io/badge/agents-7-orange)
![Commands](https://img.shields.io/badge/commands-14-blue)
![Hooks](https://img.shields.io/badge/hooks-4-green)
![Hooks](https://img.shields.io/badge/hooks-3-green)
![References](https://img.shields.io/badge/references-17-yellow)
![License](https://img.shields.io/badge/license-MIT-lightgrey)
@ -258,7 +258,6 @@ The plugin understands this hierarchy and helps you maintain alignment at every
| SessionStart | Proactive coaching — tells you where you are in the cycle and what to focus on |
| UserPromptSubmit | Injects your organization profile and available context files into every interaction |
| PreCompact | Preserves OKR draft state if the conversation gets long |
| Stop | Reminds you to save work to your tracking system |
### Skills

View file

@ -81,7 +81,7 @@ Score = (Nåværende - Baseline) / (Target - Baseline)
## OKR Statusrapport
**Dato:** [dato]
**Syklus:** Q1-2026 (Uke X av 16)
**Syklus:** T1-2026 (Uke X av 16)
**Team:** [teamnavn]
---

View file

@ -72,7 +72,7 @@ Ekstraher strukturert data:
Les antipattern-kategorier fra referanser:
- **Formuleringsfeil**: Aktivitetsfokus i KR, binære KR, vage Objectives
- **Prosessfeil**: Set-and-forget, retrospektiv-mangel, sandbægging
- **Prosessfeil**: Set-and-forget, retrospektiv-mangel, sandbagging
- **Ambisjonsbalanse**: For mange Objectives, for ambisiøst, for forsiktig
- **Organisatoriske feil**: Silo-OKR, OKR-shaming, manglende sponsor
- **Offentlig sektor-spesifikke**: Tildelingsbrev-drift, politisk overreaksjon

View file

@ -153,10 +153,11 @@ har blitt utdaterte. Poll disse navngitte kildene:
trådt i kraft og erstattet 1967-loven KB-en refererer.
- **eFormidling** — sjekk om status fortsatt er «bør» (ikke påbudt) for statlige virksomheter.
Kildegrunnlaget for de volatile markørene er dokumentert i
`${CLAUDE_PLUGIN_ROOT}/.claude/projects/2026-06-24-fase3-referansegrad-loft/research/01-norsk-offentlig-metrikker.md`
(lokal research). Rapporter hvilke `Sist oppdatert`-markører som bør bumpes, og
hvilke faktapåstander som må re-verifiseres.
Kildegrunnlaget for de volatile markørene er oppsummert i
`${CLAUDE_PLUGIN_ROOT}/skills/okr-offentlig-sektor/references/metrics-library.md`
(seksjonen «Review-kadens»; full provenans i lokalt research-arkiv, ikke
distribuert med pluginen). Rapporter hvilke `Sist oppdatert`-markører som bør
bumpes, og hvilke faktapåstander som må re-verifiseres.
## Referanser

View file

@ -16,7 +16,7 @@ kommandoene for det temaet. Ellers vis full oversikt.
| Kommando | Hva den gjør |
|----------|--------------|
| `/okr:skriv` | Skriv ny OKR med veiledet Objective- og KR-utforming |
| `/okr:kvalitet` | Kvalitetssjekk OKR mot ankret rubrikk og 19 antipatterns |
| `/okr:kvalitet` | Kvalitetssjekk OKR mot ankret rubrikk og 20 antipatterns |
| `/okr:kaskade` | Kaskader OKR fra org til team, visualiser alignment |
| `/okr:sporing` | Spor fremdrift, beregn score (0.01.0), generer check-ins |
| `/okr:møter` | Planlegg OKR-workshops, check-ins, reviews og 1:1 (CFR) |

View file

@ -31,7 +31,7 @@ OKR-kontekst injiseres automatisk via hook. Sjekk system-konteksten FØR du spø
- Identifiser styrker og svakheter
3. **Sjekk for antipatterns** — se etter de vanligste feilene
- Les `${CLAUDE_PLUGIN_ROOT}/skills/okr-offentlig-sektor/references/okr-antipatterns.md` for alle 19 antipatterns
- Les `${CLAUDE_PLUGIN_ROOT}/skills/okr-offentlig-sektor/references/okr-antipatterns.md` for alle 20 antipatterns
- Kategoriser: formulering, prosess, kultur, struktur, ledelse
4. **Tilby forbedringer** — for OKR som scorer lavt:
@ -115,5 +115,5 @@ OKR-kontekst injiseres automatisk via hook. Sjekk system-konteksten FØR du spø
## Referanser
- `${CLAUDE_PLUGIN_ROOT}/skills/okr-offentlig-sektor/references/okr-quality-rubrics.md` — ankret scoringsrubrikk (5 ankere per dimensjon); kanonisk kilde for scoringen over
- `${CLAUDE_PLUGIN_ROOT}/skills/okr-offentlig-sektor/references/okr-antipatterns.md` — alle 19 antipatterns
- `${CLAUDE_PLUGIN_ROOT}/skills/okr-offentlig-sektor/references/okr-antipatterns.md` — alle 20 antipatterns
- `${CLAUDE_PLUGIN_ROOT}/skills/okr-offentlig-sektor/references/okr-examples.md` — gode vs dårlige eksempler

45
docs/roadmap.md Normal file
View file

@ -0,0 +1,45 @@
# Roadmap
Retning og backlog for OKR Offentlig Sektor-pluginen. Versjonshistorikk: se
`CHANGELOG.md` (README bærer et sammendrag). Detaljert fase-/sesjonsplanlegging
skjer i lokalt planverk og speiles ikke hit.
## Planlagte spor (tema-nivå)
- **1.7.x (patch-lane):** dokumentasjons- og kodehygiene — KB-kryssreferanser,
referanse-integritetstest, småfikser i ingestion-bibliotekene og hooks.
- **1.8.0 «Én kanon»:** konsolidering av metodedoktrine — én kadens, én
confidence-tabell, ett scorebånd, harmoniserte antipattern-kategorier;
kommandoene moderniseres til post-1.6.0 retrieval.
- **1.9.0 «Styringssløyfa lukkes»:** gevinstrealisering-bro (DFØ-vokabular),
kommunal styringslinje, rapportering ut-siden (tertial-/årsrapport-underlag),
GDPR-posisjon og deterministisk rydde-kommando for ingested innhold.
- **2.0.0:** beriket ingestion (`--enrich`) og validering i reell tertialsyklus.
## Backlog (fra tidligere BACKLOG.md)
### OKR-1: Forbedre /okr:oppsett wizard
**Beskrivelse:** Steg-for-steg wizard med fremdriftsindikator, input-validering, og "Quick start" vs "Full setup".
**Akseptansekriterier:**
- Ny bruker kan sette opp plugin uten dokumentasjon
- Alle obligatoriske felt valideres
- "Quick start" hopper over valgfrie steg
### OKR-4: SubagentStop quality gate
**Beskrivelse:** Hook på SubagentStop som blokkerer kvalitetssjekker-agent hvis OKR ikke møter minimumskvalitet.
**Akseptansekriterier:**
- Exit 2 hvis score < 3/10 på noe element
- Feilmelding forklarer hva som må forbedres
- Kan deaktiveres via konfig
### Fremtidige ideer (ikke prioritert)
- **OKR-3:** Flere konkrete norske offentlig sektor-eksempler
- **OKR-6:** Integration med flere verktøy (Notion, Confluence)
- **OKR-7:** Notification hook for OKR-deadline påminnelser
*Sist oppdatert: Juli 2026*

View file

@ -131,7 +131,7 @@ All reference material is in `references/`:
- `okr-framework.md` — Core methodology, scoring, cycle management
- `okr-quality-rubrics.md` — Anchored quality rubric (5 anchors per dimension) for `/okr:kvalitet`
- `okr-examples.md` — Good and bad examples from public sector
- `okr-antipatterns.md`19 common OKR mistakes
- `okr-antipatterns.md`20 common OKR mistakes
- `okr-sources.md` — Bibliographic evidence base
### Operations

View file

@ -346,6 +346,11 @@ Bruk denne for å vurdere din CFR-praksis:
## Ressurser
### Interne referanser
- `meeting-guides.md` - Agendaer for 1:1 og check-in der CFR praktiseres
- `individual-vs-team-okr.md` - Hvorfor CFR (ikke individuelle OKR) dekker individnivået
- `okr-framework.md` - OKR-metodikken CFR komplementerer
### Bøker
- **Measure What Matters** av John Doerr, kap. 13-14 om CFR
- **Radical Candor** av Kim Scott for feedback-teknikker
@ -362,3 +367,5 @@ Bruk denne for å vurdere din CFR-praksis:
- **SBI-modellen** (Situation-Behavior-Impact) for strukturert feedback
- **70/30-regelen** for lyttende samtaler
- **Skalaspørsmål** for å unngå defensivitet i OKR-samtaler
*Sist oppdatert: Juli 2026*

View file

@ -7,7 +7,7 @@ OKR-metodikken.
## Hvorfor denne broen trengs
Norsk offentlig sektor snakker "DFØ-språk" — resultmål, styringsparametere,
Norsk offentlig sektor snakker "DFØ-språk" — resultatmål, styringsparametere,
resultatindikatorer. OKR-verden snakker om Objectives, Key Results, stretch goals.
Denne terminologiske kløften skaper motstand og forvirring ved OKR-innføring.
@ -112,3 +112,5 @@ Den konseptuelle broen: DFØ beskriver selv MRS som å «konsentrere seg om *hva
- DFØ: [Etatsstyring](https://dfo.no/fagomrader/styring-i-staten/etatsstyring)
- `okr-offentlig-governance.md` — Tildelingsbrev-analyse og Riksrevisjon-compliance
- `okr-framework.md` — OKR-metodikk i detalj
*Sist oppdatert: Juli 2026*

View file

@ -50,3 +50,5 @@ Via bidragsvurdering til team-OKR, 360-feedback, KPIer for rollen, og kvalitativ
**"Ledelsen vil ha individuelle OKR"**
Del denne veiledningen og forskningen bak. Foreslå en hybrid hvor ledere har team-OKR, ikke personlige OKR.
*Sist oppdatert: Juni 2026*

View file

@ -79,7 +79,7 @@ For hvert Key Result:
### Fasilitatortips
- Hold det kort og fokusert (ikke gå i detaljer om utførelse)
- Feir fremgang: Hvis noe går bra, gi skryt
- Vær løsningsorientert: Ikke schuld, men "hva kan vi gjøre?"
- Vær løsningsorientert: Ikke skyld, men "hva kan vi gjøre?"
---
@ -212,7 +212,7 @@ For hvert tema:
**00:45 - 01:00 | Action items**
- Justeringer til OKR hvis nødvendig
- Kommunikasjonsplan mellom teams
- Næste alignment-sjekk dato
- Neste alignment-sjekk dato
---
@ -267,3 +267,15 @@ Lærdommer:
6. **Dokumentasjon**: Logg decisions og actions i Oboard/Confluence
7. **Hybridvennlig**: Sørg for at remote-deltakere ser og høres
8. **Celebration**: Feir wins, ikke bare fokuser på problemer
---
## Ressurser
### Interne referanser
- `okr-arshjul.md` - Når i tertialet de ulike møtene hører hjemme
- `okr-calculator.md` - Confidence- og score-vurderingene i check-in
- `cfr-framework.md` - Samtale- og feedback-teknikker for 1:1-er
- `okr-framework.md` - Metodikken møtene opererer innenfor
*Sist oppdatert: Juli 2026*

View file

@ -298,6 +298,6 @@ Disse ser imponerende ut, men Riksrevisjonen/tilsyn har dokumentert svak reell e
### Review-kadens
Alt regelverk i denne seksjonen er et **bevegelig mål 20252026** (ny forvaltningslov fases inn, EAA pending, eFormidling 4.0-migrasjon, årlige indeksrunder, ny DI-indeks). Biblioteket kan derfor ikke være statisk. Før hver deling/release: re-verifiser kilde + dato per metrikk. `/okr:freshen-references` bør prioritere de volatile primærkildene: Lovdata (forvaltningslov-status), uutilsynet (WCAG/EAA), Digdir (eFormidling/indeks). Full provenans og confidence-vurdering: `research/01-norsk-offentlig-metrikker.md` (trekresearch 2026-06-24, confidence 0,85).
Alt regelverk i denne seksjonen er et **bevegelig mål 20252026** (ny forvaltningslov fases inn, EAA pending, eFormidling 4.0-migrasjon, årlige indeksrunder, ny DI-indeks). Biblioteket kan derfor ikke være statisk. Før hver deling/release: re-verifiser kilde + dato per metrikk. `/okr:freshen-references` bør prioritere de volatile primærkildene: Lovdata (forvaltningslov-status), uutilsynet (WCAG/EAA), Digdir (eFormidling/indeks). Full provenans og confidence-vurdering: trekresearch 2026-06-24, confidence 0,85 (lokalt research-arkiv, ikke distribuert med pluginen).
*Sist oppdatert: Juni 2026*

View file

@ -549,3 +549,5 @@ Denne guiden dekker de vanligste feilmønstrene organisert i fem kategorier.
- `okr-framework.md` - Metodikk i detalj
- `okr-examples.md` - Gode og dårlige eksempler
- `meeting-guides.md` - Agendaer for OKR-møter
*Sist oppdatert: Juni 2026*

View file

@ -94,7 +94,7 @@
**September - Oktober**
- Syklus 3 gjennomføring
- **15. oktober**: Statsbudsjett fremlegges (viktig for neste år!)
- **Tidlig oktober**: Statsbudsjett fremlegges (viktig for neste år!)
- Forberedelse til årlig review
**November**
@ -117,7 +117,7 @@
┌─────────────────────────────────────────────────────────────────┐
│ BUDSJETTPROSESSEN │
├─────────────┬───────────────────────────────────────────────────┤
Oktober 15 │ Statsbudsjett fremlegges → Indikasjon på rammer │
Tidlig okt. │ Statsbudsjett fremlegges → Indikasjon på rammer │
│ November │ Stortingsbehandling → Avklaringer │
│ Desember │ Budsjett vedtas → Rammer bekreftet │
│ Januar │ Tildelingsbrev → Endelige mål og ressurser │
@ -186,3 +186,5 @@ Se også:
- `okr-framework.md` - Komplett metodikk
- `okr-cheatsheet.md` - Hurtigreferanse
- `meeting-guides.md` - Agendaer for møter
*Sist oppdatert: Juli 2026*

View file

@ -260,3 +260,14 @@ Oppsummering av alle OKR for et team:
3. **Fokuser på tiltak** - At Risk og Off Track krever konkrete handlinger
4. **Del synlig** - Bruk Oboard eller lignende for transparens
5. **Lær av avvik** - Gap mellom prognose og resultat gir verdifull innsikt
---
## Ressurser
### Interne referanser
- `okr-framework.md` - Scoring og prognosering i metodisk kontekst
- `meeting-guides.md` - Check-in-møtene der confidence vurderes
- `okr-quality-rubrics.md` - Kvalitetsvurdering av selve KR-formuleringen
*Sist oppdatert: Juli 2026*

View file

@ -116,3 +116,5 @@ Måned 4: REVIEW
---
**Mer hjelp?** Spør OKR-skillen eller se `references/` for dybdeguider.
*Sist oppdatert: Juni 2026*

View file

@ -227,3 +227,14 @@ Bruk denne når du skriver eller vurderer OKR:
- [ ] Kan vi verifisere suksess objektivt?
- [ ] Er det klart hvem som eier hvert KR?
- [ ] Ville dette imponere stakeholders hvis vi lykkes?
---
## Ressurser
### Interne referanser
- `okr-framework.md` - Metodikken eksemplene bygger på
- `okr-quality-rubrics.md` - Rubrikk for å vurdere egne utkast mot eksemplene
- `okr-antipatterns.md` - Fallgruvene de dårlige eksemplene illustrerer
*Sist oppdatert: Juli 2026*

View file

@ -182,7 +182,7 @@ OKR i offentlig sektor må koordineres med statens budsjettprosess for å være
| Dato | Hendelse | OKR-implikasjon |
|------|----------|-----------------|
| Oktober 15 | Statsbudsjett fremlegges | Indikasjon på ressursrammer |
| Tidlig oktober | Statsbudsjett fremlegges | Indikasjon på ressursrammer |
| November | Stortingsbehandling | Avklaringer underveis |
| Desember (tidlig) | Budsjett vedtas | Rammer bekreftet |
| Januar | Tildelingsbrev sendes | Endelige mål og rammer |
@ -414,16 +414,14 @@ Hvis confidence alltid starter og forblir på 90%+, setter dere sannsynligvis ik
Den enkleste metoden for å forutsi sluttresultat:
```
Prognose = Baseline + (Nåværende progresjon / Tid brukt) × Total tid
Prognose = Baseline + (Nåværende - Baseline) × (Total tid / Tid brukt)
Eksempel:
KR: Øke konvertering fra 10% til 20%
Tid: 2 av 4 måneder brukt (50%)
Nåværende: 14%
Progresjon: (14-10) / (20-10) = 0.4 (40%)
Rate = 40% progresjon / 50% tid = 0.8
Prognose ved syklusslutt: 10 + (0.8 × 100% × 10) = 18%
Prognose = 10 + (14 - 10) × (4 / 2) = 10 + 8 = 18%
```
#### Tidsjustert forventning
@ -580,3 +578,5 @@ Selv kvalitative mål bør ha en definert måte å verifisere suksess på.
4. **Transparency**: OKR er åpne
5. **Continuous Tracking**: Følg opp månedlig
6. **Learning over Punishment**: Scorer brukes til forbedring, ikke straff
*Sist oppdatert: Juli 2026*

View file

@ -507,3 +507,5 @@ Stretch-mål krever psykologisk trygghet. Ansatte må:
- [OKR Institute](https://okrinstitute.org/) - Forskning og best practices
- [What Matters](https://www.whatmatters.com/) - John Doerrs ressursside
- [Code for America OKR Case Study](https://www.whatmatters.com/articles/code-for-america-okrs-local-government) - Offentlig sektor-eksempel
*Sist oppdatert: Juni 2026*

View file

@ -593,3 +593,5 @@ Outcome-KR | Manuell med kilde
- `meeting-guides.md` Agendaer for OKR-møter (inkl. sprint planning med OKR)
- `okr-implementation.md` Innføringsguide
- `okr-offentlig-governance.md` Kobling til tildelingsbrev og politisk styring
*Sist oppdatert: Juni 2026*

View file

@ -128,3 +128,12 @@ Oboard kan integreres med:
---
**Tips**: Bruk Oboard mobile app for rask check-in underveis!
## Ressurser
### Interne referanser
- `okr-integrations.md` - Verktøylandskapet Oboard er en del av
- `okr-calculator.md` - Scoring og confidence som føres i verktøyet
- `meeting-guides.md` - Check-in-møtene der Oboard-data brukes
*Sist oppdatert: Juli 2026*

View file

@ -0,0 +1,81 @@
// reference-integrity.test.mjs
// B1 (1.7.1): referanse-integritet for alle ${CLAUDE_PLUGIN_ROOT}-stier i
// commands/ og agents/. Fanger doed-referanse-klassen permanent (review 4:
// freshen-references pekte paa gitignored .claude/-sti som aldri shippes).
// To invarianter per referert sti:
// 1. Stien maa finnes paa disk (relativt til plugin-rot).
// 2. Stien maa vaere shippbar: aldri under .claude/ (gitignored, finnes
// lokalt men ikke i installert plugin — ren existsSync er falsk groenn).
// Glob-stier (* i siste segment) sjekkes som: katalog finnes + minst ett treff.
// Zero npm deps. Moenster: tests/package-shape.test.mjs (les fil, assert).
import { test } from 'node:test';
import assert from 'node:assert/strict';
import { readFileSync, readdirSync, existsSync } from 'node:fs';
import { join, dirname } from 'node:path';
import { fileURLToPath } from 'node:url';
const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..');
const SCAN_DIRS = ['commands', 'agents'];
// Stopper paa whitespace, backtick, anfoerselstegn, ), ] — tegnene som
// avslutter en sti i markdown-prosa/lenker. Ingen legitime stier her
// inneholder dem.
const PATH_RE = /\$\{CLAUDE_PLUGIN_ROOT\}\/([^\s`"')\]]+)/g;
function collectReferences() {
const refs = [];
for (const dir of SCAN_DIRS) {
for (const name of readdirSync(join(ROOT, dir))) {
if (!name.endsWith('.md')) continue;
const file = join(dir, name);
const body = readFileSync(join(ROOT, file), 'utf8');
for (const m of body.matchAll(PATH_RE)) {
refs.push({ file, rel: m[1] });
}
}
}
return refs;
}
function assertResolvable(rel) {
const starName = rel.lastIndexOf('*');
if (starName === -1) {
assert.ok(existsSync(join(ROOT, rel)), `finnes ikke: ${rel}`);
return;
}
// Glob: kun *-i-siste-segment brukes i repoet (f.eks. references/*.md).
const dir = dirname(rel);
assert.ok(!dir.includes('*'), `glob i katalogsegment stoettes ikke: ${rel}`);
assert.ok(existsSync(join(ROOT, dir)), `glob-katalog finnes ikke: ${dir}`);
const suffix = rel.slice(starName + 1);
const hits = readdirSync(join(ROOT, dir)).filter((n) => n.endsWith(suffix));
assert.ok(hits.length > 0, `glob uten treff: ${rel}`);
}
test('commands/agents refererer minst en plugin-rot-sti (regex-sanity)', () => {
const refs = collectReferences();
assert.ok(refs.length >= 10, `fant bare ${refs.length} referanser — regex broken?`);
});
test('alle ${CLAUDE_PLUGIN_ROOT}-stier er shippbare (aldri under .claude/)', () => {
const offenders = collectReferences().filter(({ rel }) =>
rel === '.claude' || rel.startsWith('.claude/'));
assert.deepEqual(
offenders.map((o) => `${o.file} -> ${o.rel}`),
[],
'gitignored .claude/-stier shippes aldri med pluginen'
);
});
test('alle ${CLAUDE_PLUGIN_ROOT}-stier finnes paa disk', () => {
const missing = [];
for (const { file, rel } of collectReferences()) {
try {
assertResolvable(rel);
} catch (e) {
missing.push(`${file} -> ${rel} (${e.message})`);
}
}
assert.deepEqual(missing, [], 'doede referanser funnet');
});