@rasensio/aidlc 1.20.0 → 1.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/roadmap.d.ts +66 -0
- package/dist/commands/roadmap.d.ts.map +1 -0
- package/dist/commands/roadmap.js +206 -0
- package/dist/commands/roadmap.js.map +1 -0
- package/dist/menu/roster.d.ts.map +1 -1
- package/dist/menu/roster.js +4 -0
- package/dist/menu/roster.js.map +1 -1
- package/dist/roadmap/paths.d.ts +21 -0
- package/dist/roadmap/paths.d.ts.map +1 -1
- package/dist/roadmap/paths.js +17 -1
- package/dist/roadmap/paths.js.map +1 -1
- package/dist/roadmap/sync/body.d.ts +123 -0
- package/dist/roadmap/sync/body.d.ts.map +1 -0
- package/dist/roadmap/sync/body.js +289 -0
- package/dist/roadmap/sync/body.js.map +1 -0
- package/dist/roadmap/sync/collect.d.ts +54 -0
- package/dist/roadmap/sync/collect.d.ts.map +1 -0
- package/dist/roadmap/sync/collect.js +138 -0
- package/dist/roadmap/sync/collect.js.map +1 -0
- package/dist/roadmap/sync/config.d.ts +95 -0
- package/dist/roadmap/sync/config.d.ts.map +1 -0
- package/dist/roadmap/sync/config.js +236 -0
- package/dist/roadmap/sync/config.js.map +1 -0
- package/dist/roadmap/sync/discover.d.ts +56 -0
- package/dist/roadmap/sync/discover.d.ts.map +1 -0
- package/dist/roadmap/sync/discover.js +126 -0
- package/dist/roadmap/sync/discover.js.map +1 -0
- package/dist/roadmap/sync/execute.d.ts +41 -0
- package/dist/roadmap/sync/execute.d.ts.map +1 -0
- package/dist/roadmap/sync/execute.js +174 -0
- package/dist/roadmap/sync/execute.js.map +1 -0
- package/dist/roadmap/sync/gh.d.ts +74 -0
- package/dist/roadmap/sync/gh.d.ts.map +1 -0
- package/dist/roadmap/sync/gh.js +110 -0
- package/dist/roadmap/sync/gh.js.map +1 -0
- package/dist/roadmap/sync/import.d.ts +73 -0
- package/dist/roadmap/sync/import.d.ts.map +1 -0
- package/dist/roadmap/sync/import.js +269 -0
- package/dist/roadmap/sync/import.js.map +1 -0
- package/dist/roadmap/sync/labels.d.ts +57 -0
- package/dist/roadmap/sync/labels.d.ts.map +1 -0
- package/dist/roadmap/sync/labels.js +80 -0
- package/dist/roadmap/sync/labels.js.map +1 -0
- package/dist/roadmap/sync/markdown.d.ts +79 -0
- package/dist/roadmap/sync/markdown.d.ts.map +1 -0
- package/dist/roadmap/sync/markdown.js +165 -0
- package/dist/roadmap/sync/markdown.js.map +1 -0
- package/dist/roadmap/sync/marker.d.ts +47 -0
- package/dist/roadmap/sync/marker.d.ts.map +1 -0
- package/dist/roadmap/sync/marker.js +73 -0
- package/dist/roadmap/sync/marker.js.map +1 -0
- package/dist/roadmap/sync/plan.d.ts +47 -0
- package/dist/roadmap/sync/plan.d.ts.map +1 -0
- package/dist/roadmap/sync/plan.js +290 -0
- package/dist/roadmap/sync/plan.js.map +1 -0
- package/dist/roadmap/sync/render.d.ts +28 -0
- package/dist/roadmap/sync/render.d.ts.map +1 -0
- package/dist/roadmap/sync/render.js +112 -0
- package/dist/roadmap/sync/render.js.map +1 -0
- package/dist/roadmap/sync/sanitize.d.ts +56 -0
- package/dist/roadmap/sync/sanitize.d.ts.map +1 -0
- package/dist/roadmap/sync/sanitize.js +140 -0
- package/dist/roadmap/sync/sanitize.js.map +1 -0
- package/dist/roadmap/sync/types.d.ts +139 -0
- package/dist/roadmap/sync/types.d.ts.map +1 -0
- package/dist/roadmap/sync/types.js +50 -0
- package/dist/roadmap/sync/types.js.map +1 -0
- package/package.json +2 -2
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG;AAcH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG;AAcH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2BpC;;;;;;GAMG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAmCtC;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,MAAM,GAAG,SAA2B,GAC1C,OAAO,CAQT"}
|
package/dist/cli.js
CHANGED
|
@@ -41,6 +41,7 @@ import { registerDoctor } from './commands/doctor.js';
|
|
|
41
41
|
import { registerAddSkill } from './commands/add-skill.js';
|
|
42
42
|
import { registerCompliance } from './commands/compliance.js';
|
|
43
43
|
import { registerConstitution } from './commands/constitution.js';
|
|
44
|
+
import { registerRoadmap } from './commands/roadmap.js';
|
|
44
45
|
import { registerMenu } from './commands/menu.js';
|
|
45
46
|
import { isBareInvocation } from './menu/invocation.js';
|
|
46
47
|
import { openMenu } from './menu/index.js';
|
|
@@ -78,6 +79,7 @@ export function buildProgram() {
|
|
|
78
79
|
registerAddSkill(program);
|
|
79
80
|
registerCompliance(program);
|
|
80
81
|
registerConstitution(program);
|
|
82
|
+
registerRoadmap(program);
|
|
81
83
|
// Last, so `menu` renders last in `aidlc --help` (interactive-cli-menu/AC-5).
|
|
82
84
|
// Takes the factory, not `program`: the menu dispatches on a throwaway copy so
|
|
83
85
|
// the caller's program never carries an `exitOverride` it cannot undo.
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG;AAEH,6EAA6E;AAC7E,6EAA6E;AAC7E,yDAAyD;AACzD,MAAM,uBAAuB,GAAG,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AAC7D,OAAO,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;AACtC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE;IAChC,IAAI,OAAO,CAAC,IAAI,KAAK,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO;IACzF,KAAK,MAAM,QAAQ,IAAI,uBAAuB;QAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;AACpE,CAAC,CAAC,CAAC;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C;;;;;;GAMG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,OAAO,CAAC;SACb,WAAW,CAAC,oCAAoC,CAAC;SACjD,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB,YAAY,CAAC,OAAO,CAAC,CAAC;IACtB,aAAa,CAAC,OAAO,CAAC,CAAC;IACvB,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC1B,cAAc,CAAC,OAAO,CAAC,CAAC;IACxB,YAAY,CAAC,OAAO,CAAC,CAAC;IACtB,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC5B,aAAa,CAAC,OAAO,CAAC,CAAC;IACvB,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC1B,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC3B,YAAY,CAAC,OAAO,CAAC,CAAC;IACtB,cAAc,CAAC,OAAO,CAAC,CAAC;IACxB,cAAc,CAAC,OAAO,CAAC,CAAC;IACxB,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC3B,YAAY,CAAC,OAAO,CAAC,CAAC;IACtB,aAAa,CAAC,OAAO,CAAC,CAAC;IACvB,eAAe,CAAC,OAAO,CAAC,CAAC;IACzB,cAAc,CAAC,OAAO,CAAC,CAAC;IACxB,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC1B,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC5B,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,8EAA8E;IAC9E,+EAA+E;IAC/E,uEAAuE;IACvE,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAEpC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAC1B,OAAe,EACf,QAA4B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAE3C,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,KAAK,YAAY,CAAC,KAAK,CAAC,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,oEAAoE;QACpE,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,sDAAsD;AACtD,+EAA+E;AAC/E,gFAAgF;AAChF,kEAAkE;AAClE,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IAClC,IAAI,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,uEAAuE;QACvE,qEAAqE;QACrE,qEAAqE;QACrE,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,0EAA0E;QAC1E,qEAAqE;QACrE,MAAM,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;IACpC,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `aidlc roadmap` — projection of `.aidlc/roadmap/` onto GitHub Issues.
|
|
3
|
+
*
|
|
4
|
+
* Two leaves and no useful bare form:
|
|
5
|
+
*
|
|
6
|
+
* - `sync` projects eligible items onto issues. Disk is the source of truth; the tracker is
|
|
7
|
+
* a rendering. Nothing is written to disk, ever.
|
|
8
|
+
* - `import` seeds one `inbox/` item from an existing issue, once.
|
|
9
|
+
*
|
|
10
|
+
* Both command bodies are exported as plain functions taking an injectable `deps` bag and
|
|
11
|
+
* **returning** an exit code rather than setting `process.exitCode`. Without that there
|
|
12
|
+
* would be no entry point a test could call, and the consent and exit-code behaviour — the
|
|
13
|
+
* part of this feature that decides whether something gets published — would be the part
|
|
14
|
+
* with no coverage.
|
|
15
|
+
*
|
|
16
|
+
* Requirements: roadmap-issue-projection/AC-35 … roadmap-issue-projection/AC-40,
|
|
17
|
+
* roadmap-issue-projection/AC-62
|
|
18
|
+
*
|
|
19
|
+
* @module
|
|
20
|
+
*/
|
|
21
|
+
import type { Command } from 'commander';
|
|
22
|
+
import { type Prompter } from '../core/prompt.js';
|
|
23
|
+
import { type GhRunner } from '../roadmap/sync/gh.js';
|
|
24
|
+
/** Injection seam. Every default is the real implementation. */
|
|
25
|
+
export interface RoadmapDeps {
|
|
26
|
+
gh?: GhRunner;
|
|
27
|
+
prompt?: Prompter;
|
|
28
|
+
/** Where to resolve the project from. Defaults to `resolveProjectRoot()`. */
|
|
29
|
+
cwd?: string;
|
|
30
|
+
out?: (text: string) => void;
|
|
31
|
+
err?: (text: string) => void;
|
|
32
|
+
/** Overrides the TTY probe in tests. Defaults to `isInteractive()`. */
|
|
33
|
+
interactive?: boolean;
|
|
34
|
+
}
|
|
35
|
+
export interface SyncOpts {
|
|
36
|
+
dryRun?: boolean;
|
|
37
|
+
yes?: boolean;
|
|
38
|
+
repo?: string;
|
|
39
|
+
retireIneligible?: boolean;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Project the roadmap. Returns the process exit code.
|
|
43
|
+
*
|
|
44
|
+
* Exit codes are the interesting part of this function:
|
|
45
|
+
*
|
|
46
|
+
* - `0` — the plan was printed under `--dry-run`; or there was nothing to write; or a
|
|
47
|
+
* human was asked and declined. All three are a deliberate outcome.
|
|
48
|
+
* - `1` — a refusal, a `gh` failure, or a partly-applied plan.
|
|
49
|
+
* - `2` — writes were planned but consent could not be obtained because nothing was
|
|
50
|
+
* interactive and `--yes` was absent. **Not** zero: the caller in that situation is an
|
|
51
|
+
* automation that believed it was syncing, and a green run that wrote nothing would leave
|
|
52
|
+
* it believing that indefinitely. `--dry-run` is how a caller says it meant to look
|
|
53
|
+
* without touching anything.
|
|
54
|
+
*/
|
|
55
|
+
export declare function syncCommand(opts: SyncOpts, deps?: RoadmapDeps): Promise<number>;
|
|
56
|
+
/** Seed one `inbox/` item from an issue. Returns the process exit code. */
|
|
57
|
+
export declare function importCommand(url: string, deps?: RoadmapDeps): Promise<number>;
|
|
58
|
+
/**
|
|
59
|
+
* Register the command group.
|
|
60
|
+
*
|
|
61
|
+
* The group has no `.action()`, so bare `aidlc roadmap` prints help to stderr and exits 1 —
|
|
62
|
+
* the same shape as `add` and `knowledge`, and the reason `roadmap` belongs in the menu's
|
|
63
|
+
* `EXCLUSIONS` rather than its roster.
|
|
64
|
+
*/
|
|
65
|
+
export declare function registerRoadmap(program: Command): Command;
|
|
66
|
+
//# sourceMappingURL=roadmap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roadmap.d.ts","sourceRoot":"","sources":["../../src/commands/roadmap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAanE,OAAO,EAAmD,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAKvG,gEAAgE;AAChE,MAAM,WAAW,WAAW;IAC1B,EAAE,CAAC,EAAE,QAAQ,CAAC;IACd,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,6EAA6E;IAC7E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,uEAAuE;IACvE,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAsBD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAkFrF;AAED,2EAA2E;AAC3E,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAyBpF;AAuBD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAyBzD"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `aidlc roadmap` — projection of `.aidlc/roadmap/` onto GitHub Issues.
|
|
3
|
+
*
|
|
4
|
+
* Two leaves and no useful bare form:
|
|
5
|
+
*
|
|
6
|
+
* - `sync` projects eligible items onto issues. Disk is the source of truth; the tracker is
|
|
7
|
+
* a rendering. Nothing is written to disk, ever.
|
|
8
|
+
* - `import` seeds one `inbox/` item from an existing issue, once.
|
|
9
|
+
*
|
|
10
|
+
* Both command bodies are exported as plain functions taking an injectable `deps` bag and
|
|
11
|
+
* **returning** an exit code rather than setting `process.exitCode`. Without that there
|
|
12
|
+
* would be no entry point a test could call, and the consent and exit-code behaviour — the
|
|
13
|
+
* part of this feature that decides whether something gets published — would be the part
|
|
14
|
+
* with no coverage.
|
|
15
|
+
*
|
|
16
|
+
* Requirements: roadmap-issue-projection/AC-35 … roadmap-issue-projection/AC-40,
|
|
17
|
+
* roadmap-issue-projection/AC-62
|
|
18
|
+
*
|
|
19
|
+
* @module
|
|
20
|
+
*/
|
|
21
|
+
import { resolveProjectRoot } from '../core/project-root.js';
|
|
22
|
+
import { defaultPrompter } from '../core/prompt.js';
|
|
23
|
+
import { isInteractive, NO_TTY_REASON } from '../core/tty.js';
|
|
24
|
+
import { primaryCheckout } from '../roadmap/paths.js';
|
|
25
|
+
import { collectItems } from '../roadmap/sync/collect.js';
|
|
26
|
+
import { notConfiguredMessage, readSyncConfig, withRepoOverride, } from '../roadmap/sync/config.js';
|
|
27
|
+
import { buildIssueMap, truncatedMessage } from '../roadmap/sync/discover.js';
|
|
28
|
+
import { applyPlan, renderExecReport } from '../roadmap/sync/execute.js';
|
|
29
|
+
import { ghPreflight, realGhRunner, resolveNameWithOwner } from '../roadmap/sync/gh.js';
|
|
30
|
+
import { importIssue } from '../roadmap/sync/import.js';
|
|
31
|
+
import { planProjection } from '../roadmap/sync/plan.js';
|
|
32
|
+
import { confirmMessage, renderPlan } from '../roadmap/sync/render.js';
|
|
33
|
+
function wire(deps) {
|
|
34
|
+
return {
|
|
35
|
+
gh: deps?.gh ?? realGhRunner(),
|
|
36
|
+
prompt: deps?.prompt ?? defaultPrompter,
|
|
37
|
+
cwd: deps?.cwd ?? resolveProjectRoot(),
|
|
38
|
+
out: deps?.out ?? ((t) => process.stdout.write(t)),
|
|
39
|
+
err: deps?.err ?? ((t) => process.stderr.write(t)),
|
|
40
|
+
interactive: deps?.interactive ?? isInteractive(),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Project the roadmap. Returns the process exit code.
|
|
45
|
+
*
|
|
46
|
+
* Exit codes are the interesting part of this function:
|
|
47
|
+
*
|
|
48
|
+
* - `0` — the plan was printed under `--dry-run`; or there was nothing to write; or a
|
|
49
|
+
* human was asked and declined. All three are a deliberate outcome.
|
|
50
|
+
* - `1` — a refusal, a `gh` failure, or a partly-applied plan.
|
|
51
|
+
* - `2` — writes were planned but consent could not be obtained because nothing was
|
|
52
|
+
* interactive and `--yes` was absent. **Not** zero: the caller in that situation is an
|
|
53
|
+
* automation that believed it was syncing, and a green run that wrote nothing would leave
|
|
54
|
+
* it believing that indefinitely. `--dry-run` is how a caller says it meant to look
|
|
55
|
+
* without touching anything.
|
|
56
|
+
*/
|
|
57
|
+
export async function syncCommand(opts, deps) {
|
|
58
|
+
const { gh, prompt, cwd, out, err, interactive } = wire(deps);
|
|
59
|
+
const root = primaryCheckout(cwd);
|
|
60
|
+
// Config before the gh preflight, so a bad `provider` on a machine with no gh always
|
|
61
|
+
// reports the config problem rather than the missing binary.
|
|
62
|
+
const loaded = readSyncConfig(root);
|
|
63
|
+
if (loaded.kind === 'not-configured') {
|
|
64
|
+
err(`${notConfiguredMessage()}\n`);
|
|
65
|
+
return 1;
|
|
66
|
+
}
|
|
67
|
+
if (loaded.kind === 'invalid') {
|
|
68
|
+
err(`Error: ${loaded.error}\n`);
|
|
69
|
+
return 1;
|
|
70
|
+
}
|
|
71
|
+
const resolved = withRepoOverride(loaded.config, opts.repo);
|
|
72
|
+
if (resolved.kind !== 'ok') {
|
|
73
|
+
err(`Error: ${resolved.kind === 'invalid' ? resolved.error : notConfiguredMessage()}\n`);
|
|
74
|
+
return 1;
|
|
75
|
+
}
|
|
76
|
+
const config = resolved.config;
|
|
77
|
+
const preflight = ghPreflight(gh);
|
|
78
|
+
if (!preflight.ok) {
|
|
79
|
+
err(`Error: ${preflight.error}\n`);
|
|
80
|
+
return 1;
|
|
81
|
+
}
|
|
82
|
+
const discovered = buildIssueMap(gh, { repo: config.repo, label: config.label });
|
|
83
|
+
if (discovered.kind === 'failed') {
|
|
84
|
+
err(`Error: could not read issues from ${repoLabelOf(config)}: ${discovered.error}\n`);
|
|
85
|
+
return 1;
|
|
86
|
+
}
|
|
87
|
+
if (discovered.kind === 'truncated') {
|
|
88
|
+
err(`Error: ${truncatedMessage(discovered.count, discovered.limit)}\n`);
|
|
89
|
+
return 1;
|
|
90
|
+
}
|
|
91
|
+
const collected = collectItems(cwd);
|
|
92
|
+
const planned = planProjection({
|
|
93
|
+
config,
|
|
94
|
+
items: collected.items,
|
|
95
|
+
unprojectable: collected.unprojectable,
|
|
96
|
+
issues: discovered.issues,
|
|
97
|
+
retireIneligible: opts.retireIneligible === true,
|
|
98
|
+
repoLabel: repoLabelOf(config),
|
|
99
|
+
bodyContext: { repo: resolveCoords(gh, config), itemPaths: collected.itemPaths },
|
|
100
|
+
});
|
|
101
|
+
if (planned.kind === 'refused') {
|
|
102
|
+
err(`Error: ${planned.error}\n`);
|
|
103
|
+
return 1;
|
|
104
|
+
}
|
|
105
|
+
for (const warning of planned.warnings)
|
|
106
|
+
err(`Warning: ${warning}\n`);
|
|
107
|
+
out(renderPlan(planned.plan));
|
|
108
|
+
if (planned.plan.writeCount === 0) {
|
|
109
|
+
return 0;
|
|
110
|
+
}
|
|
111
|
+
if (opts.dryRun === true) {
|
|
112
|
+
out('Dry run — nothing was written.\n');
|
|
113
|
+
return 0;
|
|
114
|
+
}
|
|
115
|
+
if (opts.yes !== true) {
|
|
116
|
+
if (!interactive) {
|
|
117
|
+
err(`Error: ${planned.plan.writeCount} write(s) are needed but consent could not be ` +
|
|
118
|
+
`obtained: ${NO_TTY_REASON}.\n` +
|
|
119
|
+
' Pass --yes to apply them, or --dry-run to say you only wanted the plan.\n');
|
|
120
|
+
return 2;
|
|
121
|
+
}
|
|
122
|
+
const answer = await prompt.confirm({ message: confirmMessage(planned.plan) });
|
|
123
|
+
if (!answer.ok || !answer.value) {
|
|
124
|
+
out('Cancelled — nothing was written.\n');
|
|
125
|
+
return 0;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const report = applyPlan(gh, planned.plan, config.label);
|
|
129
|
+
out(`${renderExecReport(report)}\n`);
|
|
130
|
+
return report.failure === null ? 0 : 1;
|
|
131
|
+
}
|
|
132
|
+
/** Seed one `inbox/` item from an issue. Returns the process exit code. */
|
|
133
|
+
export async function importCommand(url, deps) {
|
|
134
|
+
const { gh, cwd, out, err } = wire(deps);
|
|
135
|
+
const preflight = ghPreflight(gh);
|
|
136
|
+
if (!preflight.ok) {
|
|
137
|
+
err(`Error: ${preflight.error}\n`);
|
|
138
|
+
return 1;
|
|
139
|
+
}
|
|
140
|
+
const result = importIssue(gh, cwd, url);
|
|
141
|
+
switch (result.kind) {
|
|
142
|
+
case 'written':
|
|
143
|
+
out(`Wrote ${result.path}\n`);
|
|
144
|
+
out('Triage it with the aidlc-roadmap skill — its Executive Summary is deliberately unfilled.\n');
|
|
145
|
+
return 0;
|
|
146
|
+
case 'duplicate':
|
|
147
|
+
err(`Error: issue #${result.coord.number} is already linked by ${result.existing}. ` +
|
|
148
|
+
'Import is one-shot; nothing was written.\n');
|
|
149
|
+
return 1;
|
|
150
|
+
case 'refused':
|
|
151
|
+
err(`Error: ${result.error}\n`);
|
|
152
|
+
return 1;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/** What the plan header and prompt call the target. */
|
|
156
|
+
function repoLabelOf(config) {
|
|
157
|
+
return config.repo ?? 'the current repository (resolved by gh)';
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* `owner`/`name` for permalinks, or null when it cannot be established.
|
|
161
|
+
*
|
|
162
|
+
* The configured coordinate is already validated to `owner/name` shape by `validateRepo`,
|
|
163
|
+
* so splitting it needs no second check. Only the unconfigured case costs a `gh` call, and
|
|
164
|
+
* only for hyperlinks — see `resolveNameWithOwner` for why a failure there degrades instead
|
|
165
|
+
* of refusing.
|
|
166
|
+
*/
|
|
167
|
+
function resolveCoords(gh, config) {
|
|
168
|
+
const coordinate = config.repo ?? resolveNameWithOwner(gh);
|
|
169
|
+
if (coordinate === null)
|
|
170
|
+
return null;
|
|
171
|
+
const slash = coordinate.indexOf('/');
|
|
172
|
+
if (slash <= 0 || slash === coordinate.length - 1)
|
|
173
|
+
return null;
|
|
174
|
+
return { owner: coordinate.slice(0, slash), name: coordinate.slice(slash + 1) };
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Register the command group.
|
|
178
|
+
*
|
|
179
|
+
* The group has no `.action()`, so bare `aidlc roadmap` prints help to stderr and exits 1 —
|
|
180
|
+
* the same shape as `add` and `knowledge`, and the reason `roadmap` belongs in the menu's
|
|
181
|
+
* `EXCLUSIONS` rather than its roster.
|
|
182
|
+
*/
|
|
183
|
+
export function registerRoadmap(program) {
|
|
184
|
+
const group = program
|
|
185
|
+
.command('roadmap')
|
|
186
|
+
.description('Project the roadmap onto GitHub Issues, or import an issue');
|
|
187
|
+
group
|
|
188
|
+
.command('sync')
|
|
189
|
+
.description('Project eligible roadmap items onto GitHub Issues (one-way)')
|
|
190
|
+
.option('--dry-run', 'Print the plan and write nothing')
|
|
191
|
+
.option('--yes', 'Apply the plan without asking')
|
|
192
|
+
.option('--repo <owner/name>', 'Target repository (overrides roadmap.sync.repo)')
|
|
193
|
+
.option('--retire-ineligible', 'Close issues whose item has left a projected status')
|
|
194
|
+
.action(async (opts) => {
|
|
195
|
+
process.exitCode = await syncCommand(opts);
|
|
196
|
+
});
|
|
197
|
+
group
|
|
198
|
+
.command('import')
|
|
199
|
+
.description('Seed one inbox roadmap item from a GitHub issue (one-shot)')
|
|
200
|
+
.argument('<issue-url>', 'URL of the GitHub issue to import')
|
|
201
|
+
.action(async (url) => {
|
|
202
|
+
process.exitCode = await importCommand(url);
|
|
203
|
+
});
|
|
204
|
+
return group;
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=roadmap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roadmap.js","sourceRoot":"","sources":["../../src/commands/roadmap.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roster.d.ts","sourceRoot":"","sources":["../../src/menu/roster.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,wEAAwE;AACxE,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;AAE/E,MAAM,WAAW,SAAS;IACxB,gFAAgF;IAChF,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,0DAA0D;IAC1D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC;CAC/B;AAED;;;GAGG;AACH,eAAO,MAAM,MAAM,EAAE,SAAS,SAAS,EAatC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"roster.d.ts","sourceRoot":"","sources":["../../src/menu/roster.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,wEAAwE;AACxE,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;AAE/E,MAAM,WAAW,SAAS;IACxB,gFAAgF;IAChF,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,0DAA0D;IAC1D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC;CAC/B;AAED;;;GAGG;AACH,eAAO,MAAM,MAAM,EAAE,SAAS,SAAS,EAatC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA2BvD,CAAC;AAEF,+EAA+E;AAC/E,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAM7C,CAAC"}
|
package/dist/menu/roster.js
CHANGED
|
@@ -58,6 +58,10 @@ export const EXCLUSIONS = {
|
|
|
58
58
|
'project a report that most have no packs for; excluding keeps the menu ' +
|
|
59
59
|
'byte-identical for a project with no pack (compliance-packs/AC-51).',
|
|
60
60
|
constitution: 'bare `aidlc constitution` exits 1; the aidlc-constitution skill is the front door to both leaves',
|
|
61
|
+
roadmap: 'bare `aidlc roadmap` exits 1; and its leaves are opt-in — `roadmap sync` refuses ' +
|
|
62
|
+
'until a `roadmap.sync` section exists in config, which the menu cannot check because ' +
|
|
63
|
+
'it reads no project state. Rostering a leaf would offer every project a command that ' +
|
|
64
|
+
'most would only see refuse. Same reasoning as `compliance` (roadmap-issue-projection/AC-61).',
|
|
61
65
|
amend: 'follows an editing act, not a starting point — an amendment must already be written into ' +
|
|
62
66
|
'requirements.md, and the menu reads no project state so it cannot tell. Offering it would ' +
|
|
63
67
|
'give most projects a command that exits 1 with "no amendment section found" ' +
|
package/dist/menu/roster.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roster.js","sourceRoot":"","sources":["../../src/menu/roster.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAkBH;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAAyB;IAC1C,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,8BAA8B,EAAE;IAC1E,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE;IACjE,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE;IAC5D,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,IAAI,EAAE;IAClF,EAAE,IAAI,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,sBAAsB,EAAE;IACtE,EAAE,IAAI,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE;IAC9D,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,eAAe,EAAE;IAC/D,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE;IAC3D,EAAE,IAAI,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,iBAAiB,EAAE;IAClE,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,0BAA0B,EAAE;IACtF,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,oBAAoB,EAAE;IACpE,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,0BAA0B,EAAE;CAC1E,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,UAAU,GAAqC;IAC1D,IAAI,EAAE,yDAAyD;IAC/D,UAAU,EAAE,kDAAkD;IAC9D,KAAK,EAAE,mCAAmC;IAC1C,OAAO,EAAE,mCAAmC;IAC5C,GAAG,EAAE,oEAAoE;IACzE,SAAS,EACP,qFAAqF;IACvF,KAAK,EAAE,mCAAmC;IAC1C,IAAI,EAAE,QAAQ;IACd,UAAU,EACR,8EAA8E;QAC9E,gFAAgF;QAChF,yEAAyE;QACzE,qEAAqE;IACvE,YAAY,EACV,kGAAkG;IACpG,KAAK,EACH,2FAA2F;QAC3F,4FAA4F;QAC5F,8EAA8E;QAC9E,4BAA4B;CAC/B,CAAC;AAEF,+EAA+E;AAC/E,MAAM,CAAC,MAAM,YAAY,GAA0B;IACjD,OAAO;IACP,OAAO;IACP,QAAQ;IACR,SAAS;IACT,UAAU;CACX,CAAC"}
|
|
1
|
+
{"version":3,"file":"roster.js","sourceRoot":"","sources":["../../src/menu/roster.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAkBH;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAAyB;IAC1C,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,8BAA8B,EAAE;IAC1E,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE;IACjE,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE;IAC5D,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,IAAI,EAAE;IAClF,EAAE,IAAI,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,sBAAsB,EAAE;IACtE,EAAE,IAAI,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE;IAC9D,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,eAAe,EAAE;IAC/D,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE;IAC3D,EAAE,IAAI,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,iBAAiB,EAAE;IAClE,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,0BAA0B,EAAE;IACtF,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,oBAAoB,EAAE;IACpE,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,0BAA0B,EAAE;CAC1E,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,UAAU,GAAqC;IAC1D,IAAI,EAAE,yDAAyD;IAC/D,UAAU,EAAE,kDAAkD;IAC9D,KAAK,EAAE,mCAAmC;IAC1C,OAAO,EAAE,mCAAmC;IAC5C,GAAG,EAAE,oEAAoE;IACzE,SAAS,EACP,qFAAqF;IACvF,KAAK,EAAE,mCAAmC;IAC1C,IAAI,EAAE,QAAQ;IACd,UAAU,EACR,8EAA8E;QAC9E,gFAAgF;QAChF,yEAAyE;QACzE,qEAAqE;IACvE,YAAY,EACV,kGAAkG;IACpG,OAAO,EACL,mFAAmF;QACnF,uFAAuF;QACvF,uFAAuF;QACvF,8FAA8F;IAChG,KAAK,EACH,2FAA2F;QAC3F,4FAA4F;QAC5F,8EAA8E;QAC9E,4BAA4B;CAC/B,CAAC;AAEF,+EAA+E;AAC/E,MAAM,CAAC,MAAM,YAAY,GAA0B;IACjD,OAAO;IACP,OAAO;IACP,QAAQ;IACR,SAAS;IACT,UAAU;CACX,CAAC"}
|
package/dist/roadmap/paths.d.ts
CHANGED
|
@@ -49,6 +49,27 @@ export interface RoadmapItem {
|
|
|
49
49
|
/** Full file contents, so a caller can rewrite without a second read. */
|
|
50
50
|
raw: string;
|
|
51
51
|
}
|
|
52
|
+
/**
|
|
53
|
+
* Parse an item's frontmatter block, or null when there is none.
|
|
54
|
+
*
|
|
55
|
+
* Returns the raw text of the block as well as the parsed object so a caller can
|
|
56
|
+
* edit the text in place rather than re-serializing — see `writeHistoryEntry`.
|
|
57
|
+
*/
|
|
58
|
+
export declare function frontmatter(raw: string): {
|
|
59
|
+
text: string;
|
|
60
|
+
start: number;
|
|
61
|
+
end: number;
|
|
62
|
+
data: Record<string, unknown>;
|
|
63
|
+
} | null;
|
|
64
|
+
/**
|
|
65
|
+
* Everything after an item's frontmatter block — the body, verbatim.
|
|
66
|
+
*
|
|
67
|
+
* Layout knowledge, so it lives beside `frontmatter` rather than being re-derived by each
|
|
68
|
+
* consumer that wants the prose. An item with no parseable frontmatter has no separable
|
|
69
|
+
* body, and returning the whole file would silently publish the YAML; the honest answer is
|
|
70
|
+
* the empty string, and callers already have to handle an item that will not parse.
|
|
71
|
+
*/
|
|
72
|
+
export declare function itemBody(raw: string): string;
|
|
52
73
|
/** Read one item. Returns null when the file is unreadable or has no frontmatter. */
|
|
53
74
|
export declare function readItem(file: string, status: RoadmapStatus): RoadmapItem | null;
|
|
54
75
|
/** Why one item file will not yield frontmatter. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/roadmap/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH,uDAAuD;AACvD,eAAO,MAAM,gBAAgB,8DAA+D,CAAC;AAE7F,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9D,kCAAkC;AAClC,eAAO,MAAM,WAAW,mBAAmB,CAAC;AAE5C,oDAAoD;AACpD,eAAO,MAAM,gBAAgB,iBAAiB,CAAC;AAE/C,qEAAqE;AACrE,eAAO,MAAM,gBAAgB,QAAuC,CAAC;AAErE;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED,uEAAuE;AACvE,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,6CAA6C;AAC7C,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,MAAM,CAEpE;AAED,yDAAyD;AACzD,MAAM,WAAW,WAAW;IAC1B,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,MAAM,EAAE,aAAa,CAAC;IACtB,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,yEAAyE;IACzE,GAAG,EAAE,MAAM,CAAC;CACb;
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/roadmap/paths.ts"],"names":[],"mappings":"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"}
|
package/dist/roadmap/paths.js
CHANGED
|
@@ -51,7 +51,7 @@ export function statusDir(cwd, status) {
|
|
|
51
51
|
* Returns the raw text of the block as well as the parsed object so a caller can
|
|
52
52
|
* edit the text in place rather than re-serializing — see `writeHistoryEntry`.
|
|
53
53
|
*/
|
|
54
|
-
function frontmatter(raw) {
|
|
54
|
+
export function frontmatter(raw) {
|
|
55
55
|
if (!raw.startsWith('---\n'))
|
|
56
56
|
return null;
|
|
57
57
|
const close = raw.indexOf('\n---\n', 4);
|
|
@@ -68,6 +68,22 @@ function frontmatter(raw) {
|
|
|
68
68
|
}
|
|
69
69
|
return { text, start: 4, end: close + 1, data };
|
|
70
70
|
}
|
|
71
|
+
/**
|
|
72
|
+
* Everything after an item's frontmatter block — the body, verbatim.
|
|
73
|
+
*
|
|
74
|
+
* Layout knowledge, so it lives beside `frontmatter` rather than being re-derived by each
|
|
75
|
+
* consumer that wants the prose. An item with no parseable frontmatter has no separable
|
|
76
|
+
* body, and returning the whole file would silently publish the YAML; the honest answer is
|
|
77
|
+
* the empty string, and callers already have to handle an item that will not parse.
|
|
78
|
+
*/
|
|
79
|
+
export function itemBody(raw) {
|
|
80
|
+
const fm = frontmatter(raw);
|
|
81
|
+
if (fm === null)
|
|
82
|
+
return '';
|
|
83
|
+
// `fm.end` is the index just past the newline preceding the closing `---`, so the
|
|
84
|
+
// closing delimiter line occupies the next four characters.
|
|
85
|
+
return raw.slice(fm.end + 4);
|
|
86
|
+
}
|
|
71
87
|
/** Read one item. Returns null when the file is unreadable or has no frontmatter. */
|
|
72
88
|
export function readItem(file, status) {
|
|
73
89
|
let raw;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/roadmap/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACtG,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5D,uDAAuD;AACvD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,CAAU,CAAC;AAI7F,kCAAkC;AAClC,MAAM,CAAC,MAAM,WAAW,GAAG,gBAAgB,CAAC;AAE5C,oDAAoD;AACpD,MAAM,CAAC,MAAM,gBAAgB,GAAG,cAAc,CAAC;AAE/C,qEAAqE;AACrE,MAAM,CAAC,MAAM,gBAAgB,GAAG,oCAAoC,CAAC;AAErE;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AACjD,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,MAAqB;IAC1D,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;AACxC,CAAC;AAiBD;;;;;GAKG;AACH,
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/roadmap/paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The body of a projected issue.
|
|
3
|
+
*
|
|
4
|
+
* v1.21.0 emitted a fixed six-line notice carrying no item prose at all, on the grounds
|
|
5
|
+
* that projecting prose risked marker injection, mention notifications, and the 65,536
|
|
6
|
+
* character field limit. The hazards were real; the conclusion was not. What shipped was a
|
|
7
|
+
* redirect — thirty issues on a board with thirty copies of one paragraph, unreadable to
|
|
8
|
+
* exactly the person the feature was for: somebody triaging in the tracker who will not
|
|
9
|
+
* clone the repository. `richer-issue-bodies` answers all three hazards instead of avoiding
|
|
10
|
+
* them: `sanitize.ts` neutralises comments and autolink triggers code-awarely, and the
|
|
11
|
+
* budget below bounds the field.
|
|
12
|
+
*
|
|
13
|
+
* Two structural decisions carry the rest of the design.
|
|
14
|
+
*
|
|
15
|
+
* **The region is delimited, and everything outside it is somebody else's.** A body is
|
|
16
|
+
* regenerated on every sync, so it must be possible to say precisely which bytes the
|
|
17
|
+
* projection owns. Text before `BODY_BEGIN` or after `BODY_END` survives untouched, which
|
|
18
|
+
* is what makes a projected issue still usable as a tracker: a reader can add a note to the
|
|
19
|
+
* description and keep it.
|
|
20
|
+
*
|
|
21
|
+
* **The body is rewritten, not written once.** v1.21.0 froze it at creation, reasoning that
|
|
22
|
+
* an update "would delete the context around [comments]". That does not hold — GitHub issue
|
|
23
|
+
* comments are separate entities from the body, and a body edit keeps its own revision
|
|
24
|
+
* history — and the cost of freezing is that every issue created before this change stays
|
|
25
|
+
* thin forever while every later item edit makes its issue quietly wrong. The rejected
|
|
26
|
+
* alternative was a one-off migration command; this project has a recorded lesson that a
|
|
27
|
+
* capability needing a manual post-deploy command will be un-run.
|
|
28
|
+
*
|
|
29
|
+
* Nothing volatile may enter this module's output. A timestamp, a commit sha or a metric
|
|
30
|
+
* would make the rendered region differ from the stored one on every single run, so every
|
|
31
|
+
* item would plan `update-body` forever and the projection would never converge — the same
|
|
32
|
+
* defect class as `discover.ts`'s labels-are-objects bug. That is why the region is a pure
|
|
33
|
+
* function of the item and the repository coordinates, and why a test pins that this file
|
|
34
|
+
* imports neither `node:fs` nor `node:child_process`.
|
|
35
|
+
*
|
|
36
|
+
* Requirements: richer-issue-bodies/AC-1 … richer-issue-bodies/AC-4,
|
|
37
|
+
* richer-issue-bodies/AC-6, richer-issue-bodies/AC-7, richer-issue-bodies/AC-16,
|
|
38
|
+
* richer-issue-bodies/AC-17, richer-issue-bodies/AC-21 … richer-issue-bodies/AC-24,
|
|
39
|
+
* richer-issue-bodies/AC-28
|
|
40
|
+
*
|
|
41
|
+
* @module
|
|
42
|
+
*/
|
|
43
|
+
import type { ProjectableItem } from './types.js';
|
|
44
|
+
/** Start of the projection-owned region. */
|
|
45
|
+
export declare const BODY_BEGIN = "<!-- aidlc-body:begin -->";
|
|
46
|
+
/** End of the projection-owned region. */
|
|
47
|
+
export declare const BODY_END = "<!-- aidlc-body:end -->";
|
|
48
|
+
/**
|
|
49
|
+
* The ceiling this module will not cross.
|
|
50
|
+
*
|
|
51
|
+
* GitHub's own limit is 65,536. The margin is not decoration: the largest real item in this
|
|
52
|
+
* project's roadmap is 44,481 characters, so nothing today comes close, and the headroom is
|
|
53
|
+
* what keeps a future item from failing a write *after* consent was given — the one moment
|
|
54
|
+
* in the projection where a failure is expensive.
|
|
55
|
+
*/
|
|
56
|
+
export declare const MAX_BODY_LENGTH = 60000;
|
|
57
|
+
/** Repository coordinates, for permalinks. */
|
|
58
|
+
export interface RepoCoords {
|
|
59
|
+
owner: string;
|
|
60
|
+
name: string;
|
|
61
|
+
}
|
|
62
|
+
export interface BodyContext {
|
|
63
|
+
/** null when coordinates could not be resolved — paths then render unlinked. */
|
|
64
|
+
repo: RepoCoords | null;
|
|
65
|
+
/** Item id → repo-relative path, for reference links. */
|
|
66
|
+
itemPaths: ReadonlyMap<string, string>;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* A permalink to a file on the default branch.
|
|
70
|
+
*
|
|
71
|
+
* `blob/HEAD/` rather than a resolved branch name, and this was measured rather than
|
|
72
|
+
* reasoned: on 2026-09-07, `github.com/cli/cli/blob/HEAD/README.md` returned 200 while
|
|
73
|
+
* `blob/main/README.md` returned 404, because that repository's default branch is `trunk`.
|
|
74
|
+
* Hardcoding `main` would ship broken links to every project that renamed its default
|
|
75
|
+
* branch. `HEAD` also needs no extra `gh` call and puts no remote state in the body.
|
|
76
|
+
*/
|
|
77
|
+
export declare function fileUrlFor(repo: RepoCoords, relPath: string): string;
|
|
78
|
+
/**
|
|
79
|
+
* The projection-owned region, delimiters included.
|
|
80
|
+
*
|
|
81
|
+
* Facts first, because a triager reads the top of a body the way they read the top of an
|
|
82
|
+
* item. The marker sits *inside* the region, so replacing the region can never orphan or
|
|
83
|
+
* duplicate it.
|
|
84
|
+
*/
|
|
85
|
+
export declare function renderGeneratedRegion(item: ProjectableItem, ctx: BodyContext): string;
|
|
86
|
+
/**
|
|
87
|
+
* The region bytes of an existing body, or null when it carries no region.
|
|
88
|
+
*
|
|
89
|
+
* Delimiters included, so the value can be compared directly against
|
|
90
|
+
* `renderGeneratedRegion`'s output — comparing the insides would let a delimiter change go
|
|
91
|
+
* undetected.
|
|
92
|
+
*/
|
|
93
|
+
export declare function extractRegion(body: string): string | null;
|
|
94
|
+
/**
|
|
95
|
+
* v1.21.0's body, reproduced exactly.
|
|
96
|
+
*
|
|
97
|
+
* **Frozen history, not a template.** Its only job is to be recognised so it can be
|
|
98
|
+
* replaced, so it must keep emitting the bytes v1.21.0 emitted even as the real renderer
|
|
99
|
+
* changes. A test pins it as a literal for that reason: edit it and issues created before
|
|
100
|
+
* this change stop being recognised, and every one of them gains a new region below a stale
|
|
101
|
+
* notice instead of replacing it.
|
|
102
|
+
*/
|
|
103
|
+
export declare function renderLegacyIssueBody(item: ProjectableItem): string;
|
|
104
|
+
/**
|
|
105
|
+
* The body to write: a fresh region merged into whatever the issue already has.
|
|
106
|
+
*
|
|
107
|
+
* Four cases, first match wins:
|
|
108
|
+
*
|
|
109
|
+
* 1. **Both delimiters present** — replace the span between them and keep everything else.
|
|
110
|
+
* This is the steady state, and the reason a human's note survives a sync.
|
|
111
|
+
* 2. **Exactly the legacy notice** — the region alone. An issue created by v1.21.0 stops
|
|
112
|
+
* being thin.
|
|
113
|
+
* 3. **Legacy notice plus other text** — replace only the recognised notice. Whatever
|
|
114
|
+
* somebody added stays.
|
|
115
|
+
* 4. **Anything else** — append the region below the existing body, after stripping any
|
|
116
|
+
* marker naming *this* item, so the body ends up with exactly one.
|
|
117
|
+
*
|
|
118
|
+
* Case 4 deliberately leaves markers naming *other* ids alone. Those are the ambiguity
|
|
119
|
+
* `indexByMarker` exists to refuse, and quietly deleting one would hide a genuine
|
|
120
|
+
* two-issue collision rather than resolve it.
|
|
121
|
+
*/
|
|
122
|
+
export declare function mergeBody(existing: string, region: string, itemId: string): string;
|
|
123
|
+
//# sourceMappingURL=body.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"body.d.ts","sourceRoot":"","sources":["../../../src/roadmap/sync/body.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,4CAA4C;AAC5C,eAAO,MAAM,UAAU,8BAA8B,CAAC;AAEtD,0CAA0C;AAC1C,eAAO,MAAM,QAAQ,4BAA4B,CAAC;AAElD;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,QAAS,CAAC;AAEtC,8CAA8C;AAC9C,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,gFAAgF;IAChF,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IACxB,yDAAyD;IACzD,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpE;AAQD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,WAAW,GAAG,MAAM,CAgCrF;AA4FD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMzD;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAenE;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAkBlF"}
|