@magic-spells/constellation 0.1.0 → 0.2.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 +41 -4
- package/dist/cli/index.js +62 -10
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/update-check.d.ts +6 -0
- package/dist/cli/update-check.js +70 -0
- package/dist/cli/update-check.js.map +1 -0
- package/dist/{mcp → core}/git.d.ts +19 -0
- package/dist/{mcp → core}/git.js +59 -2
- package/dist/core/git.js.map +1 -0
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.js +1 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/repos.d.ts +40 -0
- package/dist/core/repos.js +93 -0
- package/dist/core/repos.js.map +1 -0
- package/dist/core/resolve.js +10 -1
- package/dist/core/resolve.js.map +1 -1
- package/dist/core/scaffold.d.ts +16 -3
- package/dist/core/scaffold.js +30 -7
- package/dist/core/scaffold.js.map +1 -1
- package/dist/core/sync.d.ts +28 -0
- package/dist/core/sync.js +85 -0
- package/dist/core/sync.js.map +1 -0
- package/dist/core/types.d.ts +12 -0
- package/dist/mcp/server.js +434 -38
- package/dist/mcp/server.js.map +1 -1
- package/dist/serve/server.js +28 -4
- package/dist/serve/server.js.map +1 -1
- package/docs/001-file-format.md +25 -0
- package/docs/002-mcp.md +56 -7
- package/examples/constellation/plan.md +1 -1
- package/package.json +3 -1
- package/schemas/plan.json +27 -0
- package/skill/SKILL.md +131 -1
- package/skill/methodology.md +228 -0
- package/skill/types/plan.md +19 -0
- package/viewer/dist/assets/{arc-Kj6pF3JI.js → arc-CMMRgIq9.js} +1 -1
- package/viewer/dist/assets/architecture-7EHR7CIX-Cbb-syEI.js +1 -0
- package/viewer/dist/assets/{architectureDiagram-3BPJPVTR-C5bZdErB.js → architectureDiagram-3BPJPVTR-CB5p_qlN.js} +1 -1
- package/viewer/dist/assets/{blockDiagram-GPEHLZMM-C1Q6l6fE.js → blockDiagram-GPEHLZMM-DpnMj_e6.js} +1 -1
- package/viewer/dist/assets/{c4Diagram-AAUBKEIU-BmM6Tmtq.js → c4Diagram-AAUBKEIU-f91ngVN8.js} +1 -1
- package/viewer/dist/assets/channel-C2bkEQHQ.js +1 -0
- package/viewer/dist/assets/{chunk-2J33WTMH-z09tLTpZ.js → chunk-2J33WTMH-y7Pz5tMO.js} +1 -1
- package/viewer/dist/assets/{chunk-3OPIFGDE-BynpXh1r.js → chunk-3OPIFGDE-Ir_ghIUQ.js} +1 -1
- package/viewer/dist/assets/{chunk-4BX2VUAB-CDOVuPyG.js → chunk-4BX2VUAB-BTPyM1ux.js} +1 -1
- package/viewer/dist/assets/{chunk-55IACEB6-nBwigOgn.js → chunk-55IACEB6-CtNd8e4Y.js} +1 -1
- package/viewer/dist/assets/{chunk-5ZQYHXKU-Bxe5xIy_.js → chunk-5ZQYHXKU-Dd3yz721.js} +1 -1
- package/viewer/dist/assets/{chunk-727SXJPM-DZmTgL68.js → chunk-727SXJPM-CAM8mGbv.js} +1 -1
- package/viewer/dist/assets/{chunk-AQP2D5EJ-B7wr_Owx.js → chunk-AQP2D5EJ-C3nW9Uve.js} +1 -1
- package/viewer/dist/assets/{chunk-BSJP7CBP-DbAKfVCK.js → chunk-BSJP7CBP-r6MRPvAH.js} +1 -1
- package/viewer/dist/assets/{chunk-CSCIHK7Q-C0rsBwqP.js → chunk-CSCIHK7Q-Cn-ZTxsS.js} +1 -1
- package/viewer/dist/assets/{chunk-FMBD7UC4-BAtzt0wv.js → chunk-FMBD7UC4-5axXeZJa.js} +1 -1
- package/viewer/dist/assets/{chunk-KSCS5N6A-CXXwf52I.js → chunk-KSCS5N6A-BwmNx0l0.js} +1 -1
- package/viewer/dist/assets/{chunk-L5ZTLDWV-DS4vRI1U.js → chunk-L5ZTLDWV-C2YNkUjB.js} +1 -1
- package/viewer/dist/assets/chunk-LZXEDZCA-CznuDgQD.js +2 -0
- package/viewer/dist/assets/{chunk-ND2GUHAM-CUSnPl8t.js → chunk-ND2GUHAM-CokDnghi.js} +1 -1
- package/viewer/dist/assets/{chunk-NZK2D7GU-Dh986nJk.js → chunk-NZK2D7GU-aaU0v4QE.js} +1 -1
- package/viewer/dist/assets/{chunk-O5CBEL6O-JAEZ_pS6.js → chunk-O5CBEL6O-ByfKhkZf.js} +1 -1
- package/viewer/dist/assets/chunk-QZHKN3VN-DJRjGeIo.js +1 -0
- package/viewer/dist/assets/chunk-WU5MYG2G-C63BVvr_.js +1 -0
- package/viewer/dist/assets/{chunk-XPW4576I-BwMZI0gv.js → chunk-XPW4576I-Amo3awtq.js} +1 -1
- package/viewer/dist/assets/classDiagram-4FO5ZUOK-z_bO1V-j.js +1 -0
- package/viewer/dist/assets/classDiagram-v2-Q7XG4LA2-z_bO1V-j.js +1 -0
- package/viewer/dist/assets/{cose-bilkent-S5V4N54A-NGC7gYHM.js → cose-bilkent-S5V4N54A-CO8yESCW.js} +1 -1
- package/viewer/dist/assets/{dagre-BM42HDAG-RD63uyvd.js → dagre-BM42HDAG-BnmNVNI2.js} +1 -1
- package/viewer/dist/assets/{diagram-2AECGRRQ-hwnqqCcb.js → diagram-2AECGRRQ-lcGXcbei.js} +1 -1
- package/viewer/dist/assets/{diagram-5GNKFQAL-q8EaoZSG.js → diagram-5GNKFQAL-Cj3-lPUt.js} +1 -1
- package/viewer/dist/assets/{diagram-KO2AKTUF-D4_5Qf-l.js → diagram-KO2AKTUF-CtXdRI4M.js} +1 -1
- package/viewer/dist/assets/{diagram-LMA3HP47-D8pwekFs.js → diagram-LMA3HP47-CIyLAzX7.js} +1 -1
- package/viewer/dist/assets/{diagram-OG6HWLK6-D9KinIWZ.js → diagram-OG6HWLK6-BwF4bQCv.js} +1 -1
- package/viewer/dist/assets/{dist-CFOOgrqc.js → dist-DzXuQd4N.js} +1 -1
- package/viewer/dist/assets/{erDiagram-TEJ5UH35-D0Wfq250.js → erDiagram-TEJ5UH35-DjwFw9yq.js} +1 -1
- package/viewer/dist/assets/eventmodeling-FCH6USID-BlKFmSzA.js +1 -0
- package/viewer/dist/assets/{flowDiagram-I6XJVG4X-Y2DY-Ze2.js → flowDiagram-I6XJVG4X-CzXbf7vQ.js} +1 -1
- package/viewer/dist/assets/{ganttDiagram-6RSMTGT7-BnqkeLVw.js → ganttDiagram-6RSMTGT7-BYcIhfmm.js} +1 -1
- package/viewer/dist/assets/{gitGraph-WXDBUCRP-Cft7usRT.js → gitGraph-WXDBUCRP-H8XeJ9QB.js} +1 -1
- package/viewer/dist/assets/{gitGraphDiagram-PVQCEYII-D-cYtraK.js → gitGraphDiagram-PVQCEYII-DtAPXKFK.js} +1 -1
- package/viewer/dist/assets/index-Bqs39Itl.css +2 -0
- package/viewer/dist/assets/index-DLPCG_Or.js +98 -0
- package/viewer/dist/assets/{info-J43DQDTF-Djc8Bx3F.js → info-J43DQDTF-BQScorZ0.js} +1 -1
- package/viewer/dist/assets/{infoDiagram-5YYISTIA-D-ehtyyJ.js → infoDiagram-5YYISTIA-Udl1omvH.js} +1 -1
- package/viewer/dist/assets/{ishikawaDiagram-YF4QCWOH-Ct3f6bH-.js → ishikawaDiagram-YF4QCWOH-VnfzT_hk.js} +1 -1
- package/viewer/dist/assets/{journeyDiagram-JHISSGLW-DXlULEmi.js → journeyDiagram-JHISSGLW-Btn4EVoD.js} +1 -1
- package/viewer/dist/assets/{kanban-definition-UN3LZRKU-3vE9h-R7.js → kanban-definition-UN3LZRKU-flOzWhPe.js} +1 -1
- package/viewer/dist/assets/{line-B8MygbLB.js → line-DJJ9BLuY.js} +1 -1
- package/viewer/dist/assets/{linear-CfMuM0B3.js → linear-C2SUy5ns.js} +1 -1
- package/viewer/dist/assets/{mermaid-parser.core-DzlZTbbh.js → mermaid-parser.core-xhSeYiZo.js} +2 -2
- package/viewer/dist/assets/{mermaid.core-IM-sPiyq.js → mermaid.core-DmeSIitY.js} +3 -3
- package/viewer/dist/assets/{mindmap-definition-RKZ34NQL-CMnpAq1T.js → mindmap-definition-RKZ34NQL-CCJcMKx1.js} +1 -1
- package/viewer/dist/assets/{packet-YPE3B663-D44AzgHh.js → packet-YPE3B663-DS8RscAk.js} +1 -1
- package/viewer/dist/assets/{pie-LRSECV5Y-DL8AVJH_.js → pie-LRSECV5Y-I2ZQhrNJ.js} +1 -1
- package/viewer/dist/assets/{pieDiagram-4H26LBE5-FvKK5jd7.js → pieDiagram-4H26LBE5-BS5HMs4j.js} +1 -1
- package/viewer/dist/assets/{quadrantDiagram-W4KKPZXB-CmjSkU8c.js → quadrantDiagram-W4KKPZXB-W4H8cw2_.js} +1 -1
- package/viewer/dist/assets/{radar-GUYGQ44K-BvfZTVyH.js → radar-GUYGQ44K-kf6QvSne.js} +1 -1
- package/viewer/dist/assets/{requirementDiagram-4Y6WPE33-BOjca3VH.js → requirementDiagram-4Y6WPE33-DSbuDQGQ.js} +1 -1
- package/viewer/dist/assets/{sankeyDiagram-5OEKKPKP-ANcjfNix.js → sankeyDiagram-5OEKKPKP-CH8Qr2vL.js} +1 -1
- package/viewer/dist/assets/{sequenceDiagram-3UESZ5HK-BLQ9AL7I.js → sequenceDiagram-3UESZ5HK-EugVcdad.js} +1 -1
- package/viewer/dist/assets/src-CM_9kdrU.js +1 -0
- package/viewer/dist/assets/{stateDiagram-AJRCARHV-D6CriBS6.js → stateDiagram-AJRCARHV-DiFl94Qy.js} +1 -1
- package/viewer/dist/assets/stateDiagram-v2-BHNVJYJU-BlJV8F13.js +1 -0
- package/viewer/dist/assets/{timeline-definition-PNZ67QCA-BNhWZ_DL.js → timeline-definition-PNZ67QCA-B0KW9GUN.js} +1 -1
- package/viewer/dist/assets/{treeView-BLDUP644-CY6Ph5Pu.js → treeView-BLDUP644-CAEY4mxq.js} +1 -1
- package/viewer/dist/assets/{treemap-LRROVOQU-DChSA_Qx.js → treemap-LRROVOQU-VVaEaTlU.js} +1 -1
- package/viewer/dist/assets/{vennDiagram-CIIHVFJN-C01WznAC.js → vennDiagram-CIIHVFJN-BSLGNfJd.js} +1 -1
- package/viewer/dist/assets/{wardley-L42UT6IY-BJ8uNoJu.js → wardley-L42UT6IY-C-5cXbAU.js} +1 -1
- package/viewer/dist/assets/{wardleyDiagram-YWT4CUSO-DwDEzlVm.js → wardleyDiagram-YWT4CUSO-COk4TVnQ.js} +1 -1
- package/viewer/dist/assets/{xychartDiagram-2RQKCTM6-BCvIDwU0.js → xychartDiagram-2RQKCTM6-CClGJLJp.js} +1 -1
- package/viewer/dist/index.html +3 -3
- package/dist/mcp/git.js.map +0 -1
- package/viewer/dist/assets/architecture-7EHR7CIX-CGfWeim3.js +0 -1
- package/viewer/dist/assets/channel-19IdUS_c.js +0 -1
- package/viewer/dist/assets/chunk-LZXEDZCA-CclT9MXr.js +0 -2
- package/viewer/dist/assets/chunk-QZHKN3VN-BKc_Kg2Z.js +0 -1
- package/viewer/dist/assets/chunk-WU5MYG2G-9ssTSMzt.js +0 -1
- package/viewer/dist/assets/classDiagram-4FO5ZUOK-DXv85WFd.js +0 -1
- package/viewer/dist/assets/classDiagram-v2-Q7XG4LA2-DXv85WFd.js +0 -1
- package/viewer/dist/assets/eventmodeling-FCH6USID-D3KRSuC1.js +0 -1
- package/viewer/dist/assets/index-CDR-riG2.css +0 -2
- package/viewer/dist/assets/index-DRPsTWe2.js +0 -98
- package/viewer/dist/assets/src-CAMdANUp.js +0 -1
- package/viewer/dist/assets/stateDiagram-v2-BHNVJYJU-DcTp66RQ.js +0 -1
package/README.md
CHANGED
|
@@ -40,6 +40,7 @@ constellation init # scaffold constellation/ with a starter plan.md
|
|
|
40
40
|
constellation lint # validate handles, references, folders, schemas
|
|
41
41
|
constellation mcp # run the MCP server (stdio) for AI agents
|
|
42
42
|
constellation serve # open the local viewer (editable; --readonly to disable)
|
|
43
|
+
constellation repos # list sibling repos declared in connected_repos
|
|
43
44
|
```
|
|
44
45
|
|
|
45
46
|
Lint errors (broken graph: bad handles, dangling structured references,
|
|
@@ -55,7 +56,7 @@ unknown fields, dangling prose links) don't block.
|
|
|
55
56
|
| `schemas/` | JSON Schemas: `card.json` (reserved keys) + one per type |
|
|
56
57
|
| `skill/` | AI authoring skill: `SKILL.md` + per-type references with golden examples |
|
|
57
58
|
| `src/core/` | Parser, reference extraction, indexer, schema validation, lint |
|
|
58
|
-
| `src/cli/` | The `constellation` binary (`
|
|
59
|
+
| `src/cli/` | The `constellation` binary (`init`, `lint`, `mcp`, `serve`, `repos`) |
|
|
59
60
|
| `src/mcp/` | MCP server: hydrated retrieval, validated writes, git tools |
|
|
60
61
|
| `examples/constellation/` | Golden sample plan — one card of every type, lints clean, doubles as the test fixture |
|
|
61
62
|
|
|
@@ -79,6 +80,10 @@ npm run build # tsc → dist/
|
|
|
79
80
|
Body-only updates never reformat frontmatter.
|
|
80
81
|
- **Git-powered change tracking**: `diff_plan` (per-card changes since the sync
|
|
81
82
|
marker), `plan_log`, `set_sync_point`, `check_integrity`.
|
|
83
|
+
- **Connected repos (multi-repo)**: a plan can declare sibling repos
|
|
84
|
+
(`add_connected_repo` / `list_connected_repos` / `remove_connected_repo`); every
|
|
85
|
+
tool takes an optional `repo` selector to read or write a sibling's plan. Omit it
|
|
86
|
+
and single-repo behavior is unchanged.
|
|
82
87
|
- **Visual viewer**: `start_viewer` / `stop_viewer` open and close the local web
|
|
83
88
|
viewer from inside an agent session, returning a clickable URL.
|
|
84
89
|
|
|
@@ -100,6 +105,38 @@ claude mcp add --scope project constellation -- npx -y @magic-spells/constellati
|
|
|
100
105
|
Manage it with `claude mcp list`, `claude mcp get constellation`, and
|
|
101
106
|
`claude mcp remove constellation`.
|
|
102
107
|
|
|
108
|
+
To build a plan from an existing codebase (or audit one), ask the agent to bootstrap or
|
|
109
|
+
audit — the server ships **`bootstrap_plan`** and **`audit_plan`** prompts (slash commands
|
|
110
|
+
in Claude Code) that walk the code macro→micro: follow the data, follow the user/auth, then
|
|
111
|
+
step back and pressure-test the plan for blind spots (missing unhappy paths, auth gaps,
|
|
112
|
+
forgotten cross-cutting concerns) and recommend. The full method is in
|
|
113
|
+
[`skill/methodology.md`](skill/methodology.md).
|
|
114
|
+
|
|
115
|
+
### Add to Codex
|
|
116
|
+
|
|
117
|
+
Codex CLI keeps MCP servers in `~/.codex/config.toml` (TOML, not JSON). Add it with the CLI:
|
|
118
|
+
|
|
119
|
+
```sh
|
|
120
|
+
# Run straight from npm — no install needed:
|
|
121
|
+
codex mcp add constellation -- npx -y @magic-spells/constellation mcp
|
|
122
|
+
|
|
123
|
+
# Or, if installed globally (npm i -g @magic-spells/constellation):
|
|
124
|
+
codex mcp add constellation -- constellation mcp
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
…or hand-edit the config (a project-scoped `.codex/config.toml` also works in trusted repos):
|
|
128
|
+
|
|
129
|
+
```toml
|
|
130
|
+
[mcp_servers.constellation]
|
|
131
|
+
command = "npx"
|
|
132
|
+
args = ["-y", "@magic-spells/constellation", "mcp"]
|
|
133
|
+
cwd = "/path/to/your/repo" # so the server walks up to your plan
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Launch `codex` from your repo root (or set `cwd` above) so the server starts there and finds
|
|
137
|
+
the plan — otherwise tools return `NO_PLAN_FOUND`. Run `/mcp` inside a Codex session to confirm
|
|
138
|
+
it's connected; manage it with `codex mcp list` and `codex mcp remove constellation`.
|
|
139
|
+
|
|
103
140
|
### Other MCP clients
|
|
104
141
|
|
|
105
142
|
Hand-edit the client's config (Claude Desktop, a project `.mcp.json`, etc.):
|
|
@@ -123,9 +160,10 @@ may not be your project — in which case tools return `NO_PLAN_FOUND`.
|
|
|
123
160
|
## Viewer
|
|
124
161
|
|
|
125
162
|
`constellation serve` renders the plan as a local website, **editable in place**
|
|
126
|
-
(pass `--readonly` to disable writes).
|
|
163
|
+
(pass `--readonly` to disable writes). Nine themes toggle in the header:
|
|
127
164
|
**observatory** (dark, star-field), **claw** (cream paper, serif, coral accents),
|
|
128
|
-
**black**, **synthwave**,
|
|
165
|
+
**black**, **synthwave**, **sumi**, **daylight**, **frost**, **ember**, and **corona**.
|
|
166
|
+
Card pages show structured fields, the
|
|
129
167
|
markdown body, connection chips in both directions, and a small constellation
|
|
130
168
|
diagram of the card's neighborhood — its nodes tinted by card type. Mermaid blocks
|
|
131
169
|
render in-browser, `[[HANDLE]]` links navigate, and the page live-reloads when plan
|
|
@@ -144,4 +182,3 @@ calls the `start_viewer` MCP tool, which returns the URL (`stop_viewer` closes i
|
|
|
144
182
|
<p align="center">
|
|
145
183
|
Made by <a href="https://github.com/coryschulz">Cory Schulz</a>
|
|
146
184
|
</p>
|
|
147
|
-
|
package/dist/cli/index.js
CHANGED
|
@@ -1,14 +1,42 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
2
3
|
import path from 'node:path';
|
|
3
4
|
import process from 'node:process';
|
|
4
5
|
import { Command } from 'commander';
|
|
5
6
|
import pc from 'picocolors';
|
|
6
7
|
import { lintPlan } from '../core/lint.js';
|
|
8
|
+
import { listConnectedRepos } from '../core/repos.js';
|
|
7
9
|
import { resolvePlanDir } from '../core/resolve.js';
|
|
10
|
+
import { notifyUpdate } from './update-check.js';
|
|
11
|
+
const require = createRequire(import.meta.url);
|
|
12
|
+
const { name, version } = require('../../package.json');
|
|
8
13
|
const program = new Command();
|
|
14
|
+
async function openUrl(url) {
|
|
15
|
+
try {
|
|
16
|
+
const { spawn } = await import('node:child_process');
|
|
17
|
+
const child = process.platform === 'darwin'
|
|
18
|
+
? spawn('open', [url], { stdio: 'ignore', detached: true })
|
|
19
|
+
: process.platform === 'win32'
|
|
20
|
+
? spawn('cmd', ['/c', 'start', '', url], {
|
|
21
|
+
stdio: 'ignore',
|
|
22
|
+
detached: true,
|
|
23
|
+
windowsHide: true,
|
|
24
|
+
})
|
|
25
|
+
: spawn('xdg-open', [url], { stdio: 'ignore', detached: true });
|
|
26
|
+
child.on('error', () => { });
|
|
27
|
+
child.unref();
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// Opening the browser is best-effort; the server URL is still printed.
|
|
31
|
+
}
|
|
32
|
+
}
|
|
9
33
|
program
|
|
10
34
|
.name('constellation')
|
|
11
|
-
.description('Files-first architecture planning for AI-assisted development')
|
|
35
|
+
.description('Files-first architecture planning for AI-assisted development')
|
|
36
|
+
.version(version);
|
|
37
|
+
// Update notice on every human command, but never for `mcp` (its stdout is JSON-RPC).
|
|
38
|
+
if (process.argv[2] !== 'mcp')
|
|
39
|
+
notifyUpdate(name, version);
|
|
12
40
|
program
|
|
13
41
|
.command('lint')
|
|
14
42
|
.argument('[path]', 'plan folder, or a directory containing constellation/ (default: walk up from cwd)')
|
|
@@ -54,12 +82,14 @@ program
|
|
|
54
82
|
program
|
|
55
83
|
.command('init')
|
|
56
84
|
.argument('[path]', 'directory to create the plan in (default: cwd)', '.')
|
|
85
|
+
.option('-n, --name <name>', 'project name shown as the viewer title (default: a title-cased folder name)')
|
|
57
86
|
.description('Scaffold a constellation/ folder with a starter plan.md')
|
|
58
|
-
.action(async (target) => {
|
|
87
|
+
.action(async (target, opts) => {
|
|
59
88
|
const { initPlan } = await import('../core/scaffold.js');
|
|
60
89
|
try {
|
|
61
|
-
const root = await initPlan(target);
|
|
90
|
+
const { root, name: projectName } = await initPlan(target, { name: opts.name });
|
|
62
91
|
console.log(pc.green('✓') + ` Created ${path.relative(process.cwd(), root)}/plan.md`);
|
|
92
|
+
console.log(` Project name: ${pc.bold(projectName)} ${pc.dim('— edit the name: field in plan.md to change it')}`);
|
|
63
93
|
console.log('\nAdd cards as <type>/<HANDLE>.md (e.g. api/API-LIST-USERS.md),\nthen run `constellation lint` to validate.');
|
|
64
94
|
}
|
|
65
95
|
catch (err) {
|
|
@@ -111,14 +141,36 @@ program
|
|
|
111
141
|
console.log(`${pc.green('✓')} Constellation viewer at ${pc.underline(url)}`);
|
|
112
142
|
console.log(pc.dim(` plan: ${root}`));
|
|
113
143
|
if (opts.open) {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
144
|
+
await openUrl(url);
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
program
|
|
148
|
+
.command('repos')
|
|
149
|
+
.argument('[path]', 'plan folder, or a directory containing constellation/ (default: walk up from cwd)')
|
|
150
|
+
.description('List the sibling repos declared in connected_repos')
|
|
151
|
+
.action(async (target) => {
|
|
152
|
+
const root = await resolvePlanDir(target ?? undefined);
|
|
153
|
+
if (!root) {
|
|
154
|
+
console.error(pc.red('No constellation/ folder found.') +
|
|
155
|
+
' Run `constellation init` to create one.');
|
|
156
|
+
process.exit(2);
|
|
157
|
+
}
|
|
158
|
+
const repos = await listConnectedRepos(root);
|
|
159
|
+
if (repos.length === 0) {
|
|
160
|
+
console.log(pc.dim('No connected repos declared in plan.md (connected_repos).'));
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
for (const r of repos) {
|
|
164
|
+
const status = r.reachable
|
|
165
|
+
? pc.green('✓ reachable')
|
|
166
|
+
: pc.yellow('• not found here');
|
|
167
|
+
console.log(`${pc.bold(r.name)} ${pc.dim(r.path)} ${status}`);
|
|
168
|
+
if (r.description)
|
|
169
|
+
console.log(` ${r.description}`);
|
|
121
170
|
}
|
|
171
|
+
console.log();
|
|
172
|
+
console.log(pc.dim(`${repos.length} connected repo${repos.length === 1 ? '' : 's'}. ` +
|
|
173
|
+
'Paths are relative to this repo; "not found here" just means a different local layout.'));
|
|
122
174
|
});
|
|
123
175
|
program.parseAsync(process.argv).catch((err) => {
|
|
124
176
|
console.error(pc.red(err instanceof Error ? err.message : String(err)));
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAU,cAAc,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Print an "update available" notice on stderr (from cache — never hits the
|
|
3
|
+
* network on this path, so it never blocks), then kick off a detached
|
|
4
|
+
* background refresh if the cache is stale. Do NOT call this for `mcp`.
|
|
5
|
+
*/
|
|
6
|
+
export declare function notifyUpdate(name: string, current: string): void;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { readFileSync } from 'node:fs';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import process from 'node:process';
|
|
6
|
+
import pc from 'picocolors';
|
|
7
|
+
const CACHE_FILE = join(process.env.XDG_CACHE_HOME || join(homedir(), '.cache'), 'constellation', 'update.json');
|
|
8
|
+
const ONE_DAY = 24 * 60 * 60 * 1000;
|
|
9
|
+
/**
|
|
10
|
+
* Print an "update available" notice on stderr (from cache — never hits the
|
|
11
|
+
* network on this path, so it never blocks), then kick off a detached
|
|
12
|
+
* background refresh if the cache is stale. Do NOT call this for `mcp`.
|
|
13
|
+
*/
|
|
14
|
+
export function notifyUpdate(name, current) {
|
|
15
|
+
if (!process.stderr.isTTY)
|
|
16
|
+
return; // not a terminal (pipe / redirect)
|
|
17
|
+
if (process.env.CI || process.env.NO_UPDATE_NOTIFIER)
|
|
18
|
+
return;
|
|
19
|
+
const cache = readCache();
|
|
20
|
+
if (cache?.latest && isNewer(cache.latest, current)) {
|
|
21
|
+
process.stderr.write(`\n ${pc.yellow('▲ Update available')} ${pc.dim(`${current} →`)} ${pc.green(cache.latest)}\n` +
|
|
22
|
+
` ${pc.dim('Run')} ${pc.cyan(`npm i -g ${name}`)}\n\n`);
|
|
23
|
+
}
|
|
24
|
+
if (!cache || Date.now() - cache.checkedAt > ONE_DAY)
|
|
25
|
+
scheduleRefresh(name);
|
|
26
|
+
}
|
|
27
|
+
function readCache() {
|
|
28
|
+
try {
|
|
29
|
+
return JSON.parse(readFileSync(CACHE_FILE, 'utf8'));
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/** Detached child fetches the registry, writes the cache, then exits — outlives us. */
|
|
36
|
+
function scheduleRefresh(name) {
|
|
37
|
+
const script = `
|
|
38
|
+
const fs = require('node:fs'), path = require('node:path'), file = process.argv[2];
|
|
39
|
+
fetch('https://registry.npmjs.org/' + process.argv[1] + '/latest')
|
|
40
|
+
.then((r) => r.json())
|
|
41
|
+
.then((j) => {
|
|
42
|
+
if (!j?.version) return;
|
|
43
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
44
|
+
fs.writeFileSync(file, JSON.stringify({ latest: j.version, checkedAt: Date.now() }));
|
|
45
|
+
})
|
|
46
|
+
.catch(() => {});
|
|
47
|
+
`;
|
|
48
|
+
try {
|
|
49
|
+
spawn(process.execPath, ['-e', script, name, CACHE_FILE], {
|
|
50
|
+
detached: true,
|
|
51
|
+
stdio: 'ignore',
|
|
52
|
+
}).unref();
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
/* a failed background check must never affect the CLI */
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/** Is `a` a newer release than `b`? Compares major.minor.patch; ignores prerelease tags. */
|
|
59
|
+
function isNewer(a, b) {
|
|
60
|
+
const pa = a.split('-')[0].split('.').map(Number);
|
|
61
|
+
const pb = b.split('-')[0].split('.').map(Number);
|
|
62
|
+
for (let i = 0; i < 3; i++) {
|
|
63
|
+
const da = pa[i] || 0;
|
|
64
|
+
const db = pb[i] || 0;
|
|
65
|
+
if (da !== db)
|
|
66
|
+
return da > db;
|
|
67
|
+
}
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=update-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../src/cli/update-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -32,3 +32,22 @@ export interface LogEntry {
|
|
|
32
32
|
subject: string;
|
|
33
33
|
}
|
|
34
34
|
export declare function planLog(planRoot: string, cardRelPath: string, limit?: number): Promise<LogEntry[]>;
|
|
35
|
+
export interface SyncActivity {
|
|
36
|
+
sha: string;
|
|
37
|
+
short_sha: string;
|
|
38
|
+
date: string;
|
|
39
|
+
subject: string;
|
|
40
|
+
cards: string[];
|
|
41
|
+
is_sync_point: boolean;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Recent commits that touched the plan folder, newest first. Each entry lists the
|
|
45
|
+
* plan-card handles it changed and flags sync-point commits (those that moved the
|
|
46
|
+
* .sync.json marker). Derived live from git — the activity log is never stored.
|
|
47
|
+
*/
|
|
48
|
+
export declare function recentPlanActivity(planRoot: string, limit?: number): Promise<SyncActivity[]>;
|
|
49
|
+
/**
|
|
50
|
+
* How many commits between `sinceSha` and HEAD touch files OUTSIDE the plan folder
|
|
51
|
+
* — i.e. how far the code has moved since the plan was last reconciled.
|
|
52
|
+
*/
|
|
53
|
+
export declare function countCodeCommitsSince(planRoot: string, sinceSha: string): Promise<number>;
|
package/dist/{mcp → core}/git.js
RENAMED
|
@@ -2,8 +2,8 @@ import { execFile } from 'node:child_process';
|
|
|
2
2
|
import { readFile, realpath, writeFile } from 'node:fs/promises';
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import { promisify } from 'node:util';
|
|
5
|
-
import { isHandleShaped, typeForHandle } from '
|
|
6
|
-
import { parseFile } from '
|
|
5
|
+
import { isHandleShaped, typeForHandle } from './handles.js';
|
|
6
|
+
import { parseFile } from './parse.js';
|
|
7
7
|
const exec = promisify(execFile);
|
|
8
8
|
async function git(cwd, ...args) {
|
|
9
9
|
const { stdout } = await exec('git', args, {
|
|
@@ -169,4 +169,61 @@ export async function planLog(planRoot, cardRelPath, limit = 20) {
|
|
|
169
169
|
return { sha, date, subject: subject.join('\t') };
|
|
170
170
|
});
|
|
171
171
|
}
|
|
172
|
+
/**
|
|
173
|
+
* Recent commits that touched the plan folder, newest first. Each entry lists the
|
|
174
|
+
* plan-card handles it changed and flags sync-point commits (those that moved the
|
|
175
|
+
* .sync.json marker). Derived live from git — the activity log is never stored.
|
|
176
|
+
*/
|
|
177
|
+
export async function recentPlanActivity(planRoot, limit = 6) {
|
|
178
|
+
const realRoot = await realpath(planRoot);
|
|
179
|
+
const repoRoot = await repoRootFor(realRoot);
|
|
180
|
+
const planRel = path.relative(repoRoot, realRoot) || '.';
|
|
181
|
+
// %x1e (record separator) prefixes each commit; %x1f (unit separator) splits the
|
|
182
|
+
// header fields; --name-only then lists that commit's files (scoped to the plan
|
|
183
|
+
// folder) on their own lines. One git call, parsed defensively.
|
|
184
|
+
const out = await git(repoRoot, 'log', `-n${limit}`, '--pretty=format:%x1e%H%x1f%aI%x1f%s', '--name-only', '--', planRel);
|
|
185
|
+
const activity = [];
|
|
186
|
+
for (const record of out.split('\x1e')) {
|
|
187
|
+
if (!record.trim())
|
|
188
|
+
continue;
|
|
189
|
+
const newline = record.indexOf('\n');
|
|
190
|
+
const header = newline === -1 ? record : record.slice(0, newline);
|
|
191
|
+
const [sha, date, subject] = header.split('\x1f');
|
|
192
|
+
if (!sha)
|
|
193
|
+
continue;
|
|
194
|
+
const files = (newline === -1 ? '' : record.slice(newline + 1))
|
|
195
|
+
.split('\n')
|
|
196
|
+
.map((f) => f.trim())
|
|
197
|
+
.filter(Boolean);
|
|
198
|
+
const cards = [];
|
|
199
|
+
let isSyncPoint = false;
|
|
200
|
+
for (const file of files) {
|
|
201
|
+
if (path.basename(file) === SYNC_FILE)
|
|
202
|
+
isSyncPoint = true;
|
|
203
|
+
const handle = handleForRepoPath(file, planRel);
|
|
204
|
+
if (handle && !cards.includes(handle))
|
|
205
|
+
cards.push(handle);
|
|
206
|
+
}
|
|
207
|
+
activity.push({
|
|
208
|
+
sha,
|
|
209
|
+
short_sha: sha.slice(0, 8),
|
|
210
|
+
date: date ?? '',
|
|
211
|
+
subject: subject ?? '',
|
|
212
|
+
cards,
|
|
213
|
+
is_sync_point: isSyncPoint,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
return activity;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* How many commits between `sinceSha` and HEAD touch files OUTSIDE the plan folder
|
|
220
|
+
* — i.e. how far the code has moved since the plan was last reconciled.
|
|
221
|
+
*/
|
|
222
|
+
export async function countCodeCommitsSince(planRoot, sinceSha) {
|
|
223
|
+
const realRoot = await realpath(planRoot);
|
|
224
|
+
const repoRoot = await repoRootFor(realRoot);
|
|
225
|
+
const planRel = path.relative(repoRoot, realRoot) || '.';
|
|
226
|
+
const out = await git(repoRoot, 'rev-list', '--count', `${sinceSha}..HEAD`, '--', '.', `:(exclude)${planRel}`);
|
|
227
|
+
return Number.parseInt(out.trim(), 10) || 0;
|
|
228
|
+
}
|
|
172
229
|
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/core/git.ts"],"names":[],"mappings":"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"}
|
package/dist/core/index.d.ts
CHANGED
package/dist/core/index.js
CHANGED
package/dist/core/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { ConnectedRepo } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Read the connected_repos declared on PLAN-PROJECT (plan.md at the plan root).
|
|
4
|
+
* Returns [] when there is no plan.md, no frontmatter, or no connected_repos.
|
|
5
|
+
* Malformed entries are skipped silently — lint surfaces the schema warning
|
|
6
|
+
* (W002) separately; this reader stays lenient so a broken entry never crashes
|
|
7
|
+
* a resolution that other entries could still satisfy.
|
|
8
|
+
*/
|
|
9
|
+
export declare function readConnectedRepos(planRoot: string): Promise<ConnectedRepo[]>;
|
|
10
|
+
export interface ResolvedRepo {
|
|
11
|
+
/** The connected repo's plan root (its constellation/ folder). */
|
|
12
|
+
root: string;
|
|
13
|
+
/** The connected repo's root directory. */
|
|
14
|
+
repoRoot: string;
|
|
15
|
+
/** The connected_repos name when resolved by name; null when resolved by raw path. */
|
|
16
|
+
name: string | null;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Resolve a `repo` selector against a home plan. `nameOrPath` is either the name
|
|
20
|
+
* of a connected_repos entry on the home plan, or a path (relative to the home
|
|
21
|
+
* repo root, or absolute). Returns null when it can't be resolved to a plan.
|
|
22
|
+
*/
|
|
23
|
+
export declare function resolveConnectedRepo(homePlanRoot: string, nameOrPath: string): Promise<ResolvedRepo | null>;
|
|
24
|
+
export interface ConnectedRepoStatus extends ConnectedRepo {
|
|
25
|
+
/** Whether the path resolves to an existing plan on this machine. */
|
|
26
|
+
reachable: boolean;
|
|
27
|
+
/** The resolved plan root, or null when unreachable. */
|
|
28
|
+
planRoot: string | null;
|
|
29
|
+
}
|
|
30
|
+
/** The home plan's connected repos, each annotated with use-time reachability. */
|
|
31
|
+
export declare function listConnectedRepos(homePlanRoot: string): Promise<ConnectedRepoStatus[]>;
|
|
32
|
+
/** Upsert an entry by name (replacing any existing entry with the same name). */
|
|
33
|
+
export declare function upsertConnectedRepo(existing: ConnectedRepo[], entry: ConnectedRepo): ConnectedRepo[];
|
|
34
|
+
/** Remove the entry with the given name. */
|
|
35
|
+
export declare function removeConnectedRepoEntry(existing: ConnectedRepo[], name: string): ConnectedRepo[];
|
|
36
|
+
/**
|
|
37
|
+
* Serialize a ConnectedRepo to a plain frontmatter object, omitting an empty
|
|
38
|
+
* description so we never write `description: null` into a card.
|
|
39
|
+
*/
|
|
40
|
+
export declare function connectedRepoToFm(repo: ConnectedRepo): Record<string, unknown>;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
3
|
+
import { parseFile } from './parse.js';
|
|
4
|
+
import { resolvePlanDir } from './resolve.js';
|
|
5
|
+
/**
|
|
6
|
+
* Connected repos are repo-level links declared on PLAN-PROJECT (plan.md).
|
|
7
|
+
* They never become card connections and the indexer never sees them — they
|
|
8
|
+
* are read on demand here, so a connected repo's plan can be resolved and
|
|
9
|
+
* targeted by the `repo` selector without ever merging two plans.
|
|
10
|
+
*/
|
|
11
|
+
/** The directory containing the plan folder — the repo root in the normal layout. */
|
|
12
|
+
function repoRootOf(planRoot) {
|
|
13
|
+
return path.dirname(planRoot);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Read the connected_repos declared on PLAN-PROJECT (plan.md at the plan root).
|
|
17
|
+
* Returns [] when there is no plan.md, no frontmatter, or no connected_repos.
|
|
18
|
+
* Malformed entries are skipped silently — lint surfaces the schema warning
|
|
19
|
+
* (W002) separately; this reader stays lenient so a broken entry never crashes
|
|
20
|
+
* a resolution that other entries could still satisfy.
|
|
21
|
+
*/
|
|
22
|
+
export async function readConnectedRepos(planRoot) {
|
|
23
|
+
let raw;
|
|
24
|
+
try {
|
|
25
|
+
raw = await readFile(path.join(planRoot, 'plan.md'), 'utf8');
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
30
|
+
const list = parseFile(raw).frontmatter.connected_repos;
|
|
31
|
+
if (!Array.isArray(list))
|
|
32
|
+
return [];
|
|
33
|
+
const repos = [];
|
|
34
|
+
for (const entry of list) {
|
|
35
|
+
if (!entry || typeof entry !== 'object' || Array.isArray(entry))
|
|
36
|
+
continue;
|
|
37
|
+
const e = entry;
|
|
38
|
+
if (typeof e.name !== 'string' || typeof e.path !== 'string')
|
|
39
|
+
continue;
|
|
40
|
+
repos.push({
|
|
41
|
+
name: e.name,
|
|
42
|
+
path: e.path,
|
|
43
|
+
description: typeof e.description === 'string' ? e.description : undefined,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
return repos;
|
|
47
|
+
}
|
|
48
|
+
/** Resolve a path (relative to the home repo root, or absolute) to a plan root, or null. */
|
|
49
|
+
async function resolveRepoPath(homePlanRoot, rawPath) {
|
|
50
|
+
const abs = path.isAbsolute(rawPath)
|
|
51
|
+
? rawPath
|
|
52
|
+
: path.resolve(repoRootOf(homePlanRoot), rawPath);
|
|
53
|
+
return resolvePlanDir(abs);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Resolve a `repo` selector against a home plan. `nameOrPath` is either the name
|
|
57
|
+
* of a connected_repos entry on the home plan, or a path (relative to the home
|
|
58
|
+
* repo root, or absolute). Returns null when it can't be resolved to a plan.
|
|
59
|
+
*/
|
|
60
|
+
export async function resolveConnectedRepo(homePlanRoot, nameOrPath) {
|
|
61
|
+
const byName = (await readConnectedRepos(homePlanRoot)).find((r) => r.name === nameOrPath);
|
|
62
|
+
const root = await resolveRepoPath(homePlanRoot, byName ? byName.path : nameOrPath);
|
|
63
|
+
if (!root)
|
|
64
|
+
return null;
|
|
65
|
+
return { root, repoRoot: repoRootOf(root), name: byName?.name ?? null };
|
|
66
|
+
}
|
|
67
|
+
/** The home plan's connected repos, each annotated with use-time reachability. */
|
|
68
|
+
export async function listConnectedRepos(homePlanRoot) {
|
|
69
|
+
const repos = await readConnectedRepos(homePlanRoot);
|
|
70
|
+
return Promise.all(repos.map(async (r) => {
|
|
71
|
+
const planRoot = await resolveRepoPath(homePlanRoot, r.path);
|
|
72
|
+
return { ...r, reachable: planRoot !== null, planRoot };
|
|
73
|
+
}));
|
|
74
|
+
}
|
|
75
|
+
/** Upsert an entry by name (replacing any existing entry with the same name). */
|
|
76
|
+
export function upsertConnectedRepo(existing, entry) {
|
|
77
|
+
return [...existing.filter((r) => r.name !== entry.name), entry];
|
|
78
|
+
}
|
|
79
|
+
/** Remove the entry with the given name. */
|
|
80
|
+
export function removeConnectedRepoEntry(existing, name) {
|
|
81
|
+
return existing.filter((r) => r.name !== name);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Serialize a ConnectedRepo to a plain frontmatter object, omitting an empty
|
|
85
|
+
* description so we never write `description: null` into a card.
|
|
86
|
+
*/
|
|
87
|
+
export function connectedRepoToFm(repo) {
|
|
88
|
+
const out = { name: repo.name, path: repo.path };
|
|
89
|
+
if (repo.description)
|
|
90
|
+
out.description = repo.description;
|
|
91
|
+
return out;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=repos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repos.js","sourceRoot":"","sources":["../../src/core/repos.ts"],"names":[],"mappings":"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"}
|
package/dist/core/resolve.js
CHANGED
|
@@ -11,7 +11,10 @@ export async function resolvePlanDir(target) {
|
|
|
11
11
|
const nested = path.join(abs, 'constellation');
|
|
12
12
|
if (await isDirectory(nested))
|
|
13
13
|
return nested;
|
|
14
|
-
|
|
14
|
+
// Only adopt the target itself when it actually looks like a plan root —
|
|
15
|
+
// otherwise an explicit path to an unrelated directory would be linted or
|
|
16
|
+
// served as if its markdown files were cards.
|
|
17
|
+
if ((await isDirectory(abs)) && (await looksLikePlanRoot(abs)))
|
|
15
18
|
return abs;
|
|
16
19
|
return null;
|
|
17
20
|
}
|
|
@@ -37,6 +40,12 @@ export async function findPlanUp(startDir) {
|
|
|
37
40
|
dir = parent;
|
|
38
41
|
}
|
|
39
42
|
}
|
|
43
|
+
/** A directory is a plan root if it's named `constellation` or contains a plan.md. */
|
|
44
|
+
async function looksLikePlanRoot(dir) {
|
|
45
|
+
if (path.basename(dir) === 'constellation')
|
|
46
|
+
return true;
|
|
47
|
+
return exists(path.join(dir, 'plan.md'));
|
|
48
|
+
}
|
|
40
49
|
export async function exists(p) {
|
|
41
50
|
try {
|
|
42
51
|
await access(p);
|
package/dist/core/resolve.js.map
CHANGED
|
@@ -1 +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;
|
|
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,yEAAyE;QACzE,0EAA0E;QAC1E,8CAA8C;QAC9C,IAAI,CAAC,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,iBAAiB,CAAC,GAAG,CAAC,CAAC;YAAE,OAAO,GAAG,CAAC;QAC3E,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,sFAAsF;AACtF,KAAK,UAAU,iBAAiB,CAAC,GAAW;IAC1C,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,eAAe;QAAE,OAAO,IAAI,CAAC;IACxD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;AAC3C,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"}
|