@rasensio/aidlc 1.9.1 → 1.10.2
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 +2 -0
- package/dist/cli.d.ts +18 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +76 -26
- package/dist/cli.js.map +1 -1
- package/dist/commands/menu.d.ts +21 -0
- package/dist/commands/menu.d.ts.map +1 -0
- package/dist/commands/menu.js +32 -0
- package/dist/commands/menu.js.map +1 -0
- package/dist/commands/review.d.ts +27 -1
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +93 -8
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/transition.d.ts.map +1 -1
- package/dist/commands/transition.js +7 -24
- package/dist/commands/transition.js.map +1 -1
- package/dist/core/lifecycle.js +28 -5
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core/types.d.ts +6 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/menu/dispatch.d.ts +59 -0
- package/dist/menu/dispatch.d.ts.map +1 -0
- package/dist/menu/dispatch.js +76 -0
- package/dist/menu/dispatch.js.map +1 -0
- package/dist/menu/index.d.ts +51 -0
- package/dist/menu/index.d.ts.map +1 -0
- package/dist/menu/index.js +117 -0
- package/dist/menu/index.js.map +1 -0
- package/dist/menu/invocation.d.ts +20 -0
- package/dist/menu/invocation.d.ts.map +1 -0
- package/dist/menu/invocation.js +22 -0
- package/dist/menu/invocation.js.map +1 -0
- package/dist/menu/prompt.d.ts +74 -0
- package/dist/menu/prompt.d.ts.map +1 -0
- package/dist/menu/prompt.js +71 -0
- package/dist/menu/prompt.js.map +1 -0
- package/dist/menu/resolve.d.ts +57 -0
- package/dist/menu/resolve.d.ts.map +1 -0
- package/dist/menu/resolve.js +76 -0
- package/dist/menu/resolve.js.map +1 -0
- package/dist/menu/roster.d.ts +51 -0
- package/dist/menu/roster.d.ts.map +1 -0
- package/dist/menu/roster.js +65 -0
- package/dist/menu/roster.js.map +1 -0
- package/dist/traceability/cache.d.ts.map +1 -1
- package/dist/traceability/cache.js +9 -2
- package/dist/traceability/cache.js.map +1 -1
- package/dist/traceability/gate-criterion.d.ts +18 -0
- package/dist/traceability/gate-criterion.d.ts.map +1 -1
- package/dist/traceability/gate-criterion.js +94 -8
- package/dist/traceability/gate-criterion.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt seam for the interactive menu (interactive-cli-menu/AC-12,
|
|
3
|
+
* interactive-cli-menu/AC-13, interactive-cli-menu/AC-26).
|
|
4
|
+
*
|
|
5
|
+
* The only module that imports `@clack/prompts`. Everything the menu does that
|
|
6
|
+
* touches a terminal goes through `MenuDeps`, so tests drive both the
|
|
7
|
+
* interactive and non-interactive branches without emulating a TTY — the same
|
|
8
|
+
* shape as the doctor's injectable `ConfirmFn`.
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
import * as clack from '@clack/prompts';
|
|
13
|
+
/**
|
|
14
|
+
* Cancellation sentinel, owned by this module.
|
|
15
|
+
*
|
|
16
|
+
* Deliberately *not* a re-export: `@clack/prompts` exports no symbol at all. Its
|
|
17
|
+
* cancel value is a private `Symbol("clack:cancel")` that is not
|
|
18
|
+
* `Symbol.for`-registered, so it can be neither imported nor reconstructed —
|
|
19
|
+
* only the `isCancel()` predicate is public, which is why every call site in
|
|
20
|
+
* this package uses that. The clack-backed adapters below translate, so injected
|
|
21
|
+
* test doubles return exactly what production returns.
|
|
22
|
+
*/
|
|
23
|
+
export const CANCEL = Symbol('aidlc:menu:cancel');
|
|
24
|
+
/**
|
|
25
|
+
* Both streams must be a TTY (interactive-cli-menu/AC-10).
|
|
26
|
+
*
|
|
27
|
+
* clack reads keys from stdin and renders to stdout, so either alone is
|
|
28
|
+
* insufficient: `aidlc | less` has a TTY stdin with a piped stdout and would
|
|
29
|
+
* paint escape sequences into the pipe, while `echo x | aidlc` has the reverse
|
|
30
|
+
* and would render a prompt nobody can answer. Both idioms exist in this package
|
|
31
|
+
* (`commands/cost.ts` keys on stdin, `doctor/context.ts` on stdout), so the
|
|
32
|
+
* conjunction is stated explicitly rather than inherited from a precedent.
|
|
33
|
+
*/
|
|
34
|
+
export function isInteractive() {
|
|
35
|
+
return process.stdin.isTTY === true && process.stdout.isTTY === true;
|
|
36
|
+
}
|
|
37
|
+
const clackSelect = async (req) => {
|
|
38
|
+
const value = await clack.select({
|
|
39
|
+
message: req.message,
|
|
40
|
+
options: req.options,
|
|
41
|
+
});
|
|
42
|
+
return clack.isCancel(value) ? CANCEL : value;
|
|
43
|
+
};
|
|
44
|
+
const clackText = async (req) => {
|
|
45
|
+
const value = await clack.text({
|
|
46
|
+
message: req.message,
|
|
47
|
+
placeholder: req.placeholder,
|
|
48
|
+
validate: req.validate,
|
|
49
|
+
});
|
|
50
|
+
return clack.isCancel(value) ? CANCEL : value;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Reject empty or whitespace-only input for a required positional.
|
|
54
|
+
*
|
|
55
|
+
* clack's text prompt yields `''` — not the cancel symbol — when Enter is
|
|
56
|
+
* pressed on an empty field with no default, so without this the menu would
|
|
57
|
+
* dispatch a meaningless invocation the user cannot distinguish from a cancel.
|
|
58
|
+
* Commander would reject a missing `<arg>`; this rejects it earlier, where the
|
|
59
|
+
* user can still fix it.
|
|
60
|
+
*/
|
|
61
|
+
export function requireNonEmpty(label) {
|
|
62
|
+
return (value) => ((value ?? '').trim() === '' ? `${label} is required` : undefined);
|
|
63
|
+
}
|
|
64
|
+
export const defaultDeps = {
|
|
65
|
+
select: clackSelect,
|
|
66
|
+
text: clackText,
|
|
67
|
+
interactive: isInteractive,
|
|
68
|
+
intro: (message) => clack.intro(message),
|
|
69
|
+
outro: (message) => clack.outro(message),
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/menu/prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC;AAExC;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,MAAM,GAAkB,MAAM,CAAC,mBAAmB,CAAC,CAAC;AA+BjE;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC;AACvE,CAAC;AAED,MAAM,WAAW,GAAa,KAAK,EAAE,GAAG,EAAE,EAAE;IAC1C,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;QAC/B,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,OAAO,EAAE,GAAG,CAAC,OAAO;KACrB,CAAC,CAAC;IACH,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,KAAgB,CAAC;AAC5D,CAAC,CAAC;AAEF,MAAM,SAAS,GAAW,KAAK,EAAE,GAAG,EAAE,EAAE;IACtC,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC;QAC7B,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,QAAQ,EAAE,GAAG,CAAC,QAAQ;KACvB,CAAC,CAAC;IACH,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,KAAgB,CAAC;AAC5D,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAC7B,KAAa;IAEb,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAa;IACnC,MAAM,EAAE,WAAW;IACnB,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,aAAa;IAC1B,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;IACxC,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;CACzC,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Roster → commander resolution (interactive-cli-menu/AC-16,
|
|
3
|
+
* interactive-cli-menu/AC-17, interactive-cli-menu/AC-34).
|
|
4
|
+
*
|
|
5
|
+
* Pure functions over a commander program. Required positionals are derived
|
|
6
|
+
* structurally from `registeredArguments` rather than restated in the roster, so
|
|
7
|
+
* the prompt set cannot go stale when a command's signature changes.
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
import type { Argument, Command } from 'commander';
|
|
12
|
+
import { type MenuEntry } from './roster.js';
|
|
13
|
+
/**
|
|
14
|
+
* Walk an entry's path from the program root to its leaf command.
|
|
15
|
+
*
|
|
16
|
+
* @returns the leaf `Command`, or `null` if any segment is unregistered.
|
|
17
|
+
*/
|
|
18
|
+
export declare function resolveEntry(program: Command, entry: MenuEntry): Command | null;
|
|
19
|
+
/**
|
|
20
|
+
* Required positional arguments of a command, in declaration order
|
|
21
|
+
* (interactive-cli-menu/AC-34).
|
|
22
|
+
*
|
|
23
|
+
* `registeredArguments` is public commander API. Across the roster only
|
|
24
|
+
* `review <instance> <artifact>` and `knowledge query <term>` have any.
|
|
25
|
+
*/
|
|
26
|
+
export declare function requiredArgs(cmd: Command): readonly Argument[];
|
|
27
|
+
/**
|
|
28
|
+
* Secondary hint text for an entry: the leaf command's own description
|
|
29
|
+
* (interactive-cli-menu/AC-16). Never used as the label.
|
|
30
|
+
*/
|
|
31
|
+
export declare function hintFor(cmd: Command): string;
|
|
32
|
+
/**
|
|
33
|
+
* Top-level command names on the program.
|
|
34
|
+
*
|
|
35
|
+
* Deliberately performs no hidden-command *detection*: `program.commands`
|
|
36
|
+
* already contains hidden commands (verified with the deprecated `setup`
|
|
37
|
+
* alias), `Command` exposes no public `hidden` accessor — the `hidden: boolean`
|
|
38
|
+
* in commander's typings belongs to `Option` — and the private `_hidden` must
|
|
39
|
+
* not be relied on. Commander's synthetic `help` command is absent from
|
|
40
|
+
* `program.commands` and needs no entry.
|
|
41
|
+
*/
|
|
42
|
+
export declare function allTopLevelNames(program: Command): string[];
|
|
43
|
+
/**
|
|
44
|
+
* Top-level names the roster accounts for — first path segments only.
|
|
45
|
+
*
|
|
46
|
+
* A nested entry such as `['knowledge','query']` accounts for nothing beyond
|
|
47
|
+
* `knowledge`'s appearance as a *rostered* name, which is why `knowledge` is
|
|
48
|
+
* also carried in `EXCLUSIONS`: the parent itself is not on the menu.
|
|
49
|
+
*/
|
|
50
|
+
export declare function rosterTopLevelNames(roster?: readonly MenuEntry[]): string[];
|
|
51
|
+
/**
|
|
52
|
+
* Top-level commands accounted for by neither the roster nor the exclusion list
|
|
53
|
+
* (interactive-cli-menu/AC-17). A non-empty result is a contract violation: a
|
|
54
|
+
* command was registered and nobody decided whether it belongs on the menu.
|
|
55
|
+
*/
|
|
56
|
+
export declare function unaccountedCommands(program: Command, roster?: readonly MenuEntry[], exclusions?: Readonly<Record<string, string>>): string[];
|
|
57
|
+
//# sourceMappingURL=resolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/menu/resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAEjE;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,GAAG,IAAI,CAQ/E;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,SAAS,QAAQ,EAAE,CAE9D;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAE5C;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,CAE3D;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,GAAE,SAAS,SAAS,EAAW,GAAG,MAAM,EAAE,CAEnF;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,OAAO,EAChB,MAAM,GAAE,SAAS,SAAS,EAAW,EACrC,UAAU,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAc,GACxD,MAAM,EAAE,CAOV"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Roster → commander resolution (interactive-cli-menu/AC-16,
|
|
3
|
+
* interactive-cli-menu/AC-17, interactive-cli-menu/AC-34).
|
|
4
|
+
*
|
|
5
|
+
* Pure functions over a commander program. Required positionals are derived
|
|
6
|
+
* structurally from `registeredArguments` rather than restated in the roster, so
|
|
7
|
+
* the prompt set cannot go stale when a command's signature changes.
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
import { EXCLUSIONS, ROSTER } from './roster.js';
|
|
12
|
+
/**
|
|
13
|
+
* Walk an entry's path from the program root to its leaf command.
|
|
14
|
+
*
|
|
15
|
+
* @returns the leaf `Command`, or `null` if any segment is unregistered.
|
|
16
|
+
*/
|
|
17
|
+
export function resolveEntry(program, entry) {
|
|
18
|
+
let current = program;
|
|
19
|
+
for (const segment of entry.path) {
|
|
20
|
+
const next = current.commands.find((child) => child.name() === segment);
|
|
21
|
+
if (!next)
|
|
22
|
+
return null;
|
|
23
|
+
current = next;
|
|
24
|
+
}
|
|
25
|
+
return current === program ? null : current;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Required positional arguments of a command, in declaration order
|
|
29
|
+
* (interactive-cli-menu/AC-34).
|
|
30
|
+
*
|
|
31
|
+
* `registeredArguments` is public commander API. Across the roster only
|
|
32
|
+
* `review <instance> <artifact>` and `knowledge query <term>` have any.
|
|
33
|
+
*/
|
|
34
|
+
export function requiredArgs(cmd) {
|
|
35
|
+
return cmd.registeredArguments.filter((arg) => arg.required);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Secondary hint text for an entry: the leaf command's own description
|
|
39
|
+
* (interactive-cli-menu/AC-16). Never used as the label.
|
|
40
|
+
*/
|
|
41
|
+
export function hintFor(cmd) {
|
|
42
|
+
return cmd.description();
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Top-level command names on the program.
|
|
46
|
+
*
|
|
47
|
+
* Deliberately performs no hidden-command *detection*: `program.commands`
|
|
48
|
+
* already contains hidden commands (verified with the deprecated `setup`
|
|
49
|
+
* alias), `Command` exposes no public `hidden` accessor — the `hidden: boolean`
|
|
50
|
+
* in commander's typings belongs to `Option` — and the private `_hidden` must
|
|
51
|
+
* not be relied on. Commander's synthetic `help` command is absent from
|
|
52
|
+
* `program.commands` and needs no entry.
|
|
53
|
+
*/
|
|
54
|
+
export function allTopLevelNames(program) {
|
|
55
|
+
return program.commands.map((cmd) => cmd.name());
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Top-level names the roster accounts for — first path segments only.
|
|
59
|
+
*
|
|
60
|
+
* A nested entry such as `['knowledge','query']` accounts for nothing beyond
|
|
61
|
+
* `knowledge`'s appearance as a *rostered* name, which is why `knowledge` is
|
|
62
|
+
* also carried in `EXCLUSIONS`: the parent itself is not on the menu.
|
|
63
|
+
*/
|
|
64
|
+
export function rosterTopLevelNames(roster = ROSTER) {
|
|
65
|
+
return roster.map((entry) => entry.path[0]);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Top-level commands accounted for by neither the roster nor the exclusion list
|
|
69
|
+
* (interactive-cli-menu/AC-17). A non-empty result is a contract violation: a
|
|
70
|
+
* command was registered and nobody decided whether it belongs on the menu.
|
|
71
|
+
*/
|
|
72
|
+
export function unaccountedCommands(program, roster = ROSTER, exclusions = EXCLUSIONS) {
|
|
73
|
+
const rostered = new Set(roster.filter((entry) => entry.path.length === 1).map((entry) => entry.path[0]));
|
|
74
|
+
return allTopLevelNames(program).filter((name) => !rostered.has(name) && !(name in exclusions));
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/menu/resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,EAAkB,MAAM,aAAa,CAAC;AAEjE;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,OAAgB,EAAE,KAAgB;IAC7D,IAAI,OAAO,GAAY,OAAO,CAAC;IAC/B,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,OAAO,CAAC,CAAC;QACxE,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACvB,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IACD,OAAO,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AAC9C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,OAAO,GAAG,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,GAAY;IAClC,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC;AAC3B,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,OAAO,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;AACnD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAA+B,MAAM;IACvE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC;AAC/C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAgB,EAChB,SAA+B,MAAM,EACrC,aAA+C,UAAU;IAEzD,MAAM,QAAQ,GAAG,IAAI,GAAG,CACtB,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CACjF,CAAC;IACF,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAC,MAAM,CACrC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,UAAU,CAAC,CACvD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The menu roster — the single declaration site for what the menu offers
|
|
3
|
+
* (interactive-cli-menu/AC-32, interactive-cli-menu/AC-33,
|
|
4
|
+
* interactive-cli-menu/AC-15, interactive-cli-menu/AC-16).
|
|
5
|
+
*
|
|
6
|
+
* Data only, no logic. Two properties are pinned by tests rather than by
|
|
7
|
+
* convention: array order IS display order, and every top-level command on the
|
|
8
|
+
* program appears in exactly one of `ROSTER` (by first path segment) or
|
|
9
|
+
* `EXCLUSIONS`.
|
|
10
|
+
*
|
|
11
|
+
* Labels are curated here rather than read from commander. Several
|
|
12
|
+
* `.description()` strings read poorly as menu labels — `doctor`'s is 76
|
|
13
|
+
* characters, and `add`/`knowledge` describe a group rather than an action — so
|
|
14
|
+
* descriptions serve as secondary hint text only.
|
|
15
|
+
*
|
|
16
|
+
* @module
|
|
17
|
+
*/
|
|
18
|
+
/** Lifecycle stage an entry belongs to; drives visual grouping only. */
|
|
19
|
+
export type MenuBucket = 'setup' | 'begin' | 'resume' | 'inspect' | 'maintain';
|
|
20
|
+
export interface MenuEntry {
|
|
21
|
+
/** Command path from the program root: `['start']`, `['knowledge','query']`. */
|
|
22
|
+
readonly path: readonly string[];
|
|
23
|
+
/** Curated label — never commander's `.description()`. */
|
|
24
|
+
readonly label: string;
|
|
25
|
+
readonly bucket: MenuBucket;
|
|
26
|
+
/**
|
|
27
|
+
* Skip menu-side prompting for required positionals and let the command run
|
|
28
|
+
* its own wizard. `start` only (interactive-cli-menu/AC-35).
|
|
29
|
+
*/
|
|
30
|
+
readonly delegatesArgs?: true;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The 12 menu entries, in display order: setup → begin → resume → inspect →
|
|
34
|
+
* maintain (interactive-cli-menu/AC-32).
|
|
35
|
+
*/
|
|
36
|
+
export declare const ROSTER: readonly MenuEntry[];
|
|
37
|
+
/**
|
|
38
|
+
* Every top-level command deliberately kept out of the menu, with its reason
|
|
39
|
+
* (interactive-cli-menu/AC-33). Excluded commands stay fully usable by typing
|
|
40
|
+
* them; there is no "more" entry.
|
|
41
|
+
*
|
|
42
|
+
* The exclusion criterion is **not** whether a command is a group — it is
|
|
43
|
+
* whether its bare invocation does something useful. `cost` is a group *and* a
|
|
44
|
+
* useful bare report, so it is rostered. `knowledge` must be listed even though
|
|
45
|
+
* `knowledge query` is rostered, because the contract test compares top-level
|
|
46
|
+
* names and `knowledge` is one.
|
|
47
|
+
*/
|
|
48
|
+
export declare const EXCLUSIONS: Readonly<Record<string, string>>;
|
|
49
|
+
/** Bucket order for grouping; matches the order entries appear in `ROSTER`. */
|
|
50
|
+
export declare const BUCKET_ORDER: readonly MenuBucket[];
|
|
51
|
+
//# sourceMappingURL=roster.d.ts.map
|
|
@@ -0,0 +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,CAUvD,CAAC;AAEF,+EAA+E;AAC/E,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAM7C,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The menu roster — the single declaration site for what the menu offers
|
|
3
|
+
* (interactive-cli-menu/AC-32, interactive-cli-menu/AC-33,
|
|
4
|
+
* interactive-cli-menu/AC-15, interactive-cli-menu/AC-16).
|
|
5
|
+
*
|
|
6
|
+
* Data only, no logic. Two properties are pinned by tests rather than by
|
|
7
|
+
* convention: array order IS display order, and every top-level command on the
|
|
8
|
+
* program appears in exactly one of `ROSTER` (by first path segment) or
|
|
9
|
+
* `EXCLUSIONS`.
|
|
10
|
+
*
|
|
11
|
+
* Labels are curated here rather than read from commander. Several
|
|
12
|
+
* `.description()` strings read poorly as menu labels — `doctor`'s is 76
|
|
13
|
+
* characters, and `add`/`knowledge` describe a group rather than an action — so
|
|
14
|
+
* descriptions serve as secondary hint text only.
|
|
15
|
+
*
|
|
16
|
+
* @module
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* The 12 menu entries, in display order: setup → begin → resume → inspect →
|
|
20
|
+
* maintain (interactive-cli-menu/AC-32).
|
|
21
|
+
*/
|
|
22
|
+
export const ROSTER = [
|
|
23
|
+
{ path: ['init'], bucket: 'setup', label: 'Set up AIDLC in this project' },
|
|
24
|
+
{ path: ['doctor'], bucket: 'setup', label: 'Run health checks' },
|
|
25
|
+
{ path: ['update'], bucket: 'setup', label: 'Update AIDLC' },
|
|
26
|
+
{ path: ['start'], bucket: 'begin', label: 'Begin new work', delegatesArgs: true },
|
|
27
|
+
{ path: ['discover'], bucket: 'begin', label: 'Explore the codebase' },
|
|
28
|
+
{ path: ['continue'], bucket: 'resume', label: 'Resume work' },
|
|
29
|
+
{ path: ['status'], bucket: 'inspect', label: 'Show progress' },
|
|
30
|
+
{ path: ['cost'], bucket: 'inspect', label: 'Cost report' },
|
|
31
|
+
{ path: ['metrics'], bucket: 'inspect', label: 'Project metrics' },
|
|
32
|
+
{ path: ['knowledge', 'query'], bucket: 'inspect', label: 'Search project knowledge' },
|
|
33
|
+
{ path: ['review'], bucket: 'inspect', label: 'Review an artifact' },
|
|
34
|
+
{ path: ['docs'], bucket: 'maintain', label: 'Generate onboarding docs' },
|
|
35
|
+
];
|
|
36
|
+
/**
|
|
37
|
+
* Every top-level command deliberately kept out of the menu, with its reason
|
|
38
|
+
* (interactive-cli-menu/AC-33). Excluded commands stay fully usable by typing
|
|
39
|
+
* them; there is no "more" entry.
|
|
40
|
+
*
|
|
41
|
+
* The exclusion criterion is **not** whether a command is a group — it is
|
|
42
|
+
* whether its bare invocation does something useful. `cost` is a group *and* a
|
|
43
|
+
* useful bare report, so it is rostered. `knowledge` must be listed even though
|
|
44
|
+
* `knowledge query` is rostered, because the contract test compares top-level
|
|
45
|
+
* names and `knowledge` is one.
|
|
46
|
+
*/
|
|
47
|
+
export const EXCLUSIONS = {
|
|
48
|
+
gate: 'CI/automation surface — consumed by scripts, not people',
|
|
49
|
+
transition: 'CI/automation surface; the phase skills drive it',
|
|
50
|
+
claim: 'session plumbing, not a user task',
|
|
51
|
+
release: 'session plumbing, not a user task',
|
|
52
|
+
add: 'bare `aidlc add` exits 1 with help on stderr — no useful bare form',
|
|
53
|
+
knowledge: 'bare `aidlc knowledge` exits 1; its useful leaf `knowledge query` is a roster entry',
|
|
54
|
+
setup: 'hidden deprecated alias of `init`',
|
|
55
|
+
menu: 'itself',
|
|
56
|
+
};
|
|
57
|
+
/** Bucket order for grouping; matches the order entries appear in `ROSTER`. */
|
|
58
|
+
export const BUCKET_ORDER = [
|
|
59
|
+
'setup',
|
|
60
|
+
'begin',
|
|
61
|
+
'resume',
|
|
62
|
+
'inspect',
|
|
63
|
+
'maintain',
|
|
64
|
+
];
|
|
65
|
+
//# sourceMappingURL=roster.js.map
|
|
@@ -0,0 +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;CACf,CAAC;AAEF,+EAA+E;AAC/E,MAAM,CAAC,MAAM,YAAY,GAA0B;IACjD,OAAO;IACP,OAAO;IACP,QAAQ;IACR,SAAS;IACT,UAAU;CACX,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/traceability/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/traceability/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAqElD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,eAAe,GAAG,IAAI,CA6BxB;AAED,2DAA2D;AAC3D,wBAAgB,cAAc,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAGhE"}
|
|
@@ -13,7 +13,7 @@ import { createHash } from 'node:crypto';
|
|
|
13
13
|
import { mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from 'node:fs';
|
|
14
14
|
import { join } from 'node:path';
|
|
15
15
|
import { DEFAULT_TEST_GLOBS, discoverTestFiles } from './scanner.js';
|
|
16
|
-
import { evaluateTraceabilityCriterion, loadTraceabilityConfig } from './gate-criterion.js';
|
|
16
|
+
import { coverageSources, evaluateTraceabilityCriterion, loadTraceabilityConfig, } from './gate-criterion.js';
|
|
17
17
|
function statLine(path) {
|
|
18
18
|
try {
|
|
19
19
|
const s = statSync(path);
|
|
@@ -28,7 +28,14 @@ function computeInputsHash(projectRoot, instanceName) {
|
|
|
28
28
|
const stateDir = join(projectRoot, '.aidlc', 'state');
|
|
29
29
|
const hash = createHash('sha256');
|
|
30
30
|
hash.update(statLine(join(stateDir, instanceName, 'requirements.md')) + '\n');
|
|
31
|
-
|
|
31
|
+
// Every possible coverage source, PLUS phase-testing.yaml and instance.yaml — those
|
|
32
|
+
// two determine WHICH source is authoritative, so adding a required artifact to the
|
|
33
|
+
// template must invalidate the cache even when no coverage file itself changed.
|
|
34
|
+
for (const source of coverageSources(projectRoot, instanceName)) {
|
|
35
|
+
hash.update(`${source}:${statLine(join(stateDir, instanceName, source))}\n`);
|
|
36
|
+
}
|
|
37
|
+
hash.update(statLine(join(stateDir, instanceName, 'phase-testing.yaml')) + '\n');
|
|
38
|
+
hash.update(statLine(join(stateDir, instanceName, 'instance.yaml')) + '\n');
|
|
32
39
|
// Every instance's requirements.md, sorted — bare-ref uniqueness (AC-24).
|
|
33
40
|
let instances = [];
|
|
34
41
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/traceability/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/traceability/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,24 @@
|
|
|
13
13
|
* Requirements: traceability-ids/AC-3, AC-11..AC-15
|
|
14
14
|
*/
|
|
15
15
|
import type { ParsedRequirements, TraceabilityConfig, TraceabilityResult } from './types.js';
|
|
16
|
+
/**
|
|
17
|
+
* Files that may carry an `ac-coverage` block, MOST-AUTHORITATIVE FIRST:
|
|
18
|
+
*
|
|
19
|
+
* 1. the testing phase's REQUIRED artifacts, per the instance's resolved template
|
|
20
|
+
* (so a project-local template override under `.aidlc/templates/` is honoured);
|
|
21
|
+
* 2. `testing.md` — legacy fallback for instances written under the old hardcoded
|
|
22
|
+
* path. Kept for AC-11, not for new use.
|
|
23
|
+
*
|
|
24
|
+
* Required-only, deliberately: `phase-testing.yaml` also lists OPTIONAL artifacts
|
|
25
|
+
* (9 of 17 instances on disk name `coverage-report.md`), and reading a coverage block
|
|
26
|
+
* out of a coverage report would be surprising and wrong. `phase-testing.yaml` does
|
|
27
|
+
* not mark which entries are required, so the required set comes from the template.
|
|
28
|
+
*
|
|
29
|
+
* Resolution happens here rather than through a new parameter because
|
|
30
|
+
* `evaluateTraceabilityCriterion` has four call sites (`cache.ts`, `commands/gate.ts`,
|
|
31
|
+
* `commands/transition.ts`) and changing its signature would touch all of them.
|
|
32
|
+
*/
|
|
33
|
+
export declare function coverageSources(projectRoot: string, instanceName: string): string[];
|
|
16
34
|
/** Message template callers use for unsatisfied criteria / violations. */
|
|
17
35
|
export declare function uncoveredMessage(acId: number): string;
|
|
18
36
|
/** Tolerant reader for the optional `traceability:` config section (AC-7). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gate-criterion.d.ts","sourceRoot":"","sources":["../../src/traceability/gate-criterion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;
|
|
1
|
+
{"version":3,"file":"gate-criterion.d.ts","sourceRoot":"","sources":["../../src/traceability/gate-criterion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAW7F;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,CA0BnF;AAqBD,0EAA0E;AAC1E,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,8EAA8E;AAC9E,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAarF;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAkBjF;AAED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAC3C,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAChB,kBAAkB,GAAG,IAAI,CA2E3B"}
|
|
@@ -15,10 +15,76 @@
|
|
|
15
15
|
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
16
16
|
import { join } from 'node:path';
|
|
17
17
|
import { parse as parseYaml } from 'yaml';
|
|
18
|
+
import { loadTemplates as loadBuiltInTemplates } from '@rasensio/aidlc-content';
|
|
19
|
+
import { loadTemplates, resolveTemplate } from '../core/template-resolver.js';
|
|
18
20
|
import { parseRequirements } from './parser.js';
|
|
19
21
|
import { DEFAULT_TEST_GLOBS, discoverTestFiles, scanFiles } from './scanner.js';
|
|
20
22
|
import { parseCoverageBlock } from './coverage-block.js';
|
|
21
23
|
import { buildMatrix } from './matrix.js';
|
|
24
|
+
/** Legacy coverage file, kept readable for instances written before the fix (AC-11). */
|
|
25
|
+
const LEGACY_COVERAGE_FILE = 'testing.md';
|
|
26
|
+
/**
|
|
27
|
+
* Files that may carry an `ac-coverage` block, MOST-AUTHORITATIVE FIRST:
|
|
28
|
+
*
|
|
29
|
+
* 1. the testing phase's REQUIRED artifacts, per the instance's resolved template
|
|
30
|
+
* (so a project-local template override under `.aidlc/templates/` is honoured);
|
|
31
|
+
* 2. `testing.md` — legacy fallback for instances written under the old hardcoded
|
|
32
|
+
* path. Kept for AC-11, not for new use.
|
|
33
|
+
*
|
|
34
|
+
* Required-only, deliberately: `phase-testing.yaml` also lists OPTIONAL artifacts
|
|
35
|
+
* (9 of 17 instances on disk name `coverage-report.md`), and reading a coverage block
|
|
36
|
+
* out of a coverage report would be surprising and wrong. `phase-testing.yaml` does
|
|
37
|
+
* not mark which entries are required, so the required set comes from the template.
|
|
38
|
+
*
|
|
39
|
+
* Resolution happens here rather than through a new parameter because
|
|
40
|
+
* `evaluateTraceabilityCriterion` has four call sites (`cache.ts`, `commands/gate.ts`,
|
|
41
|
+
* `commands/transition.ts`) and changing its signature would touch all of them.
|
|
42
|
+
*/
|
|
43
|
+
export function coverageSources(projectRoot, instanceName) {
|
|
44
|
+
const sources = [];
|
|
45
|
+
const instanceDir = join(projectRoot, '.aidlc', 'state', instanceName);
|
|
46
|
+
try {
|
|
47
|
+
const instance = parseYaml(readFileSync(join(instanceDir, 'instance.yaml'), 'utf8'));
|
|
48
|
+
const templateName = instance?.template;
|
|
49
|
+
if (templateName) {
|
|
50
|
+
const all = loadAllTemplatesForCoverage(projectRoot);
|
|
51
|
+
const raw = all.get(templateName);
|
|
52
|
+
if (raw) {
|
|
53
|
+
const resolved = resolveTemplate(raw, all);
|
|
54
|
+
const testingPhase = resolved.phases.find((p) => p.name === 'testing');
|
|
55
|
+
for (const artifact of testingPhase?.required_artifacts ?? []) {
|
|
56
|
+
if (!sources.includes(artifact.name))
|
|
57
|
+
sources.push(artifact.name);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// Unreadable instance.yaml or template — fall through to the legacy file.
|
|
64
|
+
}
|
|
65
|
+
if (!sources.includes(LEGACY_COVERAGE_FILE))
|
|
66
|
+
sources.push(LEGACY_COVERAGE_FILE);
|
|
67
|
+
return sources;
|
|
68
|
+
}
|
|
69
|
+
/** Built-in templates plus any project-local overrides. */
|
|
70
|
+
function loadAllTemplatesForCoverage(projectRoot) {
|
|
71
|
+
const templates = new Map();
|
|
72
|
+
try {
|
|
73
|
+
for (const tpl of loadBuiltInTemplates()) {
|
|
74
|
+
templates.set(tpl.name, tpl.raw);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Content package unavailable — project-local templates may still resolve.
|
|
79
|
+
}
|
|
80
|
+
const customDir = join(projectRoot, '.aidlc', 'templates');
|
|
81
|
+
if (existsSync(customDir)) {
|
|
82
|
+
for (const [name, tpl] of loadTemplates(customDir)) {
|
|
83
|
+
templates.set(name, tpl);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return templates;
|
|
87
|
+
}
|
|
22
88
|
/** Message template callers use for unsatisfied criteria / violations. */
|
|
23
89
|
export function uncoveredMessage(acId) {
|
|
24
90
|
return `acceptance criterion AC-${acId} has no referencing test (traceability)`;
|
|
@@ -86,7 +152,9 @@ export function evaluateTraceabilityCriterion(projectRoot, instanceName, phaseNa
|
|
|
86
152
|
if (!parsed || parsed.acShapedLines === 0)
|
|
87
153
|
return null;
|
|
88
154
|
const requirementsPath = `.aidlc/state/${instanceName}/requirements.md`;
|
|
89
|
-
const
|
|
155
|
+
const sources = coverageSources(projectRoot, instanceName);
|
|
156
|
+
const authoritative = sources.find((f) => existsSync(join(instanceDir, f)));
|
|
157
|
+
const testingPath = `.aidlc/state/${instanceName}/${authoritative ?? LEGACY_COVERAGE_FILE}`;
|
|
90
158
|
// Warnings ordered by phase: parse → glob/discovery → scan → block → matrix
|
|
91
159
|
// (NFR4). Registry parse warnings are scoped to the target instance only.
|
|
92
160
|
const warnings = [...parsed.warnings];
|
|
@@ -100,14 +168,32 @@ export function evaluateTraceabilityCriterion(projectRoot, instanceName, phaseNa
|
|
|
100
168
|
warnings.push(...discovery.warnings);
|
|
101
169
|
const scan = scanFiles(projectRoot, discovery.files);
|
|
102
170
|
warnings.push(...scan.warnings);
|
|
171
|
+
// PRECEDENCE, not union: the first source that exists provides the coverage block and
|
|
172
|
+
// later sources are not read. A union would let a stale `testing.md` keep an AC covered
|
|
173
|
+
// after the template-declared artifact had dropped the claim — coverage no current
|
|
174
|
+
// artifact asserts. When a later source also exists, a warning names it as ignored so
|
|
175
|
+
// the situation is visible rather than silent.
|
|
103
176
|
let blockEntries = [];
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
177
|
+
if (authoritative) {
|
|
178
|
+
try {
|
|
179
|
+
const block = parseCoverageBlock(readFileSync(join(instanceDir, authoritative), 'utf8'));
|
|
180
|
+
blockEntries = block.entries;
|
|
181
|
+
warnings.push(...block.warnings);
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
// Unreadable despite existing — scan-only coverage.
|
|
185
|
+
}
|
|
186
|
+
for (const ignored of sources) {
|
|
187
|
+
if (ignored === authoritative)
|
|
188
|
+
continue;
|
|
189
|
+
if (!existsSync(join(instanceDir, ignored)))
|
|
190
|
+
continue;
|
|
191
|
+
const block = parseCoverageBlock(readFileSync(join(instanceDir, ignored), 'utf8'));
|
|
192
|
+
if (block.entries.length > 0) {
|
|
193
|
+
warnings.push(`ac-coverage block in "${ignored}" ignored: "${authoritative}" is authoritative ` +
|
|
194
|
+
`for this template (${block.entries.length} ${block.entries.length === 1 ? 'entry' : 'entries'} not counted)`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
111
197
|
}
|
|
112
198
|
const matrix = buildMatrix({
|
|
113
199
|
instance: instanceName,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gate-criterion.js","sourceRoot":"","sources":["../../src/traceability/gate-criterion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"gate-criterion.js","sourceRoot":"","sources":["../../src/traceability/gate-criterion.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rasensio/aidlc",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.10.2",
|
|
4
4
|
"description": "AI Development Lifecycle Framework — structured lifecycle guidance for AI coding agents across platforms",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/cli.js",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"commander": "15.0.0",
|
|
25
25
|
"picomatch": "4.0.5",
|
|
26
26
|
"yaml": "2.9.0",
|
|
27
|
-
"@rasensio/aidlc-content": "1.
|
|
27
|
+
"@rasensio/aidlc-content": "1.10.2"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@types/node": "22.15.32",
|