@rasensio/aidlc 1.79.0 → 1.81.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/autopilot/driver.d.ts.map +1 -1
- package/dist/autopilot/driver.js +13 -2
- package/dist/autopilot/driver.js.map +1 -1
- package/dist/commands/compliance.d.ts.map +1 -1
- package/dist/commands/compliance.js +1 -0
- package/dist/commands/compliance.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +11 -7
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/roadmap.d.ts +1 -0
- package/dist/commands/roadmap.d.ts.map +1 -1
- package/dist/commands/roadmap.js +7 -1
- package/dist/commands/roadmap.js.map +1 -1
- package/dist/compliance/install.d.ts +2 -0
- package/dist/compliance/install.d.ts.map +1 -1
- package/dist/compliance/install.js +2 -0
- package/dist/compliance/install.js.map +1 -1
- package/dist/compliance/schema.d.ts +5 -0
- package/dist/compliance/schema.d.ts.map +1 -1
- package/dist/compliance/schema.js +37 -0
- package/dist/compliance/schema.js.map +1 -1
- package/dist/compliance/types.d.ts +9 -0
- package/dist/compliance/types.d.ts.map +1 -1
- package/dist/roadmap/next.d.ts +22 -3
- package/dist/roadmap/next.d.ts.map +1 -1
- package/dist/roadmap/next.js +30 -4
- package/dist/roadmap/next.js.map +1 -1
- package/package.json +2 -2
package/dist/roadmap/next.d.ts
CHANGED
|
@@ -10,6 +10,10 @@
|
|
|
10
10
|
* Reads the PRIMARY checkout's roadmap (`roadmapRoot`), like every roadmap lookup
|
|
11
11
|
* that decides status.
|
|
12
12
|
*
|
|
13
|
+
* With `autopilot`, items whose `run` is `attended` — or unreadable — are left for a
|
|
14
|
+
* person (autopilot-or-attended-field/AC-1..AC-3); without it they are offered as before,
|
|
15
|
+
* because a person can pick them (AC-4).
|
|
16
|
+
*
|
|
13
17
|
* @module
|
|
14
18
|
*/
|
|
15
19
|
import { type RoadmapItem } from './paths.js';
|
|
@@ -21,7 +25,7 @@ export interface NextCandidate {
|
|
|
21
25
|
}
|
|
22
26
|
export interface Skipped {
|
|
23
27
|
file: string;
|
|
24
|
-
reason: 'bad-priority' | 'blocked' | 'promoted';
|
|
28
|
+
reason: 'bad-priority' | 'blocked' | 'promoted' | 'attended' | 'bad-run';
|
|
25
29
|
detail: string;
|
|
26
30
|
}
|
|
27
31
|
/**
|
|
@@ -42,7 +46,22 @@ export interface NextResult {
|
|
|
42
46
|
file: string;
|
|
43
47
|
title: string | null;
|
|
44
48
|
}[];
|
|
49
|
+
/** Every backlog item whose `run` is malformed, in either mode — what the warning reads (autopilot-or-attended-field/AC-5). */
|
|
50
|
+
badRun: {
|
|
51
|
+
file: string;
|
|
52
|
+
detail: string;
|
|
53
|
+
}[];
|
|
45
54
|
}
|
|
55
|
+
export type RunMode = 'autopilot' | 'attended';
|
|
56
|
+
export interface PickOptions {
|
|
57
|
+
/** Leave `run: attended` and malformed-`run` items out of the ready order. */
|
|
58
|
+
autopilot?: boolean;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Read one item's `run`. Absent or null reads as `autopilot`, so a repo that never sets
|
|
62
|
+
* it sees no change (autopilot-or-attended-field/AC-2); any other value is `'bad'`.
|
|
63
|
+
*/
|
|
64
|
+
export declare function parseRun(raw: unknown): RunMode | 'bad';
|
|
46
65
|
/**
|
|
47
66
|
* Read one item's `priority`: a positive integer, `null` when absent or null, or
|
|
48
67
|
* `'bad'` for anything else.
|
|
@@ -53,10 +72,10 @@ export interface NextResult {
|
|
|
53
72
|
export declare function parsePriority(raw: unknown): number | null | 'bad';
|
|
54
73
|
/** Priority ascending, unranked last, then file name — total, so the pick is stable. */
|
|
55
74
|
export declare function compareCandidates(a: NextCandidate, b: NextCandidate): number;
|
|
56
|
-
export declare function pickNext(cwd: string): NextResult;
|
|
75
|
+
export declare function pickNext(cwd: string, opts?: PickOptions): NextResult;
|
|
57
76
|
/**
|
|
58
77
|
* `pickNext` against an explicit roadmap root — what `aidlc roadmap view` calls, so the
|
|
59
78
|
* board marks as ready exactly what `roadmap next` would offer (html-roadmap-view/AC-17).
|
|
60
79
|
*/
|
|
61
|
-
export declare function pickNextAt(root: string): NextResult;
|
|
80
|
+
export declare function pickNextAt(root: string, opts?: PickOptions): NextResult;
|
|
62
81
|
//# sourceMappingURL=next.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"next.d.ts","sourceRoot":"","sources":["../../src/roadmap/next.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"next.d.ts","sourceRoot":"","sources":["../../src/roadmap/next.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAA0C,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAEtF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;IACzE,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,GAAG,MAAM,GAAG,IAAI,CAErF;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,yGAAyG;IACzG,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,EAAE,CAAC;IACnD,+HAA+H;IAC/H,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC5C;AAED,MAAM,MAAM,OAAO,GAAG,WAAW,GAAG,UAAU,CAAC;AAE/C,MAAM,WAAW,WAAW;IAC1B,8EAA8E;IAC9E,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,GAAG,KAAK,CAGtD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,GAAG,KAAK,CAIjE;AAED,wFAAwF;AACxF,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,GAAG,MAAM,CAO5E;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,UAAU,CAExE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,UAAU,CA8D3E"}
|
package/dist/roadmap/next.js
CHANGED
|
@@ -10,6 +10,10 @@
|
|
|
10
10
|
* Reads the PRIMARY checkout's roadmap (`roadmapRoot`), like every roadmap lookup
|
|
11
11
|
* that decides status.
|
|
12
12
|
*
|
|
13
|
+
* With `autopilot`, items whose `run` is `attended` — or unreadable — are left for a
|
|
14
|
+
* person (autopilot-or-attended-field/AC-1..AC-3); without it they are offered as before,
|
|
15
|
+
* because a person can pick them (AC-4).
|
|
16
|
+
*
|
|
13
17
|
* @module
|
|
14
18
|
*/
|
|
15
19
|
import { frontmatter, listStatusAt, roadmapRoot } from './paths.js';
|
|
@@ -24,6 +28,15 @@ import { frontmatter, listStatusAt, roadmapRoot } from './paths.js';
|
|
|
24
28
|
export function promotionRefusal(item) {
|
|
25
29
|
return item.promotedTo === null ? null : `already promoted to "${item.promotedTo}"`;
|
|
26
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* Read one item's `run`. Absent or null reads as `autopilot`, so a repo that never sets
|
|
33
|
+
* it sees no change (autopilot-or-attended-field/AC-2); any other value is `'bad'`.
|
|
34
|
+
*/
|
|
35
|
+
export function parseRun(raw) {
|
|
36
|
+
if (raw === undefined || raw === null)
|
|
37
|
+
return 'autopilot';
|
|
38
|
+
return raw === 'autopilot' || raw === 'attended' ? raw : 'bad';
|
|
39
|
+
}
|
|
27
40
|
/**
|
|
28
41
|
* Read one item's `priority`: a positive integer, `null` when absent or null, or
|
|
29
42
|
* `'bad'` for anything else.
|
|
@@ -49,14 +62,14 @@ export function compareCandidates(a, b) {
|
|
|
49
62
|
}
|
|
50
63
|
return a.file < b.file ? -1 : a.file > b.file ? 1 : 0;
|
|
51
64
|
}
|
|
52
|
-
export function pickNext(cwd) {
|
|
53
|
-
return pickNextAt(roadmapRoot(cwd));
|
|
65
|
+
export function pickNext(cwd, opts = {}) {
|
|
66
|
+
return pickNextAt(roadmapRoot(cwd), opts);
|
|
54
67
|
}
|
|
55
68
|
/**
|
|
56
69
|
* `pickNext` against an explicit roadmap root — what `aidlc roadmap view` calls, so the
|
|
57
70
|
* board marks as ready exactly what `roadmap next` would offer (html-roadmap-view/AC-17).
|
|
58
71
|
*/
|
|
59
|
-
export function pickNextAt(root) {
|
|
72
|
+
export function pickNextAt(root, opts = {}) {
|
|
60
73
|
const doneIds = new Set();
|
|
61
74
|
for (const item of listStatusAt(root, 'done')) {
|
|
62
75
|
if (item.id)
|
|
@@ -65,6 +78,7 @@ export function pickNextAt(root) {
|
|
|
65
78
|
const ready = [];
|
|
66
79
|
const skipped = [];
|
|
67
80
|
const unranked = [];
|
|
81
|
+
const badRun = [];
|
|
68
82
|
for (const item of listStatusAt(root, 'backlog')) {
|
|
69
83
|
const data = frontmatter(item.raw)?.data ?? {};
|
|
70
84
|
const priority = parsePriority(data.priority);
|
|
@@ -78,6 +92,10 @@ export function pickNextAt(root) {
|
|
|
78
92
|
}
|
|
79
93
|
if (priority === null)
|
|
80
94
|
unranked.push({ file: item.filename, title: item.title });
|
|
95
|
+
const run = parseRun(data.run);
|
|
96
|
+
const runDetail = `run ${JSON.stringify(data.run)} is not autopilot or attended`;
|
|
97
|
+
if (run === 'bad')
|
|
98
|
+
badRun.push({ file: item.filename, detail: runDetail });
|
|
81
99
|
const refusal = promotionRefusal(item);
|
|
82
100
|
if (refusal !== null) {
|
|
83
101
|
skipped.push({ file: item.filename, reason: 'promoted', detail: refusal });
|
|
@@ -93,9 +111,17 @@ export function pickNextAt(root) {
|
|
|
93
111
|
});
|
|
94
112
|
continue;
|
|
95
113
|
}
|
|
114
|
+
// Last, so a blocked or promoted item keeps the reason it has today and `attended`
|
|
115
|
+
// names only items a person could start now (autopilot-or-attended-field/AC-1, AC-3).
|
|
116
|
+
if (opts.autopilot && run !== 'autopilot') {
|
|
117
|
+
skipped.push(run === 'attended'
|
|
118
|
+
? { file: item.filename, reason: 'attended', detail: 'run: attended — needs a person' }
|
|
119
|
+
: { file: item.filename, reason: 'bad-run', detail: runDetail });
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
96
122
|
ready.push({ file: item.filename, id: item.id, title: item.title, priority });
|
|
97
123
|
}
|
|
98
124
|
ready.sort(compareCandidates);
|
|
99
|
-
return { next: ready[0] ?? null, ready, skipped, unranked };
|
|
125
|
+
return { next: ready[0] ?? null, ready, skipped, unranked, badRun };
|
|
100
126
|
}
|
|
101
127
|
//# sourceMappingURL=next.js.map
|
package/dist/roadmap/next.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"next.js","sourceRoot":"","sources":["../../src/roadmap/next.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"next.js","sourceRoot":"","sources":["../../src/roadmap/next.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.81.0",
|
|
4
4
|
"description": "AI Development Lifecycle Framework — structured lifecycle guidance for AI coding agents across platforms",
|
|
5
5
|
"homepage": "https://aidlc.rodrigoasensio.com",
|
|
6
6
|
"repository": {
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"commander": "15.0.0",
|
|
32
32
|
"picomatch": "4.0.5",
|
|
33
33
|
"yaml": "2.9.0",
|
|
34
|
-
"@rasensio/aidlc-content": "1.
|
|
34
|
+
"@rasensio/aidlc-content": "1.81.0"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@types/node": "22.15.32",
|