@magic-spells/constellation 0.2.1 → 0.3.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/README.md +13 -6
- package/constellation/agent/AGENT-GUIDANCE.md +22 -0
- package/constellation/component/COMPONENT-EDITABLE.md +9 -0
- package/constellation/component/COMPONENT-STATUS-PILL.md +9 -0
- package/constellation/component/COMPONENT-SYNC-PILL.md +9 -0
- package/constellation/diagram/DIAGRAM-ARCHITECTURE.md +28 -0
- package/constellation/doc/DOC-CARD-TYPES.md +36 -0
- package/constellation/doc/DOC-CHANGE-TRACKING.md +26 -0
- package/constellation/doc/DOC-CONNECTED-REPOS.md +25 -0
- package/constellation/doc/DOC-DIAGRAMS.md +22 -0
- package/constellation/doc/DOC-FILE-FORMAT.md +54 -0
- package/constellation/doc/DOC-LINT-CODES.md +35 -0
- package/constellation/doc/DOC-MCP-SERVER.md +59 -0
- package/constellation/doc/DOC-MCP-UPGRADES.md +56 -0
- package/constellation/external/EXTERNAL-AJV.md +7 -0
- package/constellation/external/EXTERNAL-GIT.md +7 -0
- package/constellation/external/EXTERNAL-GRAY-MATTER.md +7 -0
- package/constellation/external/EXTERNAL-MCP-SDK.md +7 -0
- package/constellation/external/EXTERNAL-ZOD.md +7 -0
- package/constellation/file/FILE-CLI.md +9 -0
- package/constellation/file/FILE-CODE.md +9 -0
- package/constellation/file/FILE-EXTRACT.md +9 -0
- package/constellation/file/FILE-GIT.md +9 -0
- package/constellation/file/FILE-HANDLES.md +9 -0
- package/constellation/file/FILE-INDEXER.md +11 -0
- package/constellation/file/FILE-LINT.md +9 -0
- package/constellation/file/FILE-MCP-SEARCH.md +12 -0
- package/constellation/file/FILE-MCP-SERVER.md +9 -0
- package/constellation/file/FILE-PARSE.md +9 -0
- package/constellation/file/FILE-RENAME.md +18 -0
- package/constellation/file/FILE-REPOS.md +9 -0
- package/constellation/file/FILE-RESOLVE.md +9 -0
- package/constellation/file/FILE-SCAFFOLD.md +12 -0
- package/constellation/file/FILE-SERVE.md +9 -0
- package/constellation/file/FILE-SYNC.md +9 -0
- package/constellation/file/FILE-TYPES.md +9 -0
- package/constellation/file/FILE-VALIDATE.md +11 -0
- package/constellation/file/FILE-WRITER.md +11 -0
- package/constellation/flow/FLOW-DRIFT-DETECT.md +11 -0
- package/constellation/flow/FLOW-LINT-PIPELINE.md +14 -0
- package/constellation/flow/FLOW-SYNC-PLAN.md +13 -0
- package/constellation/page/PAGE-VIEWER-CARD.md +9 -0
- package/constellation/page/PAGE-VIEWER-HOME.md +9 -0
- package/constellation/plan.md +59 -0
- package/constellation/test/TEST-SUITE.md +9 -0
- package/dist/cli/index.js +37 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/code.d.ts +48 -0
- package/dist/core/code.js +184 -0
- package/dist/core/code.js.map +1 -0
- package/dist/core/git.d.ts +10 -0
- package/dist/core/git.js +42 -4
- package/dist/core/git.js.map +1 -1
- package/dist/core/rename.d.ts +24 -0
- package/dist/core/rename.js +72 -0
- package/dist/core/rename.js.map +1 -0
- package/dist/core/repos.d.ts +2 -0
- package/dist/core/repos.js +5 -1
- package/dist/core/repos.js.map +1 -1
- package/dist/core/sync.d.ts +3 -0
- package/dist/core/sync.js +21 -9
- package/dist/core/sync.js.map +1 -1
- package/dist/core/validate.js +27 -3
- package/dist/core/validate.js.map +1 -1
- package/dist/core/writer.d.ts +54 -0
- package/dist/core/writer.js +163 -4
- package/dist/core/writer.js.map +1 -1
- package/dist/mcp/search.d.ts +2 -2
- package/dist/mcp/search.js +27 -5
- package/dist/mcp/search.js.map +1 -1
- package/dist/mcp/server.js +726 -63
- package/dist/mcp/server.js.map +1 -1
- package/dist/serve/server.js +6 -7
- package/dist/serve/server.js.map +1 -1
- package/examples/constellation/datatype/DATATYPE-TICKET.md +5 -0
- package/package.json +5 -3
- package/schemas/card.json +46 -2
- package/skill/SKILL.md +42 -9
- package/skill/methodology.md +11 -4
- package/viewer/dist/assets/{arc-CMMRgIq9.js → arc-ByV7p1fN.js} +1 -1
- package/viewer/dist/assets/architecture-7EHR7CIX-FCXXAu3O.js +1 -0
- package/viewer/dist/assets/{architectureDiagram-3BPJPVTR-CB5p_qlN.js → architectureDiagram-3BPJPVTR-CMawC2nt.js} +1 -1
- package/viewer/dist/assets/{blockDiagram-GPEHLZMM-DpnMj_e6.js → blockDiagram-GPEHLZMM-Bp0MKYXV.js} +1 -1
- package/viewer/dist/assets/{c4Diagram-AAUBKEIU-f91ngVN8.js → c4Diagram-AAUBKEIU-BLCX9gmN.js} +1 -1
- package/viewer/dist/assets/channel-GJMBi5UK.js +1 -0
- package/viewer/dist/assets/{chunk-2J33WTMH-y7Pz5tMO.js → chunk-2J33WTMH-C6iOidst.js} +1 -1
- package/viewer/dist/assets/{chunk-3OPIFGDE-Ir_ghIUQ.js → chunk-3OPIFGDE-B9xItVw4.js} +1 -1
- package/viewer/dist/assets/{chunk-4BX2VUAB-BTPyM1ux.js → chunk-4BX2VUAB-Bl0HWb9B.js} +1 -1
- package/viewer/dist/assets/{chunk-55IACEB6-CtNd8e4Y.js → chunk-55IACEB6-BYilo1WJ.js} +1 -1
- package/viewer/dist/assets/{chunk-5ZQYHXKU-Dd3yz721.js → chunk-5ZQYHXKU-DOCnP8P8.js} +1 -1
- package/viewer/dist/assets/{chunk-727SXJPM-CAM8mGbv.js → chunk-727SXJPM-D9YKAzha.js} +1 -1
- package/viewer/dist/assets/{chunk-AQP2D5EJ-C3nW9Uve.js → chunk-AQP2D5EJ-B1KE4h_b.js} +1 -1
- package/viewer/dist/assets/{chunk-BSJP7CBP-r6MRPvAH.js → chunk-BSJP7CBP-DA3pfXCw.js} +1 -1
- package/viewer/dist/assets/{chunk-CSCIHK7Q-Cn-ZTxsS.js → chunk-CSCIHK7Q-Bv0Fa0Zn.js} +6 -6
- package/viewer/dist/assets/{chunk-FMBD7UC4-5axXeZJa.js → chunk-FMBD7UC4-k-EzzpU2.js} +1 -1
- package/viewer/dist/assets/{chunk-KSCS5N6A-BwmNx0l0.js → chunk-KSCS5N6A-CUTkv0jR.js} +1 -1
- package/viewer/dist/assets/{chunk-L5ZTLDWV-C2YNkUjB.js → chunk-L5ZTLDWV-C_SwE6oB.js} +1 -1
- package/viewer/dist/assets/{chunk-LZXEDZCA-CznuDgQD.js → chunk-LZXEDZCA-DtwqVIDt.js} +2 -2
- package/viewer/dist/assets/{chunk-ND2GUHAM-CokDnghi.js → chunk-ND2GUHAM-JJiAqLG2.js} +1 -1
- package/viewer/dist/assets/{chunk-NZK2D7GU-aaU0v4QE.js → chunk-NZK2D7GU-BQ8Dn7FA.js} +1 -1
- package/viewer/dist/assets/{chunk-O5CBEL6O-ByfKhkZf.js → chunk-O5CBEL6O-BRpqOJ1I.js} +1 -1
- package/viewer/dist/assets/chunk-QZHKN3VN-DA8qsAVF.js +1 -0
- package/viewer/dist/assets/chunk-WU5MYG2G-Dp8LMm21.js +1 -0
- package/viewer/dist/assets/{chunk-XPW4576I-Amo3awtq.js → chunk-XPW4576I-C1NcqPJd.js} +1 -1
- package/viewer/dist/assets/classDiagram-4FO5ZUOK-wnkp0LBB.js +1 -0
- package/viewer/dist/assets/classDiagram-v2-Q7XG4LA2-wnkp0LBB.js +1 -0
- package/viewer/dist/assets/{cose-bilkent-S5V4N54A-CO8yESCW.js → cose-bilkent-S5V4N54A-BsJFb39B.js} +1 -1
- package/viewer/dist/assets/{dagre-BM42HDAG-BnmNVNI2.js → dagre-BM42HDAG-CRPovG4Q.js} +1 -1
- package/viewer/dist/assets/{diagram-2AECGRRQ-lcGXcbei.js → diagram-2AECGRRQ-D6GCKn1u.js} +1 -1
- package/viewer/dist/assets/{diagram-5GNKFQAL-Cj3-lPUt.js → diagram-5GNKFQAL-CoHqKdf3.js} +1 -1
- package/viewer/dist/assets/{diagram-KO2AKTUF-CtXdRI4M.js → diagram-KO2AKTUF-BEkMb40X.js} +1 -1
- package/viewer/dist/assets/{diagram-LMA3HP47-CIyLAzX7.js → diagram-LMA3HP47-B6mfW9S2.js} +1 -1
- package/viewer/dist/assets/{diagram-OG6HWLK6-BwF4bQCv.js → diagram-OG6HWLK6-OBBkuJvR.js} +1 -1
- package/viewer/dist/assets/{dist-DzXuQd4N.js → dist-C4BxOpXa.js} +1 -1
- package/viewer/dist/assets/{erDiagram-TEJ5UH35-DjwFw9yq.js → erDiagram-TEJ5UH35-C2i3TB2-.js} +1 -1
- package/viewer/dist/assets/eventmodeling-FCH6USID-CCZDiBK0.js +1 -0
- package/viewer/dist/assets/{flowDiagram-I6XJVG4X-CzXbf7vQ.js → flowDiagram-I6XJVG4X-SreJFib5.js} +1 -1
- package/viewer/dist/assets/{ganttDiagram-6RSMTGT7-BYcIhfmm.js → ganttDiagram-6RSMTGT7-DO7GLSdw.js} +1 -1
- package/viewer/dist/assets/{gitGraph-WXDBUCRP-H8XeJ9QB.js → gitGraph-WXDBUCRP-Cgwn_Q5_.js} +1 -1
- package/viewer/dist/assets/{gitGraphDiagram-PVQCEYII-DtAPXKFK.js → gitGraphDiagram-PVQCEYII-DLwaMyDa.js} +1 -1
- package/viewer/dist/assets/{index-DLPCG_Or.js → index-COz6c_JS.js} +4 -4
- package/viewer/dist/assets/{info-J43DQDTF-BQScorZ0.js → info-J43DQDTF-Ci-BiM87.js} +1 -1
- package/viewer/dist/assets/{infoDiagram-5YYISTIA-Udl1omvH.js → infoDiagram-5YYISTIA-Bip5dlKM.js} +1 -1
- package/viewer/dist/assets/{ishikawaDiagram-YF4QCWOH-VnfzT_hk.js → ishikawaDiagram-YF4QCWOH-VXV_9uEH.js} +1 -1
- package/viewer/dist/assets/{journeyDiagram-JHISSGLW-Btn4EVoD.js → journeyDiagram-JHISSGLW-DQz-8gAS.js} +1 -1
- package/viewer/dist/assets/{kanban-definition-UN3LZRKU-flOzWhPe.js → kanban-definition-UN3LZRKU-BTWpEcf0.js} +1 -1
- package/viewer/dist/assets/{line-DJJ9BLuY.js → line-BnRWAabF.js} +1 -1
- package/viewer/dist/assets/{linear-C2SUy5ns.js → linear-BR6v_8SI.js} +1 -1
- package/viewer/dist/assets/{mermaid-parser.core-xhSeYiZo.js → mermaid-parser.core-CSsnrQhR.js} +2 -2
- package/viewer/dist/assets/{mermaid.core-DmeSIitY.js → mermaid.core-I1kLnpG2.js} +3 -3
- package/viewer/dist/assets/{mindmap-definition-RKZ34NQL-CCJcMKx1.js → mindmap-definition-RKZ34NQL-Cq66Ilr1.js} +1 -1
- package/viewer/dist/assets/{packet-YPE3B663-DS8RscAk.js → packet-YPE3B663-BjSCEGVd.js} +1 -1
- package/viewer/dist/assets/{pie-LRSECV5Y-I2ZQhrNJ.js → pie-LRSECV5Y-Di72yxoZ.js} +1 -1
- package/viewer/dist/assets/{pieDiagram-4H26LBE5-BS5HMs4j.js → pieDiagram-4H26LBE5-TmsfKHOO.js} +1 -1
- package/viewer/dist/assets/{quadrantDiagram-W4KKPZXB-W4H8cw2_.js → quadrantDiagram-W4KKPZXB-Dp9iSvCk.js} +1 -1
- package/viewer/dist/assets/{radar-GUYGQ44K-kf6QvSne.js → radar-GUYGQ44K-CZeWC3Jm.js} +1 -1
- package/viewer/dist/assets/{requirementDiagram-4Y6WPE33-DSbuDQGQ.js → requirementDiagram-4Y6WPE33-lbTbiw59.js} +1 -1
- package/viewer/dist/assets/{sankeyDiagram-5OEKKPKP-CH8Qr2vL.js → sankeyDiagram-5OEKKPKP-DqmoGDJk.js} +1 -1
- package/viewer/dist/assets/{sequenceDiagram-3UESZ5HK-EugVcdad.js → sequenceDiagram-3UESZ5HK-B6_EiWF6.js} +1 -1
- package/viewer/dist/assets/{src-CM_9kdrU.js → src-Dz3SjXJY.js} +1 -1
- package/viewer/dist/assets/{stateDiagram-AJRCARHV-DiFl94Qy.js → stateDiagram-AJRCARHV-Z6QRASCx.js} +1 -1
- package/viewer/dist/assets/stateDiagram-v2-BHNVJYJU-BePyUY0u.js +1 -0
- package/viewer/dist/assets/{timeline-definition-PNZ67QCA-B0KW9GUN.js → timeline-definition-PNZ67QCA-XuUZAYAP.js} +1 -1
- package/viewer/dist/assets/{treeView-BLDUP644-CAEY4mxq.js → treeView-BLDUP644-DuGsPB97.js} +1 -1
- package/viewer/dist/assets/{treemap-LRROVOQU-VVaEaTlU.js → treemap-LRROVOQU-CSJx8IZ0.js} +1 -1
- package/viewer/dist/assets/{vennDiagram-CIIHVFJN-BSLGNfJd.js → vennDiagram-CIIHVFJN-BnebDryc.js} +1 -1
- package/viewer/dist/assets/{wardley-L42UT6IY-C-5cXbAU.js → wardley-L42UT6IY-DqqoXPSq.js} +1 -1
- package/viewer/dist/assets/{wardleyDiagram-YWT4CUSO-COk4TVnQ.js → wardleyDiagram-YWT4CUSO-Bchy871K.js} +1 -1
- package/viewer/dist/assets/{xychartDiagram-2RQKCTM6-CClGJLJp.js → xychartDiagram-2RQKCTM6-Bl_zzGZm.js} +1 -1
- package/viewer/dist/index.html +1 -1
- package/docs/001-file-format.md +0 -247
- package/docs/002-mcp.md +0 -158
- package/viewer/dist/assets/architecture-7EHR7CIX-Cbb-syEI.js +0 -1
- package/viewer/dist/assets/channel-C2bkEQHQ.js +0 -1
- package/viewer/dist/assets/chunk-QZHKN3VN-DJRjGeIo.js +0 -1
- package/viewer/dist/assets/chunk-WU5MYG2G-C63BVvr_.js +0 -1
- package/viewer/dist/assets/classDiagram-4FO5ZUOK-z_bO1V-j.js +0 -1
- package/viewer/dist/assets/classDiagram-v2-Q7XG4LA2-z_bO1V-j.js +0 -1
- package/viewer/dist/assets/eventmodeling-FCH6USID-BlKFmSzA.js +0 -1
- package/viewer/dist/assets/stateDiagram-v2-BHNVJYJU-BlJV8F13.js +0 -1
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: scaffold.ts
|
|
3
|
+
status: built
|
|
4
|
+
path: src/core/scaffold.ts
|
|
5
|
+
language: typescript
|
|
6
|
+
summary: Shared init scaffold
|
|
7
|
+
connections:
|
|
8
|
+
- FILE-CLI
|
|
9
|
+
- FILE-MCP-SERVER
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
Creates `constellation/` + a starter `plan.md` (PLAN-PROJECT). Used by both CLI `init` and MCP `init_plan` so the two can't drift.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: serve/server.ts
|
|
3
|
+
status: built
|
|
4
|
+
path: src/serve/server.ts
|
|
5
|
+
language: typescript
|
|
6
|
+
summary: Local HTTP server for the viewer
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
Serves `viewer/dist`, a read API, and a PATCH/POST/DELETE write API (with `if_mtime` stale-write guard), watching files for live reload. Shares the byte-preserving writer with the MCP path.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sync.ts
|
|
3
|
+
status: built
|
|
4
|
+
path: src/core/sync.ts
|
|
5
|
+
language: typescript
|
|
6
|
+
summary: 'computeSyncStatus: a live freshness verdict'
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
Composes git + lint + status rollup into one glanceable state — `in-sync` / `drifted` / `dirty` / `never-synced` / `no-git`, plus a `marker_error` (forcing `drifted`) when the marker sha is unreachable. Computed live on every call, never stored.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: types.ts
|
|
3
|
+
status: built
|
|
4
|
+
path: src/core/types.ts
|
|
5
|
+
language: typescript
|
|
6
|
+
summary: Core domain types + TYPE_NAMES (the 17 types)
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
`Card`, `Connection`, `PlanIndex`, `Issue`, `CardRefs`, `ConnectedRepo`, and `TYPE_NAMES`. One of the four places a type addition must touch.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: validate.ts
|
|
3
|
+
status: built
|
|
4
|
+
path: src/core/validate.ts
|
|
5
|
+
language: typescript
|
|
6
|
+
summary: Ajv schema validation → W002 (shape) and W003 (unknown field)
|
|
7
|
+
connections:
|
|
8
|
+
- FILE-TYPES
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Validates each card's frontmatter against `schemas/`. Derives the W003 base allow-list from `card.json`'s properties (not a hardcoded list), so cross-type metadata fields are blessed on all 17 types. Ajv ships CJS — loaded via createRequire.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: writer.ts
|
|
3
|
+
status: built
|
|
4
|
+
path: src/core/writer.ts
|
|
5
|
+
language: typescript
|
|
6
|
+
summary: Byte-preserving card writes + patch / note / section helpers
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
Re-serializes only the top-level frontmatter keys whose values changed and keeps the body byte-for-byte on a frontmatter-only update (and vice versa). Provides deep-merge patch semantics, `withAppendedNote`, and fence-aware `replaceBodySection`. Shared by the MCP and viewer write paths — fix serialization bugs here once.
|
|
10
|
+
|
|
11
|
+
All writes are atomic (temp file + rename; exclusive creates via `link`) and serialized behind an in-process per-file lock (`withFileLock`). `mutateCardFile` is the locked read→transform→write path — the cheap writes apply their change to the file's *current* content, so concurrent small updates compose instead of clobbering. `rewriteHandleInFile` does the whole-token handle rewrite used by [[FILE-RENAME]].
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Code-side drift detection
|
|
3
|
+
kind: sync
|
|
4
|
+
status: built
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Makes a `built`/`verified` claim re-verifiable instead of taken on faith (reverse drift).
|
|
8
|
+
|
|
9
|
+
1. `set_verified` stamps `verified_sha` = the git sha a card was checked at — [[FILE-CODE]].
|
|
10
|
+
2. Later, the card's bound code (a connected FILE `path:` or its own `code_refs`) changes.
|
|
11
|
+
3. `stale_report` / `check_sync` diff the bound files against `verified_sha` and flag the card — [[FILE-SYNC]]. The verdict is computed live, never stored. See [[DOC-MCP-UPGRADES]].
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Lint pipeline
|
|
3
|
+
kind: pipeline
|
|
4
|
+
status: built
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
How a plan folder becomes validated graph state.
|
|
8
|
+
|
|
9
|
+
1. A consumer (CLI / MCP / viewer) calls `loadPlan(root)` — [[FILE-INDEXER]].
|
|
10
|
+
2. [[FILE-PARSE]] splits each file into frontmatter + body.
|
|
11
|
+
3. [[FILE-EXTRACT]] pulls the four connection sources; [[FILE-HANDLES]] validates handle shape and type.
|
|
12
|
+
4. The indexer dedupes handles, resolves references, builds the undirected connection set, and collects E001–E006 / W001 / W004.
|
|
13
|
+
5. [[FILE-VALIDATE]] adds W002 / W003 from the JSON Schemas; [[FILE-LINT]] composes and sorts every issue.
|
|
14
|
+
6. The CLI exits 1 on errors, 0 otherwise (warnings never fail), 2 when no plan is found. See [[DOC-LINT-CODES]].
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Sync the plan to the code
|
|
3
|
+
kind: sync
|
|
4
|
+
status: built
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
"Sync the plan to the code" brings CODE up to a changed plan — the plan is the source of truth, so behavior changes in the plan first.
|
|
8
|
+
|
|
9
|
+
1. `diff_plan` (base = the `.sync.json` marker) lists added / modified / removed cards — [[FILE-GIT]].
|
|
10
|
+
2. `traverse` the changed handles (detail: full) for the blast radius.
|
|
11
|
+
3. Update the application code to match those cards.
|
|
12
|
+
4. Run the build/tests, bump card `status`, commit the plan.
|
|
13
|
+
5. `set_sync_point` advances the marker. For a large diff, `assemble` partitions the blast radius into file-disjoint units to fan out one sub-agent each. See [[DOC-CHANGE-TRACKING]].
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Viewer — card
|
|
3
|
+
kind: route
|
|
4
|
+
status: built
|
|
5
|
+
code_refs:
|
|
6
|
+
- viewer/src/pages/CardPage.svelte
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
A single card: frontmatter, rendered markdown + mermaid body, the derived neighborhood diagram, and inline editing via [[COMPONENT-EDITABLE]] / [[COMPONENT-STATUS-PILL]]. Served by [[FILE-SERVE]].
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Constellation
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Constellation
|
|
6
|
+
|
|
7
|
+
Files-first architecture planning for AI-assisted development. A project's architecture
|
|
8
|
+
plan lives in the repo as markdown **cards** — one file per card, the filename is the
|
|
9
|
+
**handle** — linked by undirected **connections**. The graph is always *derived* from the
|
|
10
|
+
files; nothing derived is ever stored. Cards are frontmatter (structure) + markdown
|
|
11
|
+
(narrative); git is the change-tracking system.
|
|
12
|
+
|
|
13
|
+
> **Meta:** this plan documents Constellation *itself* (the tool). It is distinct from
|
|
14
|
+
> `examples/constellation/`, a sample ticketing-app fixture used by the tests and the viewer
|
|
15
|
+
> demo — keep tool concerns and example content separate.
|
|
16
|
+
|
|
17
|
+
## What ships
|
|
18
|
+
|
|
19
|
+
One package (`@magic-spells/constellation`) that is four things at once, kept consistent:
|
|
20
|
+
|
|
21
|
+
- **A library** (`src/core/`) — parser, indexer, lint, writer, code-binding, git/sync.
|
|
22
|
+
- **A CLI** (`constellation`) — `init`, `lint`, `mcp`, `serve`, `repos`, `version`, `upgrade`. See [[FILE-CLI]].
|
|
23
|
+
- **An MCP server** (`constellation mcp`, stdio) — graph queries, hydrated retrieval,
|
|
24
|
+
validated writes, git change-tracking, code binding/drift, for AI agents. See [[DOC-MCP-SERVER]].
|
|
25
|
+
- **A viewer** (Svelte 5 + Tailwind v4) — a local web app rendering the plan as a browsable,
|
|
26
|
+
editable site. See [[PAGE-VIEWER-HOME]].
|
|
27
|
+
|
|
28
|
+
Plus the **spec** (this plan, formerly `docs/`), the **schemas** (`schemas/*.json`), the
|
|
29
|
+
authoring **skill** (`skill/`), and the **golden example** (`examples/constellation/`).
|
|
30
|
+
|
|
31
|
+
## The pipeline (one direction)
|
|
32
|
+
|
|
33
|
+
`files → index → (lint | serve | mcp)`. Every consumer reloads the index from disk on each
|
|
34
|
+
operation (tens of ms at realistic sizes), so it is always correct while files are edited in
|
|
35
|
+
parallel — no watcher, no cache invalidation. See [[DIAGRAM-ARCHITECTURE]].
|
|
36
|
+
|
|
37
|
+
## Design principles
|
|
38
|
+
|
|
39
|
+
1. **The files are the source of truth.** Indexes, catalogs, rollups, subgraph diagrams,
|
|
40
|
+
diffs — all derived in memory, never stored.
|
|
41
|
+
2. **A card with no frontmatter is valid.** Path gives identity; body gives content.
|
|
42
|
+
3. **Git is the change-tracking system.** `git diff -- constellation/` *is* the plan diff.
|
|
43
|
+
Lifecycle (`status`) is a card property; "what changed" is history — never conflated.
|
|
44
|
+
4. **Cheap to connect.** Connections are a plain list of handles.
|
|
45
|
+
|
|
46
|
+
See [[DOC-FILE-FORMAT]] for the normative format and [[DOC-MCP-UPGRADES]] for the
|
|
47
|
+
durability/cross-session-memory decisions.
|
|
48
|
+
|
|
49
|
+
## Conventions
|
|
50
|
+
|
|
51
|
+
- **ESM, Node ≥ 22**, strict TypeScript, `tsc` → `dist/`. Imports use explicit `.js`
|
|
52
|
+
extensions even from `.ts` sources (NodeNext).
|
|
53
|
+
- **Adding/renaming a card type touches four places that must agree:** `TYPE_NAMES`
|
|
54
|
+
([[FILE-TYPES]]) + `TYPE_FOLDERS` ([[FILE-HANDLES]]); `schemas/<folder>.json`;
|
|
55
|
+
`skill/types/<folder>.md`; and a sample card in `examples/` + the type table.
|
|
56
|
+
- **Agent guidance lives in three unshared copies that must stay consistent** — see
|
|
57
|
+
[[AGENT-GUIDANCE]].
|
|
58
|
+
- **Writes preserve bytes; nothing derived is stored; plan resolution never crosses a repo
|
|
59
|
+
boundary.** See [[FILE-WRITER]], [[FILE-RESOLVE]].
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Test suite (vitest)
|
|
3
|
+
kind: integration
|
|
4
|
+
status: built
|
|
5
|
+
code_refs:
|
|
6
|
+
- tests
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
The vitest suite (159 tests): core unit tests, MCP integration via an in-memory client, and git-backed drift/security tests. The golden plan `examples/constellation/` doubles as a fixture and must lint clean (0 errors). Exercises [[FILE-LINT]], [[FILE-INDEXER]], [[FILE-MCP-SERVER]].
|
package/dist/cli/index.js
CHANGED
|
@@ -123,6 +123,43 @@ program
|
|
|
123
123
|
process.exit(2);
|
|
124
124
|
}
|
|
125
125
|
});
|
|
126
|
+
program
|
|
127
|
+
.command('rename')
|
|
128
|
+
.argument('<from>', 'current handle (e.g. API-OLD-NAME)')
|
|
129
|
+
.argument('<to>', 'new handle — a different prefix also moves the type folder')
|
|
130
|
+
.argument('[path]', 'plan folder, or a directory containing constellation/ (default: walk up from cwd)')
|
|
131
|
+
.description('Rename a card and rewrite every reference to it across the plan')
|
|
132
|
+
.action(async (from, to, target) => {
|
|
133
|
+
const root = await resolvePlanDir(target ?? undefined);
|
|
134
|
+
if (!root) {
|
|
135
|
+
console.error(pc.red('No constellation/ folder found.') +
|
|
136
|
+
' Run `constellation init` to create one.');
|
|
137
|
+
process.exit(2);
|
|
138
|
+
}
|
|
139
|
+
const { renameCard, RenameCardError } = await import('../core/rename.js');
|
|
140
|
+
try {
|
|
141
|
+
const result = await renameCard(root, from, to);
|
|
142
|
+
if (result.noop) {
|
|
143
|
+
console.log(pc.dim(`${result.from} → ${result.to}: same handle, nothing to do.`));
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
console.log(`${pc.green('✓')} ${result.from} → ${pc.bold(result.to)} (${result.file})`);
|
|
147
|
+
console.log(result.references_updated.length > 0
|
|
148
|
+
? ` references rewritten in: ${result.references_updated.join(', ')}`
|
|
149
|
+
: pc.dim(' no other card referenced it'));
|
|
150
|
+
const lint = await lintPlan(root);
|
|
151
|
+
if (lint.errors.length > 0) {
|
|
152
|
+
console.log(pc.yellow(` plan now has ${lint.errors.length} lint error(s) — run \`constellation lint\` for details`));
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
if (err instanceof RenameCardError) {
|
|
157
|
+
console.error(pc.red(err.message));
|
|
158
|
+
process.exit(2);
|
|
159
|
+
}
|
|
160
|
+
throw err;
|
|
161
|
+
}
|
|
162
|
+
});
|
|
126
163
|
program
|
|
127
164
|
.command('mcp')
|
|
128
165
|
.description('Run the Constellation MCP server over stdio')
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { Card, PlanIndex } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Code binding + attach. A card points at code two ways: a directly-connected
|
|
4
|
+
* FILE card (its `path:`, the primary binding) or the card's own `code_refs`
|
|
5
|
+
* (optional precision binding, `path` or `path:symbol`). Both resolve here.
|
|
6
|
+
*
|
|
7
|
+
* Cards never connect across repos (a Constellation invariant), so bound code is
|
|
8
|
+
* always in the card's OWN repo — resolved against the git repo root. To read a
|
|
9
|
+
* sibling repo's code, target that repo's plan with the `repo` selector.
|
|
10
|
+
*/
|
|
11
|
+
export interface BoundPath {
|
|
12
|
+
/** Repo-relative path. */
|
|
13
|
+
path: string;
|
|
14
|
+
via: 'file-card' | 'code_ref';
|
|
15
|
+
/** FILE card handle, when bound via a connected FILE card. */
|
|
16
|
+
handle?: string;
|
|
17
|
+
/** Symbol hint, when a code_ref was written `path:symbol`. Informational. */
|
|
18
|
+
symbol?: string;
|
|
19
|
+
}
|
|
20
|
+
/** Every distinct file a card is bound to (connected FILE paths + own code_refs). */
|
|
21
|
+
export declare function boundPathsForCard(index: PlanIndex, card: Card): BoundPath[];
|
|
22
|
+
export interface CodeFile extends BoundPath {
|
|
23
|
+
exists: boolean;
|
|
24
|
+
bytes?: number;
|
|
25
|
+
/** Attached file contents (mode "direct" only, when not skipped). */
|
|
26
|
+
content?: string;
|
|
27
|
+
/** Set when the file was over the per-file cap and only its head was attached. */
|
|
28
|
+
truncated?: boolean;
|
|
29
|
+
/** Why contents were not attached (missing, binary, lockfile, budget). */
|
|
30
|
+
skipped?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface CodeResolution {
|
|
33
|
+
/** Git repo root the paths resolve against, or null when not in a git repo. */
|
|
34
|
+
repo_root: string | null;
|
|
35
|
+
files: CodeFile[];
|
|
36
|
+
total_bytes: number;
|
|
37
|
+
budget_exhausted: boolean;
|
|
38
|
+
/** Bound files whose path no longer exists on disk — a drift signal. */
|
|
39
|
+
missing: string[];
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Resolve a card's bound code. mode "paths" returns existence-checked paths
|
|
43
|
+
* (cheap; the agent Reads what it wants); mode "direct" also attaches file
|
|
44
|
+
* contents under per-file and total size caps, skipping binaries, lockfiles,
|
|
45
|
+
* and generated output. A file over the per-file cap attaches its head with
|
|
46
|
+
* `truncated: true` rather than being skipped.
|
|
47
|
+
*/
|
|
48
|
+
export declare function resolveCodeForCard(planRoot: string, index: PlanIndex, card: Card, mode: 'paths' | 'direct'): Promise<CodeResolution>;
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { open, realpath, stat } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { repoRootFor } from './git.js';
|
|
4
|
+
/** Every distinct file a card is bound to (connected FILE paths + own code_refs). */
|
|
5
|
+
export function boundPathsForCard(index, card) {
|
|
6
|
+
const out = [];
|
|
7
|
+
const seen = new Set();
|
|
8
|
+
const add = (p, b) => {
|
|
9
|
+
if (!p || seen.has(p))
|
|
10
|
+
return;
|
|
11
|
+
seen.add(p);
|
|
12
|
+
out.push({ path: p, ...b });
|
|
13
|
+
};
|
|
14
|
+
// A FILE card is bound to its own path:.
|
|
15
|
+
if (card.type === 'FILE' && typeof card.frontmatter.path === 'string') {
|
|
16
|
+
add(card.frontmatter.path, { via: 'file-card', handle: card.handle });
|
|
17
|
+
}
|
|
18
|
+
for (const handle of [...(index.connectedHandles.get(card.handle) ?? [])].sort()) {
|
|
19
|
+
const neighbor = index.cards.get(handle);
|
|
20
|
+
if (!neighbor || neighbor.type !== 'FILE')
|
|
21
|
+
continue;
|
|
22
|
+
const p = neighbor.frontmatter.path;
|
|
23
|
+
if (typeof p === 'string')
|
|
24
|
+
add(p, { via: 'file-card', handle });
|
|
25
|
+
}
|
|
26
|
+
const refs = Array.isArray(card.frontmatter.code_refs) ? card.frontmatter.code_refs : [];
|
|
27
|
+
for (const ref of refs) {
|
|
28
|
+
if (typeof ref !== 'string')
|
|
29
|
+
continue;
|
|
30
|
+
const colon = ref.indexOf(':');
|
|
31
|
+
const p = colon > 0 ? ref.slice(0, colon) : ref;
|
|
32
|
+
const symbol = colon > 0 ? ref.slice(colon + 1) : undefined;
|
|
33
|
+
add(p, { via: 'code_ref', symbol });
|
|
34
|
+
}
|
|
35
|
+
return out;
|
|
36
|
+
}
|
|
37
|
+
const PER_FILE_MAX = 64 * 1024;
|
|
38
|
+
const TOTAL_MAX = 256 * 1024;
|
|
39
|
+
const SKIP_BASENAMES = new Set([
|
|
40
|
+
'package-lock.json', 'yarn.lock', 'pnpm-lock.yaml', 'npm-shrinkwrap.json',
|
|
41
|
+
'composer.lock', 'cargo.lock', 'poetry.lock', 'gemfile.lock', 'go.sum',
|
|
42
|
+
]);
|
|
43
|
+
const SKIP_DIR_RE = /(^|\/)(node_modules|dist|build|out|coverage|\.next|\.git|vendor)\//;
|
|
44
|
+
const BINARY_EXT = new Set([
|
|
45
|
+
'.png', '.jpg', '.jpeg', '.gif', '.webp', '.ico', '.svg', '.pdf', '.zip', '.gz',
|
|
46
|
+
'.tar', '.tgz', '.wasm', '.woff', '.woff2', '.ttf', '.eot', '.mp4', '.mov', '.mp3',
|
|
47
|
+
'.bin', '.exe', '.dll', '.so', '.dylib', '.class', '.jar', '.db', '.sqlite',
|
|
48
|
+
]);
|
|
49
|
+
const GENERATED_RE = /\.min\.(js|css)$|\.map$|\.lock$/;
|
|
50
|
+
/** Why a path should not have its contents attached, or null to attach it. */
|
|
51
|
+
function skipReason(p) {
|
|
52
|
+
const base = path.basename(p).toLowerCase();
|
|
53
|
+
const ext = path.extname(p).toLowerCase();
|
|
54
|
+
if (SKIP_BASENAMES.has(base))
|
|
55
|
+
return 'lockfile';
|
|
56
|
+
if (base === '.env' || base.startsWith('.env.') || ext === '.pem' || ext === '.key') {
|
|
57
|
+
return 'secrets';
|
|
58
|
+
}
|
|
59
|
+
if (SKIP_DIR_RE.test(p))
|
|
60
|
+
return 'generated/vendored';
|
|
61
|
+
if (BINARY_EXT.has(ext))
|
|
62
|
+
return 'binary';
|
|
63
|
+
if (ext === '.snap' || ext === '.tsbuildinfo')
|
|
64
|
+
return 'generated';
|
|
65
|
+
if (GENERATED_RE.test(p))
|
|
66
|
+
return 'generated';
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
/** First `max` bytes of a file, without loading the rest into memory. */
|
|
70
|
+
async function readCapped(abs, max) {
|
|
71
|
+
const fh = await open(abs);
|
|
72
|
+
try {
|
|
73
|
+
const buf = Buffer.alloc(max);
|
|
74
|
+
const { bytesRead } = await fh.read(buf, 0, max, 0);
|
|
75
|
+
return buf.subarray(0, bytesRead);
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
await fh.close();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Resolve a card's bound code. mode "paths" returns existence-checked paths
|
|
83
|
+
* (cheap; the agent Reads what it wants); mode "direct" also attaches file
|
|
84
|
+
* contents under per-file and total size caps, skipping binaries, lockfiles,
|
|
85
|
+
* and generated output. A file over the per-file cap attaches its head with
|
|
86
|
+
* `truncated: true` rather than being skipped.
|
|
87
|
+
*/
|
|
88
|
+
export async function resolveCodeForCard(planRoot, index, card, mode) {
|
|
89
|
+
const bound = boundPathsForCard(index, card);
|
|
90
|
+
let repoRoot = null;
|
|
91
|
+
try {
|
|
92
|
+
repoRoot = await repoRootFor(await realpath(planRoot));
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
repoRoot = null;
|
|
96
|
+
}
|
|
97
|
+
// Canonical repo root for the symlink-escape check below.
|
|
98
|
+
const realRepoRoot = repoRoot ? await realpath(repoRoot).catch(() => repoRoot) : null;
|
|
99
|
+
const escapes = (real) => realRepoRoot !== null && real !== realRepoRoot && !real.startsWith(realRepoRoot + path.sep);
|
|
100
|
+
const files = [];
|
|
101
|
+
const missing = [];
|
|
102
|
+
let total = 0;
|
|
103
|
+
let budgetExhausted = false;
|
|
104
|
+
for (const b of bound) {
|
|
105
|
+
const abs = repoRoot ? path.resolve(repoRoot, b.path) : null;
|
|
106
|
+
// Containment: a bound path with `..` must not escape the repo root and read
|
|
107
|
+
// arbitrary files. Reject anything resolving outside, in every mode.
|
|
108
|
+
const inside = abs !== null && repoRoot !== null
|
|
109
|
+
? abs === repoRoot || abs.startsWith(repoRoot + path.sep)
|
|
110
|
+
: false;
|
|
111
|
+
if (abs !== null && !inside) {
|
|
112
|
+
files.push({ ...b, exists: false, skipped: 'outside repo root' });
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
let exists = false;
|
|
116
|
+
let bytes;
|
|
117
|
+
if (abs) {
|
|
118
|
+
try {
|
|
119
|
+
const s = await stat(abs);
|
|
120
|
+
exists = s.isFile();
|
|
121
|
+
bytes = s.size;
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
exists = false;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Symlink containment: a file inside the repo may itself be a symlink pointing
|
|
128
|
+
// OUT of it; lexical containment can't catch that. Resolve the real path and
|
|
129
|
+
// refuse anything that leaves the tree (in both modes — the path is reported either way).
|
|
130
|
+
if (exists && abs) {
|
|
131
|
+
try {
|
|
132
|
+
if (escapes(await realpath(abs))) {
|
|
133
|
+
files.push({ ...b, exists: false, skipped: 'symlink escapes repo root' });
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
files.push({ ...b, exists: false, skipped: 'unresolvable' });
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (!exists)
|
|
143
|
+
missing.push(b.path);
|
|
144
|
+
const file = { ...b, exists, bytes };
|
|
145
|
+
if (mode === 'direct') {
|
|
146
|
+
if (!exists) {
|
|
147
|
+
file.skipped = 'missing';
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
const reason = skipReason(b.path);
|
|
151
|
+
const attachBytes = Math.min(bytes ?? 0, PER_FILE_MAX);
|
|
152
|
+
if (reason) {
|
|
153
|
+
file.skipped = reason;
|
|
154
|
+
}
|
|
155
|
+
else if (total + attachBytes > TOTAL_MAX) {
|
|
156
|
+
file.skipped = 'total budget exhausted';
|
|
157
|
+
budgetExhausted = true;
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
try {
|
|
161
|
+
const buf = await readCapped(abs, PER_FILE_MAX);
|
|
162
|
+
if (buf.includes(0)) {
|
|
163
|
+
file.skipped = 'binary';
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
// Cutting at a byte boundary may split a multibyte char at the
|
|
167
|
+
// very end; a single replacement char there is acceptable.
|
|
168
|
+
file.content = buf.toString('utf8');
|
|
169
|
+
total += buf.length;
|
|
170
|
+
if ((bytes ?? 0) > PER_FILE_MAX)
|
|
171
|
+
file.truncated = true;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
file.skipped = 'unreadable';
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
files.push(file);
|
|
181
|
+
}
|
|
182
|
+
return { repo_root: repoRoot, files, total_bytes: total, budget_exhausted: budgetExhausted, missing };
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code.js","sourceRoot":"","sources":["../../src/core/code.ts"],"names":[],"mappings":"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"}
|
package/dist/core/git.d.ts
CHANGED
|
@@ -11,6 +11,16 @@ export declare function writeSyncPoint(planRoot: string, sha?: string): Promise<
|
|
|
11
11
|
* the plan being dirty).
|
|
12
12
|
*/
|
|
13
13
|
export declare function planDirty(planRoot: string): Promise<boolean>;
|
|
14
|
+
/** The current HEAD sha of the repo the plan lives in. */
|
|
15
|
+
export declare function headSha(planRoot: string): Promise<string>;
|
|
16
|
+
/** Resolve a revision to a full commit sha, verifying it actually exists. */
|
|
17
|
+
export declare function resolveCommit(planRoot: string, rev: string): Promise<string>;
|
|
18
|
+
/**
|
|
19
|
+
* Of the given repo-relative paths, the subset that changed between `sinceSha`
|
|
20
|
+
* and the working tree — one git call. A path absent from the result is
|
|
21
|
+
* unchanged since that sha (file existence is checked separately, on disk).
|
|
22
|
+
*/
|
|
23
|
+
export declare function changedFilesSince(planRoot: string, sinceSha: string, paths: string[]): Promise<Set<string>>;
|
|
14
24
|
export type ChangeKind = 'added' | 'modified' | 'removed' | 'renamed';
|
|
15
25
|
export interface PlanChange {
|
|
16
26
|
handle: string;
|
package/dist/core/git.js
CHANGED
|
@@ -12,6 +12,19 @@ async function git(cwd, ...args) {
|
|
|
12
12
|
});
|
|
13
13
|
return stdout;
|
|
14
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Guard a caller-supplied git revision. A value starting with `-` would be
|
|
17
|
+
* parsed by git as an option, not a revision — e.g. `--output=/path` makes
|
|
18
|
+
* `git diff` write an arbitrary file. We both reject leading-dash revisions here
|
|
19
|
+
* and pass `--end-of-options` before every revision below, so no caller string
|
|
20
|
+
* is ever interpreted as a flag.
|
|
21
|
+
*/
|
|
22
|
+
function safeRev(rev) {
|
|
23
|
+
if (rev.startsWith('-')) {
|
|
24
|
+
throw new Error(`Refusing git revision that looks like an option: ${rev}`);
|
|
25
|
+
}
|
|
26
|
+
return rev;
|
|
27
|
+
}
|
|
15
28
|
export async function repoRootFor(planRoot) {
|
|
16
29
|
return (await git(planRoot, 'rev-parse', '--show-toplevel')).trim();
|
|
17
30
|
}
|
|
@@ -28,7 +41,7 @@ export async function readSyncPoint(planRoot) {
|
|
|
28
41
|
}
|
|
29
42
|
export async function writeSyncPoint(planRoot, sha) {
|
|
30
43
|
const resolved = sha
|
|
31
|
-
? (await git(planRoot, 'rev-parse', sha)).trim()
|
|
44
|
+
? (await git(planRoot, 'rev-parse', '--end-of-options', safeRev(sha))).trim()
|
|
32
45
|
: (await git(planRoot, 'rev-parse', 'HEAD')).trim();
|
|
33
46
|
const point = {
|
|
34
47
|
synced_sha: resolved,
|
|
@@ -49,6 +62,31 @@ export async function planDirty(planRoot) {
|
|
|
49
62
|
const out = await git(repoRoot, 'status', '--porcelain', '--', planRel, `:(exclude)${path.join(planRel, SYNC_FILE)}`);
|
|
50
63
|
return out.trim().length > 0;
|
|
51
64
|
}
|
|
65
|
+
/** The current HEAD sha of the repo the plan lives in. */
|
|
66
|
+
export async function headSha(planRoot) {
|
|
67
|
+
const realRoot = await realpath(planRoot);
|
|
68
|
+
const repoRoot = await repoRootFor(realRoot);
|
|
69
|
+
return (await git(repoRoot, 'rev-parse', 'HEAD')).trim();
|
|
70
|
+
}
|
|
71
|
+
/** Resolve a revision to a full commit sha, verifying it actually exists. */
|
|
72
|
+
export async function resolveCommit(planRoot, rev) {
|
|
73
|
+
const realRoot = await realpath(planRoot);
|
|
74
|
+
const repoRoot = await repoRootFor(realRoot);
|
|
75
|
+
return (await git(repoRoot, 'rev-parse', '--verify', '--end-of-options', `${safeRev(rev)}^{commit}`)).trim();
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Of the given repo-relative paths, the subset that changed between `sinceSha`
|
|
79
|
+
* and the working tree — one git call. A path absent from the result is
|
|
80
|
+
* unchanged since that sha (file existence is checked separately, on disk).
|
|
81
|
+
*/
|
|
82
|
+
export async function changedFilesSince(planRoot, sinceSha, paths) {
|
|
83
|
+
if (paths.length === 0)
|
|
84
|
+
return new Set();
|
|
85
|
+
const realRoot = await realpath(planRoot);
|
|
86
|
+
const repoRoot = await repoRootFor(realRoot);
|
|
87
|
+
const out = await git(repoRoot, 'diff', '--name-only', '--end-of-options', safeRev(sinceSha), '--', ...paths);
|
|
88
|
+
return new Set(out.split('\n').map((l) => l.trim()).filter(Boolean));
|
|
89
|
+
}
|
|
52
90
|
export async function diffPlan(planRoot, base, head) {
|
|
53
91
|
// realpath: git reports the canonical repo root, which may differ from the
|
|
54
92
|
// caller's path through symlinks (e.g. /var vs /private/var on macOS).
|
|
@@ -68,9 +106,9 @@ export async function diffPlan(planRoot, base, head) {
|
|
|
68
106
|
baseSource = 'HEAD';
|
|
69
107
|
}
|
|
70
108
|
}
|
|
71
|
-
const args = ['diff', '--name-status', '-M', resolvedBase];
|
|
109
|
+
const args = ['diff', '--name-status', '-M', '--end-of-options', safeRev(resolvedBase)];
|
|
72
110
|
if (head)
|
|
73
|
-
args.push(head);
|
|
111
|
+
args.push(safeRev(head));
|
|
74
112
|
args.push('--', planRel);
|
|
75
113
|
const output = await git(repoRoot, ...args);
|
|
76
114
|
const changes = [];
|
|
@@ -223,7 +261,7 @@ export async function countCodeCommitsSince(planRoot, sinceSha) {
|
|
|
223
261
|
const realRoot = await realpath(planRoot);
|
|
224
262
|
const repoRoot = await repoRootFor(realRoot);
|
|
225
263
|
const planRel = path.relative(repoRoot, realRoot) || '.';
|
|
226
|
-
const out = await git(repoRoot, 'rev-list', '--count', `${sinceSha}..HEAD`, '--', '.', `:(exclude)${planRel}`);
|
|
264
|
+
const out = await git(repoRoot, 'rev-list', '--count', `${safeRev(sinceSha)}..HEAD`, '--', '.', `:(exclude)${planRel}`);
|
|
227
265
|
return Number.parseInt(out.trim(), 10) || 0;
|
|
228
266
|
}
|
|
229
267
|
//# sourceMappingURL=git.js.map
|