@isaacriehm/cairn-core 0.21.0 → 0.22.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/align-undo/log.js +3 -2
- package/dist/align-undo/log.js.map +1 -1
- package/dist/attention/source-strip.js +2 -1
- package/dist/attention/source-strip.js.map +1 -1
- package/dist/components/emit.js +33 -6
- package/dist/components/emit.js.map +1 -1
- package/dist/components/freshness.d.ts +51 -0
- package/dist/components/freshness.js +121 -0
- package/dist/components/freshness.js.map +1 -0
- package/dist/components/index.d.ts +4 -0
- package/dist/components/index.js +2 -0
- package/dist/components/index.js.map +1 -1
- package/dist/components/reconfirm.d.ts +64 -0
- package/dist/components/reconfirm.js +204 -0
- package/dist/components/reconfirm.js.map +1 -0
- package/dist/context/handoff-builder.js +3 -3
- package/dist/context/handoff-builder.js.map +1 -1
- package/dist/context/task-summary.js +2 -2
- package/dist/context/task-summary.js.map +1 -1
- package/dist/doctor/index.js +7 -7
- package/dist/doctor/index.js.map +1 -1
- package/dist/events/paths.js +2 -2
- package/dist/events/paths.js.map +1 -1
- package/dist/fix-align/sentinel.js +2 -3
- package/dist/fix-align/sentinel.js.map +1 -1
- package/dist/gc/attested-commits.js +2 -2
- package/dist/gc/attested-commits.js.map +1 -1
- package/dist/gc/canary.js +2 -3
- package/dist/gc/canary.js.map +1 -1
- package/dist/gc/citation-integrity.d.ts +2 -3
- package/dist/gc/citation-integrity.js +2 -26
- package/dist/gc/citation-integrity.js.map +1 -1
- package/dist/gc/completion-integrity.js +4 -3
- package/dist/gc/completion-integrity.js.map +1 -1
- package/dist/gc/entity-orphan.js +60 -8
- package/dist/gc/entity-orphan.js.map +1 -1
- package/dist/gc/ghost-anchor.d.ts +57 -0
- package/dist/gc/ghost-anchor.js +171 -0
- package/dist/gc/ghost-anchor.js.map +1 -0
- package/dist/gc/index.d.ts +2 -0
- package/dist/gc/index.js +1 -0
- package/dist/gc/index.js.map +1 -1
- package/dist/gc/runtime-prune.d.ts +59 -0
- package/dist/gc/runtime-prune.js +232 -0
- package/dist/gc/runtime-prune.js.map +1 -0
- package/dist/gc/sweep.js +18 -0
- package/dist/gc/sweep.js.map +1 -1
- package/dist/gc/types.d.ts +1 -1
- package/dist/hooks/bypass-detection.js +3 -2
- package/dist/hooks/bypass-detection.js.map +1 -1
- package/dist/hooks/defer.js +3 -2
- package/dist/hooks/defer.js.map +1 -1
- package/dist/hooks/ghost-backup.d.ts +37 -0
- package/dist/hooks/ghost-backup.js +82 -0
- package/dist/hooks/ghost-backup.js.map +1 -0
- package/dist/hooks/post-tool-use/allowlist-reader.js +2 -2
- package/dist/hooks/post-tool-use/allowlist-reader.js.map +1 -1
- package/dist/hooks/post-tool-use/ask-user-blocked.js +2 -2
- package/dist/hooks/post-tool-use/ask-user-blocked.js.map +1 -1
- package/dist/hooks/post-tool-use/citation-scanner.d.ts +8 -6
- package/dist/hooks/post-tool-use/citation-scanner.js +9 -14
- package/dist/hooks/post-tool-use/citation-scanner.js.map +1 -1
- package/dist/hooks/post-tool-use/legend-builder.d.ts +2 -2
- package/dist/hooks/post-tool-use/legend-builder.js +1 -19
- package/dist/hooks/post-tool-use/legend-builder.js.map +1 -1
- package/dist/hooks/post-tool-use/post-write.js +18 -1
- package/dist/hooks/post-tool-use/post-write.js.map +1 -1
- package/dist/hooks/post-tool-use/read-enricher.d.ts +2 -2
- package/dist/hooks/post-tool-use/read-enricher.js +4 -6
- package/dist/hooks/post-tool-use/read-enricher.js.map +1 -1
- package/dist/hooks/post-tool-use/sot-align.js +29 -3
- package/dist/hooks/post-tool-use/sot-align.js.map +1 -1
- package/dist/hooks/post-tool-use/write-guardian.js +4 -4
- package/dist/hooks/post-tool-use/write-guardian.js.map +1 -1
- package/dist/hooks/runners/context-threshold.js +3 -3
- package/dist/hooks/runners/context-threshold.js.map +1 -1
- package/dist/hooks/runners/payload.js +2 -1
- package/dist/hooks/runners/payload.js.map +1 -1
- package/dist/hooks/runners/phase-ready-surface.js +3 -2
- package/dist/hooks/runners/phase-ready-surface.js.map +1 -1
- package/dist/hooks/runners/session-start.js +124 -5
- package/dist/hooks/runners/session-start.js.map +1 -1
- package/dist/hooks/runners/stop.js +26 -12
- package/dist/hooks/runners/stop.js.map +1 -1
- package/dist/hooks/runners/user-prompt-submit.d.ts +2 -2
- package/dist/hooks/runners/user-prompt-submit.js +4 -9
- package/dist/hooks/runners/user-prompt-submit.js.map +1 -1
- package/dist/hooks/seed-attested.js +3 -2
- package/dist/hooks/seed-attested.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/init/baseline-audit.js +3 -3
- package/dist/init/baseline-audit.js.map +1 -1
- package/dist/init/claude-rule.js +13 -1
- package/dist/init/claude-rule.js.map +1 -1
- package/dist/init/curator/corpus.d.ts +1 -0
- package/dist/init/curator/corpus.js +6 -2
- package/dist/init/curator/corpus.js.map +1 -1
- package/dist/init/curator/emit.js +2 -3
- package/dist/init/curator/emit.js.map +1 -1
- package/dist/init/detect-components.js +2 -2
- package/dist/init/detect-components.js.map +1 -1
- package/dist/init/eta-calibration.js +2 -2
- package/dist/init/eta-calibration.js.map +1 -1
- package/dist/init/index.d.ts +1 -1
- package/dist/init/index.js +1 -1
- package/dist/init/index.js.map +1 -1
- package/dist/init/init.d.ts +8 -0
- package/dist/init/init.js +16 -6
- package/dist/init/init.js.map +1 -1
- package/dist/init/mapper.js +2 -2
- package/dist/init/mapper.js.map +1 -1
- package/dist/init/multi-dev/install.js +24 -0
- package/dist/init/multi-dev/install.js.map +1 -1
- package/dist/init/phases/11-baseline.js +1 -1
- package/dist/init/phases/11-baseline.js.map +1 -1
- package/dist/init/phases/4-seed.js +7 -5
- package/dist/init/phases/4-seed.js.map +1 -1
- package/dist/init/phases/9a-walker.js +4 -0
- package/dist/init/phases/9a-walker.js.map +1 -1
- package/dist/init/phases/9b-curate.d.ts +1 -0
- package/dist/init/phases/9b-curate.js +6 -2
- package/dist/init/phases/9b-curate.js.map +1 -1
- package/dist/init/phases/9d-comp-walk.js +2 -2
- package/dist/init/phases/9d-comp-walk.js.map +1 -1
- package/dist/init/phases/9e-comp-annotate.js +63 -3
- package/dist/init/phases/9e-comp-annotate.js.map +1 -1
- package/dist/init/phases/index.d.ts +0 -1
- package/dist/init/phases/index.js +0 -1
- package/dist/init/phases/index.js.map +1 -1
- package/dist/init/phases/mapper-output-io.d.ts +1 -1
- package/dist/init/phases/mapper-output-io.js +3 -2
- package/dist/init/phases/mapper-output-io.js.map +1 -1
- package/dist/init/phases/state-io.d.ts +1 -1
- package/dist/init/phases/state-io.js +3 -2
- package/dist/init/phases/state-io.js.map +1 -1
- package/dist/init/phases/types.d.ts +20 -8
- package/dist/init/phases/types.js +0 -1
- package/dist/init/phases/types.js.map +1 -1
- package/dist/init/progress.d.ts +1 -0
- package/dist/init/progress.js +3 -1
- package/dist/init/progress.js.map +1 -1
- package/dist/init/rules-merge/ingest.js +3 -3
- package/dist/init/rules-merge/ingest.js.map +1 -1
- package/dist/init/seed.js +54 -5
- package/dist/init/seed.js.map +1 -1
- package/dist/init/source-comments/strip-replace.d.ts +0 -1
- package/dist/init/source-comments/strip-replace.js +17 -1
- package/dist/init/source-comments/strip-replace.js.map +1 -1
- package/dist/join/index.d.ts +9 -0
- package/dist/join/index.js +82 -25
- package/dist/join/index.js.map +1 -1
- package/dist/lock.js +4 -3
- package/dist/lock.js.map +1 -1
- package/dist/mcp/bootstrap-guard.js +10 -1
- package/dist/mcp/bootstrap-guard.js.map +1 -1
- package/dist/mcp/schemas.d.ts +26 -0
- package/dist/mcp/schemas.js +26 -0
- package/dist/mcp/schemas.js.map +1 -1
- package/dist/mcp/server.js +3 -3
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/telemetry.js +4 -3
- package/dist/mcp/telemetry.js.map +1 -1
- package/dist/mcp/tools/component-reconfirm.d.ts +7 -0
- package/dist/mcp/tools/component-reconfirm.js +39 -0
- package/dist/mcp/tools/component-reconfirm.js.map +1 -0
- package/dist/mcp/tools/component-register.d.ts +15 -0
- package/dist/mcp/tools/component-register.js +65 -0
- package/dist/mcp/tools/component-register.js.map +1 -0
- package/dist/mcp/tools/index.js +8 -0
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/init-phases.d.ts +2 -0
- package/dist/mcp/tools/init-phases.js +21 -5
- package/dist/mcp/tools/init-phases.js.map +1 -1
- package/dist/mcp/tools/migrate.d.ts +21 -0
- package/dist/mcp/tools/migrate.js +49 -0
- package/dist/mcp/tools/migrate.js.map +1 -0
- package/dist/mcp/tools/mission-advance.js +5 -5
- package/dist/mcp/tools/mission-advance.js.map +1 -1
- package/dist/mcp/tools/mission-resume.js +3 -3
- package/dist/mcp/tools/mission-resume.js.map +1 -1
- package/dist/mcp/tools/record-decision.js +11 -4
- package/dist/mcp/tools/record-decision.js.map +1 -1
- package/dist/mcp/tools/resolve-attention.js +20 -4
- package/dist/mcp/tools/resolve-attention.js.map +1 -1
- package/dist/mcp/tools/resume.js +3 -2
- package/dist/mcp/tools/resume.js.map +1 -1
- package/dist/mcp/tools/search.js +2 -2
- package/dist/mcp/tools/search.js.map +1 -1
- package/dist/mcp/tools/task-complete.js +2 -3
- package/dist/mcp/tools/task-complete.js.map +1 -1
- package/dist/mcp/tools/task-create.js +2 -2
- package/dist/mcp/tools/task-create.js.map +1 -1
- package/dist/migrate/config-io.d.ts +10 -2
- package/dist/migrate/config-io.js +21 -19
- package/dist/migrate/config-io.js.map +1 -1
- package/dist/migrate/gitignore.d.ts +28 -0
- package/dist/migrate/gitignore.js +82 -0
- package/dist/migrate/gitignore.js.map +1 -0
- package/dist/migrate/index.d.ts +1 -0
- package/dist/migrate/index.js +1 -0
- package/dist/migrate/index.js.map +1 -1
- package/dist/migrate/migrations/0001-drop-dead-config-fields.js +2 -2
- package/dist/migrate/migrations/0001-drop-dead-config-fields.js.map +1 -1
- package/dist/migrate/migrations/0002-backfill-gitignore.d.ts +14 -0
- package/dist/migrate/migrations/0002-backfill-gitignore.js +40 -0
- package/dist/migrate/migrations/0002-backfill-gitignore.js.map +1 -0
- package/dist/migrate/migrations/0003-prune-scaffolding.d.ts +19 -0
- package/dist/migrate/migrations/0003-prune-scaffolding.js +54 -0
- package/dist/migrate/migrations/0003-prune-scaffolding.js.map +1 -0
- package/dist/migrate/registry.js +7 -1
- package/dist/migrate/registry.js.map +1 -1
- package/dist/migrate/runner.js +17 -10
- package/dist/migrate/runner.js.map +1 -1
- package/dist/migrate/types.d.ts +10 -2
- package/dist/missions/task-link.js +4 -5
- package/dist/missions/task-link.js.map +1 -1
- package/dist/paths/index.d.ts +12 -1
- package/dist/paths/index.js +17 -3
- package/dist/paths/index.js.map +1 -1
- package/dist/sensors/catalog.js +3 -3
- package/dist/sensors/catalog.js.map +1 -1
- package/dist/session-start/build.js +31 -16
- package/dist/session-start/build.js.map +1 -1
- package/dist/status-line/event-queue.js +2 -1
- package/dist/status-line/event-queue.js.map +1 -1
- package/dist/status-line/reader.js +5 -5
- package/dist/status-line/reader.js.map +1 -1
- package/dist/status-line/writer.js +2 -1
- package/dist/status-line/writer.js.map +1 -1
- package/dist/tasks/lifecycle.js +10 -9
- package/dist/tasks/lifecycle.js.map +1 -1
- package/dist/trace/index.js +2 -2
- package/dist/trace/index.js.map +1 -1
- package/dist/update-check.d.ts +28 -0
- package/dist/update-check.js +137 -0
- package/dist/update-check.js.map +1 -0
- package/package.json +2 -2
- package/templates/.cairn/git-hooks/commit-msg +33 -5
- package/templates/.cairn/git-hooks/post-commit +13 -3
- package/templates/.cairn/git-hooks/pre-commit +48 -25
- package/dist/hooks/read-enrich.d.ts +0 -6
- package/dist/hooks/read-enrich.js +0 -11
- package/dist/hooks/read-enrich.js.map +0 -1
- package/dist/hooks/write-guard.d.ts +0 -6
- package/dist/hooks/write-guard.js +0 -11
- package/dist/hooks/write-guard.js.map +0 -1
- package/dist/init/phases/12-strip.d.ts +0 -10
- package/dist/init/phases/12-strip.js +0 -88
- package/dist/init/phases/12-strip.js.map +0 -1
package/dist/align-undo/log.js
CHANGED
|
@@ -19,10 +19,11 @@
|
|
|
19
19
|
* the same window is idempotent.
|
|
20
20
|
*/
|
|
21
21
|
import { appendFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
22
|
-
import { dirname
|
|
22
|
+
import { dirname } from "node:path";
|
|
23
23
|
import { z } from "zod";
|
|
24
24
|
import { withWriteLock } from "../lock.js";
|
|
25
25
|
import { logger } from "../logger.js";
|
|
26
|
+
import { cairnDir } from "@isaacriehm/cairn-state";
|
|
26
27
|
const log = logger("align-undo.log");
|
|
27
28
|
/**
|
|
28
29
|
* Drop entries older than this on the next append + GC sweep. Operators
|
|
@@ -54,7 +55,7 @@ export const AlignUndoEntry = z.object({
|
|
|
54
55
|
augments_existing_id: z.string().optional(),
|
|
55
56
|
});
|
|
56
57
|
export function alignUndoLogPath(repoRoot) {
|
|
57
|
-
return
|
|
58
|
+
return cairnDir(repoRoot, "state", "align-undo-log.jsonl");
|
|
58
59
|
}
|
|
59
60
|
export async function appendAlignUndoEntry(repoRoot, entry) {
|
|
60
61
|
const validated = AlignUndoEntry.parse(entry);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/align-undo/log.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7F,OAAO,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/align-undo/log.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7F,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEnD,MAAM,GAAG,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAErC;;;;GAIG;AACH,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE3C;;;GAGG;AACH,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAE/B,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE;IAChC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,UAAU,CAAC,CAAC;IACxE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,gFAAgF;IAChF,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,8DAA8D;IAC9D,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,iFAAiF;IACjF,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,uEAAuE;IACvE,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC/C,gFAAgF;IAChF,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC5C,CAAC,CAAC;AAGH,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,OAAO,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,sBAAsB,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,QAAgB,EAChB,KAAqB;IAErB,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACxC,mEAAmE;IACnE,8DAA8D;IAC9D,+DAA+D;IAC/D,4BAA4B;IAC5B,MAAM,aAAa,CAAC,QAAQ,EAAE,GAAG,EAAE;QACjC,IAAI,CAAC;YACH,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9C,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;gBACvB,cAAc,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAC/D,OAAO;YACT,CAAC;YACD,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1B,aAAa,CACX,IAAI,EACJ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EACzD,MAAM,CACP,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CACN,EAAE,GAAG,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EACzD,8BAA8B,CAC/B,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,SAAS,UAAU,CAAC,IAAY;IAC9B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACxE,IAAI,KAAK,CAAC,MAAM,GAAG,kBAAkB;QAAE,OAAO,IAAI,CAAC;IACnD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC;IACvC,MAAM,SAAS,GAAqB,EAAE,CAAC;IACvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACtD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACjC,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,MAAM;gBAAE,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClE,CAAC;QAAC,MAAM,CAAC;YACP,0CAA0C;QAC5C,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,MAAM,IAAI,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,MAAM,GAAG,GAAqB,EAAE,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACnC,IAAI,CAAC;YACH,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CACN,EAAE,GAAG,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EACzD,qCAAqC,CACtC,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgB,EAChB,SAA2B;IAE3B,MAAM,IAAI,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACxC,sEAAsE;IACtE,wDAAwD;IACxD,MAAM,aAAa,CAAC,QAAQ,EAAE,GAAG,EAAE;QACjC,IAAI,CAAC;YACH,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,aAAa,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;gBAChC,OAAO;YACT,CAAC;YACD,aAAa,CACX,IAAI,EACJ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EACzD,MAAM,CACP,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CACN,EAAE,GAAG,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EACzD,6BAA6B,CAC9B,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -23,6 +23,7 @@ import { parse as parseYaml } from "yaml";
|
|
|
23
23
|
import { z } from "zod";
|
|
24
24
|
import { applyStripReplace, formatBareCitation, } from "../init/source-comments/strip-replace.js";
|
|
25
25
|
import { logger } from "../logger.js";
|
|
26
|
+
import { cairnDir } from "@isaacriehm/cairn-state";
|
|
26
27
|
const DraftMetaSchema = z.object({
|
|
27
28
|
blockId: z.string().nullable().optional(),
|
|
28
29
|
sourceFile: z.string().nullable().optional(),
|
|
@@ -108,7 +109,7 @@ function extractAuditBlocks(body) {
|
|
|
108
109
|
}));
|
|
109
110
|
}
|
|
110
111
|
export function findLatestSourceCommentsAudit(repoRoot) {
|
|
111
|
-
const dir =
|
|
112
|
+
const dir = cairnDir(repoRoot, "baseline");
|
|
112
113
|
if (!existsSync(dir))
|
|
113
114
|
return null;
|
|
114
115
|
let entries;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source-strip.js","sourceRoot":"","sources":["../../src/attention/source-strip.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,GAGnB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"source-strip.js","sourceRoot":"","sources":["../../src/attention/source-strip.ts"],"names":[],"mappings":"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"}
|
package/dist/components/emit.js
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
import { mkdirSync, writeFileSync } from "node:fs";
|
|
19
19
|
import { join } from "node:path";
|
|
20
20
|
import { stringify as stringifyYaml } from "yaml";
|
|
21
|
-
import { bodyContentHash, collectComponents, deriveInvId, hasComponentConfig, invariantsDir, loadComponentsConfig, writeInvariantsLedger, } from "@isaacriehm/cairn-state";
|
|
21
|
+
import { cairnDir, bodyContentHash, collectComponents, deriveInvId, hasComponentConfig, invariantsDir, isGhost, loadComponentsConfig, readComponentRegistry, writeInvariantsLedger, } from "@isaacriehm/cairn-state";
|
|
22
22
|
import { buildComponentIndex } from "./index-build.js";
|
|
23
23
|
import { runComponentAudit } from "./audit.js";
|
|
24
24
|
const CAPTURE_SOURCE = "cairn-init-components";
|
|
@@ -133,16 +133,37 @@ function writeComponentBaseline(repoRoot, audit, missing) {
|
|
|
133
133
|
severity: "soft",
|
|
134
134
|
message: `${f.message} — ${f.recommendation}`,
|
|
135
135
|
}));
|
|
136
|
+
// Ghost forbids the `@cairn` header in client source, so the "missing"
|
|
137
|
+
// list is an *unregistered units* offer, not a header nag — soft, and
|
|
138
|
+
// resolved by `cairn_component_register` (writes the out-of-repo store,
|
|
139
|
+
// never the file). Committed keeps the hard header-debt gate.
|
|
140
|
+
const ghost = isGhost(repoRoot);
|
|
136
141
|
const missingFindings = missing.map((p) => ({
|
|
137
142
|
path: p,
|
|
138
143
|
line: 0,
|
|
139
|
-
severity: "hard",
|
|
140
|
-
message:
|
|
144
|
+
severity: (ghost ? "soft" : "hard"),
|
|
145
|
+
message: ghost
|
|
146
|
+
? "unregistered unit — register it via cairn_component_register so it joins the store (no source edit)"
|
|
147
|
+
: "missing @cairn header — annotate this component so it joins the registry (the daily-flow check blocks on this)",
|
|
141
148
|
}));
|
|
142
|
-
|
|
149
|
+
// Ghost-only: registered components the freshness gate flagged as
|
|
150
|
+
// identity-changed (§3.8.1 L3). Surfacing them here — at emit / `components
|
|
151
|
+
// audit`, a quota-expected context — is where the deferred reclassify is
|
|
152
|
+
// meant to run. Soft offer; resolved by re-confirming the entry.
|
|
153
|
+
const reconfirmFindings = ghost
|
|
154
|
+
? readComponentRegistry(repoRoot)
|
|
155
|
+
.entries.filter((e) => e.needs_reconfirm === true)
|
|
156
|
+
.map((e) => ({
|
|
157
|
+
path: e.file,
|
|
158
|
+
line: 0,
|
|
159
|
+
severity: "soft",
|
|
160
|
+
message: `${e.name} changed shape/exports since registration — re-confirm its category/purpose (no source edit)`,
|
|
161
|
+
}))
|
|
162
|
+
: [];
|
|
163
|
+
const total = auditFindings.length + missingFindings.length + reconfirmFindings.length;
|
|
143
164
|
if (total === 0)
|
|
144
165
|
return null;
|
|
145
|
-
const dir =
|
|
166
|
+
const dir = cairnDir(repoRoot, "baseline");
|
|
146
167
|
mkdirSync(dir, { recursive: true });
|
|
147
168
|
const nowIso = new Date().toISOString();
|
|
148
169
|
const filename = `components-${nowIso.replace(/[:.]/g, "-")}.yaml`;
|
|
@@ -151,7 +172,13 @@ function writeComponentBaseline(repoRoot, audit, missing) {
|
|
|
151
172
|
total_findings: total,
|
|
152
173
|
sensors: [
|
|
153
174
|
{ sensor_id: "component-audit", findings: auditFindings },
|
|
154
|
-
{
|
|
175
|
+
{
|
|
176
|
+
sensor_id: ghost ? "component-unregistered" : "component-missing-header",
|
|
177
|
+
findings: missingFindings,
|
|
178
|
+
},
|
|
179
|
+
...(reconfirmFindings.length > 0
|
|
180
|
+
? [{ sensor_id: "component-reconfirm", findings: reconfirmFindings }]
|
|
181
|
+
: []),
|
|
155
182
|
],
|
|
156
183
|
};
|
|
157
184
|
writeFileSync(join(dir, filename), stringifyYaml(payload), "utf8");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emit.js","sourceRoot":"","sources":["../../src/components/emit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,MAAM,CAAC;AAClD,OAAO,
|
|
1
|
+
{"version":3,"file":"emit.js","sourceRoot":"","sources":["../../src/components/emit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Headerless component freshness — the edit-time gate (ghost-mode design).
|
|
3
|
+
*
|
|
4
|
+
* In committed mode the `@cairn <Name>` header rots in place the moment someone
|
|
5
|
+
* edits a component and ignores the comment — caught only by a later sensor.
|
|
6
|
+
* Ghost has no header, so the out-of-repo registry has to *detect* a body change
|
|
7
|
+
* at edit time and decide whether the classification it stored is still valid.
|
|
8
|
+
*
|
|
9
|
+
* The hard rule: **the hot edit path never calls the LLM.** This module is the
|
|
10
|
+
* cheap-to-expensive gate that runs on every Write/Edit and exits free at the
|
|
11
|
+
* first layer that settles it. Reclassification (the only LLM spend) is deferred
|
|
12
|
+
* to a quota-expected context (a `components audit` / backfill, or the operator
|
|
13
|
+
* acting on the surfaced "N components changed" offer) — never here.
|
|
14
|
+
*
|
|
15
|
+
* - **L0 — registered?** Edited path not in the registry → stop. Zero cost.
|
|
16
|
+
* (Most edits — committed repos exit even earlier on the `isGhost` guard.)
|
|
17
|
+
* - **L1 — body changed?** Whole-file fingerprint matches the stored hash →
|
|
18
|
+
* stop. Zero work. (A Write that didn't actually change bytes.)
|
|
19
|
+
* - **L2 — identity changed (deterministic only)?** Body differs, but the
|
|
20
|
+
* exports + unit-shape are unchanged and the registered export symbol still
|
|
21
|
+
* exists → an internal refactor → refresh the fingerprint, no flag, no LLM.
|
|
22
|
+
* - **L3 — identity may have genuinely changed.** Exports changed, the shape
|
|
23
|
+
* flipped, or the registered export vanished → mark the entry
|
|
24
|
+
* `needs_reconfirm` (+ refresh the fingerprint/snapshot), free. The expensive
|
|
25
|
+
* reclassify runs later.
|
|
26
|
+
*
|
|
27
|
+
* v1 anchors on a whole-file fingerprint (one component per file is the UI
|
|
28
|
+
* convention, so the file body *is* the component span); the export-span hash is
|
|
29
|
+
* a later precision refinement. Every path is `isGhost`-gated — committed mode's
|
|
30
|
+
* header is its own SoT and this never runs there.
|
|
31
|
+
*/
|
|
32
|
+
export type FreshnessAction = "inert" | "not-registered" | "unchanged" | "refreshed" | "reconfirm";
|
|
33
|
+
export interface FreshnessResult {
|
|
34
|
+
action: FreshnessAction;
|
|
35
|
+
/** Repo-relative path the gate ran against. */
|
|
36
|
+
file: string;
|
|
37
|
+
/** The registered component name, when the path resolved to one. */
|
|
38
|
+
name: string | null;
|
|
39
|
+
/**
|
|
40
|
+
* Operator-facing one-liner for the L3 case (surfaced as a PostToolUse hint),
|
|
41
|
+
* or null for every settled-free outcome.
|
|
42
|
+
*/
|
|
43
|
+
hint: string | null;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Run the L0–L3 freshness gate against one repo-relative file. Pure, fast,
|
|
47
|
+
* deterministic — NO LLM. Mutates the registry only when a registered
|
|
48
|
+
* component's body actually changed (L2 refresh or L3 flag). Best-effort: any
|
|
49
|
+
* failure degrades to `inert` so the hot Write path is never blocked.
|
|
50
|
+
*/
|
|
51
|
+
export declare function runComponentFreshness(repoRoot: string, relPath: string): FreshnessResult;
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Headerless component freshness — the edit-time gate (ghost-mode design).
|
|
3
|
+
*
|
|
4
|
+
* In committed mode the `@cairn <Name>` header rots in place the moment someone
|
|
5
|
+
* edits a component and ignores the comment — caught only by a later sensor.
|
|
6
|
+
* Ghost has no header, so the out-of-repo registry has to *detect* a body change
|
|
7
|
+
* at edit time and decide whether the classification it stored is still valid.
|
|
8
|
+
*
|
|
9
|
+
* The hard rule: **the hot edit path never calls the LLM.** This module is the
|
|
10
|
+
* cheap-to-expensive gate that runs on every Write/Edit and exits free at the
|
|
11
|
+
* first layer that settles it. Reclassification (the only LLM spend) is deferred
|
|
12
|
+
* to a quota-expected context (a `components audit` / backfill, or the operator
|
|
13
|
+
* acting on the surfaced "N components changed" offer) — never here.
|
|
14
|
+
*
|
|
15
|
+
* - **L0 — registered?** Edited path not in the registry → stop. Zero cost.
|
|
16
|
+
* (Most edits — committed repos exit even earlier on the `isGhost` guard.)
|
|
17
|
+
* - **L1 — body changed?** Whole-file fingerprint matches the stored hash →
|
|
18
|
+
* stop. Zero work. (A Write that didn't actually change bytes.)
|
|
19
|
+
* - **L2 — identity changed (deterministic only)?** Body differs, but the
|
|
20
|
+
* exports + unit-shape are unchanged and the registered export symbol still
|
|
21
|
+
* exists → an internal refactor → refresh the fingerprint, no flag, no LLM.
|
|
22
|
+
* - **L3 — identity may have genuinely changed.** Exports changed, the shape
|
|
23
|
+
* flipped, or the registered export vanished → mark the entry
|
|
24
|
+
* `needs_reconfirm` (+ refresh the fingerprint/snapshot), free. The expensive
|
|
25
|
+
* reclassify runs later.
|
|
26
|
+
*
|
|
27
|
+
* v1 anchors on a whole-file fingerprint (one component per file is the UI
|
|
28
|
+
* convention, so the file body *is* the component span); the export-span hash is
|
|
29
|
+
* a later precision refinement. Every path is `isGhost`-gated — committed mode's
|
|
30
|
+
* header is its own SoT and this never runs there.
|
|
31
|
+
*/
|
|
32
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
33
|
+
import { join } from "node:path";
|
|
34
|
+
import { bodyContentHash, extractExportNames, isGhost, lookupComponentEntryByFile, profileForFile, readComponentRegistry, registerComponentEntry, } from "@isaacriehm/cairn-state";
|
|
35
|
+
import { logger } from "../logger.js";
|
|
36
|
+
const log = logger("components.freshness");
|
|
37
|
+
function inert(file) {
|
|
38
|
+
return { action: "inert", file, name: null, hint: null };
|
|
39
|
+
}
|
|
40
|
+
/** Set equality, order-independent — a reorder is not an identity change. */
|
|
41
|
+
function sameSet(a, b) {
|
|
42
|
+
if (a.length !== b.length)
|
|
43
|
+
return false;
|
|
44
|
+
const sa = new Set(a);
|
|
45
|
+
for (const x of b)
|
|
46
|
+
if (!sa.has(x))
|
|
47
|
+
return false;
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Run the L0–L3 freshness gate against one repo-relative file. Pure, fast,
|
|
52
|
+
* deterministic — NO LLM. Mutates the registry only when a registered
|
|
53
|
+
* component's body actually changed (L2 refresh or L3 flag). Best-effort: any
|
|
54
|
+
* failure degrades to `inert` so the hot Write path is never blocked.
|
|
55
|
+
*/
|
|
56
|
+
export function runComponentFreshness(repoRoot, relPath) {
|
|
57
|
+
try {
|
|
58
|
+
// Committed mode: the in-file header is the SoT — this gate does not apply.
|
|
59
|
+
if (!isGhost(repoRoot))
|
|
60
|
+
return inert(relPath);
|
|
61
|
+
// L0 — is this a registered unit? (Cheap: one small yaml read, memoized
|
|
62
|
+
// isGhost already short-circuited committed repos to zero cost.)
|
|
63
|
+
const reg = readComponentRegistry(repoRoot);
|
|
64
|
+
const entry = lookupComponentEntryByFile(reg, relPath);
|
|
65
|
+
if (entry === null) {
|
|
66
|
+
return { action: "not-registered", file: relPath, name: null, hint: null };
|
|
67
|
+
}
|
|
68
|
+
const abs = join(repoRoot, relPath);
|
|
69
|
+
if (!existsSync(abs)) {
|
|
70
|
+
// Deletion is GC/orphan territory, not freshness — leave the entry as-is.
|
|
71
|
+
return { action: "not-registered", file: relPath, name: entry.name, hint: null };
|
|
72
|
+
}
|
|
73
|
+
let source;
|
|
74
|
+
try {
|
|
75
|
+
source = readFileSync(abs, "utf8");
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return { action: "not-registered", file: relPath, name: entry.name, hint: null };
|
|
79
|
+
}
|
|
80
|
+
// L1 — body changed? Whole-file fingerprint vs the stored hash.
|
|
81
|
+
const hash = bodyContentHash(source);
|
|
82
|
+
if (hash === entry.anchor.content_hash) {
|
|
83
|
+
return { action: "unchanged", file: relPath, name: entry.name, hint: null };
|
|
84
|
+
}
|
|
85
|
+
// Body differs — L2/L3 deterministic identity check.
|
|
86
|
+
const exportsNow = extractExportNames(source, relPath);
|
|
87
|
+
const shapeNow = profileForFile(relPath)?.isUnitShaped(source, relPath) ?? false;
|
|
88
|
+
// No baseline snapshot (legacy entry registered before snapshots existed):
|
|
89
|
+
// backfill it on this edit, never flag — we have nothing to compare against.
|
|
90
|
+
const hasBaseline = (entry.exports?.length ?? 0) > 0 || entry.unit_shaped !== undefined;
|
|
91
|
+
const identityChanged = hasBaseline &&
|
|
92
|
+
(!sameSet(exportsNow, entry.exports ?? []) ||
|
|
93
|
+
(entry.unit_shaped !== undefined && entry.unit_shaped !== shapeNow) ||
|
|
94
|
+
!exportsNow.includes(entry.export));
|
|
95
|
+
const updated = {
|
|
96
|
+
...entry,
|
|
97
|
+
anchor: { ...entry.anchor, content_hash: hash },
|
|
98
|
+
exports: exportsNow,
|
|
99
|
+
unit_shaped: shapeNow,
|
|
100
|
+
// Latch the flag: an internal refactor must NOT clear a reconfirm that a
|
|
101
|
+
// prior identity change already raised — only an actual reclassify clears
|
|
102
|
+
// it. So once true, stay true until re-confirmed.
|
|
103
|
+
needs_reconfirm: identityChanged ? true : entry.needs_reconfirm,
|
|
104
|
+
};
|
|
105
|
+
registerComponentEntry(repoRoot, updated, reg);
|
|
106
|
+
if (identityChanged) {
|
|
107
|
+
return {
|
|
108
|
+
action: "reconfirm",
|
|
109
|
+
file: relPath,
|
|
110
|
+
name: entry.name,
|
|
111
|
+
hint: `⬡ ${entry.name} changed shape/exports — re-confirm its registry purpose with \`cairn components audit\` (ghost: no source edit).`,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
return { action: "refreshed", file: relPath, name: entry.name, hint: null };
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
log.warn({ err: err instanceof Error ? err.message : String(err), file: relPath }, "component freshness gate failed; degrading to inert");
|
|
118
|
+
return inert(relPath);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=freshness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"freshness.js","sourceRoot":"","sources":["../../src/components/freshness.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,3 +6,7 @@ export { runComponentAudit } from "./audit.js";
|
|
|
6
6
|
export type { ComponentAuditFinding, ComponentAuditKind, ComponentAuditResult, } from "./audit.js";
|
|
7
7
|
export { emitComponentStore } from "./emit.js";
|
|
8
8
|
export type { ComponentEmitResult } from "./emit.js";
|
|
9
|
+
export { runComponentFreshness } from "./freshness.js";
|
|
10
|
+
export type { FreshnessAction, FreshnessResult } from "./freshness.js";
|
|
11
|
+
export { runComponentReconfirm } from "./reconfirm.js";
|
|
12
|
+
export type { ReconfirmArgs, ReconfirmResult, ReconfirmVerdict } from "./reconfirm.js";
|
package/dist/components/index.js
CHANGED
|
@@ -2,4 +2,6 @@ export { runComponentCheck } from "./check.js";
|
|
|
2
2
|
export { buildComponentIndex } from "./index-build.js";
|
|
3
3
|
export { runComponentAudit } from "./audit.js";
|
|
4
4
|
export { emitComponentStore } from "./emit.js";
|
|
5
|
+
export { runComponentFreshness } from "./freshness.js";
|
|
6
|
+
export { runComponentReconfirm } from "./reconfirm.js";
|
|
5
7
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAM/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAM/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAE/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Headerless component re-confirm — the deferred reclassify tier (§3.8.1).
|
|
3
|
+
*
|
|
4
|
+
* The freshness gate (`freshness.ts`) runs on every edit and, when a registered
|
|
5
|
+
* component's identity changes, latches `needs_reconfirm` — deterministically,
|
|
6
|
+
* NO LLM. This module is the *other half*: the narrow, quota-gated pass that
|
|
7
|
+
* actually decides whether the stored classification still holds and clears the
|
|
8
|
+
* flag. It runs ONLY in a quota-expected context (an explicit
|
|
9
|
+
* `cairn_component_reconfirm`, a `components audit` refresh, or the operator
|
|
10
|
+
* acting on the surfaced "N components changed" offer) — never on the hot edit
|
|
11
|
+
* path.
|
|
12
|
+
*
|
|
13
|
+
* Tier split (§3.8.2): *initial* classification ("what IS this component —
|
|
14
|
+
* category, purpose") is a rich judgment → Sonnet (the adoption annotator). A
|
|
15
|
+
* *re-confirm* on a changed body ("does the EXISTING category still fit?") is a
|
|
16
|
+
* narrow yes/no → **Haiku**. That keeps the recurring, higher-frequency path the
|
|
17
|
+
* cheapest one.
|
|
18
|
+
*
|
|
19
|
+
* Cost controls, mirroring sot-align:
|
|
20
|
+
* - **Hard per-run cap** on Haiku calls; entries past it stay flagged
|
|
21
|
+
* (deferred), logged via the returned counts — never silently dropped.
|
|
22
|
+
* - **Verdict cached on the body fingerprint** — re-running over a still-flagged
|
|
23
|
+
* component whose body hasn't changed is a free cache hit, so repeated sweeps
|
|
24
|
+
* don't re-burn quota on a stuck-stale entry.
|
|
25
|
+
*
|
|
26
|
+
* A "fits" verdict clears the flag. A "stale"/"ambiguous" verdict leaves it
|
|
27
|
+
* flagged; the operator resolves it by re-registering (`cairn_component_register`
|
|
28
|
+
* overwrites the entry — and, building it fresh, drops the flag). Every path is
|
|
29
|
+
* `isGhost`-gated.
|
|
30
|
+
*/
|
|
31
|
+
export type ReconfirmVerdict = "fits" | "stale" | "ambiguous";
|
|
32
|
+
export interface ReconfirmArgs {
|
|
33
|
+
repoRoot: string;
|
|
34
|
+
/** Hard cap on fresh Haiku calls per run. Rest stay flagged (deferred). */
|
|
35
|
+
cap?: number;
|
|
36
|
+
/** Reconfirm a single file (operator acting on one offer). Omit = sweep all. */
|
|
37
|
+
onlyFile?: string;
|
|
38
|
+
/** Mock judge for smokes — default is the real Haiku judge. */
|
|
39
|
+
mockJudge?: (args: {
|
|
40
|
+
name: string;
|
|
41
|
+
category: string;
|
|
42
|
+
purpose: string;
|
|
43
|
+
body: string;
|
|
44
|
+
}) => Promise<ReconfirmVerdict>;
|
|
45
|
+
}
|
|
46
|
+
export interface ReconfirmResult {
|
|
47
|
+
/** Flagged entries in scope this run. */
|
|
48
|
+
considered: number;
|
|
49
|
+
/** Verdict "fits" → flag cleared. */
|
|
50
|
+
cleared: number;
|
|
51
|
+
/** Verdict "stale"/"ambiguous" (or unreadable source) → left flagged. */
|
|
52
|
+
stillStale: number;
|
|
53
|
+
/** Past the Haiku cap → untouched, still flagged. */
|
|
54
|
+
deferred: number;
|
|
55
|
+
/** Fresh Haiku calls made. */
|
|
56
|
+
haikuCalls: number;
|
|
57
|
+
/** Verdicts served from the fingerprint cache (free). */
|
|
58
|
+
cacheHits: number;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Re-confirm flagged components. No-op (zeros) outside ghost. NEVER called from
|
|
62
|
+
* the hot edit path — this is the quota-expected reclassify pass.
|
|
63
|
+
*/
|
|
64
|
+
export declare function runComponentReconfirm(args: ReconfirmArgs): Promise<ReconfirmResult>;
|