@planu/cli 0.80.1 → 0.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/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/config/ac-gap-keywords.json +144 -0
- package/dist/config/challenge-scenarios.json +114 -0
- package/dist/config/code-quality-thresholds.json +114 -0
- package/dist/config/compliance-frameworks.json +150 -0
- package/dist/config/dor-dod-items.json +214 -0
- package/dist/config/drift-severity.json +22 -0
- package/dist/config/elicitation-questions.json +70 -0
- package/dist/config/feasibility-rules.json +91 -0
- package/dist/config/rbac-roles.json +27 -0
- package/dist/config/readiness-config.json +18 -0
- package/dist/config/spec-types.json +42 -0
- package/dist/engine/ac-gap-detector/constants.d.ts.map +1 -1
- package/dist/engine/ac-gap-detector/constants.js +24 -126
- package/dist/engine/ac-gap-detector/constants.js.map +1 -1
- package/dist/engine/ac-gap-detector/keyword-loader.d.ts +13 -0
- package/dist/engine/ac-gap-detector/keyword-loader.d.ts.map +1 -0
- package/dist/engine/ac-gap-detector/keyword-loader.js +35 -0
- package/dist/engine/ac-gap-detector/keyword-loader.js.map +1 -0
- package/dist/engine/challenge-scenarios-loader.d.ts +46 -0
- package/dist/engine/challenge-scenarios-loader.d.ts.map +1 -0
- package/dist/engine/challenge-scenarios-loader.js +83 -0
- package/dist/engine/challenge-scenarios-loader.js.map +1 -0
- package/dist/engine/code-quality-thresholds-loader.d.ts +27 -0
- package/dist/engine/code-quality-thresholds-loader.d.ts.map +1 -0
- package/dist/engine/code-quality-thresholds-loader.js +88 -0
- package/dist/engine/code-quality-thresholds-loader.js.map +1 -0
- package/dist/engine/compliance-injector.d.ts +46 -0
- package/dist/engine/compliance-injector.d.ts.map +1 -0
- package/dist/engine/compliance-injector.js +121 -0
- package/dist/engine/compliance-injector.js.map +1 -0
- package/dist/engine/dor-dod/dod.d.ts +3 -2
- package/dist/engine/dor-dod/dod.d.ts.map +1 -1
- package/dist/engine/dor-dod/dod.js +38 -73
- package/dist/engine/dor-dod/dod.js.map +1 -1
- package/dist/engine/dor-dod/dor.d.ts +3 -2
- package/dist/engine/dor-dod/dor.d.ts.map +1 -1
- package/dist/engine/dor-dod/dor.js +75 -125
- package/dist/engine/dor-dod/dor.js.map +1 -1
- package/dist/engine/dor-dod/items-loader.d.ts +18 -0
- package/dist/engine/dor-dod/items-loader.d.ts.map +1 -0
- package/dist/engine/dor-dod/items-loader.js +55 -0
- package/dist/engine/dor-dod/items-loader.js.map +1 -0
- package/dist/engine/elicitation/question-generator.d.ts.map +1 -1
- package/dist/engine/elicitation/question-generator.js +74 -63
- package/dist/engine/elicitation/question-generator.js.map +1 -1
- package/dist/engine/feasibility-rules-loader.d.ts +13 -0
- package/dist/engine/feasibility-rules-loader.d.ts.map +1 -0
- package/dist/engine/feasibility-rules-loader.js +39 -0
- package/dist/engine/feasibility-rules-loader.js.map +1 -0
- package/dist/engine/feasibility-validator.d.ts +1 -1
- package/dist/engine/feasibility-validator.d.ts.map +1 -1
- package/dist/engine/feasibility-validator.js +21 -78
- package/dist/engine/feasibility-validator.js.map +1 -1
- package/dist/engine/rbac/roles.d.ts +13 -5
- package/dist/engine/rbac/roles.d.ts.map +1 -1
- package/dist/engine/rbac/roles.js +58 -24
- package/dist/engine/rbac/roles.js.map +1 -1
- package/dist/engine/readiness-checker.d.ts +1 -1
- package/dist/engine/readiness-checker.d.ts.map +1 -1
- package/dist/engine/readiness-checker.js +10 -12
- package/dist/engine/readiness-checker.js.map +1 -1
- package/dist/engine/readiness-config-loader.d.ts +8 -0
- package/dist/engine/readiness-config-loader.d.ts.map +1 -0
- package/dist/engine/readiness-config-loader.js +58 -0
- package/dist/engine/readiness-config-loader.js.map +1 -0
- package/dist/engine/spec-types-loader.d.ts +22 -0
- package/dist/engine/spec-types-loader.d.ts.map +1 -0
- package/dist/engine/spec-types-loader.js +50 -0
- package/dist/engine/spec-types-loader.js.map +1 -0
- package/dist/engine/validator/analyzer.d.ts +1 -0
- package/dist/engine/validator/analyzer.d.ts.map +1 -1
- package/dist/engine/validator/analyzer.js +31 -8
- package/dist/engine/validator/analyzer.js.map +1 -1
- package/dist/types/common/primitives.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/plugin-configs.d.ts +105 -0
- package/dist/types/plugin-configs.d.ts.map +1 -0
- package/dist/types/plugin-configs.js +6 -0
- package/dist/types/plugin-configs.js.map +1 -0
- package/package.json +1 -1
- package/src/config/ac-gap-keywords.json +144 -0
- package/src/config/challenge-scenarios.json +114 -0
- package/src/config/code-quality-thresholds.json +114 -0
- package/src/config/compliance-frameworks.json +150 -0
- package/src/config/dor-dod-items.json +214 -0
- package/src/config/drift-severity.json +22 -0
- package/src/config/elicitation-questions.json +70 -0
- package/src/config/feasibility-rules.json +91 -0
- package/src/config/rbac-roles.json +27 -0
- package/src/config/readiness-config.json +18 -0
- package/src/config/spec-types.json +42 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { loadDodItemDefs } from './items-loader.js';
|
|
1
2
|
// --- Internal builders ---
|
|
2
3
|
function computeDoD(specId, items) {
|
|
3
4
|
const requiredItems = items.filter((i) => i.required);
|
|
@@ -12,75 +13,38 @@ function computeDoD(specId, items) {
|
|
|
12
13
|
completedAt: isDone ? new Date().toISOString() : null,
|
|
13
14
|
};
|
|
14
15
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
required: true,
|
|
48
|
-
autoCheck: false,
|
|
49
|
-
status: 'pending',
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
id: 'dod-5',
|
|
53
|
-
description: 'Linting and formatting clean (zero errors, zero warnings)',
|
|
54
|
-
category: 'quality',
|
|
55
|
-
required: true,
|
|
56
|
-
autoCheck: false,
|
|
57
|
-
status: 'pending',
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
id: 'dod-6',
|
|
61
|
-
description: 'Code reviewed and approved',
|
|
62
|
-
category: 'review',
|
|
63
|
-
required: false,
|
|
64
|
-
autoCheck: false,
|
|
65
|
-
status: 'pending',
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
id: 'dod-7',
|
|
69
|
-
description: 'Documentation updated (HU.md, FICHA-TECNICA.md, PLAN.md)',
|
|
70
|
-
category: 'docs',
|
|
71
|
-
required: false,
|
|
72
|
-
autoCheck: false,
|
|
73
|
-
status: 'pending',
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
id: 'dod-8',
|
|
77
|
-
description: 'Actuals recorded (hours, tokens, cost)',
|
|
78
|
-
category: 'review',
|
|
79
|
-
required: true,
|
|
80
|
-
autoCheck: true,
|
|
81
|
-
status: hasActuals ? 'passed' : 'pending',
|
|
82
|
-
},
|
|
83
|
-
];
|
|
16
|
+
/**
|
|
17
|
+
* Evaluates the auto-check condition for a DoD item against the spec.
|
|
18
|
+
*/
|
|
19
|
+
function evaluateAutoCheck(def, spec) {
|
|
20
|
+
if (!def.autoCheck || !def.autoCheckCondition) {
|
|
21
|
+
return 'pending';
|
|
22
|
+
}
|
|
23
|
+
if (def.autoCheckCondition === 'notNull') {
|
|
24
|
+
return spec.actuals !== null ? 'passed' : 'pending';
|
|
25
|
+
}
|
|
26
|
+
return 'pending';
|
|
27
|
+
}
|
|
28
|
+
/** Converts a DorDodItemDef into a live DoDItem, resolving dynamic description and status. */
|
|
29
|
+
function defToDoDItem(def, spec, criteriaCount) {
|
|
30
|
+
let description = def.description;
|
|
31
|
+
// dod-1 dynamically includes criteriaCount in its description
|
|
32
|
+
if (def.id === 'dod-1' && criteriaCount > 0) {
|
|
33
|
+
description = `All ${criteriaCount} acceptance criteria implemented`;
|
|
34
|
+
}
|
|
35
|
+
const status = evaluateAutoCheck(def, spec);
|
|
36
|
+
return {
|
|
37
|
+
id: def.id,
|
|
38
|
+
description,
|
|
39
|
+
category: def.category,
|
|
40
|
+
required: def.required,
|
|
41
|
+
autoCheck: def.autoCheck,
|
|
42
|
+
status,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function buildDoDItems(spec, criteriaCount, projectHash) {
|
|
46
|
+
const defs = loadDodItemDefs(projectHash);
|
|
47
|
+
return defs.map((def) => defToDoDItem(def, spec, criteriaCount));
|
|
84
48
|
}
|
|
85
49
|
function buildDoDHumanMessage(title, blockingItems) {
|
|
86
50
|
/* v8 ignore start -- generateDoD always produces required pending items; zero-blocking path unreachable at runtime */
|
|
@@ -98,17 +62,18 @@ function buildDoDHumanMessage(title, blockingItems) {
|
|
|
98
62
|
/**
|
|
99
63
|
* Generate a Definition of Done checklist derived from spec metadata.
|
|
100
64
|
* criteriaCount reflects how many acceptance criteria exist in HU.md.
|
|
65
|
+
* Optionally pass a projectHash to load project-level overrides.
|
|
101
66
|
*/
|
|
102
|
-
export function generateDoD(spec, criteriaCount = 0) {
|
|
103
|
-
const items = buildDoDItems(spec, criteriaCount);
|
|
67
|
+
export function generateDoD(spec, criteriaCount = 0, projectHash) {
|
|
68
|
+
const items = buildDoDItems(spec, criteriaCount, projectHash);
|
|
104
69
|
return computeDoD(spec.id, items);
|
|
105
70
|
}
|
|
106
71
|
/**
|
|
107
72
|
* Validate a spec's DoD.
|
|
108
73
|
* Both failed AND pending required items are blocking (manual items need explicit confirmation).
|
|
109
74
|
*/
|
|
110
|
-
export function validateDoD(spec) {
|
|
111
|
-
const dod = generateDoD(spec);
|
|
75
|
+
export function validateDoD(spec, projectHash) {
|
|
76
|
+
const dod = generateDoD(spec, 0, projectHash);
|
|
112
77
|
/* v8 ignore start -- auto-check DoD items are 'passed'|'pending', never 'failed' */
|
|
113
78
|
const failed = dod.items
|
|
114
79
|
.filter((i) => i.required && i.status === 'failed')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dod.js","sourceRoot":"","sources":["../../../src/engine/dor-dod/dod.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dod.js","sourceRoot":"","sources":["../../../src/engine/dor-dod/dod.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,13 +2,14 @@ import type { Spec, DefinitionOfReady, DoRItem, DoRDoDValidationResult } from '.
|
|
|
2
2
|
/**
|
|
3
3
|
* Generate a Definition of Ready checklist for a spec.
|
|
4
4
|
* Items are type/scope-aware and include auto-checkable conditions.
|
|
5
|
+
* Optionally pass a projectHash to load project-level overrides.
|
|
5
6
|
*/
|
|
6
|
-
export declare function generateDoR(spec: Spec): DefinitionOfReady;
|
|
7
|
+
export declare function generateDoR(spec: Spec, projectHash?: string): DefinitionOfReady;
|
|
7
8
|
/**
|
|
8
9
|
* Validate a spec's DoR and return a structured result.
|
|
9
10
|
* Blocking = required items that failed; warnings = optional items that failed.
|
|
10
11
|
*/
|
|
11
|
-
export declare function validateDoR(spec: Spec): DoRDoDValidationResult;
|
|
12
|
+
export declare function validateDoR(spec: Spec, projectHash?: string): DoRDoDValidationResult;
|
|
12
13
|
/**
|
|
13
14
|
* Add a custom item to an existing DoR checklist.
|
|
14
15
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dor.d.ts","sourceRoot":"","sources":["../../../src/engine/dor-dod/dor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,IAAI,EACJ,iBAAiB,EACjB,OAAO,EACP,sBAAsB,EAGvB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"dor.d.ts","sourceRoot":"","sources":["../../../src/engine/dor-dod/dor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,IAAI,EACJ,iBAAiB,EACjB,OAAO,EACP,sBAAsB,EAGvB,MAAM,sBAAsB,CAAC;AA4H9B;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAG/E;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,sBAAsB,CAcpF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,OAAO,GAAG,iBAAiB,CAGzF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,iBAAiB,EACtB,eAAe,EAAE,MAAM,EAAE,GACxB,iBAAiB,CAanB"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { loadDorItemDefs } from './items-loader.js';
|
|
1
2
|
// --- Internal builders ---
|
|
2
3
|
function computeDoR(specId, items) {
|
|
3
4
|
const requiredItems = items.filter((i) => i.required);
|
|
@@ -12,132 +13,80 @@ function computeDoR(specId, items) {
|
|
|
12
13
|
generatedAt: new Date().toISOString(),
|
|
13
14
|
};
|
|
14
15
|
}
|
|
15
|
-
function
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
16
|
+
function bothNonEmpty(spec) {
|
|
17
|
+
return spec.type.length > 0 && spec.scope.length > 0;
|
|
18
|
+
}
|
|
19
|
+
function checkFieldNonEmpty(spec, field) {
|
|
20
|
+
const val = spec[field];
|
|
21
|
+
return typeof val === 'string' && val.length > 0 ? 'passed' : 'failed';
|
|
22
|
+
}
|
|
23
|
+
/** Evaluates the auto-check condition defined in config against the spec. */
|
|
24
|
+
function evaluateAutoCheck(def, spec) {
|
|
25
|
+
const { autoCheckField, autoCheckCondition } = def;
|
|
26
|
+
if (!autoCheckField || !autoCheckCondition) {
|
|
27
|
+
return 'failed';
|
|
26
28
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
29
|
+
switch (autoCheckCondition) {
|
|
30
|
+
case 'length>3':
|
|
31
|
+
return spec.title.length > 3 ? 'passed' : 'failed';
|
|
32
|
+
case 'bothNonEmpty':
|
|
33
|
+
return bothNonEmpty(spec) ? 'passed' : 'failed';
|
|
34
|
+
case 'between1and5':
|
|
35
|
+
return spec.difficulty >= 1 && spec.difficulty <= 5 ? 'passed' : 'failed';
|
|
36
|
+
case 'greaterThan0':
|
|
37
|
+
return spec.estimation.devHours > 0 ? 'passed' : 'failed';
|
|
38
|
+
case 'nonEmpty':
|
|
39
|
+
return checkFieldNonEmpty(spec, autoCheckField);
|
|
40
|
+
case 'emptyArray':
|
|
41
|
+
return spec.blockedBy.length === 0 ? 'passed' : 'failed';
|
|
42
|
+
case 'approvedOrImplementing':
|
|
43
|
+
return spec.status === 'approved' || spec.status === 'implementing' ? 'passed' : 'failed';
|
|
44
|
+
default:
|
|
45
|
+
return 'failed';
|
|
36
46
|
}
|
|
37
|
-
return items;
|
|
38
47
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
id: 'dor-2',
|
|
51
|
-
description: 'Spec type and scope are defined',
|
|
52
|
-
category: 'spec',
|
|
53
|
-
required: true,
|
|
54
|
-
autoCheck: true,
|
|
55
|
-
status: spec.type.length > 0 && spec.scope.length > 0 ? 'passed' : 'failed',
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
id: 'dor-3',
|
|
59
|
-
description: 'Difficulty is assessed (1-5)',
|
|
60
|
-
category: 'spec',
|
|
61
|
-
required: true,
|
|
62
|
-
autoCheck: true,
|
|
63
|
-
status: spec.difficulty >= 1 && spec.difficulty <= 5 ? 'passed' : 'failed',
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
id: 'dor-4',
|
|
67
|
-
description: 'Estimation is complete (dev hours > 0)',
|
|
68
|
-
category: 'spec',
|
|
69
|
-
required: true,
|
|
70
|
-
autoCheck: true,
|
|
71
|
-
status: spec.estimation.devHours > 0 ? 'passed' : 'failed',
|
|
72
|
-
},
|
|
73
|
-
{
|
|
74
|
-
id: 'dor-5',
|
|
75
|
-
description: 'HU.md file exists and is complete',
|
|
76
|
-
category: 'spec',
|
|
77
|
-
required: true,
|
|
78
|
-
autoCheck: true,
|
|
79
|
-
status: spec.specPath ? 'passed' : 'failed',
|
|
80
|
-
},
|
|
81
|
-
];
|
|
48
|
+
/** Converts a DorDodItemDef into a live DoRItem by evaluating its auto-check condition. */
|
|
49
|
+
function defToDoRItem(def, spec) {
|
|
50
|
+
const status = def.autoCheck ? evaluateAutoCheck(def, spec) : 'pending';
|
|
51
|
+
return {
|
|
52
|
+
id: def.id,
|
|
53
|
+
description: def.description,
|
|
54
|
+
category: def.category,
|
|
55
|
+
required: def.required,
|
|
56
|
+
autoCheck: def.autoCheck,
|
|
57
|
+
status,
|
|
58
|
+
};
|
|
82
59
|
}
|
|
83
|
-
function
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
category: 'technical',
|
|
105
|
-
required: true,
|
|
106
|
-
autoCheck: true,
|
|
107
|
-
status: spec.risk.length > 0 ? 'passed' : 'failed',
|
|
108
|
-
},
|
|
109
|
-
{
|
|
110
|
-
id: 'dor-9',
|
|
111
|
-
description: 'Target is defined (frontend/backend/fullstack)',
|
|
112
|
-
category: 'technical',
|
|
113
|
-
required: true,
|
|
114
|
-
autoCheck: true,
|
|
115
|
-
status: spec.target.length > 0 ? 'passed' : 'failed',
|
|
116
|
-
},
|
|
117
|
-
{
|
|
118
|
-
id: 'dor-10',
|
|
119
|
-
description: 'Spec is in approved status',
|
|
120
|
-
category: 'spec',
|
|
121
|
-
required: true,
|
|
122
|
-
autoCheck: true,
|
|
123
|
-
status: spec.status === 'approved' || spec.status === 'implementing' ? 'passed' : 'failed',
|
|
124
|
-
},
|
|
125
|
-
{
|
|
126
|
-
id: 'dor-11',
|
|
127
|
-
description: 'Git branch is configured for this spec',
|
|
128
|
-
category: 'technical',
|
|
129
|
-
required: false,
|
|
130
|
-
autoCheck: true,
|
|
131
|
-
status: spec.gitBranch.length > 0 ? 'passed' : 'failed',
|
|
132
|
-
},
|
|
133
|
-
];
|
|
60
|
+
function buildScopeAwareDoRItems(defs, type, scope, spec) {
|
|
61
|
+
const items = [];
|
|
62
|
+
for (const def of defs) {
|
|
63
|
+
if (def.scopeFilter) {
|
|
64
|
+
if (!def.scopeFilter.includes(scope)) {
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
const item = defToDoRItem(def, spec);
|
|
68
|
+
// dor-arch-1: required only for architectural scope
|
|
69
|
+
const required = scope === 'architectural';
|
|
70
|
+
items.push({ ...item, required });
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (def.typeFilter) {
|
|
74
|
+
if (!def.typeFilter.includes(type)) {
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
items.push(defToDoRItem(def, spec));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return items;
|
|
134
81
|
}
|
|
135
|
-
function buildDoRItems(spec) {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
82
|
+
function buildDoRItems(spec, projectHash) {
|
|
83
|
+
const defs = loadDorItemDefs(projectHash);
|
|
84
|
+
// Separate core/tech defs from scope/type-conditional defs
|
|
85
|
+
const coreDefs = defs.filter((d) => !d.scopeFilter && !d.typeFilter);
|
|
86
|
+
const conditionalDefs = defs.filter((d) => d.scopeFilter ?? d.typeFilter);
|
|
87
|
+
const coreItems = coreDefs.map((def) => defToDoRItem(def, spec));
|
|
88
|
+
const conditionalItems = buildScopeAwareDoRItems(conditionalDefs, spec.type, spec.scope, spec);
|
|
89
|
+
return [...coreItems, ...conditionalItems];
|
|
141
90
|
}
|
|
142
91
|
function buildDoRHumanMessage(title, blockingItems) {
|
|
143
92
|
if (blockingItems.length === 0) {
|
|
@@ -152,17 +101,18 @@ function buildDoRHumanMessage(title, blockingItems) {
|
|
|
152
101
|
/**
|
|
153
102
|
* Generate a Definition of Ready checklist for a spec.
|
|
154
103
|
* Items are type/scope-aware and include auto-checkable conditions.
|
|
104
|
+
* Optionally pass a projectHash to load project-level overrides.
|
|
155
105
|
*/
|
|
156
|
-
export function generateDoR(spec) {
|
|
157
|
-
const items = buildDoRItems(spec);
|
|
106
|
+
export function generateDoR(spec, projectHash) {
|
|
107
|
+
const items = buildDoRItems(spec, projectHash);
|
|
158
108
|
return computeDoR(spec.id, items);
|
|
159
109
|
}
|
|
160
110
|
/**
|
|
161
111
|
* Validate a spec's DoR and return a structured result.
|
|
162
112
|
* Blocking = required items that failed; warnings = optional items that failed.
|
|
163
113
|
*/
|
|
164
|
-
export function validateDoR(spec) {
|
|
165
|
-
const dor = generateDoR(spec);
|
|
114
|
+
export function validateDoR(spec, projectHash) {
|
|
115
|
+
const dor = generateDoR(spec, projectHash);
|
|
166
116
|
const blockingItems = dor.items
|
|
167
117
|
.filter((i) => i.required && i.status === 'failed')
|
|
168
118
|
.map((i) => i.description);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dor.js","sourceRoot":"","sources":["../../../src/engine/dor-dod/dor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dor.js","sourceRoot":"","sources":["../../../src/engine/dor-dod/dor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { DorDodItemDef } from '../../types/index.js';
|
|
2
|
+
import { ConfigLoader } from '../config-loader.js';
|
|
3
|
+
export type { DorDodItemDef };
|
|
4
|
+
/**
|
|
5
|
+
* Load all DoR item definitions, filtered to items with kind="dor".
|
|
6
|
+
* Optionally merges project-level overrides.
|
|
7
|
+
*/
|
|
8
|
+
export declare function loadDorItemDefs(projectHash?: string): DorDodItemDef[];
|
|
9
|
+
/**
|
|
10
|
+
* Load all DoD item definitions, filtered to items with kind="dod".
|
|
11
|
+
* Optionally merges project-level overrides.
|
|
12
|
+
*/
|
|
13
|
+
export declare function loadDodItemDefs(projectHash?: string): DorDodItemDef[];
|
|
14
|
+
/**
|
|
15
|
+
* Get the ConfigLoader instance (for testing / inspection).
|
|
16
|
+
*/
|
|
17
|
+
export declare function getDorDodLoader(): ConfigLoader<DorDodItemDef>;
|
|
18
|
+
//# sourceMappingURL=items-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"items-loader.d.ts","sourceRoot":"","sources":["../../../src/engine/dor-dod/items-loader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAgCnD,YAAY,EAAE,aAAa,EAAE,CAAC;AAM9B;;;GAGG;AACH,wBAAgB,eAAe,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE,CAErE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE,CAErE;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAAC,aAAa,CAAC,CAE7D"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// engine/dor-dod/items-loader.ts — Config-driven DoR/DoD item definitions (SPEC-212)
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { ConfigLoader } from '../config-loader.js';
|
|
4
|
+
/** Schema for a single DoR or DoD item definition from config. */
|
|
5
|
+
const DorDodItemDefSchema = z.object({
|
|
6
|
+
id: z.string().describe('Stable identifier for this item (e.g. "dor-1", "dod-3")'),
|
|
7
|
+
kind: z.enum(['dor', 'dod']).describe('Whether this item belongs to DoR or DoD checklist'),
|
|
8
|
+
description: z.string().describe('Human-readable description of the readiness/done criterion'),
|
|
9
|
+
category: z
|
|
10
|
+
.string()
|
|
11
|
+
.describe('Grouping label for the item (e.g. "spec", "design", "technical", "tests")'),
|
|
12
|
+
required: z.boolean().describe('If true, this item is blocking — must pass for ready/done'),
|
|
13
|
+
autoCheck: z
|
|
14
|
+
.boolean()
|
|
15
|
+
.describe('If true, the system can evaluate this item automatically from spec metadata'),
|
|
16
|
+
autoCheckField: z
|
|
17
|
+
.string()
|
|
18
|
+
.nullable()
|
|
19
|
+
.describe('Spec field used for auto-check (null when autoCheck is false)'),
|
|
20
|
+
autoCheckCondition: z
|
|
21
|
+
.string()
|
|
22
|
+
.nullable()
|
|
23
|
+
.describe('Condition code for auto-check evaluation (null when autoCheck is false)'),
|
|
24
|
+
scopeFilter: z
|
|
25
|
+
.array(z.string())
|
|
26
|
+
.optional()
|
|
27
|
+
.describe('If present, item only applies when spec.scope is one of these values'),
|
|
28
|
+
typeFilter: z
|
|
29
|
+
.array(z.string())
|
|
30
|
+
.optional()
|
|
31
|
+
.describe('If present, item only applies when spec.type is one of these values'),
|
|
32
|
+
});
|
|
33
|
+
const DorDodItemDefArraySchema = z.array(DorDodItemDefSchema);
|
|
34
|
+
const loader = new ConfigLoader('dor-dod-items', DorDodItemDefArraySchema);
|
|
35
|
+
/**
|
|
36
|
+
* Load all DoR item definitions, filtered to items with kind="dor".
|
|
37
|
+
* Optionally merges project-level overrides.
|
|
38
|
+
*/
|
|
39
|
+
export function loadDorItemDefs(projectHash) {
|
|
40
|
+
return loader.load(projectHash).filter((item) => item.kind === 'dor');
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Load all DoD item definitions, filtered to items with kind="dod".
|
|
44
|
+
* Optionally merges project-level overrides.
|
|
45
|
+
*/
|
|
46
|
+
export function loadDodItemDefs(projectHash) {
|
|
47
|
+
return loader.load(projectHash).filter((item) => item.kind === 'dod');
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get the ConfigLoader instance (for testing / inspection).
|
|
51
|
+
*/
|
|
52
|
+
export function getDorDodLoader() {
|
|
53
|
+
return loader;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=items-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"items-loader.js","sourceRoot":"","sources":["../../../src/engine/dor-dod/items-loader.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,kEAAkE;AAClE,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;IAClF,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,mDAAmD,CAAC;IAC1F,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4DAA4D,CAAC;IAC9F,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,QAAQ,CAAC,2EAA2E,CAAC;IACxF,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,2DAA2D,CAAC;IAC3F,SAAS,EAAE,CAAC;SACT,OAAO,EAAE;SACT,QAAQ,CAAC,6EAA6E,CAAC;IAC1F,cAAc,EAAE,CAAC;SACd,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,+DAA+D,CAAC;IAC5E,kBAAkB,EAAE,CAAC;SAClB,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,yEAAyE,CAAC;IACtF,WAAW,EAAE,CAAC;SACX,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACjB,QAAQ,EAAE;SACV,QAAQ,CAAC,sEAAsE,CAAC;IACnF,UAAU,EAAE,CAAC;SACV,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACjB,QAAQ,EAAE;SACV,QAAQ,CAAC,qEAAqE,CAAC;CACnF,CAAC,CAAC;AAIH,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;AAE9D,MAAM,MAAM,GAAG,IAAI,YAAY,CAAgB,eAAe,EAAE,wBAAwB,CAAC,CAAC;AAE1F;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,WAAoB;IAClD,OAAO,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;AACxE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,WAAoB;IAClD,OAAO,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;AACxE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"question-generator.d.ts","sourceRoot":"","sources":["../../../src/engine/elicitation/question-generator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"question-generator.d.ts","sourceRoot":"","sources":["../../../src/engine/elicitation/question-generator.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EAEnB,MAAM,sBAAsB,CAAC;AAG9B,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;AAqExD,mEAAmE;AACnE,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GACvE,mBAAmB,EAAE,CA8BvB;AAED,+EAA+E;AAC/E,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CA2B3E;AAED,+DAA+D;AAC/D,wBAAgB,YAAY,CAC1B,SAAS,EAAE,mBAAmB,EAAE,EAChC,WAAW,EAAE,MAAM,GAClB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgBxB"}
|