@magic-spells/constellation 0.1.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/LICENSE +674 -0
- package/README.md +147 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +127 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/extract.d.ts +9 -0
- package/dist/core/extract.js +56 -0
- package/dist/core/extract.js.map +1 -0
- package/dist/core/handles.d.ts +13 -0
- package/dist/core/handles.js +45 -0
- package/dist/core/handles.js.map +1 -0
- package/dist/core/index.d.ts +8 -0
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/indexer.d.ts +3 -0
- package/dist/core/indexer.js +209 -0
- package/dist/core/indexer.js.map +1 -0
- package/dist/core/lint.d.ts +9 -0
- package/dist/core/lint.js +19 -0
- package/dist/core/lint.js.map +1 -0
- package/dist/core/parse.d.ts +7 -0
- package/dist/core/parse.js +19 -0
- package/dist/core/parse.js.map +1 -0
- package/dist/core/resolve.d.ts +12 -0
- package/dist/core/resolve.js +57 -0
- package/dist/core/resolve.js.map +1 -0
- package/dist/core/scaffold.d.ts +3 -0
- package/dist/core/scaffold.js +36 -0
- package/dist/core/scaffold.js.map +1 -0
- package/dist/core/types.d.ts +50 -0
- package/dist/core/types.js +5 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/validate.d.ts +6 -0
- package/dist/core/validate.js +64 -0
- package/dist/core/validate.js.map +1 -0
- package/dist/core/writer.d.ts +34 -0
- package/dist/core/writer.js +170 -0
- package/dist/core/writer.js.map +1 -0
- package/dist/mcp/git.d.ts +34 -0
- package/dist/mcp/git.js +172 -0
- package/dist/mcp/git.js.map +1 -0
- package/dist/mcp/search.d.ts +11 -0
- package/dist/mcp/search.js +52 -0
- package/dist/mcp/search.js.map +1 -0
- package/dist/mcp/server.d.ts +7 -0
- package/dist/mcp/server.js +684 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/serve/server.d.ts +12 -0
- package/dist/serve/server.js +281 -0
- package/dist/serve/server.js.map +1 -0
- package/docs/001-file-format.md +222 -0
- package/docs/002-mcp.md +109 -0
- package/examples/constellation/agent/AGENT-CODE-STYLE.md +14 -0
- package/examples/constellation/api/API-TICKETS.md +24 -0
- package/examples/constellation/component/COMPONENT-TICKET-CARD.md +16 -0
- package/examples/constellation/datatype/DATATYPE-CREATE-TICKET-INPUT.md +15 -0
- package/examples/constellation/datatype/DATATYPE-TICKET.md +20 -0
- package/examples/constellation/db/DB-TICKETS.md +21 -0
- package/examples/constellation/diagram/DIAGRAM-SYSTEM-OVERVIEW.md +19 -0
- package/examples/constellation/doc/DOC-TICKET-LIFECYCLE.md +22 -0
- package/examples/constellation/event/EVENT-TICKET-CREATED.md +13 -0
- package/examples/constellation/external/EXTERNAL-EMAIL-PROVIDER.md +13 -0
- package/examples/constellation/file/FILE-TICKETS-ROUTE.md +12 -0
- package/examples/constellation/flow/FLOW-CREATE-TICKET.md +16 -0
- package/examples/constellation/job/JOB-AUTO-ASSIGN.md +15 -0
- package/examples/constellation/page/PAGE-INBOX.md +19 -0
- package/examples/constellation/plan.md +23 -0
- package/examples/constellation/role/ROLE-SUPPORT-AGENT.md +12 -0
- package/examples/constellation/state/STATE-TICKET.md +31 -0
- package/examples/constellation/test/TEST-CREATE-TICKET.md +17 -0
- package/package.json +80 -0
- package/schemas/agent.json +21 -0
- package/schemas/api.json +47 -0
- package/schemas/card.json +37 -0
- package/schemas/component.json +40 -0
- package/schemas/datatype.json +8 -0
- package/schemas/db.json +51 -0
- package/schemas/diagram.json +95 -0
- package/schemas/doc.json +8 -0
- package/schemas/event.json +28 -0
- package/schemas/external.json +24 -0
- package/schemas/file.json +22 -0
- package/schemas/flow.json +20 -0
- package/schemas/job.json +25 -0
- package/schemas/page.json +36 -0
- package/schemas/plan.json +13 -0
- package/schemas/role.json +18 -0
- package/schemas/state.json +35 -0
- package/schemas/test.json +13 -0
- package/skill/SKILL.md +105 -0
- package/skill/types/agent.md +26 -0
- package/skill/types/api.md +38 -0
- package/skill/types/component.md +30 -0
- package/skill/types/datatype.md +26 -0
- package/skill/types/db.md +33 -0
- package/skill/types/diagram.md +32 -0
- package/skill/types/doc.md +23 -0
- package/skill/types/event.md +31 -0
- package/skill/types/external.md +30 -0
- package/skill/types/file.md +28 -0
- package/skill/types/flow.md +29 -0
- package/skill/types/job.md +27 -0
- package/skill/types/page.md +28 -0
- package/skill/types/plan.md +37 -0
- package/skill/types/role.md +25 -0
- package/skill/types/state.md +38 -0
- package/skill/types/test.md +28 -0
- package/viewer/dist/assets/arc-Kj6pF3JI.js +1 -0
- package/viewer/dist/assets/architecture-7EHR7CIX-CGfWeim3.js +1 -0
- package/viewer/dist/assets/architectureDiagram-3BPJPVTR-C5bZdErB.js +36 -0
- package/viewer/dist/assets/array-BifhSqXX.js +1 -0
- package/viewer/dist/assets/blockDiagram-GPEHLZMM-C1Q6l6fE.js +132 -0
- package/viewer/dist/assets/c4Diagram-AAUBKEIU-BmM6Tmtq.js +10 -0
- package/viewer/dist/assets/channel-19IdUS_c.js +1 -0
- package/viewer/dist/assets/chunk-2J33WTMH-z09tLTpZ.js +1 -0
- package/viewer/dist/assets/chunk-3OPIFGDE-BynpXh1r.js +62 -0
- package/viewer/dist/assets/chunk-4BX2VUAB-CDOVuPyG.js +1 -0
- package/viewer/dist/assets/chunk-55IACEB6-nBwigOgn.js +1 -0
- package/viewer/dist/assets/chunk-5ZQYHXKU-Bxe5xIy_.js +2 -0
- package/viewer/dist/assets/chunk-727SXJPM-DZmTgL68.js +206 -0
- package/viewer/dist/assets/chunk-AQP2D5EJ-B7wr_Owx.js +231 -0
- package/viewer/dist/assets/chunk-BSJP7CBP-DbAKfVCK.js +1 -0
- package/viewer/dist/assets/chunk-CSCIHK7Q-C0rsBwqP.js +124 -0
- package/viewer/dist/assets/chunk-FMBD7UC4-BAtzt0wv.js +15 -0
- package/viewer/dist/assets/chunk-KSCS5N6A-CXXwf52I.js +10 -0
- package/viewer/dist/assets/chunk-L5ZTLDWV-DS4vRI1U.js +1 -0
- package/viewer/dist/assets/chunk-LZXEDZCA-CclT9MXr.js +2 -0
- package/viewer/dist/assets/chunk-ND2GUHAM-CUSnPl8t.js +1 -0
- package/viewer/dist/assets/chunk-NNHCCRGN-DlpIbxXb.js +159 -0
- package/viewer/dist/assets/chunk-NZK2D7GU-Dh986nJk.js +1 -0
- package/viewer/dist/assets/chunk-O5CBEL6O-JAEZ_pS6.js +70 -0
- package/viewer/dist/assets/chunk-QZHKN3VN-BKc_Kg2Z.js +1 -0
- package/viewer/dist/assets/chunk-WU5MYG2G-9ssTSMzt.js +1 -0
- package/viewer/dist/assets/chunk-XPW4576I-BwMZI0gv.js +32 -0
- package/viewer/dist/assets/classDiagram-4FO5ZUOK-DXv85WFd.js +1 -0
- package/viewer/dist/assets/classDiagram-v2-Q7XG4LA2-DXv85WFd.js +1 -0
- package/viewer/dist/assets/cose-bilkent-S5V4N54A-NGC7gYHM.js +1 -0
- package/viewer/dist/assets/cytoscape.esm-h6BdjjI9.js +321 -0
- package/viewer/dist/assets/dagre-BM42HDAG-RD63uyvd.js +4 -0
- package/viewer/dist/assets/dagre-Bx709z4p.js +1 -0
- package/viewer/dist/assets/defaultLocale-C8Fc0cco.js +1 -0
- package/viewer/dist/assets/diagram-2AECGRRQ-hwnqqCcb.js +43 -0
- package/viewer/dist/assets/diagram-5GNKFQAL-q8EaoZSG.js +10 -0
- package/viewer/dist/assets/diagram-KO2AKTUF-D4_5Qf-l.js +3 -0
- package/viewer/dist/assets/diagram-LMA3HP47-D8pwekFs.js +24 -0
- package/viewer/dist/assets/diagram-OG6HWLK6-D9KinIWZ.js +24 -0
- package/viewer/dist/assets/dist-CFOOgrqc.js +1 -0
- package/viewer/dist/assets/erDiagram-TEJ5UH35-D0Wfq250.js +85 -0
- package/viewer/dist/assets/eventmodeling-FCH6USID-D3KRSuC1.js +1 -0
- package/viewer/dist/assets/flowDiagram-I6XJVG4X-Y2DY-Ze2.js +162 -0
- package/viewer/dist/assets/ganttDiagram-6RSMTGT7-BnqkeLVw.js +292 -0
- package/viewer/dist/assets/gitGraph-WXDBUCRP-Cft7usRT.js +1 -0
- package/viewer/dist/assets/gitGraphDiagram-PVQCEYII-D-cYtraK.js +106 -0
- package/viewer/dist/assets/graphlib-B8gBHxth.js +1 -0
- package/viewer/dist/assets/index-CDR-riG2.css +2 -0
- package/viewer/dist/assets/index-DRPsTWe2.js +98 -0
- package/viewer/dist/assets/info-J43DQDTF-Djc8Bx3F.js +1 -0
- package/viewer/dist/assets/infoDiagram-5YYISTIA-D-ehtyyJ.js +2 -0
- package/viewer/dist/assets/init-D6jRqBbL.js +1 -0
- package/viewer/dist/assets/ishikawaDiagram-YF4QCWOH-Ct3f6bH-.js +70 -0
- package/viewer/dist/assets/journeyDiagram-JHISSGLW-DXlULEmi.js +139 -0
- package/viewer/dist/assets/kanban-definition-UN3LZRKU-3vE9h-R7.js +89 -0
- package/viewer/dist/assets/katex-Vhh-h91d.js +257 -0
- package/viewer/dist/assets/line-B8MygbLB.js +1 -0
- package/viewer/dist/assets/linear-CfMuM0B3.js +1 -0
- package/viewer/dist/assets/mermaid-parser.core-DzlZTbbh.js +4 -0
- package/viewer/dist/assets/mermaid.core-IM-sPiyq.js +9 -0
- package/viewer/dist/assets/mindmap-definition-RKZ34NQL-CMnpAq1T.js +96 -0
- package/viewer/dist/assets/ordinal-hYBb2elL.js +1 -0
- package/viewer/dist/assets/packet-YPE3B663-D44AzgHh.js +1 -0
- package/viewer/dist/assets/path-BWPyau1x.js +1 -0
- package/viewer/dist/assets/pie-LRSECV5Y-DL8AVJH_.js +1 -0
- package/viewer/dist/assets/pieDiagram-4H26LBE5-FvKK5jd7.js +30 -0
- package/viewer/dist/assets/quadrantDiagram-W4KKPZXB-CmjSkU8c.js +7 -0
- package/viewer/dist/assets/radar-GUYGQ44K-BvfZTVyH.js +1 -0
- package/viewer/dist/assets/requirementDiagram-4Y6WPE33-BOjca3VH.js +84 -0
- package/viewer/dist/assets/rough.esm-CSKSodPl.js +1 -0
- package/viewer/dist/assets/sankeyDiagram-5OEKKPKP-ANcjfNix.js +40 -0
- package/viewer/dist/assets/sequenceDiagram-3UESZ5HK-BLQ9AL7I.js +162 -0
- package/viewer/dist/assets/src-CAMdANUp.js +1 -0
- package/viewer/dist/assets/stateDiagram-AJRCARHV-D6CriBS6.js +1 -0
- package/viewer/dist/assets/stateDiagram-v2-BHNVJYJU-DcTp66RQ.js +1 -0
- package/viewer/dist/assets/timeline-definition-PNZ67QCA-BNhWZ_DL.js +120 -0
- package/viewer/dist/assets/treeView-BLDUP644-CY6Ph5Pu.js +1 -0
- package/viewer/dist/assets/treemap-LRROVOQU-DChSA_Qx.js +1 -0
- package/viewer/dist/assets/vennDiagram-CIIHVFJN-C01WznAC.js +34 -0
- package/viewer/dist/assets/wardley-L42UT6IY-BJ8uNoJu.js +1 -0
- package/viewer/dist/assets/wardleyDiagram-YWT4CUSO-DwDEzlVm.js +78 -0
- package/viewer/dist/assets/xychartDiagram-2RQKCTM6-BCvIDwU0.js +7 -0
- package/viewer/dist/index.html +20 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexer.js","sourceRoot":"","sources":["../../src/core/indexer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Issue, PlanIndex } from './types.js';
|
|
2
|
+
export interface LintResult {
|
|
3
|
+
index: PlanIndex;
|
|
4
|
+
issues: Issue[];
|
|
5
|
+
errors: Issue[];
|
|
6
|
+
warnings: Issue[];
|
|
7
|
+
}
|
|
8
|
+
/** Structural checks (indexer) + schema validation, sorted by file then code. */
|
|
9
|
+
export declare function lintPlan(root: string): Promise<LintResult>;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { loadPlan } from './indexer.js';
|
|
2
|
+
import { loadSchemas } from './validate.js';
|
|
3
|
+
/** Structural checks (indexer) + schema validation, sorted by file then code. */
|
|
4
|
+
export async function lintPlan(root) {
|
|
5
|
+
const index = await loadPlan(root);
|
|
6
|
+
const schemas = await loadSchemas();
|
|
7
|
+
const issues = [...index.issues];
|
|
8
|
+
for (const card of index.cards.values()) {
|
|
9
|
+
issues.push(...schemas.validateCard(card));
|
|
10
|
+
}
|
|
11
|
+
issues.sort((x, y) => x.file.localeCompare(y.file) || x.code.localeCompare(y.code));
|
|
12
|
+
return {
|
|
13
|
+
index,
|
|
14
|
+
issues,
|
|
15
|
+
errors: issues.filter((i) => i.severity === 'error'),
|
|
16
|
+
warnings: issues.filter((i) => i.severity === 'warning'),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=lint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/core/lint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAU5C,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY;IACzC,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,MAAM,WAAW,EAAE,CAAC;IAEpC,MAAM,MAAM,GAAY,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,IAAI,CACT,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CACvE,CAAC;IAEF,OAAO;QACL,KAAK;QACL,MAAM;QACN,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC;QACpD,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC;KACzD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import matter from 'gray-matter';
|
|
2
|
+
export function parseFile(raw) {
|
|
3
|
+
try {
|
|
4
|
+
const parsed = matter(raw);
|
|
5
|
+
const data = parsed.data;
|
|
6
|
+
const frontmatter = data && typeof data === 'object' && !Array.isArray(data)
|
|
7
|
+
? data
|
|
8
|
+
: {};
|
|
9
|
+
return { frontmatter, body: parsed.content };
|
|
10
|
+
}
|
|
11
|
+
catch (err) {
|
|
12
|
+
return {
|
|
13
|
+
frontmatter: {},
|
|
14
|
+
body: raw,
|
|
15
|
+
yamlError: err instanceof Error ? err.message.split('\n')[0] : String(err),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/core/parse.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AASjC,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACzB,MAAM,WAAW,GACf,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YACtD,CAAC,CAAE,IAAgC;YACnC,CAAC,CAAC,EAAE,CAAC;QACT,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,WAAW,EAAE,EAAE;YACf,IAAI,EAAE,GAAG;YACT,SAAS,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SAC3E,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Find the plan folder. With a target: the target itself or target/constellation.
|
|
3
|
+
* Without: walk up from cwd looking for constellation/, bounded by the repo root.
|
|
4
|
+
*/
|
|
5
|
+
export declare function resolvePlanDir(target?: string): Promise<string | null>;
|
|
6
|
+
/**
|
|
7
|
+
* Walk up from `startDir` for a `constellation/` folder, stopping at the repo
|
|
8
|
+
* root (the first ancestor containing `.git`). Returns null rather than crossing
|
|
9
|
+
* the repo boundary, so a repo with no plan never adopts a sibling repo's plan.
|
|
10
|
+
*/
|
|
11
|
+
export declare function findPlanUp(startDir: string): Promise<string | null>;
|
|
12
|
+
export declare function exists(p: string): Promise<boolean>;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { access, stat } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import process from 'node:process';
|
|
4
|
+
/**
|
|
5
|
+
* Find the plan folder. With a target: the target itself or target/constellation.
|
|
6
|
+
* Without: walk up from cwd looking for constellation/, bounded by the repo root.
|
|
7
|
+
*/
|
|
8
|
+
export async function resolvePlanDir(target) {
|
|
9
|
+
if (target) {
|
|
10
|
+
const abs = path.resolve(target);
|
|
11
|
+
const nested = path.join(abs, 'constellation');
|
|
12
|
+
if (await isDirectory(nested))
|
|
13
|
+
return nested;
|
|
14
|
+
if (await isDirectory(abs))
|
|
15
|
+
return abs;
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
return findPlanUp(process.cwd());
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Walk up from `startDir` for a `constellation/` folder, stopping at the repo
|
|
22
|
+
* root (the first ancestor containing `.git`). Returns null rather than crossing
|
|
23
|
+
* the repo boundary, so a repo with no plan never adopts a sibling repo's plan.
|
|
24
|
+
*/
|
|
25
|
+
export async function findPlanUp(startDir) {
|
|
26
|
+
let dir = path.resolve(startDir);
|
|
27
|
+
for (;;) {
|
|
28
|
+
const candidate = path.join(dir, 'constellation');
|
|
29
|
+
if (await exists(candidate))
|
|
30
|
+
return candidate;
|
|
31
|
+
// Stop at the repo root — never ascend past it into another repo.
|
|
32
|
+
if (await exists(path.join(dir, '.git')))
|
|
33
|
+
return null;
|
|
34
|
+
const parent = path.dirname(dir);
|
|
35
|
+
if (parent === dir)
|
|
36
|
+
return null;
|
|
37
|
+
dir = parent;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export async function exists(p) {
|
|
41
|
+
try {
|
|
42
|
+
await access(p);
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async function isDirectory(p) {
|
|
50
|
+
try {
|
|
51
|
+
return (await stat(p)).isDirectory();
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/core/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAe;IAClD,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;QAC/C,IAAI,MAAM,WAAW,CAAC,MAAM,CAAC;YAAE,OAAO,MAAM,CAAC;QAC7C,IAAI,MAAM,WAAW,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AACnC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjC,SAAS,CAAC;QACR,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;QAClD,IAAI,MAAM,MAAM,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;QAC9C,kEAAkE;QAClE,IAAI,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAChC,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,CAAS;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,CAAS;IAClC,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare const STARTER_PLAN = "---\nname: Project plan\n---\n\n# Project Plan\n\n## Current state\n\n- (what exists, what is in flight)\n\n## Conventions\n\n- (project-wide rules cards should follow)\n\n## Last synced\n\nCode has not been reconciled against this plan yet.\n";
|
|
2
|
+
/** Create constellation/ with a starter plan.md. Throws if it already exists. */
|
|
3
|
+
export declare function initPlan(targetDir: string): Promise<string>;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { access, mkdir, writeFile } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
export const STARTER_PLAN = `---
|
|
4
|
+
name: Project plan
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Project Plan
|
|
8
|
+
|
|
9
|
+
## Current state
|
|
10
|
+
|
|
11
|
+
- (what exists, what is in flight)
|
|
12
|
+
|
|
13
|
+
## Conventions
|
|
14
|
+
|
|
15
|
+
- (project-wide rules cards should follow)
|
|
16
|
+
|
|
17
|
+
## Last synced
|
|
18
|
+
|
|
19
|
+
Code has not been reconciled against this plan yet.
|
|
20
|
+
`;
|
|
21
|
+
/** Create constellation/ with a starter plan.md. Throws if it already exists. */
|
|
22
|
+
export async function initPlan(targetDir) {
|
|
23
|
+
const root = path.resolve(targetDir, 'constellation');
|
|
24
|
+
try {
|
|
25
|
+
await access(root);
|
|
26
|
+
throw new Error(`${root} already exists`);
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
if (err instanceof Error && err.message.endsWith('already exists'))
|
|
30
|
+
throw err;
|
|
31
|
+
}
|
|
32
|
+
await mkdir(root, { recursive: true });
|
|
33
|
+
await writeFile(path.join(root, 'plan.md'), STARTER_PLAN, { flag: 'wx' });
|
|
34
|
+
return root;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=scaffold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/core/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;CAiB3B,CAAC;AAEF,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,SAAiB;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IACtD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,iBAAiB,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YAAE,MAAM,GAAG,CAAC;IAChF,CAAC;IACD,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1E,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export declare const TYPE_NAMES: readonly ["API", "DB", "DATATYPE", "ROLE", "DOC", "FILE", "TEST", "EXTERNAL", "EVENT", "COMPONENT", "PAGE", "JOB", "FLOW", "STATE", "DIAGRAM", "AGENT", "PLAN"];
|
|
2
|
+
export type TypeName = (typeof TYPE_NAMES)[number];
|
|
3
|
+
export interface CardRefs {
|
|
4
|
+
/** Handles listed in the frontmatter `connections` key. */
|
|
5
|
+
connections: string[];
|
|
6
|
+
/** Handle-shaped values found elsewhere in frontmatter (e.g. response_schema). */
|
|
7
|
+
frontmatter: string[];
|
|
8
|
+
/** [[HANDLE]] wiki-links in the body. */
|
|
9
|
+
body: string[];
|
|
10
|
+
/** Handle-shaped identifiers inside ```mermaid blocks. */
|
|
11
|
+
mermaid: string[];
|
|
12
|
+
}
|
|
13
|
+
export interface Card {
|
|
14
|
+
handle: string;
|
|
15
|
+
type: TypeName;
|
|
16
|
+
/** Path relative to the plan root, e.g. api/API-TICKETS.md */
|
|
17
|
+
relPath: string;
|
|
18
|
+
/** Absolute path on disk. */
|
|
19
|
+
filePath: string;
|
|
20
|
+
frontmatter: Record<string, unknown>;
|
|
21
|
+
body: string;
|
|
22
|
+
name?: string;
|
|
23
|
+
kind?: string;
|
|
24
|
+
status?: string;
|
|
25
|
+
refs: CardRefs;
|
|
26
|
+
}
|
|
27
|
+
/** Undirected connection; endpoints are stored in sorted order so each pair is unique. */
|
|
28
|
+
export interface Connection {
|
|
29
|
+
a: string;
|
|
30
|
+
b: string;
|
|
31
|
+
}
|
|
32
|
+
export type Severity = 'error' | 'warning';
|
|
33
|
+
export interface Issue {
|
|
34
|
+
severity: Severity;
|
|
35
|
+
code: string;
|
|
36
|
+
message: string;
|
|
37
|
+
/** Path relative to the plan root. */
|
|
38
|
+
file: string;
|
|
39
|
+
}
|
|
40
|
+
export interface PlanIndex {
|
|
41
|
+
/** Absolute path of the plan root (the constellation/ folder). */
|
|
42
|
+
root: string;
|
|
43
|
+
/** Cards by handle. */
|
|
44
|
+
cards: Map<string, Card>;
|
|
45
|
+
connections: Connection[];
|
|
46
|
+
/** handle -> set of connected handles (both directions). */
|
|
47
|
+
connectedHandles: Map<string, Set<string>>;
|
|
48
|
+
/** Structural issues found while loading (E001–E006, W001, W004). */
|
|
49
|
+
issues: Issue[];
|
|
50
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO;IAC3E,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM;CAC/D,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Card, Issue } from './types.js';
|
|
2
|
+
export interface SchemaSet {
|
|
3
|
+
/** Schema-violation (W002) and unknown-field (W003) issues for one card. */
|
|
4
|
+
validateCard(card: Card): Issue[];
|
|
5
|
+
}
|
|
6
|
+
export declare function loadSchemas(schemasDir?: string): Promise<SchemaSet>;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { readdir, readFile } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { createRequire } from 'node:module';
|
|
5
|
+
import { TYPE_FOLDERS } from './handles.js';
|
|
6
|
+
// ajv ships CJS; createRequire sidesteps ESM default-export interop quirks.
|
|
7
|
+
const require = createRequire(import.meta.url);
|
|
8
|
+
const ajvModule = require('ajv/dist/2020.js');
|
|
9
|
+
const Ajv2020 = ajvModule.default ?? ajvModule;
|
|
10
|
+
const RESERVED_KEYS = ['name', 'kind', 'status', 'connections'];
|
|
11
|
+
export async function loadSchemas(schemasDir) {
|
|
12
|
+
const dir = schemasDir ?? path.join(fileURLToPath(new URL('../..', import.meta.url)), 'schemas');
|
|
13
|
+
const ajv = new Ajv2020({ allErrors: true, allowUnionTypes: true });
|
|
14
|
+
const files = (await readdir(dir)).filter((f) => f.endsWith('.json'));
|
|
15
|
+
const raw = new Map();
|
|
16
|
+
for (const file of files) {
|
|
17
|
+
const schema = JSON.parse(await readFile(path.join(dir, file), 'utf8'));
|
|
18
|
+
raw.set(file, schema);
|
|
19
|
+
ajv.addSchema(schema, file);
|
|
20
|
+
}
|
|
21
|
+
const cardValidator = ajv.getSchema('card.json');
|
|
22
|
+
const typeValidators = new Map();
|
|
23
|
+
const knownKeys = new Map();
|
|
24
|
+
for (const [type, folder] of Object.entries(TYPE_FOLDERS)) {
|
|
25
|
+
const file = `${folder}.json`;
|
|
26
|
+
const schema = raw.get(file);
|
|
27
|
+
if (!schema)
|
|
28
|
+
continue;
|
|
29
|
+
typeValidators.set(type, ajv.getSchema(file));
|
|
30
|
+
const props = Object.keys(schema.properties ?? {});
|
|
31
|
+
knownKeys.set(type, new Set([...RESERVED_KEYS, ...props]));
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
validateCard(card) {
|
|
35
|
+
const issues = [];
|
|
36
|
+
const validators = [cardValidator, typeValidators.get(card.type)].filter(Boolean);
|
|
37
|
+
for (const validate of validators) {
|
|
38
|
+
if (!validate(card.frontmatter)) {
|
|
39
|
+
for (const err of validate.errors ?? []) {
|
|
40
|
+
issues.push({
|
|
41
|
+
severity: 'warning',
|
|
42
|
+
code: 'W002',
|
|
43
|
+
message: `Frontmatter${err.instancePath || ''} ${err.message ?? 'is invalid'}`,
|
|
44
|
+
file: card.relPath,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const known = knownKeys.get(card.type) ?? new Set(RESERVED_KEYS);
|
|
50
|
+
for (const key of Object.keys(card.frontmatter)) {
|
|
51
|
+
if (!known.has(key)) {
|
|
52
|
+
issues.push({
|
|
53
|
+
severity: 'warning',
|
|
54
|
+
code: 'W003',
|
|
55
|
+
message: `Unknown frontmatter field for ${card.type}: ${key}`,
|
|
56
|
+
file: card.relPath,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return issues;
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/core/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export declare function reservedFieldKeys(fields?: Record<string, unknown>): string[];
|
|
2
|
+
/**
|
|
3
|
+
* Deep-merge a patch into a frontmatter object. Plain objects merge recursively,
|
|
4
|
+
* arrays replace wholesale, explicit null deletes the key. Returns a new object
|
|
5
|
+
* preserving the target's key order (new keys append).
|
|
6
|
+
*/
|
|
7
|
+
export declare function deepMerge(target: Record<string, unknown>, patch: Record<string, unknown>): Record<string, unknown>;
|
|
8
|
+
export interface CardPatch {
|
|
9
|
+
name?: string | null;
|
|
10
|
+
kind?: string | null;
|
|
11
|
+
status?: string | null;
|
|
12
|
+
/** Replaces the whole list; null deletes it. */
|
|
13
|
+
connections?: string[] | null;
|
|
14
|
+
/** Type-specific frontmatter; deep-merged (arrays replace, null deletes). */
|
|
15
|
+
fields?: Record<string, unknown>;
|
|
16
|
+
}
|
|
17
|
+
/** Shared patch semantics for MCP update_card and the viewer's PATCH endpoint. */
|
|
18
|
+
export declare function applyCardPatch(frontmatter: Record<string, unknown>, patch: CardPatch): Record<string, unknown>;
|
|
19
|
+
export declare function composeCard(fm: Record<string, unknown>, body: string): string;
|
|
20
|
+
/** Path a handle's card file belongs at, relative to the plan root. */
|
|
21
|
+
export declare function relPathForHandle(handle: string): string;
|
|
22
|
+
export declare function createCardFile(planRoot: string, handle: string, fm: Record<string, unknown>, body: string): Promise<string>;
|
|
23
|
+
export interface CardFileUpdate {
|
|
24
|
+
/** Complete new frontmatter object. Omit to leave frontmatter bytes untouched. */
|
|
25
|
+
frontmatter?: Record<string, unknown>;
|
|
26
|
+
/** Complete new body. Omit to leave the body untouched. */
|
|
27
|
+
body?: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Rewrite a card file. A body-only update preserves the original frontmatter
|
|
31
|
+
* block byte-for-byte; a frontmatter update re-serializes only the top-level
|
|
32
|
+
* keys whose values changed, keeping everything else byte-identical.
|
|
33
|
+
*/
|
|
34
|
+
export declare function updateCardFile(filePath: string, update: CardFileUpdate): Promise<void>;
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import yaml from 'js-yaml';
|
|
4
|
+
import { TYPE_FOLDERS, typeForHandle } from './handles.js';
|
|
5
|
+
const FM_BLOCK = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?/;
|
|
6
|
+
const RESERVED_FRONTMATTER_KEYS = new Set(['name', 'kind', 'status', 'connections']);
|
|
7
|
+
export function reservedFieldKeys(fields) {
|
|
8
|
+
return Object.keys(fields ?? {}).filter((key) => RESERVED_FRONTMATTER_KEYS.has(key));
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Deep-merge a patch into a frontmatter object. Plain objects merge recursively,
|
|
12
|
+
* arrays replace wholesale, explicit null deletes the key. Returns a new object
|
|
13
|
+
* preserving the target's key order (new keys append).
|
|
14
|
+
*/
|
|
15
|
+
export function deepMerge(target, patch) {
|
|
16
|
+
const out = { ...target };
|
|
17
|
+
for (const [key, value] of Object.entries(patch)) {
|
|
18
|
+
if (value === null) {
|
|
19
|
+
delete out[key];
|
|
20
|
+
}
|
|
21
|
+
else if (isPlainObject(value) && isPlainObject(out[key])) {
|
|
22
|
+
out[key] = deepMerge(out[key], value);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
out[key] = value;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return out;
|
|
29
|
+
}
|
|
30
|
+
/** Shared patch semantics for MCP update_card and the viewer's PATCH endpoint. */
|
|
31
|
+
export function applyCardPatch(frontmatter, patch) {
|
|
32
|
+
const reserved = reservedFieldKeys(patch.fields);
|
|
33
|
+
if (reserved.length > 0) {
|
|
34
|
+
throw new Error(`fields cannot contain reserved keys: ${reserved.join(', ')}`);
|
|
35
|
+
}
|
|
36
|
+
const patchObject = { ...(patch.fields ?? {}) };
|
|
37
|
+
if (patch.name !== undefined)
|
|
38
|
+
patchObject.name = patch.name;
|
|
39
|
+
if (patch.kind !== undefined)
|
|
40
|
+
patchObject.kind = patch.kind;
|
|
41
|
+
if (patch.status !== undefined)
|
|
42
|
+
patchObject.status = patch.status;
|
|
43
|
+
if (patch.connections !== undefined) {
|
|
44
|
+
patchObject.connections =
|
|
45
|
+
patch.connections === null
|
|
46
|
+
? null
|
|
47
|
+
: patch.connections.map((c) => c.toUpperCase());
|
|
48
|
+
}
|
|
49
|
+
return deepMerge(frontmatter, patchObject);
|
|
50
|
+
}
|
|
51
|
+
function isPlainObject(value) {
|
|
52
|
+
return (typeof value === 'object' &&
|
|
53
|
+
value !== null &&
|
|
54
|
+
!Array.isArray(value) &&
|
|
55
|
+
Object.getPrototypeOf(value) === Object.prototype);
|
|
56
|
+
}
|
|
57
|
+
function dumpFrontmatter(fm) {
|
|
58
|
+
// js-yaml dumps in insertion order; deepMerge preserves it, so existing key
|
|
59
|
+
// order survives a rewrite. Style normalizes (flow maps may become block).
|
|
60
|
+
return yaml.dump(fm, { lineWidth: 100, noRefs: true });
|
|
61
|
+
}
|
|
62
|
+
export function composeCard(fm, body) {
|
|
63
|
+
const fmText = Object.keys(fm).length > 0 ? `---\n${dumpFrontmatter(fm)}---\n\n` : '';
|
|
64
|
+
return `${fmText}${body.replace(/\s+$/, '')}\n`;
|
|
65
|
+
}
|
|
66
|
+
/** Path a handle's card file belongs at, relative to the plan root. */
|
|
67
|
+
export function relPathForHandle(handle) {
|
|
68
|
+
if (handle === 'PLAN-PROJECT')
|
|
69
|
+
return 'plan.md';
|
|
70
|
+
const type = typeForHandle(handle);
|
|
71
|
+
if (!type)
|
|
72
|
+
throw new Error(`Unknown handle prefix: ${handle}`);
|
|
73
|
+
return path.join(TYPE_FOLDERS[type], `${handle}.md`);
|
|
74
|
+
}
|
|
75
|
+
export async function createCardFile(planRoot, handle, fm, body) {
|
|
76
|
+
const relPath = relPathForHandle(handle);
|
|
77
|
+
const filePath = path.join(planRoot, relPath);
|
|
78
|
+
await mkdir(path.dirname(filePath), { recursive: true });
|
|
79
|
+
await writeFile(filePath, composeCard(fm, body), { flag: 'wx' });
|
|
80
|
+
return relPath;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Re-serialize frontmatter while keeping the original text of every top-level
|
|
84
|
+
* key whose value is unchanged — a status flip must not reformat the columns
|
|
85
|
+
* table next to it. Returns null when the original can't be segmented safely.
|
|
86
|
+
*/
|
|
87
|
+
function rewriteFrontmatter(originalInner, next) {
|
|
88
|
+
let originalParsed;
|
|
89
|
+
try {
|
|
90
|
+
const parsed = yaml.load(originalInner);
|
|
91
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
|
|
92
|
+
return null;
|
|
93
|
+
originalParsed = parsed;
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
// Split the original YAML into one text segment per top-level key.
|
|
99
|
+
const segments = new Map();
|
|
100
|
+
let currentKey = null;
|
|
101
|
+
let currentLines = [];
|
|
102
|
+
for (const line of originalInner.split('\n')) {
|
|
103
|
+
const keyMatch = /^([A-Za-z0-9_-]+)\s*:/.exec(line);
|
|
104
|
+
if (keyMatch) {
|
|
105
|
+
if (currentKey)
|
|
106
|
+
segments.set(currentKey, currentLines.join('\n'));
|
|
107
|
+
currentKey = keyMatch[1];
|
|
108
|
+
currentLines = [line];
|
|
109
|
+
}
|
|
110
|
+
else if (currentKey) {
|
|
111
|
+
currentLines.push(line);
|
|
112
|
+
}
|
|
113
|
+
else if (line.trim() !== '') {
|
|
114
|
+
// Leading content that is not a plain key (quoted key, doc marker…).
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
if (currentKey)
|
|
119
|
+
segments.set(currentKey, currentLines.join('\n'));
|
|
120
|
+
if (segments.size !== Object.keys(originalParsed).length)
|
|
121
|
+
return null;
|
|
122
|
+
const parts = [];
|
|
123
|
+
for (const [key, value] of Object.entries(next)) {
|
|
124
|
+
const original = segments.get(key);
|
|
125
|
+
if (original !== undefined &&
|
|
126
|
+
JSON.stringify(originalParsed[key]) === JSON.stringify(value)) {
|
|
127
|
+
parts.push(original.replace(/\n+$/, ''));
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
parts.push(yaml.dump({ [key]: value }, { lineWidth: 100, noRefs: true }).trimEnd());
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return `${parts.join('\n')}\n`;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Rewrite a card file. A body-only update preserves the original frontmatter
|
|
137
|
+
* block byte-for-byte; a frontmatter update re-serializes only the top-level
|
|
138
|
+
* keys whose values changed, keeping everything else byte-identical.
|
|
139
|
+
*/
|
|
140
|
+
export async function updateCardFile(filePath, update) {
|
|
141
|
+
const raw = await readFile(filePath, 'utf8');
|
|
142
|
+
const match = raw.match(FM_BLOCK);
|
|
143
|
+
const originalFmBlock = match ? match[0] : '';
|
|
144
|
+
const originalBody = match ? raw.slice(match[0].length) : raw;
|
|
145
|
+
let fmText;
|
|
146
|
+
if (update.frontmatter !== undefined) {
|
|
147
|
+
if (Object.keys(update.frontmatter).length === 0) {
|
|
148
|
+
fmText = '';
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
const inner = (match && rewriteFrontmatter(match[1], update.frontmatter)) ??
|
|
152
|
+
dumpFrontmatter(update.frontmatter);
|
|
153
|
+
fmText = `---\n${inner}---\n\n`;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
fmText = originalFmBlock;
|
|
158
|
+
// Keep the original separation when we keep the original block.
|
|
159
|
+
if (fmText && update.body !== undefined && !fmText.endsWith('\n\n')) {
|
|
160
|
+
fmText = `${fmText}\n`;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
let body = update.body !== undefined ? update.body.replace(/\s+$/, '') : originalBody;
|
|
164
|
+
// The frontmatter block already supplies the blank-line separation.
|
|
165
|
+
if (fmText.endsWith('\n\n'))
|
|
166
|
+
body = body.replace(/^\n+/, '');
|
|
167
|
+
const trailingNewline = update.body !== undefined ? '\n' : '';
|
|
168
|
+
await writeFile(filePath, `${fmText}${body}${trailingNewline}`, 'utf8');
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../../src/core/writer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export declare function repoRootFor(planRoot: string): Promise<string>;
|
|
2
|
+
export interface SyncPoint {
|
|
3
|
+
synced_sha: string;
|
|
4
|
+
synced_at: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function readSyncPoint(planRoot: string): Promise<SyncPoint | null>;
|
|
7
|
+
export declare function writeSyncPoint(planRoot: string, sha?: string): Promise<SyncPoint>;
|
|
8
|
+
/**
|
|
9
|
+
* True when the plan folder has uncommitted (staged or unstaged) changes,
|
|
10
|
+
* ignoring the .sync.json marker itself (writing the marker shouldn't count as
|
|
11
|
+
* the plan being dirty).
|
|
12
|
+
*/
|
|
13
|
+
export declare function planDirty(planRoot: string): Promise<boolean>;
|
|
14
|
+
export type ChangeKind = 'added' | 'modified' | 'removed' | 'renamed';
|
|
15
|
+
export interface PlanChange {
|
|
16
|
+
handle: string;
|
|
17
|
+
file: string;
|
|
18
|
+
change: ChangeKind;
|
|
19
|
+
changed_keys?: string[];
|
|
20
|
+
body_changed?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface PlanDiff {
|
|
23
|
+
base: string;
|
|
24
|
+
base_source: 'argument' | 'sync-marker' | 'HEAD';
|
|
25
|
+
head: string;
|
|
26
|
+
changes: PlanChange[];
|
|
27
|
+
}
|
|
28
|
+
export declare function diffPlan(planRoot: string, base?: string, head?: string): Promise<PlanDiff>;
|
|
29
|
+
export interface LogEntry {
|
|
30
|
+
sha: string;
|
|
31
|
+
date: string;
|
|
32
|
+
subject: string;
|
|
33
|
+
}
|
|
34
|
+
export declare function planLog(planRoot: string, cardRelPath: string, limit?: number): Promise<LogEntry[]>;
|