@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.
Files changed (52) hide show
  1. package/README.md +2 -0
  2. package/dist/cli.d.ts +18 -1
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +76 -26
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/menu.d.ts +21 -0
  7. package/dist/commands/menu.d.ts.map +1 -0
  8. package/dist/commands/menu.js +32 -0
  9. package/dist/commands/menu.js.map +1 -0
  10. package/dist/commands/review.d.ts +27 -1
  11. package/dist/commands/review.d.ts.map +1 -1
  12. package/dist/commands/review.js +93 -8
  13. package/dist/commands/review.js.map +1 -1
  14. package/dist/commands/transition.d.ts.map +1 -1
  15. package/dist/commands/transition.js +7 -24
  16. package/dist/commands/transition.js.map +1 -1
  17. package/dist/core/lifecycle.js +28 -5
  18. package/dist/core/lifecycle.js.map +1 -1
  19. package/dist/core/types.d.ts +6 -0
  20. package/dist/core/types.d.ts.map +1 -1
  21. package/dist/menu/dispatch.d.ts +59 -0
  22. package/dist/menu/dispatch.d.ts.map +1 -0
  23. package/dist/menu/dispatch.js +76 -0
  24. package/dist/menu/dispatch.js.map +1 -0
  25. package/dist/menu/index.d.ts +51 -0
  26. package/dist/menu/index.d.ts.map +1 -0
  27. package/dist/menu/index.js +117 -0
  28. package/dist/menu/index.js.map +1 -0
  29. package/dist/menu/invocation.d.ts +20 -0
  30. package/dist/menu/invocation.d.ts.map +1 -0
  31. package/dist/menu/invocation.js +22 -0
  32. package/dist/menu/invocation.js.map +1 -0
  33. package/dist/menu/prompt.d.ts +74 -0
  34. package/dist/menu/prompt.d.ts.map +1 -0
  35. package/dist/menu/prompt.js +71 -0
  36. package/dist/menu/prompt.js.map +1 -0
  37. package/dist/menu/resolve.d.ts +57 -0
  38. package/dist/menu/resolve.d.ts.map +1 -0
  39. package/dist/menu/resolve.js +76 -0
  40. package/dist/menu/resolve.js.map +1 -0
  41. package/dist/menu/roster.d.ts +51 -0
  42. package/dist/menu/roster.d.ts.map +1 -0
  43. package/dist/menu/roster.js +65 -0
  44. package/dist/menu/roster.js.map +1 -0
  45. package/dist/traceability/cache.d.ts.map +1 -1
  46. package/dist/traceability/cache.js +9 -2
  47. package/dist/traceability/cache.js.map +1 -1
  48. package/dist/traceability/gate-criterion.d.ts +18 -0
  49. package/dist/traceability/gate-criterion.d.ts.map +1 -1
  50. package/dist/traceability/gate-criterion.js +94 -8
  51. package/dist/traceability/gate-criterion.js.map +1 -1
  52. 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;AAyDlD;;;;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"}
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
- hash.update(statLine(join(stateDir, instanceName, 'testing.md')) + '\n');
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":"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"}
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;AAMH,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAM7F,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,CAuD3B"}
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 testingPath = `.aidlc/state/${instanceName}/testing.md`;
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
- try {
105
- const block = parseCoverageBlock(readFileSync(join(instanceDir, 'testing.md'), 'utf8'));
106
- blockEntries = block.entries;
107
- warnings.push(...block.warnings);
108
- }
109
- catch {
110
- // No testing.md yet — scan-only coverage.
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":"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"}
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.9.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.9.1"
27
+ "@rasensio/aidlc-content": "1.10.2"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@types/node": "22.15.32",