@rasensio/aidlc 1.10.1 → 1.10.5
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/commands/add-action.d.ts.map +1 -1
- package/dist/commands/add-action.js +17 -2
- package/dist/commands/add-action.js.map +1 -1
- package/dist/commands/add-skill.d.ts.map +1 -1
- package/dist/commands/add-skill.js +13 -0
- package/dist/commands/add-skill.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +20 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/knowledge.d.ts.map +1 -1
- package/dist/commands/knowledge.js +11 -0
- package/dist/commands/knowledge.js.map +1 -1
- 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/start.d.ts.map +1 -1
- package/dist/commands/start.js +13 -3
- package/dist/commands/start.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/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/lifecycle.js +28 -5
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core/tty.d.ts +38 -0
- package/dist/core/tty.d.ts.map +1 -0
- package/dist/core/tty.js +40 -0
- package/dist/core/tty.js.map +1 -0
- package/dist/core/types.d.ts +6 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/doctor/context.d.ts.map +1 -1
- package/dist/doctor/context.js +5 -1
- package/dist/doctor/context.js.map +1 -1
- package/dist/events/event-bus.d.ts.map +1 -1
- package/dist/events/event-bus.js +16 -13
- package/dist/events/event-bus.js.map +1 -1
- package/dist/events/plugin-hooks.d.ts.map +1 -1
- package/dist/events/plugin-hooks.js +12 -15
- package/dist/events/plugin-hooks.js.map +1 -1
- package/dist/events/run-command.d.ts +58 -0
- package/dist/events/run-command.d.ts.map +1 -0
- package/dist/events/run-command.js +110 -0
- package/dist/events/run-command.js.map +1 -0
- package/dist/menu/prompt.d.ts +7 -7
- package/dist/menu/prompt.d.ts.map +1 -1
- package/dist/menu/prompt.js +7 -9
- package/dist/menu/prompt.js.map +1 -1
- 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
package/dist/events/event-bus.js
CHANGED
|
@@ -14,6 +14,7 @@ import { join, dirname } from 'node:path';
|
|
|
14
14
|
import { execSync } from 'node:child_process';
|
|
15
15
|
import { parse } from 'yaml';
|
|
16
16
|
import { coordinationRoot } from '../concurrency/common-dir.js';
|
|
17
|
+
import { runCommand } from './run-command.js';
|
|
17
18
|
// ---------------------------------------------------------------------------
|
|
18
19
|
// Retro-pending markers (feedback-loop AC-23, design DD-4)
|
|
19
20
|
// ---------------------------------------------------------------------------
|
|
@@ -229,21 +230,16 @@ function executeAction(action, event) {
|
|
|
229
230
|
return handler(event, action.with);
|
|
230
231
|
}
|
|
231
232
|
if ('run' in action && action.run) {
|
|
232
|
-
// Custom shell command
|
|
233
|
-
|
|
234
|
-
const
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
240
|
-
timeout: 30_000,
|
|
241
|
-
});
|
|
233
|
+
// Custom shell command. The verdict is the child's exit status, not whether
|
|
234
|
+
// the parent managed to write the stdin payload — see events/run-command.ts.
|
|
235
|
+
const result = runCommand(action.run, {
|
|
236
|
+
env: { ...process.env, ...buildEnvVars(event) },
|
|
237
|
+
input: JSON.stringify(event),
|
|
238
|
+
});
|
|
239
|
+
if (result.success) {
|
|
242
240
|
return { success: true };
|
|
243
241
|
}
|
|
244
|
-
|
|
245
|
-
return { success: false, error: `Command failed: ${err.message}` };
|
|
246
|
-
}
|
|
242
|
+
return { success: false, error: `command ${JSON.stringify(action.run)} ${result.error}` };
|
|
247
243
|
}
|
|
248
244
|
return { success: false, error: 'Action has neither "use" nor "run" field' };
|
|
249
245
|
}
|
|
@@ -292,6 +288,13 @@ export function emit(event, actions, opts) {
|
|
|
292
288
|
if (!result.success && action.blocking) {
|
|
293
289
|
break;
|
|
294
290
|
}
|
|
291
|
+
// A non-blocking failure is not returned to the user by every caller
|
|
292
|
+
// (`aidlc transition` ignores the report), so say it here or it is lost —
|
|
293
|
+
// which is how a release-blocking flake stayed unreadable for ten days
|
|
294
|
+
// (subprocess-test-flake/AC-6).
|
|
295
|
+
if (!result.success) {
|
|
296
|
+
process.stderr.write(`[aidlc] action error (${action.id}): ${result.error ?? 'failed'}\n`);
|
|
297
|
+
}
|
|
295
298
|
}
|
|
296
299
|
return report;
|
|
297
300
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../../src/events/event-bus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../../src/events/event-bus.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-hooks.d.ts","sourceRoot":"","sources":["../../src/events/plugin-hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,KAAK,EACV,cAAc,EAEd,YAAY,EACZ,cAAc,EAEf,MAAM,kBAAkB,CAAC;AA0E1B;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,EAAE,CA6EpE;AAmBD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,cAAc,EAAE,EACzB,KAAK,EAAE,YAAY,EACnB,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC1B,cAAc,
|
|
1
|
+
{"version":3,"file":"plugin-hooks.d.ts","sourceRoot":"","sources":["../../src/events/plugin-hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,KAAK,EACV,cAAc,EAEd,YAAY,EACZ,cAAc,EAEf,MAAM,kBAAkB,CAAC;AA0E1B;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,EAAE,CA6EpE;AAmBD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,cAAc,EAAE,EACzB,KAAK,EAAE,YAAY,EACnB,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC1B,cAAc,CAsChB"}
|
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
* Requirements: 10.1, 10.2, 10.5, 10.6, 10.7, 14.5
|
|
11
11
|
*/
|
|
12
12
|
import { readdirSync, readFileSync, existsSync, statSync } from 'node:fs';
|
|
13
|
-
import { execSync } from 'node:child_process';
|
|
14
13
|
import { join, resolve } from 'node:path';
|
|
15
14
|
import { parse } from 'yaml';
|
|
15
|
+
import { runCommand } from './run-command.js';
|
|
16
16
|
// ---------------------------------------------------------------------------
|
|
17
17
|
// Plugin manifest validation
|
|
18
18
|
// ---------------------------------------------------------------------------
|
|
@@ -199,22 +199,19 @@ export function firePluginHooks(plugins, event, opts) {
|
|
|
199
199
|
report.fired.push({ id: hookId, success: true });
|
|
200
200
|
continue;
|
|
201
201
|
}
|
|
202
|
-
// Execute the hook command (non-blocking: errors logged, never halt)
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
timeout: 30_000,
|
|
211
|
-
cwd: undefined,
|
|
212
|
-
});
|
|
202
|
+
// Execute the hook command (non-blocking: errors logged, never halt).
|
|
203
|
+
// The verdict is the child's exit status, not whether the parent managed
|
|
204
|
+
// to write the stdin payload — see events/run-command.ts.
|
|
205
|
+
const result = runCommand(hook.run, {
|
|
206
|
+
env: { ...process.env, ...buildEnvVars(event) },
|
|
207
|
+
input: JSON.stringify(event),
|
|
208
|
+
});
|
|
209
|
+
if (result.success) {
|
|
213
210
|
report.fired.push({ id: hookId, success: true });
|
|
214
211
|
}
|
|
215
|
-
|
|
216
|
-
const errorMsg =
|
|
217
|
-
process.stderr.write(`[aidlc] plugin hook error (${plugin.name}): ${
|
|
212
|
+
else {
|
|
213
|
+
const errorMsg = `command ${JSON.stringify(hook.run)} ${result.error}`;
|
|
214
|
+
process.stderr.write(`[aidlc] plugin hook error (${plugin.name}): ${errorMsg}\n`);
|
|
218
215
|
report.fired.push({ id: hookId, success: false, error: errorMsg });
|
|
219
216
|
// Non-blocking: continue to next hook
|
|
220
217
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-hooks.js","sourceRoot":"","sources":["../../src/events/plugin-hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"plugin-hooks.js","sourceRoot":"","sources":["../../src/events/plugin-hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared child-process runner for lifecycle actions and plugin hooks.
|
|
3
|
+
*
|
|
4
|
+
* Both callers hand the event payload to the child on stdin. `spawnSync` forks
|
|
5
|
+
* first and writes that payload afterwards, so a command that never reads stdin
|
|
6
|
+
* can exit before the write lands — the write then hits a closed pipe and
|
|
7
|
+
* `spawnSync` reports `EPIPE` for a command that ran and exited 0. The race is
|
|
8
|
+
* deterministic above the 64 KiB pipe buffer and load-dependent below it, which
|
|
9
|
+
* is how it reached CI as a release-blocking flake that survived three retries
|
|
10
|
+
* (see .aidlc/state/subprocess-test-flake/reproduction.md).
|
|
11
|
+
*
|
|
12
|
+
* So the child's exit status — not the parent's stdin write — is the verdict on
|
|
13
|
+
* whether a hook succeeded, and a failure has to carry enough detail to be
|
|
14
|
+
* diagnosed from a CI log alone.
|
|
15
|
+
*
|
|
16
|
+
* Requirements: subprocess-test-flake/AC-1 .. AC-8
|
|
17
|
+
*/
|
|
18
|
+
import type { SpawnSyncReturns } from 'node:child_process';
|
|
19
|
+
/** Wall-clock budget for a single hook or action command. */
|
|
20
|
+
export declare const COMMAND_TIMEOUT_MS = 30000;
|
|
21
|
+
export interface RunCommandOptions {
|
|
22
|
+
/** Environment for the child (callers pass process.env plus AIDLC_* vars). */
|
|
23
|
+
env: NodeJS.ProcessEnv;
|
|
24
|
+
/** Payload written to the child's stdin. */
|
|
25
|
+
input: string;
|
|
26
|
+
/** Working directory; undefined inherits the parent's. */
|
|
27
|
+
cwd?: string;
|
|
28
|
+
/** Overrides COMMAND_TIMEOUT_MS (tests use a short budget). */
|
|
29
|
+
timeoutMs?: number;
|
|
30
|
+
}
|
|
31
|
+
export interface RunCommandResult {
|
|
32
|
+
success: boolean;
|
|
33
|
+
/** Present only on failure: exit status, signal, errno, and child stderr. */
|
|
34
|
+
error?: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* How a command is actually spawned. Only tests pass anything but the default:
|
|
38
|
+
* a transient spawn errno (EAGAIN and friends) cannot be provoked on demand
|
|
39
|
+
* from inside a process, and the retry it triggers is the one behaviour here
|
|
40
|
+
* that no real command can exercise.
|
|
41
|
+
*/
|
|
42
|
+
export type SpawnFn = (command: string, options: {
|
|
43
|
+
shell: true;
|
|
44
|
+
env: NodeJS.ProcessEnv;
|
|
45
|
+
input: string;
|
|
46
|
+
stdio: ['pipe', 'pipe', 'pipe'];
|
|
47
|
+
timeout: number;
|
|
48
|
+
cwd?: string;
|
|
49
|
+
encoding: 'utf8';
|
|
50
|
+
}) => SpawnSyncReturns<string>;
|
|
51
|
+
/**
|
|
52
|
+
* Run a hook or action command synchronously and classify the outcome.
|
|
53
|
+
*
|
|
54
|
+
* The success path spawns exactly once and never sleeps; only a transient spawn
|
|
55
|
+
* errno costs a second attempt (AC-4).
|
|
56
|
+
*/
|
|
57
|
+
export declare function runCommand(command: string, opts: RunCommandOptions, spawn?: SpawnFn): RunCommandResult;
|
|
58
|
+
//# sourceMappingURL=run-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-command.d.ts","sourceRoot":"","sources":["../../src/events/run-command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,6DAA6D;AAC7D,eAAO,MAAM,kBAAkB,QAAS,CAAC;AAczC,MAAM,WAAW,iBAAiB;IAChC,8EAA8E;IAC9E,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAsED;;;;;GAKG;AACH,MAAM,MAAM,OAAO,GAAG,CACpB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IACP,KAAK,EAAE,IAAI,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB,KACE,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAI9B;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,iBAAiB,EACvB,KAAK,GAAE,OAAsB,GAC5B,gBAAgB,CAoBlB"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared child-process runner for lifecycle actions and plugin hooks.
|
|
3
|
+
*
|
|
4
|
+
* Both callers hand the event payload to the child on stdin. `spawnSync` forks
|
|
5
|
+
* first and writes that payload afterwards, so a command that never reads stdin
|
|
6
|
+
* can exit before the write lands — the write then hits a closed pipe and
|
|
7
|
+
* `spawnSync` reports `EPIPE` for a command that ran and exited 0. The race is
|
|
8
|
+
* deterministic above the 64 KiB pipe buffer and load-dependent below it, which
|
|
9
|
+
* is how it reached CI as a release-blocking flake that survived three retries
|
|
10
|
+
* (see .aidlc/state/subprocess-test-flake/reproduction.md).
|
|
11
|
+
*
|
|
12
|
+
* So the child's exit status — not the parent's stdin write — is the verdict on
|
|
13
|
+
* whether a hook succeeded, and a failure has to carry enough detail to be
|
|
14
|
+
* diagnosed from a CI log alone.
|
|
15
|
+
*
|
|
16
|
+
* Requirements: subprocess-test-flake/AC-1 .. AC-8
|
|
17
|
+
*/
|
|
18
|
+
import { spawnSync } from 'node:child_process';
|
|
19
|
+
/** Wall-clock budget for a single hook or action command. */
|
|
20
|
+
export const COMMAND_TIMEOUT_MS = 30_000;
|
|
21
|
+
/** Child stderr is quoted in failure text up to this many characters. */
|
|
22
|
+
const STDERR_LIMIT = 500;
|
|
23
|
+
/**
|
|
24
|
+
* Spawn errnos that mean "the machine was momentarily out of a resource",
|
|
25
|
+
* not "the command is wrong" — worth one retry before reporting a failure.
|
|
26
|
+
*/
|
|
27
|
+
const TRANSIENT_CODES = new Set(['EAGAIN', 'EMFILE', 'ENFILE', 'ENOMEM']);
|
|
28
|
+
/** Backoff before the single transient-errno retry. Never runs on success. */
|
|
29
|
+
const RETRY_DELAY_MS = 50;
|
|
30
|
+
/** Sleep without spawning anything or going async. */
|
|
31
|
+
function sleepSync(ms) {
|
|
32
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
|
|
33
|
+
}
|
|
34
|
+
function errnoOf(error) {
|
|
35
|
+
return error?.code;
|
|
36
|
+
}
|
|
37
|
+
/** Trailing child stderr, trimmed and bounded, as a suffix for failure text. */
|
|
38
|
+
function stderrSuffix(result) {
|
|
39
|
+
const text = (result.stderr ?? '').trim();
|
|
40
|
+
if (text === '') {
|
|
41
|
+
return '';
|
|
42
|
+
}
|
|
43
|
+
const bounded = text.length > STDERR_LIMIT ? `${text.slice(0, STDERR_LIMIT)}… (truncated)` : text;
|
|
44
|
+
return `; stderr: ${bounded}`;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Turn a raw spawnSync result into a success/failure verdict.
|
|
48
|
+
*
|
|
49
|
+
* Order matters: a timeout kill and a genuine spawn failure both outrank the
|
|
50
|
+
* exit status, while EPIPE outranks nothing — it is tolerated when the child
|
|
51
|
+
* exited cleanly (AC-1) and reported alongside the status when it did not (AC-2).
|
|
52
|
+
*/
|
|
53
|
+
function classify(result, timeoutMs) {
|
|
54
|
+
const errno = errnoOf(result.error);
|
|
55
|
+
if (errno === 'ETIMEDOUT') {
|
|
56
|
+
return {
|
|
57
|
+
success: false,
|
|
58
|
+
error: `timed out after ${timeoutMs} ms and was killed (${result.signal ?? 'SIGTERM'})${stderrSuffix(result)}`,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
if (result.error !== undefined && errno !== 'EPIPE') {
|
|
62
|
+
return {
|
|
63
|
+
success: false,
|
|
64
|
+
error: `could not run (${errno ?? 'unknown errno'}): ${result.error.message}${stderrSuffix(result)}`,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
if (result.signal !== null && result.signal !== undefined) {
|
|
68
|
+
return {
|
|
69
|
+
success: false,
|
|
70
|
+
error: `killed by ${result.signal}${stderrSuffix(result)}`,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
if (result.status !== 0) {
|
|
74
|
+
// An EPIPE here is a side note: the command failed on its own terms.
|
|
75
|
+
const unread = errno === 'EPIPE' ? ' (it also never read the stdin payload)' : '';
|
|
76
|
+
return {
|
|
77
|
+
success: false,
|
|
78
|
+
error: `exited ${result.status}${unread}${stderrSuffix(result)}`,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
// status 0 — including the EPIPE case, where the command ran fine and simply
|
|
82
|
+
// ignored stdin (AC-1).
|
|
83
|
+
return { success: true };
|
|
84
|
+
}
|
|
85
|
+
const defaultSpawn = (command, options) => spawnSync(command, options);
|
|
86
|
+
/**
|
|
87
|
+
* Run a hook or action command synchronously and classify the outcome.
|
|
88
|
+
*
|
|
89
|
+
* The success path spawns exactly once and never sleeps; only a transient spawn
|
|
90
|
+
* errno costs a second attempt (AC-4).
|
|
91
|
+
*/
|
|
92
|
+
export function runCommand(command, opts, spawn = defaultSpawn) {
|
|
93
|
+
const timeoutMs = opts.timeoutMs ?? COMMAND_TIMEOUT_MS;
|
|
94
|
+
const spawnOptions = {
|
|
95
|
+
shell: true,
|
|
96
|
+
env: opts.env,
|
|
97
|
+
input: opts.input,
|
|
98
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
99
|
+
timeout: timeoutMs,
|
|
100
|
+
cwd: opts.cwd,
|
|
101
|
+
encoding: 'utf8',
|
|
102
|
+
};
|
|
103
|
+
let result = spawn(command, spawnOptions);
|
|
104
|
+
if (TRANSIENT_CODES.has(errnoOf(result.error) ?? '')) {
|
|
105
|
+
sleepSync(RETRY_DELAY_MS);
|
|
106
|
+
result = spawn(command, spawnOptions);
|
|
107
|
+
}
|
|
108
|
+
return classify(result, timeoutMs);
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=run-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-command.js","sourceRoot":"","sources":["../../src/events/run-command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG/C,6DAA6D;AAC7D,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAEzC,yEAAyE;AACzE,MAAM,YAAY,GAAG,GAAG,CAAC;AAEzB;;;GAGG;AACH,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;AAE1E,8EAA8E;AAC9E,MAAM,cAAc,GAAG,EAAE,CAAC;AAmB1B,sDAAsD;AACtD,SAAS,SAAS,CAAC,EAAU;IAC3B,OAAO,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,OAAO,CAAC,KAAc;IAC7B,OAAQ,KAA2C,EAAE,IAAI,CAAC;AAC5D,CAAC;AAED,gFAAgF;AAChF,SAAS,YAAY,CAAC,MAAgC;IACpD,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;QAChB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,OAAO,GACX,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC;IACpF,OAAO,aAAa,OAAO,EAAE,CAAC;AAChC,CAAC;AAED;;;;;;GAMG;AACH,SAAS,QAAQ,CACf,MAAgC,EAChC,SAAiB;IAEjB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEpC,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;QAC1B,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,mBAAmB,SAAS,uBAAuB,MAAM,CAAC,MAAM,IAAI,SAAS,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE;SAC/G,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QACpD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,kBAAkB,KAAK,IAAI,eAAe,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,EAAE;SACrG,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC1D,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,aAAa,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,EAAE;SAC3D,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,qEAAqE;QACrE,MAAM,MAAM,GAAG,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,yCAAyC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,UAAU,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,EAAE;SACjE,CAAC;IACJ,CAAC;IAED,6EAA6E;IAC7E,wBAAwB;IACxB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAqBD,MAAM,YAAY,GAAY,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAEhF;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CACxB,OAAe,EACf,IAAuB,EACvB,QAAiB,YAAY;IAE7B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,kBAAkB,CAAC;IACvD,MAAM,YAAY,GAAG;QACnB,KAAK,EAAE,IAAa;QACpB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAA6B;QAC3D,OAAO,EAAE,SAAS;QAClB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,QAAQ,EAAE,MAAe;KAC1B,CAAC;IAEF,IAAI,MAAM,GAAG,KAAK,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAE1C,IAAI,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QACrD,SAAS,CAAC,cAAc,CAAC,CAAC;QAC1B,MAAM,GAAG,KAAK,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AACrC,CAAC"}
|
package/dist/menu/prompt.d.ts
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
*
|
|
10
10
|
* @module
|
|
11
11
|
*/
|
|
12
|
+
import { isInteractive } from '../core/tty.js';
|
|
12
13
|
/**
|
|
13
14
|
* Cancellation sentinel, owned by this module.
|
|
14
15
|
*
|
|
@@ -52,14 +53,13 @@ export interface MenuDeps {
|
|
|
52
53
|
/**
|
|
53
54
|
* Both streams must be a TTY (interactive-cli-menu/AC-10).
|
|
54
55
|
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
* conjunction is stated explicitly rather than inherited from a precedent.
|
|
56
|
+
* Re-exported, not redefined: the predicate moved to `core/tty.ts` so the
|
|
57
|
+
* command modules could adopt it without importing `menu/` — `menu/index.ts`
|
|
58
|
+
* imports the command registrars, so that direction is a cycle
|
|
59
|
+
* (tty-prompt-guard/AC-1, tty-prompt-guard/AC-2). The reasoning for requiring
|
|
60
|
+
* *both* streams now lives with the definition.
|
|
61
61
|
*/
|
|
62
|
-
export
|
|
62
|
+
export { isInteractive };
|
|
63
63
|
/**
|
|
64
64
|
* Reject empty or whitespace-only input for a required positional.
|
|
65
65
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/menu/prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH;;;;;;;;;GASG;AACH,eAAO,MAAM,MAAM,EAAE,OAAO,MAAoC,CAAC;AAEjE,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC5D;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,MAAM,GAAG,SAAS,CAAC;CAC9D;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,MAAM,GAAG,OAAO,MAAM,CAAC,CAAC;AAC/E,MAAM,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,GAAG,OAAO,MAAM,CAAC,CAAC;AAE3E,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,QAAQ,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAED
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/menu/prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C;;;;;;;;;GASG;AACH,eAAO,MAAM,MAAM,EAAE,OAAO,MAAoC,CAAC;AAEjE,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC5D;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,MAAM,GAAG,SAAS,CAAC;CAC9D;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,MAAM,GAAG,OAAO,MAAM,CAAC,CAAC;AAC/E,MAAM,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,GAAG,OAAO,MAAM,CAAC,CAAC;AAE3E,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,QAAQ,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAED;;;;;;;;GAQG;AACH,OAAO,EAAE,aAAa,EAAE,CAAC;AAmBzB;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,GACZ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,MAAM,GAAG,SAAS,CAEnD;AAED,eAAO,MAAM,WAAW,EAAE,QAMzB,CAAC"}
|
package/dist/menu/prompt.js
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* @module
|
|
11
11
|
*/
|
|
12
12
|
import * as clack from '@clack/prompts';
|
|
13
|
+
import { isInteractive } from '../core/tty.js';
|
|
13
14
|
/**
|
|
14
15
|
* Cancellation sentinel, owned by this module.
|
|
15
16
|
*
|
|
@@ -24,16 +25,13 @@ export const CANCEL = Symbol('aidlc:menu:cancel');
|
|
|
24
25
|
/**
|
|
25
26
|
* Both streams must be a TTY (interactive-cli-menu/AC-10).
|
|
26
27
|
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* conjunction is stated explicitly rather than inherited from a precedent.
|
|
28
|
+
* Re-exported, not redefined: the predicate moved to `core/tty.ts` so the
|
|
29
|
+
* command modules could adopt it without importing `menu/` — `menu/index.ts`
|
|
30
|
+
* imports the command registrars, so that direction is a cycle
|
|
31
|
+
* (tty-prompt-guard/AC-1, tty-prompt-guard/AC-2). The reasoning for requiring
|
|
32
|
+
* *both* streams now lives with the definition.
|
|
33
33
|
*/
|
|
34
|
-
export
|
|
35
|
-
return process.stdin.isTTY === true && process.stdout.isTTY === true;
|
|
36
|
-
}
|
|
34
|
+
export { isInteractive };
|
|
37
35
|
const clackSelect = async (req) => {
|
|
38
36
|
const value = await clack.select({
|
|
39
37
|
message: req.message,
|
package/dist/menu/prompt.js.map
CHANGED
|
@@ -1 +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
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/menu/prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC;AAExC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,MAAM,GAAkB,MAAM,CAAC,mBAAmB,CAAC,CAAC;AA+BjE;;;;;;;;GAQG;AACH,OAAO,EAAE,aAAa,EAAE,CAAC;AAEzB,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"}
|
|
@@ -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"}
|