@isaacriehm/cairn-core 0.5.0 → 0.7.0
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.d.ts +2 -2
- package/dist/align-undo/log.js +80 -17
- package/dist/align-undo/log.js.map +1 -1
- package/dist/align-undo/undo.d.ts +10 -11
- package/dist/align-undo/undo.js +233 -23
- package/dist/align-undo/undo.js.map +1 -1
- package/dist/attention/bulk-accept.js +65 -37
- package/dist/attention/bulk-accept.js.map +1 -1
- package/dist/attention/serve/api.js +10 -18
- package/dist/attention/serve/api.js.map +1 -1
- package/dist/attention/serve/index.js +3 -3
- package/dist/attention/serve/index.js.map +1 -1
- package/dist/drain/drain.js +4 -4
- package/dist/drain/drain.js.map +1 -1
- package/dist/fix-align/index.d.ts +2 -0
- package/dist/fix-align/index.js +1 -0
- package/dist/fix-align/index.js.map +1 -1
- package/dist/fix-align/sentinel.d.ts +59 -0
- package/dist/fix-align/sentinel.js +149 -0
- package/dist/fix-align/sentinel.js.map +1 -0
- package/dist/fs.d.ts +5 -0
- package/dist/fs.js +11 -0
- package/dist/fs.js.map +1 -0
- package/dist/gc/apply.js +4 -4
- package/dist/gc/apply.js.map +1 -1
- package/dist/ground/anchor-map.js +3 -4
- package/dist/ground/anchor-map.js.map +1 -1
- package/dist/ground/file-candidates-map.d.ts +23 -0
- package/dist/ground/file-candidates-map.js +76 -0
- package/dist/ground/file-candidates-map.js.map +1 -0
- package/dist/ground/frontmatter.d.ts +12 -0
- package/dist/ground/frontmatter.js +28 -0
- package/dist/ground/frontmatter.js.map +1 -1
- package/dist/ground/index.d.ts +6 -4
- package/dist/ground/index.js +6 -4
- package/dist/ground/index.js.map +1 -1
- package/dist/ground/paths.d.ts +2 -0
- package/dist/ground/paths.js +6 -0
- package/dist/ground/paths.js.map +1 -1
- package/dist/ground/rejected.d.ts +42 -0
- package/dist/ground/rejected.js +100 -0
- package/dist/ground/rejected.js.map +1 -0
- package/dist/ground/schemas.d.ts +88 -8
- package/dist/ground/schemas.js +73 -19
- package/dist/ground/schemas.js.map +1 -1
- package/dist/ground/scope-index.js +4 -4
- package/dist/ground/scope-index.js.map +1 -1
- package/dist/ground/sot-bindings.js +3 -4
- package/dist/ground/sot-bindings.js.map +1 -1
- package/dist/ground/sot-cache.js +3 -4
- package/dist/ground/sot-cache.js.map +1 -1
- package/dist/ground/topic-index.d.ts +7 -0
- package/dist/ground/topic-index.js +26 -4
- package/dist/ground/topic-index.js.map +1 -1
- package/dist/hooks/post-tool-use/index.d.ts +1 -1
- package/dist/hooks/post-tool-use/index.js +1 -1
- package/dist/hooks/post-tool-use/index.js.map +1 -1
- package/dist/hooks/post-tool-use/ledger-cache.d.ts +13 -0
- package/dist/hooks/post-tool-use/ledger-cache.js +48 -0
- package/dist/hooks/post-tool-use/ledger-cache.js.map +1 -1
- package/dist/hooks/post-tool-use/legend-builder.d.ts +10 -1
- package/dist/hooks/post-tool-use/legend-builder.js +27 -2
- package/dist/hooks/post-tool-use/legend-builder.js.map +1 -1
- package/dist/hooks/post-tool-use/read-enricher.js +8 -2
- package/dist/hooks/post-tool-use/read-enricher.js.map +1 -1
- package/dist/hooks/post-tool-use/sot-align.js +11 -16
- package/dist/hooks/post-tool-use/sot-align.js.map +1 -1
- package/dist/hooks/pre-commit/sot-align-precommit.js +3 -3
- package/dist/hooks/pre-commit/sot-align-precommit.js.map +1 -1
- package/dist/init/index.d.ts +2 -2
- package/dist/init/index.js +1 -1
- package/dist/init/index.js.map +1 -1
- package/dist/init/ingest-docs.d.ts +82 -22
- package/dist/init/ingest-docs.js +632 -108
- package/dist/init/ingest-docs.js.map +1 -1
- package/dist/init/init.d.ts +10 -1
- package/dist/init/init.js +113 -251
- package/dist/init/init.js.map +1 -1
- package/dist/init/mapper-parallel.js +8 -0
- package/dist/init/mapper-parallel.js.map +1 -1
- package/dist/init/mapper.js +6 -6
- package/dist/init/mapper.js.map +1 -1
- package/dist/init/phases/6-docs-ingest.d.ts +9 -4
- package/dist/init/phases/6-docs-ingest.js +13 -10
- package/dist/init/phases/6-docs-ingest.js.map +1 -1
- package/dist/init/phases/parallel-678.js +10 -4
- package/dist/init/phases/parallel-678.js.map +1 -1
- package/dist/init/sot-emit.d.ts +22 -0
- package/dist/init/sot-emit.js +51 -9
- package/dist/init/sot-emit.js.map +1 -1
- package/dist/init/source-comments/ingest.js +107 -7
- package/dist/init/source-comments/ingest.js.map +1 -1
- package/dist/init/topic-index/index.d.ts +14 -0
- package/dist/init/topic-index/index.js +83 -4
- package/dist/init/topic-index/index.js.map +1 -1
- package/dist/init/topic-index/judge.js +14 -1
- package/dist/init/topic-index/judge.js.map +1 -1
- package/dist/init/topic-index/resolve.d.ts +19 -0
- package/dist/init/topic-index/resolve.js +100 -14
- package/dist/init/topic-index/resolve.js.map +1 -1
- package/dist/init/topic-index/walk.d.ts +32 -0
- package/dist/init/topic-index/walk.js +70 -4
- package/dist/init/topic-index/walk.js.map +1 -1
- package/dist/mcp/history/summarizer.js +5 -0
- package/dist/mcp/history/summarizer.js.map +1 -1
- package/dist/mcp/schemas.d.ts +48 -0
- package/dist/mcp/schemas.js +43 -0
- package/dist/mcp/schemas.js.map +1 -1
- package/dist/mcp/tools/index.d.ts +1 -1
- package/dist/mcp/tools/index.js +8 -0
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/init-phases.js.map +1 -1
- package/dist/mcp/tools/propose-decision.d.ts +34 -0
- package/dist/mcp/tools/propose-decision.js +200 -0
- package/dist/mcp/tools/propose-decision.js.map +1 -0
- package/dist/mcp/tools/record-decision.js +5 -2
- package/dist/mcp/tools/record-decision.js.map +1 -1
- package/dist/mcp/tools/reject-candidate.d.ts +24 -0
- package/dist/mcp/tools/reject-candidate.js +71 -0
- package/dist/mcp/tools/reject-candidate.js.map +1 -0
- package/dist/mcp/tools/resolve-attention.js +7 -54
- package/dist/mcp/tools/resolve-attention.js.map +1 -1
- package/dist/mcp/tools/search-candidates.d.ts +20 -0
- package/dist/mcp/tools/search-candidates.js +93 -0
- package/dist/mcp/tools/search-candidates.js.map +1 -0
- package/package.json +1 -1
- package/templates/attention-ui/app.js +40 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,CAAC,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,CAAC,MAAM,QAAQ,GAAqB;IACxC,yBAAyB;IACzB,eAAe;IACf,oBAAoB;IACpB,sBAAsB;IACtB,qBAAqB;IACrB,aAAa;IACb,mBAAmB;IACnB,gBAAgB;IAChB,qBAAqB;IACrB,6BAA6B;IAC7B,UAAU;IACV,YAAY;IACZ,WAAW;IACX,4BAA4B;IAC5B,gBAAgB;IAChB,kEAAkE;IAClE,oBAAoB;IACpB,QAAQ;IACR,kBAAkB;IAClB,cAAc;IACd,WAAW;IACX,mEAAmE;IACnE,mBAAmB;IACnB,mBAAmB;IACnB,qBAAqB;IACrB,oBAAoB;IACpB,uBAAuB;IACvB,kBAAkB;IAClB,oBAAoB;IACpB,kBAAkB;IAClB,iBAAiB;IACjB,qCAAqC;IACrC,cAAc;IACd,iDAAiD;IACjD,cAAc;IACd,mBAAmB;IACnB,GAAG,cAAc;CAClB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-phases.js","sourceRoot":"","sources":["../../../src/mcp/tools/init-phases.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,SAAS,EACT,aAAa,EACb,eAAe,EACf,cAAc,EACd,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,eAAe,EACf,cAAc,EACd,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,wBAAwB,EACxB,oBAAoB,EACpB,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EACf,aAAa,GAMd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAGxC,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"init-phases.js","sourceRoot":"","sources":["../../../src/mcp/tools/init-phases.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `cairn_propose_decision` — promote a topic-index candidate (slug)
|
|
3
|
+
* into a DEC draft under `.cairn/ground/decisions/_inbox/`.
|
|
4
|
+
*
|
|
5
|
+
* Spec: PHASE_6_REDESIGN §4.6 / §5.4. The AI-curator path. Body is
|
|
6
|
+
* ALWAYS verbatim from `readSotBody` so the resulting draft's
|
|
7
|
+
* `sot_content_hash` matches the source paragraph the agent saw — no
|
|
8
|
+
* paraphrasing, no AI-generated prose. The drift sensor depends on
|
|
9
|
+
* this hash.
|
|
10
|
+
*
|
|
11
|
+
* Refusal modes (returned as `{ ok: false, reason: <kind> }`):
|
|
12
|
+
* - `not_found` — slug not present in the topic-index.
|
|
13
|
+
* - `rejected` — slug appears in `.cairn/ground/_rejected.yaml`.
|
|
14
|
+
* - `unreadable` — `readSotBody` returned null (anchor-map missing
|
|
15
|
+
* or the source file disappeared).
|
|
16
|
+
* - `drifted` — body hash no longer matches `entry.content_hash`.
|
|
17
|
+
* The operator (or another agent) edited the source
|
|
18
|
+
* paragraph after phase 5b walked it. Caller should
|
|
19
|
+
* re-run `cairn index` and re-evaluate.
|
|
20
|
+
*
|
|
21
|
+
* Idempotent: a slug that already has a `dec_id` returns
|
|
22
|
+
* `{ ok: true, dec_id, path, warning: "...already exists" }` rather
|
|
23
|
+
* than re-emitting. The locked "DO NOT enforce" wording goes back
|
|
24
|
+
* to the agent verbatim so it cannot accidentally cite the draft as
|
|
25
|
+
* accepted policy.
|
|
26
|
+
*/
|
|
27
|
+
import type { ToolDef } from "./types.js";
|
|
28
|
+
interface Input {
|
|
29
|
+
slug: string;
|
|
30
|
+
title?: string;
|
|
31
|
+
kind?: "decision" | "rule";
|
|
32
|
+
}
|
|
33
|
+
export declare const proposeDecisionTool: ToolDef<Input>;
|
|
34
|
+
export {};
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `cairn_propose_decision` — promote a topic-index candidate (slug)
|
|
3
|
+
* into a DEC draft under `.cairn/ground/decisions/_inbox/`.
|
|
4
|
+
*
|
|
5
|
+
* Spec: PHASE_6_REDESIGN §4.6 / §5.4. The AI-curator path. Body is
|
|
6
|
+
* ALWAYS verbatim from `readSotBody` so the resulting draft's
|
|
7
|
+
* `sot_content_hash` matches the source paragraph the agent saw — no
|
|
8
|
+
* paraphrasing, no AI-generated prose. The drift sensor depends on
|
|
9
|
+
* this hash.
|
|
10
|
+
*
|
|
11
|
+
* Refusal modes (returned as `{ ok: false, reason: <kind> }`):
|
|
12
|
+
* - `not_found` — slug not present in the topic-index.
|
|
13
|
+
* - `rejected` — slug appears in `.cairn/ground/_rejected.yaml`.
|
|
14
|
+
* - `unreadable` — `readSotBody` returned null (anchor-map missing
|
|
15
|
+
* or the source file disappeared).
|
|
16
|
+
* - `drifted` — body hash no longer matches `entry.content_hash`.
|
|
17
|
+
* The operator (or another agent) edited the source
|
|
18
|
+
* paragraph after phase 5b walked it. Caller should
|
|
19
|
+
* re-run `cairn index` and re-evaluate.
|
|
20
|
+
*
|
|
21
|
+
* Idempotent: a slug that already has a `dec_id` returns
|
|
22
|
+
* `{ ok: true, dec_id, path, warning: "...already exists" }` rather
|
|
23
|
+
* than re-emitting. The locked "DO NOT enforce" wording goes back
|
|
24
|
+
* to the agent verbatim so it cannot accidentally cite the draft as
|
|
25
|
+
* accepted policy.
|
|
26
|
+
*/
|
|
27
|
+
import { mkdirSync, writeFileSync } from "node:fs";
|
|
28
|
+
import { join } from "node:path";
|
|
29
|
+
import { stringify as stringifyYaml } from "yaml";
|
|
30
|
+
import { bodyContentHash, decisionsDir, deriveDecId, readAnchorMap, readRejectedYaml, readTopicIndex, setTopic, writeFileCandidatesMap, writeTopicIndex, } from "../../ground/index.js";
|
|
31
|
+
import { scanExistingDecisionIds } from "../../decision-capture/index.js";
|
|
32
|
+
import { withWriteLock } from "../../lock.js";
|
|
33
|
+
import { readSotBody } from "../../init/sot-emit.js";
|
|
34
|
+
import { requireBootstrap } from "../bootstrap-guard.js";
|
|
35
|
+
import { proposeDecisionInput } from "../schemas.js";
|
|
36
|
+
const CAPTURE_SOURCE = "ai-proposed";
|
|
37
|
+
const DECIDED_BY = "ai-curator";
|
|
38
|
+
async function handler(ctx, input) {
|
|
39
|
+
const block = requireBootstrap(ctx.repoRoot);
|
|
40
|
+
if (block !== null)
|
|
41
|
+
return block;
|
|
42
|
+
return withWriteLock(ctx.repoRoot, () => {
|
|
43
|
+
const topicIndex = readTopicIndex(ctx.repoRoot);
|
|
44
|
+
const entry = topicIndex.topics[input.slug];
|
|
45
|
+
if (entry === undefined) {
|
|
46
|
+
return {
|
|
47
|
+
ok: false,
|
|
48
|
+
reason: "not_found",
|
|
49
|
+
detail: `slug "${input.slug}" not in topic-index`,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
if (entry.dec_id !== undefined) {
|
|
53
|
+
return {
|
|
54
|
+
ok: true,
|
|
55
|
+
dec_id: entry.dec_id,
|
|
56
|
+
path: relativeInboxPath(entry.dec_id, ctx.repoRoot),
|
|
57
|
+
warning: `DEC draft already exists for slug ${input.slug}; returning existing id ${entry.dec_id}.`,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
const rejected = readRejectedYaml(ctx.repoRoot);
|
|
61
|
+
const reject = rejected.get(input.slug);
|
|
62
|
+
if (reject !== undefined) {
|
|
63
|
+
return {
|
|
64
|
+
ok: false,
|
|
65
|
+
reason: "rejected",
|
|
66
|
+
detail: reject.reason,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
const anchorMap = readAnchorMap(ctx.repoRoot);
|
|
70
|
+
const body = readSotBody(ctx.repoRoot, entry, anchorMap);
|
|
71
|
+
if (body === null) {
|
|
72
|
+
return {
|
|
73
|
+
ok: false,
|
|
74
|
+
reason: "unreadable",
|
|
75
|
+
detail: "anchor-map missing or source body unreadable",
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
// Drift check — the topic-index records the body hash phase 5b
|
|
79
|
+
// saw. If the operator (or another agent) has since edited the
|
|
80
|
+
// paragraph, the AI may be promoting outdated content. Surface it
|
|
81
|
+
// and bounce the caller; correct path is `cairn index` then retry.
|
|
82
|
+
if (entry.content_hash !== undefined) {
|
|
83
|
+
const currentHash = bodyContentHash(body);
|
|
84
|
+
if (currentHash !== entry.content_hash) {
|
|
85
|
+
return {
|
|
86
|
+
ok: false,
|
|
87
|
+
reason: "drifted",
|
|
88
|
+
detail: "Source file modified since index build. Run 'cairn index' to refresh, then retry.",
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const titleSeed = input.title !== undefined && input.title.trim().length > 0
|
|
93
|
+
? input.title.trim()
|
|
94
|
+
: firstLineFallback(body);
|
|
95
|
+
const sotPath = entryToSotPath(entry);
|
|
96
|
+
const existingIds = scanExistingDecisionIds(ctx.repoRoot);
|
|
97
|
+
const decId = allocateUniqueDecId({ sot_path: sotPath, title: titleSeed, capture_source: CAPTURE_SOURCE }, existingIds);
|
|
98
|
+
writeDraftToInbox({
|
|
99
|
+
repoRoot: ctx.repoRoot,
|
|
100
|
+
id: decId,
|
|
101
|
+
title: titleSeed,
|
|
102
|
+
body,
|
|
103
|
+
sot_path: sotPath,
|
|
104
|
+
source_file: entry.sot_source,
|
|
105
|
+
});
|
|
106
|
+
const updatedTopicIndex = setTopic(topicIndex, input.slug, {
|
|
107
|
+
...entry,
|
|
108
|
+
dec_id: decId,
|
|
109
|
+
});
|
|
110
|
+
writeTopicIndex(ctx.repoRoot, updatedTopicIndex);
|
|
111
|
+
// Refresh the per-file candidate count map so the read-enrich
|
|
112
|
+
// hint reflects the post-promote state next time the agent reads
|
|
113
|
+
// the file.
|
|
114
|
+
writeFileCandidatesMap(ctx.repoRoot, updatedTopicIndex);
|
|
115
|
+
return {
|
|
116
|
+
ok: true,
|
|
117
|
+
dec_id: decId,
|
|
118
|
+
path: relativeInboxPath(decId, ctx.repoRoot),
|
|
119
|
+
warning: `Created draft from slug ${input.slug}. Status=draft, pending operator review via cairn-attention. ` +
|
|
120
|
+
`DO NOT enforce this rule yet — proposal only. You MAY cite as "proposed (${decId}, draft)".`,
|
|
121
|
+
};
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
function writeDraftToInbox(args) {
|
|
125
|
+
const inboxDir = join(decisionsDir(args.repoRoot), "_inbox");
|
|
126
|
+
mkdirSync(inboxDir, { recursive: true });
|
|
127
|
+
const abs = join(inboxDir, `${args.id}.draft.md`);
|
|
128
|
+
const now = new Date().toISOString();
|
|
129
|
+
const fm = {
|
|
130
|
+
id: args.id,
|
|
131
|
+
title: args.title,
|
|
132
|
+
type: "adr",
|
|
133
|
+
status: "draft",
|
|
134
|
+
audience: "dual",
|
|
135
|
+
generated: now,
|
|
136
|
+
"verified-at": now,
|
|
137
|
+
decided_at: now,
|
|
138
|
+
decided_by: DECIDED_BY,
|
|
139
|
+
sot_kind: "path",
|
|
140
|
+
sot_path: args.sot_path,
|
|
141
|
+
sot_content_hash: bodyContentHash(args.body),
|
|
142
|
+
capture_source: CAPTURE_SOURCE,
|
|
143
|
+
source_file: args.source_file,
|
|
144
|
+
};
|
|
145
|
+
const out = [];
|
|
146
|
+
out.push("---");
|
|
147
|
+
out.push(stringifyYaml(fm).trimEnd());
|
|
148
|
+
out.push("---");
|
|
149
|
+
out.push("");
|
|
150
|
+
out.push(args.body.trimEnd());
|
|
151
|
+
out.push("");
|
|
152
|
+
writeFileSync(abs, out.join("\n"), "utf8");
|
|
153
|
+
return abs;
|
|
154
|
+
}
|
|
155
|
+
function relativeInboxPath(id, _repoRoot) {
|
|
156
|
+
// Project-relative path so callers can hand it straight to Read or
|
|
157
|
+
// `cairn_decision_get` without prefix juggling.
|
|
158
|
+
return `.cairn/ground/decisions/_inbox/${id}.draft.md`;
|
|
159
|
+
}
|
|
160
|
+
function entryToSotPath(entry) {
|
|
161
|
+
const sot = entry.candidates.find((c) => c.file === entry.sot_source);
|
|
162
|
+
if (sot === undefined)
|
|
163
|
+
return entry.sot_source;
|
|
164
|
+
if (sot.anchor !== undefined && sot.anchor.length > 0) {
|
|
165
|
+
return `${entry.sot_source}#${sot.anchor}`;
|
|
166
|
+
}
|
|
167
|
+
return entry.sot_source;
|
|
168
|
+
}
|
|
169
|
+
function firstLineFallback(body) {
|
|
170
|
+
const first = body.split("\n").find((l) => l.trim().length > 0) ?? "";
|
|
171
|
+
return first.replace(/^#+\s*/, "").trim().slice(0, 120) || "(untitled)";
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Mirrors `phase 6`'s id allocator: derive a content-stable id, fall
|
|
175
|
+
* back to `<title> #N` suffixing on the (vanishingly rare) collision
|
|
176
|
+
* against an existing on-disk DEC.
|
|
177
|
+
*/
|
|
178
|
+
function allocateUniqueDecId(input, existingIds) {
|
|
179
|
+
const id = deriveDecId(input);
|
|
180
|
+
if (!existingIds.has(id)) {
|
|
181
|
+
existingIds.add(id);
|
|
182
|
+
return id;
|
|
183
|
+
}
|
|
184
|
+
for (let suffix = 2; suffix < 1_000; suffix += 1) {
|
|
185
|
+
const tagged = deriveDecId({ ...input, title: `${input.title} #${suffix}` });
|
|
186
|
+
if (!existingIds.has(tagged)) {
|
|
187
|
+
existingIds.add(tagged);
|
|
188
|
+
return tagged;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
existingIds.add(id);
|
|
192
|
+
return id;
|
|
193
|
+
}
|
|
194
|
+
export const proposeDecisionTool = {
|
|
195
|
+
name: "cairn_propose_decision",
|
|
196
|
+
description: "Promote a topic-index candidate (slug) to a DEC draft in `_inbox/`. Body is verbatim via readSotBody; AI may only supply a title. Refuses on rejected, drifted, or unreadable slugs. Returns a locked 'DO NOT enforce — proposal only' warning so the draft is never miscited as accepted policy.",
|
|
197
|
+
inputSchema: proposeDecisionInput,
|
|
198
|
+
handler,
|
|
199
|
+
};
|
|
200
|
+
//# sourceMappingURL=propose-decision.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"propose-decision.js","sourceRoot":"","sources":["../../../src/mcp/tools/propose-decision.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { join } from "node:path";
|
|
|
3
3
|
import { stringify as stringifyYaml } from "yaml";
|
|
4
4
|
import { computeDecisionId, scanExistingDecisionIds, } from "../../decision-capture/index.js";
|
|
5
5
|
import { writeInvalidationEvent } from "../../events/index.js";
|
|
6
|
-
import { decisionsDir } from "../../ground/index.js";
|
|
6
|
+
import { bodyContentHash, decisionsDir } from "../../ground/index.js";
|
|
7
7
|
import { DecisionAssertion } from "../../ground/index.js";
|
|
8
8
|
import { withWriteLock } from "../../lock.js";
|
|
9
9
|
import { requireBootstrap } from "../bootstrap-guard.js";
|
|
@@ -58,6 +58,7 @@ async function handler(ctx, input) {
|
|
|
58
58
|
const target = input.target ?? "inbox";
|
|
59
59
|
const outDir = target === "accepted" ? dir : inboxDir;
|
|
60
60
|
mkdirSync(outDir, { recursive: true });
|
|
61
|
+
const body = input.body_markdown ?? `# ${id} — ${input.title}\n\n## Summary\n\n${input.summary}\n`;
|
|
61
62
|
const frontmatter = {
|
|
62
63
|
id,
|
|
63
64
|
title: input.title,
|
|
@@ -68,13 +69,15 @@ async function handler(ctx, input) {
|
|
|
68
69
|
"verified-at": new Date().toISOString(),
|
|
69
70
|
decided_at: new Date().toISOString().slice(0, 10),
|
|
70
71
|
scope_globs: input.scope_globs,
|
|
72
|
+
sot_kind: "ledger",
|
|
73
|
+
sot_path: "ledger",
|
|
74
|
+
sot_content_hash: bodyContentHash(body),
|
|
71
75
|
...(input.supersedes !== undefined ? { supersedes: input.supersedes } : {}),
|
|
72
76
|
...(input.assertions !== undefined ? { assertions: input.assertions } : {}),
|
|
73
77
|
...(input.human_review_hint !== undefined
|
|
74
78
|
? { human_review_hint: input.human_review_hint }
|
|
75
79
|
: {}),
|
|
76
80
|
};
|
|
77
|
-
const body = input.body_markdown ?? `# ${id} — ${input.title}\n\n## Summary\n\n${input.summary}\n`;
|
|
78
81
|
const filename = target === "accepted" ? `${id}.md` : `${id}.draft.md`;
|
|
79
82
|
const path = join(outDir, filename);
|
|
80
83
|
const content = `---\n${stringifyYaml(frontmatter)}---\n\n${body}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-decision.js","sourceRoot":"","sources":["../../../src/mcp/tools/record-decision.ts"],"names":[],"mappings":"AAAA,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,EACL,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"record-decision.js","sourceRoot":"","sources":["../../../src/mcp/tools/record-decision.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `cairn_reject_candidate` — append a topic-index slug to
|
|
3
|
+
* `.cairn/ground/_rejected.yaml` so phase 6 / `cairn ingest` /
|
|
4
|
+
* `cairn_propose_decision` skip it on the next pass.
|
|
5
|
+
*
|
|
6
|
+
* Spec: PHASE_6_REDESIGN §4.6. Dedup by slug — first writer wins the
|
|
7
|
+
* `reason` string; subsequent writes only refresh `rejected_at`. The
|
|
8
|
+
* AI-curator path stamps `rejected_by: "ai-curator"`; operator-driven
|
|
9
|
+
* rejections (`cairn-attention` skill) reuse the same writer with
|
|
10
|
+
* `rejected_by: "operator"`.
|
|
11
|
+
*
|
|
12
|
+
* Refusal modes:
|
|
13
|
+
* - `not_found` — slug not present in the topic-index. We refuse so
|
|
14
|
+
* stale agent calls can't poison the rejection
|
|
15
|
+
* ledger with phantom slugs that the GC pass would
|
|
16
|
+
* immediately drop.
|
|
17
|
+
*/
|
|
18
|
+
import type { ToolDef } from "./types.js";
|
|
19
|
+
interface Input {
|
|
20
|
+
slug: string;
|
|
21
|
+
reason: string;
|
|
22
|
+
}
|
|
23
|
+
export declare const rejectCandidateTool: ToolDef<Input>;
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `cairn_reject_candidate` — append a topic-index slug to
|
|
3
|
+
* `.cairn/ground/_rejected.yaml` so phase 6 / `cairn ingest` /
|
|
4
|
+
* `cairn_propose_decision` skip it on the next pass.
|
|
5
|
+
*
|
|
6
|
+
* Spec: PHASE_6_REDESIGN §4.6. Dedup by slug — first writer wins the
|
|
7
|
+
* `reason` string; subsequent writes only refresh `rejected_at`. The
|
|
8
|
+
* AI-curator path stamps `rejected_by: "ai-curator"`; operator-driven
|
|
9
|
+
* rejections (`cairn-attention` skill) reuse the same writer with
|
|
10
|
+
* `rejected_by: "operator"`.
|
|
11
|
+
*
|
|
12
|
+
* Refusal modes:
|
|
13
|
+
* - `not_found` — slug not present in the topic-index. We refuse so
|
|
14
|
+
* stale agent calls can't poison the rejection
|
|
15
|
+
* ledger with phantom slugs that the GC pass would
|
|
16
|
+
* immediately drop.
|
|
17
|
+
*/
|
|
18
|
+
import { appendRejected, readRejectedYaml, readTopicIndex, writeRejectedYaml, } from "../../ground/index.js";
|
|
19
|
+
import { withWriteLock } from "../../lock.js";
|
|
20
|
+
import { requireBootstrap } from "../bootstrap-guard.js";
|
|
21
|
+
import { rejectCandidateInput } from "../schemas.js";
|
|
22
|
+
const REJECTED_BY = "ai-curator";
|
|
23
|
+
async function handler(ctx, input) {
|
|
24
|
+
const block = requireBootstrap(ctx.repoRoot);
|
|
25
|
+
if (block !== null)
|
|
26
|
+
return block;
|
|
27
|
+
return withWriteLock(ctx.repoRoot, () => {
|
|
28
|
+
const topicIndex = readTopicIndex(ctx.repoRoot);
|
|
29
|
+
const entry = topicIndex.topics[input.slug];
|
|
30
|
+
if (entry === undefined) {
|
|
31
|
+
return {
|
|
32
|
+
ok: false,
|
|
33
|
+
reason: "not_found",
|
|
34
|
+
detail: `slug "${input.slug}" not in topic-index`,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
const sot = entry.candidates.find((c) => c.file === entry.sot_source);
|
|
38
|
+
const now = new Date().toISOString();
|
|
39
|
+
const record = {
|
|
40
|
+
slug: input.slug,
|
|
41
|
+
rejected_at: now,
|
|
42
|
+
rejected_by: REJECTED_BY,
|
|
43
|
+
reason: input.reason,
|
|
44
|
+
sot_source: entry.sot_source,
|
|
45
|
+
...(sot?.line_range !== undefined ? { line_range: sot.line_range } : {}),
|
|
46
|
+
};
|
|
47
|
+
const current = readRejectedYaml(ctx.repoRoot);
|
|
48
|
+
const existing = current.get(input.slug);
|
|
49
|
+
const next = appendRejected(current, record);
|
|
50
|
+
writeRejectedYaml(ctx.repoRoot, next);
|
|
51
|
+
if (existing !== undefined) {
|
|
52
|
+
return {
|
|
53
|
+
ok: true,
|
|
54
|
+
slug: input.slug,
|
|
55
|
+
warning: `Slug ${input.slug} was already rejected by ${existing.rejected_by} (${existing.reason}). ` +
|
|
56
|
+
`Refreshed rejected_at; original reason preserved.`,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
ok: true,
|
|
61
|
+
slug: input.slug,
|
|
62
|
+
};
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
export const rejectCandidateTool = {
|
|
66
|
+
name: "cairn_reject_candidate",
|
|
67
|
+
description: "Mark a topic-index slug as not-a-decision in `.cairn/ground/_rejected.yaml`. Phase 6 / cairn ingest / cairn_propose_decision skip rejected slugs. Dedup by slug; first writer wins the reason string. Use when the candidate is research, narrative, plan, status, or otherwise not a binding rule.",
|
|
68
|
+
inputSchema: rejectCandidateInput,
|
|
69
|
+
handler,
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=reject-candidate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reject-candidate.js","sourceRoot":"","sources":["../../../src/mcp/tools/reject-candidate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,iBAAiB,GAElB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAgBrD,MAAM,WAAW,GAAG,YAAY,CAAC;AAEjC,KAAK,UAAU,OAAO,CAAC,GAAe,EAAE,KAAY;IAClD,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAEjC,OAAO,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE;QACtC,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,WAAW;gBACnB,MAAM,EAAE,SAAS,KAAK,CAAC,IAAI,sBAAsB;aAClB,CAAC;QACpC,CAAC;QAED,MAAM,GAAG,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,UAAU,CAAC,CAAC;QACtE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,MAAM,GAAkB;YAC5B,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,WAAW,EAAE,GAAG;YAChB,WAAW,EAAE,WAAW;YACxB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,GAAG,CAAC,GAAG,EAAE,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzE,CAAC;QAEF,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7C,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAEtC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO;gBACL,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,OAAO,EACL,QAAQ,KAAK,CAAC,IAAI,4BAA4B,QAAQ,CAAC,WAAW,KAAK,QAAQ,CAAC,MAAM,KAAK;oBAC3F,mDAAmD;aACtB,CAAC;QACpC,CAAC;QACD,OAAO;YACL,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,KAAK,CAAC,IAAI;SACe,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAmB;IACjD,IAAI,EAAE,wBAAwB;IAC9B,WAAW,EACT,qSAAqS;IACvS,WAAW,EAAE,oBAAoB;IACjC,OAAO;CACR,CAAC"}
|
|
@@ -22,11 +22,12 @@
|
|
|
22
22
|
*/
|
|
23
23
|
import { appendFileSync, existsSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, statSync, writeFileSync, } from "node:fs";
|
|
24
24
|
import { dirname, join } from "node:path";
|
|
25
|
+
import { writeFileSafe } from "../../fs.js";
|
|
25
26
|
import { createHash } from "node:crypto";
|
|
26
|
-
import {
|
|
27
|
+
import { stringify as stringifyYaml } from "yaml";
|
|
27
28
|
import { parseDraftMeta, restoreDec, runDecSourceStrip, } from "../../attention/index.js";
|
|
28
29
|
import { writeInvalidationEvent } from "../../events/index.js";
|
|
29
|
-
import { alignmentPendingDir, archivedConflictsDir, bindDec, bodyContentHash, conflictsDir, decisionsDir, deleteSotCacheEntry, deriveLedgerDecId, deriveLedgerInvId,
|
|
30
|
+
import { alignmentPendingDir, archivedConflictsDir, bindDec, bodyContentHash, conflictsDir, decisionsDir, deleteSotCacheEntry, deriveLedgerDecId, deriveLedgerInvId, invariantsDir, parseFrontmatterRecord, readSotBindings, readSotCache, recordDriftEvent, setSotCacheEntry, unbindDec, writeSotBindings, writeSotCache, } from "../../ground/index.js";
|
|
30
31
|
import { tokenize } from "../../text/jaccard.js";
|
|
31
32
|
import { applyStripReplace, formatBareCitation, } from "../../init/source-comments/index.js";
|
|
32
33
|
import { writeDecisionsLedger, writeInvariantsLedger } from "../../ground/ledgers.js";
|
|
@@ -323,20 +324,7 @@ function parseConflictFile(repoRoot, itemId) {
|
|
|
323
324
|
catch {
|
|
324
325
|
return null;
|
|
325
326
|
}
|
|
326
|
-
const
|
|
327
|
-
let fm = {};
|
|
328
|
-
if (fmMatch !== null && fmMatch[1] !== undefined) {
|
|
329
|
-
try {
|
|
330
|
-
const parsed = parseYaml(fmMatch[1]);
|
|
331
|
-
if (typeof parsed === "object" && parsed !== null) {
|
|
332
|
-
fm = parsed;
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
catch {
|
|
336
|
-
/* best-effort */
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
const body = fmMatch !== null ? raw.slice(fmMatch[0].length) : raw;
|
|
327
|
+
const { fm, body } = parseFrontmatterRecord(raw);
|
|
340
328
|
const aId = String(fm["a_id"] ?? itemId.split("__")[0] ?? "");
|
|
341
329
|
const bId = String(fm["b_id"] ?? itemId.split("__")[1] ?? "");
|
|
342
330
|
if (!CONFLICT_ID_RE.test(aId) || !CONFLICT_ID_RE.test(bId))
|
|
@@ -361,20 +349,7 @@ function readEntity(ref) {
|
|
|
361
349
|
catch {
|
|
362
350
|
return null;
|
|
363
351
|
}
|
|
364
|
-
const
|
|
365
|
-
let fm = {};
|
|
366
|
-
if (fmMatch !== null && fmMatch[1] !== undefined) {
|
|
367
|
-
try {
|
|
368
|
-
const parsed = parseYaml(fmMatch[1]);
|
|
369
|
-
if (typeof parsed === "object" && parsed !== null) {
|
|
370
|
-
fm = parsed;
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
catch {
|
|
374
|
-
/* best-effort */
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
const body = fmMatch !== null ? raw.slice(fmMatch[0].length) : raw;
|
|
352
|
+
const { fm, body } = parseFrontmatterRecord(raw);
|
|
378
353
|
return { fm, body, raw };
|
|
379
354
|
}
|
|
380
355
|
function writeEntity(ref, fm, body) {
|
|
@@ -516,8 +491,6 @@ function cleanLosersFromSotState(repoRoot, losers) {
|
|
|
516
491
|
*/
|
|
517
492
|
function bindAndCacheMergedEntity(repoRoot, mergedId, mergedBody) {
|
|
518
493
|
let bindings = readSotBindings(repoRoot);
|
|
519
|
-
if (Object.keys(bindings.forward).length === 0)
|
|
520
|
-
bindings = emptySotBindings();
|
|
521
494
|
bindings = bindDec(bindings, mergedId, "ledger");
|
|
522
495
|
try {
|
|
523
496
|
writeSotBindings(repoRoot, bindings);
|
|
@@ -526,8 +499,6 @@ function bindAndCacheMergedEntity(repoRoot, mergedId, mergedBody) {
|
|
|
526
499
|
log.warn({ err: err instanceof Error ? err.message : String(err) }, "sot-bindings rewrite failed for merged entity");
|
|
527
500
|
}
|
|
528
501
|
let cache = readSotCache(repoRoot);
|
|
529
|
-
if (Object.keys(cache.entries).length === 0)
|
|
530
|
-
cache = emptySotCache();
|
|
531
502
|
cache = setSotCacheEntry(cache, mergedId, {
|
|
532
503
|
dec_id: mergedId,
|
|
533
504
|
sot_path: "ledger",
|
|
@@ -556,20 +527,7 @@ function loadAlignmentPending(repoRoot, itemId) {
|
|
|
556
527
|
catch {
|
|
557
528
|
return null;
|
|
558
529
|
}
|
|
559
|
-
const
|
|
560
|
-
let fm = {};
|
|
561
|
-
if (fmMatch !== null && fmMatch[1] !== undefined) {
|
|
562
|
-
try {
|
|
563
|
-
const parsed = parseYaml(fmMatch[1]);
|
|
564
|
-
if (typeof parsed === "object" && parsed !== null) {
|
|
565
|
-
fm = parsed;
|
|
566
|
-
}
|
|
567
|
-
}
|
|
568
|
-
catch {
|
|
569
|
-
/* best-effort */
|
|
570
|
-
}
|
|
571
|
-
}
|
|
572
|
-
const body = fmMatch !== null ? raw.slice(fmMatch[0].length) : raw;
|
|
530
|
+
const { fm, body } = parseFrontmatterRecord(raw);
|
|
573
531
|
// Block prose lives between the first ```/``` fence pair under the
|
|
574
532
|
// "## Block ..." heading. Pick the first fenced block.
|
|
575
533
|
const blockMatch = body.match(/##\s+Block[^\n]*\n+```\n([\s\S]*?)\n```/);
|
|
@@ -834,13 +792,9 @@ function emitFreshDec(repoRoot, args) {
|
|
|
834
792
|
mkdirSync(dir, { recursive: true });
|
|
835
793
|
writeFileSync(abs, `---\n${stringifyYaml(fm).trimEnd()}\n---\n\n${trimmed}\n`, "utf8");
|
|
836
794
|
let bindings = readSotBindings(repoRoot);
|
|
837
|
-
if (Object.keys(bindings.forward).length === 0)
|
|
838
|
-
bindings = emptySotBindings();
|
|
839
795
|
bindings = bindDec(bindings, id, "ledger");
|
|
840
796
|
writeSotBindings(repoRoot, bindings);
|
|
841
797
|
let cache = readSotCache(repoRoot);
|
|
842
|
-
if (Object.keys(cache.entries).length === 0)
|
|
843
|
-
cache = emptySotCache();
|
|
844
798
|
cache = setSotCacheEntry(cache, id, {
|
|
845
799
|
dec_id: id,
|
|
846
800
|
sot_path: "ledger",
|
|
@@ -1058,8 +1012,7 @@ function mergeConflict(repoRoot, conflict, rationale) {
|
|
|
1058
1012
|
mergedFm["decided_at"] = now;
|
|
1059
1013
|
mergedFm["decided_by"] = "cairn-conflict-merge";
|
|
1060
1014
|
}
|
|
1061
|
-
|
|
1062
|
-
writeFileSync(mergedAbs, `---\n${stringifyYaml(mergedFm).trimEnd()}\n---\n${mergedBody}`, "utf8");
|
|
1015
|
+
writeFileSafe(mergedAbs, `---\n${stringifyYaml(mergedFm).trimEnd()}\n---\n${mergedBody}`);
|
|
1063
1016
|
// Both old entries get superseded_by → new merged id.
|
|
1064
1017
|
setSupersededBy(repoRoot, conflict.aRef, mergedId, "superseded");
|
|
1065
1018
|
setSupersededBy(repoRoot, conflict.bRef, mergedId, "superseded");
|