@mcoda/core 0.1.19 → 0.1.20
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/api/QaTasksApi.d.ts.map +1 -1
- package/dist/api/QaTasksApi.js +3 -0
- package/dist/prompts/PdrPrompts.d.ts.map +1 -1
- package/dist/prompts/PdrPrompts.js +22 -8
- package/dist/prompts/SdsPrompts.d.ts.map +1 -1
- package/dist/prompts/SdsPrompts.js +53 -34
- package/dist/services/backlog/BacklogService.d.ts.map +1 -1
- package/dist/services/backlog/BacklogService.js +3 -0
- package/dist/services/backlog/TaskOrderingService.d.ts +9 -0
- package/dist/services/backlog/TaskOrderingService.d.ts.map +1 -1
- package/dist/services/backlog/TaskOrderingService.js +251 -35
- package/dist/services/docs/DocsService.d.ts.map +1 -1
- package/dist/services/docs/DocsService.js +487 -71
- package/dist/services/docs/review/gates/PdrFolderTreeGate.d.ts +7 -0
- package/dist/services/docs/review/gates/PdrFolderTreeGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/PdrFolderTreeGate.js +151 -0
- package/dist/services/docs/review/gates/PdrNoUnresolvedItemsGate.d.ts +7 -0
- package/dist/services/docs/review/gates/PdrNoUnresolvedItemsGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/PdrNoUnresolvedItemsGate.js +109 -0
- package/dist/services/docs/review/gates/PdrTechStackRationaleGate.d.ts +7 -0
- package/dist/services/docs/review/gates/PdrTechStackRationaleGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/PdrTechStackRationaleGate.js +128 -0
- package/dist/services/docs/review/gates/SdsFolderTreeGate.d.ts +7 -0
- package/dist/services/docs/review/gates/SdsFolderTreeGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/SdsFolderTreeGate.js +153 -0
- package/dist/services/docs/review/gates/SdsNoUnresolvedItemsGate.d.ts +7 -0
- package/dist/services/docs/review/gates/SdsNoUnresolvedItemsGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/SdsNoUnresolvedItemsGate.js +109 -0
- package/dist/services/docs/review/gates/SdsTechStackRationaleGate.d.ts +7 -0
- package/dist/services/docs/review/gates/SdsTechStackRationaleGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/SdsTechStackRationaleGate.js +128 -0
- package/dist/services/execution/QaTasksService.d.ts +6 -0
- package/dist/services/execution/QaTasksService.d.ts.map +1 -1
- package/dist/services/execution/QaTasksService.js +278 -95
- package/dist/services/execution/TaskSelectionService.d.ts +3 -0
- package/dist/services/execution/TaskSelectionService.d.ts.map +1 -1
- package/dist/services/execution/TaskSelectionService.js +33 -0
- package/dist/services/execution/WorkOnTasksService.d.ts +4 -0
- package/dist/services/execution/WorkOnTasksService.d.ts.map +1 -1
- package/dist/services/execution/WorkOnTasksService.js +141 -19
- package/dist/services/openapi/OpenApiService.d.ts.map +1 -1
- package/dist/services/openapi/OpenApiService.js +43 -4
- package/dist/services/planning/CreateTasksService.d.ts +10 -0
- package/dist/services/planning/CreateTasksService.d.ts.map +1 -1
- package/dist/services/planning/CreateTasksService.js +480 -44
- package/dist/services/planning/RefineTasksService.d.ts +1 -0
- package/dist/services/planning/RefineTasksService.d.ts.map +1 -1
- package/dist/services/planning/RefineTasksService.js +88 -2
- package/dist/services/review/CodeReviewService.d.ts +6 -0
- package/dist/services/review/CodeReviewService.d.ts.map +1 -1
- package/dist/services/review/CodeReviewService.js +260 -41
- package/dist/services/shared/ProjectGuidance.d.ts +18 -2
- package/dist/services/shared/ProjectGuidance.d.ts.map +1 -1
- package/dist/services/shared/ProjectGuidance.js +535 -34
- package/package.json +6 -6
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
const UNRESOLVED_PATTERNS = [
|
|
3
|
+
/\bTBD\b/i,
|
|
4
|
+
/\bTBC\b/i,
|
|
5
|
+
/\bTODO\b/i,
|
|
6
|
+
/\bFIXME\b/i,
|
|
7
|
+
/\bto be (determined|decided|filled)\b/i,
|
|
8
|
+
/\bunknown\b/i,
|
|
9
|
+
/\bunresolved\b/i,
|
|
10
|
+
];
|
|
11
|
+
const OPEN_QUESTIONS_HEADING = /open questions?/i;
|
|
12
|
+
const RESOLVED_LINE = /^[-*+\d.)\s]*resolved:/i;
|
|
13
|
+
const NO_OPEN_ITEMS_LINE = /no unresolved questions remain|no open questions remain/i;
|
|
14
|
+
const isFenceLine = (line) => /^```|^~~~/.test(line.trim());
|
|
15
|
+
const buildIssue = (input) => ({
|
|
16
|
+
id: input.id,
|
|
17
|
+
gateId: "gate-sds-no-unresolved-items",
|
|
18
|
+
severity: "high",
|
|
19
|
+
category: "open_questions",
|
|
20
|
+
artifact: "sds",
|
|
21
|
+
message: input.message,
|
|
22
|
+
remediation: input.remediation,
|
|
23
|
+
location: {
|
|
24
|
+
kind: "line_range",
|
|
25
|
+
path: input.record.path,
|
|
26
|
+
lineStart: input.line,
|
|
27
|
+
lineEnd: input.line,
|
|
28
|
+
excerpt: input.excerpt,
|
|
29
|
+
},
|
|
30
|
+
metadata: input.metadata,
|
|
31
|
+
});
|
|
32
|
+
export const runSdsNoUnresolvedItemsGate = async (input) => {
|
|
33
|
+
const sds = input.artifacts.sds;
|
|
34
|
+
if (!sds) {
|
|
35
|
+
return {
|
|
36
|
+
gateId: "gate-sds-no-unresolved-items",
|
|
37
|
+
gateName: "SDS No Unresolved Items",
|
|
38
|
+
status: "skipped",
|
|
39
|
+
issues: [],
|
|
40
|
+
notes: ["No SDS artifact available for unresolved item validation."],
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const issues = [];
|
|
44
|
+
const notes = [];
|
|
45
|
+
try {
|
|
46
|
+
const content = await fs.readFile(sds.path, "utf8");
|
|
47
|
+
const lines = content.split(/\r?\n/);
|
|
48
|
+
let inFence = false;
|
|
49
|
+
let inOpenQuestions = false;
|
|
50
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
51
|
+
const line = lines[i] ?? "";
|
|
52
|
+
const trimmed = line.trim();
|
|
53
|
+
if (!trimmed)
|
|
54
|
+
continue;
|
|
55
|
+
if (isFenceLine(trimmed)) {
|
|
56
|
+
inFence = !inFence;
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (inFence)
|
|
60
|
+
continue;
|
|
61
|
+
const heading = trimmed.match(/^#{1,6}\s+(.*)$/);
|
|
62
|
+
if (heading) {
|
|
63
|
+
const title = heading[1]?.trim() ?? "";
|
|
64
|
+
inOpenQuestions = OPEN_QUESTIONS_HEADING.test(title);
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (inOpenQuestions) {
|
|
68
|
+
if (NO_OPEN_ITEMS_LINE.test(trimmed))
|
|
69
|
+
continue;
|
|
70
|
+
if (RESOLVED_LINE.test(trimmed))
|
|
71
|
+
continue;
|
|
72
|
+
issues.push(buildIssue({
|
|
73
|
+
id: `gate-sds-no-unresolved-items-open-${i + 1}`,
|
|
74
|
+
message: "Open Questions section contains an unresolved entry.",
|
|
75
|
+
remediation: "Rewrite entries as resolved decisions (prefix each line with 'Resolved:') or remove unresolved items.",
|
|
76
|
+
record: sds,
|
|
77
|
+
line: i + 1,
|
|
78
|
+
excerpt: trimmed,
|
|
79
|
+
metadata: { issueType: "unresolved_open_question" },
|
|
80
|
+
}));
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
const unresolvedPattern = UNRESOLVED_PATTERNS.find((pattern) => pattern.test(trimmed));
|
|
84
|
+
if (unresolvedPattern) {
|
|
85
|
+
issues.push(buildIssue({
|
|
86
|
+
id: `gate-sds-no-unresolved-items-marker-${i + 1}`,
|
|
87
|
+
message: "SDS contains unresolved placeholder language.",
|
|
88
|
+
remediation: "Replace unresolved markers with explicit decisions and concrete implementation details.",
|
|
89
|
+
record: sds,
|
|
90
|
+
line: i + 1,
|
|
91
|
+
excerpt: trimmed,
|
|
92
|
+
metadata: { issueType: "unresolved_marker", pattern: unresolvedPattern.source },
|
|
93
|
+
}));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
notes.push(`Unable to read SDS ${sds.path}: ${error.message ?? String(error)}`);
|
|
99
|
+
}
|
|
100
|
+
const status = issues.length === 0 ? "pass" : "fail";
|
|
101
|
+
return {
|
|
102
|
+
gateId: "gate-sds-no-unresolved-items",
|
|
103
|
+
gateName: "SDS No Unresolved Items",
|
|
104
|
+
status,
|
|
105
|
+
issues,
|
|
106
|
+
notes: notes.length ? notes : undefined,
|
|
107
|
+
metadata: { issueCount: issues.length },
|
|
108
|
+
};
|
|
109
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { DocgenArtifactInventory } from "../../DocgenRunContext.js";
|
|
2
|
+
import { ReviewGateResult } from "../ReviewTypes.js";
|
|
3
|
+
export interface SdsTechStackRationaleGateInput {
|
|
4
|
+
artifacts: DocgenArtifactInventory;
|
|
5
|
+
}
|
|
6
|
+
export declare const runSdsTechStackRationaleGate: (input: SdsTechStackRationaleGateInput) => Promise<ReviewGateResult>;
|
|
7
|
+
//# sourceMappingURL=SdsTechStackRationaleGate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SdsTechStackRationaleGate.d.ts","sourceRoot":"","sources":["../../../../../src/services/docs/review/gates/SdsTechStackRationaleGate.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAe,MAAM,mBAAmB,CAAC;AAElE,MAAM,WAAW,8BAA8B;IAC7C,SAAS,EAAE,uBAAuB,CAAC;CACpC;AAqED,eAAO,MAAM,4BAA4B,GACvC,OAAO,8BAA8B,KACpC,OAAO,CAAC,gBAAgB,CAoF1B,CAAC"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
const SECTION_HEADING = /platform model|technology stack|tech stack/i;
|
|
3
|
+
const CHOSEN_STACK_PATTERNS = [/chosen stack/i, /selected stack/i, /primary stack/i, /\bwe use\b/i];
|
|
4
|
+
const ALTERNATIVES_PATTERNS = [/alternatives? considered/i, /\balternative\b/i, /options? considered/i];
|
|
5
|
+
const RATIONALE_PATTERNS = [/rationale/i, /trade[- ]?off/i, /\bbecause\b/i, /why (this|the) stack/i];
|
|
6
|
+
const isFenceLine = (line) => /^```|^~~~/.test(line.trim());
|
|
7
|
+
const extractSection = (lines, headingMatch) => {
|
|
8
|
+
let inFence = false;
|
|
9
|
+
let capture = false;
|
|
10
|
+
let startLine = 0;
|
|
11
|
+
const collected = [];
|
|
12
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
13
|
+
const line = lines[i] ?? "";
|
|
14
|
+
const trimmed = line.trim();
|
|
15
|
+
if (isFenceLine(trimmed)) {
|
|
16
|
+
inFence = !inFence;
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
if (inFence)
|
|
20
|
+
continue;
|
|
21
|
+
const heading = trimmed.match(/^#{1,6}\s+(.*)$/);
|
|
22
|
+
if (heading) {
|
|
23
|
+
const title = heading[1]?.trim() ?? "";
|
|
24
|
+
if (headingMatch.test(title)) {
|
|
25
|
+
capture = true;
|
|
26
|
+
startLine = i + 1;
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
if (capture)
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
if (capture && trimmed)
|
|
33
|
+
collected.push(trimmed);
|
|
34
|
+
}
|
|
35
|
+
if (!capture)
|
|
36
|
+
return undefined;
|
|
37
|
+
return { content: collected, line: startLine };
|
|
38
|
+
};
|
|
39
|
+
const containsAny = (lines, patterns) => lines.some((line) => patterns.some((pattern) => pattern.test(line)));
|
|
40
|
+
const buildIssue = (input) => ({
|
|
41
|
+
id: input.id,
|
|
42
|
+
gateId: "gate-sds-tech-stack-rationale",
|
|
43
|
+
severity: "high",
|
|
44
|
+
category: "decision",
|
|
45
|
+
artifact: "sds",
|
|
46
|
+
message: input.message,
|
|
47
|
+
remediation: input.remediation,
|
|
48
|
+
location: {
|
|
49
|
+
kind: "line_range",
|
|
50
|
+
path: input.record.path,
|
|
51
|
+
lineStart: input.line ?? 1,
|
|
52
|
+
lineEnd: input.line ?? 1,
|
|
53
|
+
excerpt: input.message,
|
|
54
|
+
},
|
|
55
|
+
metadata: input.metadata,
|
|
56
|
+
});
|
|
57
|
+
export const runSdsTechStackRationaleGate = async (input) => {
|
|
58
|
+
const sds = input.artifacts.sds;
|
|
59
|
+
if (!sds) {
|
|
60
|
+
return {
|
|
61
|
+
gateId: "gate-sds-tech-stack-rationale",
|
|
62
|
+
gateName: "SDS Tech Stack Rationale",
|
|
63
|
+
status: "skipped",
|
|
64
|
+
issues: [],
|
|
65
|
+
notes: ["No SDS artifact available for tech stack rationale validation."],
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
const issues = [];
|
|
69
|
+
const notes = [];
|
|
70
|
+
try {
|
|
71
|
+
const content = await fs.readFile(sds.path, "utf8");
|
|
72
|
+
const lines = content.split(/\r?\n/);
|
|
73
|
+
const stackSection = extractSection(lines, SECTION_HEADING);
|
|
74
|
+
if (!stackSection) {
|
|
75
|
+
issues.push(buildIssue({
|
|
76
|
+
id: "gate-sds-tech-stack-rationale-missing-section",
|
|
77
|
+
message: "SDS is missing a platform model / technology stack section.",
|
|
78
|
+
remediation: "Add a section that defines the selected stack, alternatives considered, and decision rationale.",
|
|
79
|
+
record: sds,
|
|
80
|
+
metadata: { issueType: "missing_tech_stack_section" },
|
|
81
|
+
}));
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
if (!containsAny(stackSection.content, CHOSEN_STACK_PATTERNS)) {
|
|
85
|
+
issues.push(buildIssue({
|
|
86
|
+
id: "gate-sds-tech-stack-rationale-missing-chosen",
|
|
87
|
+
message: "Tech stack section does not explicitly state the chosen stack baseline.",
|
|
88
|
+
remediation: "Add explicit chosen/selected stack statements for runtime, language, persistence, and tooling.",
|
|
89
|
+
record: sds,
|
|
90
|
+
line: stackSection.line,
|
|
91
|
+
metadata: { issueType: "missing_chosen_stack" },
|
|
92
|
+
}));
|
|
93
|
+
}
|
|
94
|
+
if (!containsAny(stackSection.content, ALTERNATIVES_PATTERNS)) {
|
|
95
|
+
issues.push(buildIssue({
|
|
96
|
+
id: "gate-sds-tech-stack-rationale-missing-alternatives",
|
|
97
|
+
message: "Tech stack section does not document alternatives considered.",
|
|
98
|
+
remediation: "Document at least one realistic alternative and explain why it was not selected.",
|
|
99
|
+
record: sds,
|
|
100
|
+
line: stackSection.line,
|
|
101
|
+
metadata: { issueType: "missing_alternatives" },
|
|
102
|
+
}));
|
|
103
|
+
}
|
|
104
|
+
if (!containsAny(stackSection.content, RATIONALE_PATTERNS)) {
|
|
105
|
+
issues.push(buildIssue({
|
|
106
|
+
id: "gate-sds-tech-stack-rationale-missing-rationale",
|
|
107
|
+
message: "Tech stack section does not include explicit decision rationale/trade-offs.",
|
|
108
|
+
remediation: "Add rationale that explains trade-offs and why the selected stack is preferred for this phase.",
|
|
109
|
+
record: sds,
|
|
110
|
+
line: stackSection.line,
|
|
111
|
+
metadata: { issueType: "missing_rationale" },
|
|
112
|
+
}));
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
notes.push(`Unable to read SDS ${sds.path}: ${error.message ?? String(error)}`);
|
|
118
|
+
}
|
|
119
|
+
const status = issues.length === 0 ? "pass" : "fail";
|
|
120
|
+
return {
|
|
121
|
+
gateId: "gate-sds-tech-stack-rationale",
|
|
122
|
+
gateName: "SDS Tech Stack Rationale",
|
|
123
|
+
status,
|
|
124
|
+
issues,
|
|
125
|
+
notes: notes.length ? notes : undefined,
|
|
126
|
+
metadata: { issueCount: issues.length },
|
|
127
|
+
};
|
|
128
|
+
};
|
|
@@ -28,6 +28,9 @@ export interface QaTasksRequest extends TaskSelectionFilters {
|
|
|
28
28
|
evidenceUrl?: string;
|
|
29
29
|
allowDirty?: boolean;
|
|
30
30
|
cleanIgnorePaths?: string[];
|
|
31
|
+
dependencyPolicy?: 'enforce' | 'ignore';
|
|
32
|
+
noChangesPolicy?: 'require_qa' | 'skip' | 'manual';
|
|
33
|
+
debug?: boolean;
|
|
31
34
|
abortSignal?: AbortSignal;
|
|
32
35
|
}
|
|
33
36
|
export interface QaTaskResult {
|
|
@@ -62,8 +65,10 @@ export declare class QaTasksService {
|
|
|
62
65
|
private routingService?;
|
|
63
66
|
private ratingService?;
|
|
64
67
|
private dryRunGuard;
|
|
68
|
+
private debugLogging;
|
|
65
69
|
private qaProfilePlan?;
|
|
66
70
|
private qaTaskPlans?;
|
|
71
|
+
private projectKeyById;
|
|
67
72
|
constructor(workspace: WorkspaceResolution, deps: {
|
|
68
73
|
workspaceRepo: WorkspaceRepository;
|
|
69
74
|
jobService: JobService;
|
|
@@ -98,6 +103,7 @@ export declare class QaTasksService {
|
|
|
98
103
|
private resolveRunAllMarkerPolicy;
|
|
99
104
|
private adjustOutcomeForSkippedTests;
|
|
100
105
|
private combineOutcome;
|
|
106
|
+
private resolveTaskProjectKey;
|
|
101
107
|
private gatherDocContext;
|
|
102
108
|
private resolveAgent;
|
|
103
109
|
private ensureRatingService;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QaTasksService.d.ts","sourceRoot":"","sources":["../../../src/services/execution/QaTasksService.ts"],"names":[],"mappings":"AAWA,OAAO,EAAW,mBAAmB,EAA2D,MAAM,WAAW,CAAC;AAGlH,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAY,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAC1G,OAAO,EAAE,gBAAgB,EAA+B,MAAM,uBAAuB,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAsB,MAAM,wBAAwB,CAAC;AAM/E,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGhD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"QaTasksService.d.ts","sourceRoot":"","sources":["../../../src/services/execution/QaTasksService.ts"],"names":[],"mappings":"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"}
|