@context-forge/core 0.3.4 → 0.3.6
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/config/ConfigKeys.d.ts.map +1 -1
- package/dist/config/ConfigKeys.js +5 -0
- package/dist/config/ConfigKeys.js.map +1 -1
- package/dist/guides/GuideManager.d.ts +2 -0
- package/dist/guides/GuideManager.d.ts.map +1 -1
- package/dist/guides/GuideManager.js +18 -1
- package/dist/guides/GuideManager.js.map +1 -1
- package/dist/introspection/ConsistencyChecker.d.ts +38 -0
- package/dist/introspection/ConsistencyChecker.d.ts.map +1 -0
- package/dist/introspection/ConsistencyChecker.js +381 -0
- package/dist/introspection/ConsistencyChecker.js.map +1 -0
- package/dist/introspection/WorkflowNavigator.d.ts.map +1 -1
- package/dist/introspection/WorkflowNavigator.js +12 -3
- package/dist/introspection/WorkflowNavigator.js.map +1 -1
- package/dist/introspection/parsers/slicePlanParser.d.ts +3 -0
- package/dist/introspection/parsers/slicePlanParser.d.ts.map +1 -1
- package/dist/introspection/parsers/slicePlanParser.js +34 -14
- package/dist/introspection/parsers/slicePlanParser.js.map +1 -1
- package/dist/introspection/types.d.ts +41 -0
- package/dist/introspection/types.d.ts.map +1 -1
- package/dist/introspection/writers/markdownWriter.d.ts +12 -0
- package/dist/introspection/writers/markdownWriter.d.ts.map +1 -0
- package/dist/introspection/writers/markdownWriter.js +93 -0
- package/dist/introspection/writers/markdownWriter.js.map +1 -0
- package/dist/node.d.ts +2 -0
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +2 -0
- package/dist/node.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigKeys.d.ts","sourceRoot":"","sources":["../../src/config/ConfigKeys.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;CAChE;AAED,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,
|
|
1
|
+
{"version":3,"file":"ConfigKeys.d.ts","sourceRoot":"","sources":["../../src/config/ConfigKeys.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;CAChE;AAED,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAgC3D,CAAC"}
|
|
@@ -25,5 +25,10 @@ export const CONFIG_KEYS = {
|
|
|
25
25
|
default: false,
|
|
26
26
|
description: 'Auto-advance to next slice when current is complete',
|
|
27
27
|
},
|
|
28
|
+
'workflow.auto_fix': {
|
|
29
|
+
type: 'boolean',
|
|
30
|
+
default: false,
|
|
31
|
+
description: 'Automatically apply non-destructive corrections when running consistency checks',
|
|
32
|
+
},
|
|
28
33
|
};
|
|
29
34
|
//# sourceMappingURL=ConfigKeys.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigKeys.js","sourceRoot":"","sources":["../../src/config/ConfigKeys.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,WAAW,GAAwC;IAC9D,eAAe,EAAE;QACf,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,qEAAqE;KACnF;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,KAAK;QACd,WAAW,EAAE,sDAAsD;KACpE;IACD,cAAc,EAAE;QACd,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,4CAA4C;KAC1D;IACD,oBAAoB,EAAE;QACpB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,WAAW;QACpB,WAAW,EAAE,oDAAoD;QACjE,IAAI,EAAE,CAAC,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC;KACvC;IACD,uBAAuB,EAAE;QACvB,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,KAAK;QACd,WAAW,EAAE,qDAAqD;KACnE;CACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"ConfigKeys.js","sourceRoot":"","sources":["../../src/config/ConfigKeys.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,WAAW,GAAwC;IAC9D,eAAe,EAAE;QACf,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,qEAAqE;KACnF;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,KAAK;QACd,WAAW,EAAE,sDAAsD;KACpE;IACD,cAAc,EAAE;QACd,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,4CAA4C;KAC1D;IACD,oBAAoB,EAAE;QACpB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,WAAW;QACpB,WAAW,EAAE,oDAAoD;QACjE,IAAI,EAAE,CAAC,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC;KACvC;IACD,uBAAuB,EAAE;QACvB,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,KAAK;QACd,WAAW,EAAE,qDAAqD;KACnE;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,KAAK;QACd,WAAW,EAAE,iFAAiF;KAC/F;CACF,CAAC"}
|
|
@@ -15,6 +15,8 @@ export declare class GuideManager {
|
|
|
15
15
|
private resolveSource;
|
|
16
16
|
/** Resolve strategy from config or default */
|
|
17
17
|
private resolveStrategy;
|
|
18
|
+
/** Create user artifact directories alongside the guide */
|
|
19
|
+
private createUserDirectories;
|
|
18
20
|
/** Map method name to strategy instance */
|
|
19
21
|
private getStrategy;
|
|
20
22
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GuideManager.d.ts","sourceRoot":"","sources":["../../src/guides/GuideManager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GuideManager.d.ts","sourceRoot":"","sources":["../../src/guides/GuideManager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAmB,MAAM,YAAY,CAAC;AAOvG,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAgB;IAC/C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;gBAE7B,WAAW,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,aAAa;IAM9D,4CAA4C;IACtC,MAAM,IAAI,OAAO,CAAC,SAAS,CAAC;IAKlC,yCAAyC;IACnC,OAAO,CAAC,gBAAgB,CAAC,EAAE,WAAW,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAsB9F,4CAA4C;IACtC,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;IAerC,gDAAgD;YAClC,aAAa;IAc3B,8CAA8C;YAChC,eAAe;IAc7B,2DAA2D;IAC3D,OAAO,CAAC,qBAAqB;IAa7B,2CAA2C;IAC3C,OAAO,CAAC,WAAW;CAUpB"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// Orchestration layer for guide lifecycle management
|
|
2
2
|
import { join } from 'path';
|
|
3
|
+
import { mkdirSync } from 'fs';
|
|
3
4
|
import { DEFAULT_SOURCE_GIT, GUIDE_RELATIVE_PATH } from './types.js';
|
|
4
5
|
import { GuideDetector } from './GuideDetector.js';
|
|
5
6
|
import { SubmoduleStrategy } from './strategies/SubmoduleStrategy.js';
|
|
@@ -30,7 +31,10 @@ export class GuideManager {
|
|
|
30
31
|
throw new Error('Guide is already installed. Use guide_update (or cf guides update) to update it.');
|
|
31
32
|
}
|
|
32
33
|
const strategy = this.getStrategy(method);
|
|
33
|
-
|
|
34
|
+
const result = await strategy.install(this.projectPath, source, targetDir);
|
|
35
|
+
// Create user artifact directories so the project is ready to use
|
|
36
|
+
this.createUserDirectories();
|
|
37
|
+
return result;
|
|
34
38
|
}
|
|
35
39
|
/** Update an existing guide installation */
|
|
36
40
|
async update() {
|
|
@@ -73,6 +77,19 @@ export class GuideManager {
|
|
|
73
77
|
}
|
|
74
78
|
return 'submodule';
|
|
75
79
|
}
|
|
80
|
+
/** Create user artifact directories alongside the guide */
|
|
81
|
+
createUserDirectories() {
|
|
82
|
+
const userDirs = [
|
|
83
|
+
'project-documents/user',
|
|
84
|
+
'project-documents/user/architecture',
|
|
85
|
+
'project-documents/user/slices',
|
|
86
|
+
'project-documents/user/tasks',
|
|
87
|
+
'project-documents/user/project-guides',
|
|
88
|
+
];
|
|
89
|
+
for (const dir of userDirs) {
|
|
90
|
+
mkdirSync(join(this.projectPath, dir), { recursive: true });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
76
93
|
/** Map method name to strategy instance */
|
|
77
94
|
getStrategy(method) {
|
|
78
95
|
switch (method) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GuideManager.js","sourceRoot":"","sources":["../../src/guides/GuideManager.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"GuideManager.js","sourceRoot":"","sources":["../../src/guides/GuideManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { ProjectData } from '../types/project.js';
|
|
2
|
+
import type { IArtifactIntrospector } from './interfaces.js';
|
|
3
|
+
import type { ConsistencyCheckResult, ConsistencyFixResult } from './types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Compares related artifact states within a project and flags mismatches.
|
|
6
|
+
* Optionally applies non-destructive corrections to fixable findings.
|
|
7
|
+
*/
|
|
8
|
+
export declare class ConsistencyChecker {
|
|
9
|
+
private readonly introspector;
|
|
10
|
+
constructor(introspector: IArtifactIntrospector);
|
|
11
|
+
/**
|
|
12
|
+
* Run all detection rules against a project and return structured findings.
|
|
13
|
+
*/
|
|
14
|
+
check(project: ProjectData): Promise<ConsistencyCheckResult>;
|
|
15
|
+
/**
|
|
16
|
+
* Run check(), then apply non-destructive corrections to fixable findings.
|
|
17
|
+
*/
|
|
18
|
+
fix(project: ProjectData): Promise<ConsistencyFixResult>;
|
|
19
|
+
/** Rule 1: Task completion vs. slice plan checkbox */
|
|
20
|
+
private ruleTaskVsPlan;
|
|
21
|
+
/** Rule 2: Frontmatter status vs. computed state */
|
|
22
|
+
private ruleFrontmatterVsComputed;
|
|
23
|
+
/** Rule 3: Missing artifact cross-references */
|
|
24
|
+
private ruleMissingArtifacts;
|
|
25
|
+
/** Rule 4: Plan checkbox vs. slice frontmatter status */
|
|
26
|
+
private rulePlanVsFrontmatter;
|
|
27
|
+
/** Rule 5: Task file frontmatter status vs. computed task completion */
|
|
28
|
+
private ruleTaskFileStatus;
|
|
29
|
+
private emptyResult;
|
|
30
|
+
private buildResult;
|
|
31
|
+
private resolveSlicePlanPath;
|
|
32
|
+
private safeDetectDocuments;
|
|
33
|
+
private safeParseSlicePlan;
|
|
34
|
+
private safeParseTaskFile;
|
|
35
|
+
private safeParseFrontmatter;
|
|
36
|
+
private safeParseTaskFileFrontmatter;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=ConsistencyChecker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConsistencyChecker.d.ts","sourceRoot":"","sources":["../../src/introspection/ConsistencyChecker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,KAAK,EAEV,sBAAsB,EACtB,oBAAoB,EAIrB,MAAM,YAAY,CAAC;AAapB;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAwB;gBAEzC,YAAY,EAAE,qBAAqB;IAI/C;;OAEG;IACG,KAAK,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAiElE;;OAEG;IACG,GAAG,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAqC9D,sDAAsD;IACtD,OAAO,CAAC,cAAc;IAoDtB,oDAAoD;IACpD,OAAO,CAAC,yBAAyB;IAoDjC,gDAAgD;IAChD,OAAO,CAAC,oBAAoB;IAmC5B,yDAAyD;IACzD,OAAO,CAAC,qBAAqB;IAoD7B,wEAAwE;IACxE,OAAO,CAAC,kBAAkB;IAmD1B,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,WAAW;IAoBnB,OAAO,CAAC,oBAAoB;YAMd,mBAAmB;YAYnB,kBAAkB;YAalB,iBAAiB;YAajB,oBAAoB;YAYpB,4BAA4B;CAY3C"}
|
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { resolveArtifactPath } from '../schema/resolveFileByIndex.js';
|
|
3
|
+
import { updateCheckbox, updateFrontmatterField } from './writers/markdownWriter.js';
|
|
4
|
+
/**
|
|
5
|
+
* Extract numeric slice index from a fileSlice value like "165-slice.workflow-navigator".
|
|
6
|
+
*/
|
|
7
|
+
function extractSliceIndex(fileSlice) {
|
|
8
|
+
if (!fileSlice)
|
|
9
|
+
return null;
|
|
10
|
+
const match = /^(\d+)-/.exec(fileSlice);
|
|
11
|
+
return match ? parseInt(match[1], 10) : null;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Compares related artifact states within a project and flags mismatches.
|
|
15
|
+
* Optionally applies non-destructive corrections to fixable findings.
|
|
16
|
+
*/
|
|
17
|
+
export class ConsistencyChecker {
|
|
18
|
+
introspector;
|
|
19
|
+
constructor(introspector) {
|
|
20
|
+
this.introspector = introspector;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Run all detection rules against a project and return structured findings.
|
|
24
|
+
*/
|
|
25
|
+
async check(project) {
|
|
26
|
+
const projectPath = project.projectPath;
|
|
27
|
+
if (!projectPath) {
|
|
28
|
+
return this.emptyResult('');
|
|
29
|
+
}
|
|
30
|
+
const sliceIndex = extractSliceIndex(project.fileSlice);
|
|
31
|
+
if (sliceIndex === null) {
|
|
32
|
+
return this.emptyResult(projectPath);
|
|
33
|
+
}
|
|
34
|
+
// Gather data from introspector — each call individually try/caught
|
|
35
|
+
const docs = await this.safeDetectDocuments(projectPath, sliceIndex);
|
|
36
|
+
const slicePlanResult = await this.safeParseSlicePlan(project, projectPath);
|
|
37
|
+
const taskResult = await this.safeParseTaskFile(docs?.taskFile, projectPath);
|
|
38
|
+
const sliceFrontmatter = await this.safeParseFrontmatter(docs?.sliceDesign, projectPath);
|
|
39
|
+
// Find the matching slice plan entry
|
|
40
|
+
const planEntry = slicePlanResult?.entries.find((e) => e.index === sliceIndex) ?? null;
|
|
41
|
+
const slicePlanPath = this.resolveSlicePlanPath(project, projectPath);
|
|
42
|
+
const findings = [];
|
|
43
|
+
// Rule 1: task completion vs. slice plan checkbox
|
|
44
|
+
findings.push(...this.ruleTaskVsPlan(taskResult, planEntry, slicePlanPath, slicePlanResult, sliceIndex));
|
|
45
|
+
const sliceDesignRel = docs?.sliceDesign ?? null;
|
|
46
|
+
// Rule 2: frontmatter status vs. computed state
|
|
47
|
+
findings.push(...this.ruleFrontmatterVsComputed(sliceFrontmatter, taskResult, sliceDesignRel, projectPath));
|
|
48
|
+
// Rule 3: missing artifact cross-references
|
|
49
|
+
findings.push(...this.ruleMissingArtifacts(docs, planEntry, sliceIndex));
|
|
50
|
+
// Rule 4: plan checkbox vs. slice frontmatter status
|
|
51
|
+
findings.push(...this.rulePlanVsFrontmatter(planEntry, sliceFrontmatter, slicePlanPath, sliceDesignRel, projectPath));
|
|
52
|
+
// Rule 5: task file frontmatter status vs. computed task completion
|
|
53
|
+
const taskFileFrontmatter = await this.safeParseTaskFileFrontmatter(docs?.taskFile, projectPath);
|
|
54
|
+
findings.push(...this.ruleTaskFileStatus(taskResult, taskFileFrontmatter));
|
|
55
|
+
return this.buildResult(projectPath, findings);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Run check(), then apply non-destructive corrections to fixable findings.
|
|
59
|
+
*/
|
|
60
|
+
async fix(project) {
|
|
61
|
+
const checkResult = await this.check(project);
|
|
62
|
+
const fixLog = [];
|
|
63
|
+
const fixErrors = [];
|
|
64
|
+
let fixed = 0;
|
|
65
|
+
for (const finding of checkResult.findings) {
|
|
66
|
+
if (!finding.fixable || !finding.fixAction)
|
|
67
|
+
continue;
|
|
68
|
+
try {
|
|
69
|
+
if (finding.fixAction.type === 'update-checkbox') {
|
|
70
|
+
const { lineIndex, checked } = finding.fixAction.detail;
|
|
71
|
+
const entry = await updateCheckbox(finding.fixAction.filePath, lineIndex, checked);
|
|
72
|
+
entry.rule = finding.rule;
|
|
73
|
+
fixLog.push(entry);
|
|
74
|
+
fixed++;
|
|
75
|
+
}
|
|
76
|
+
else if (finding.fixAction.type === 'update-frontmatter') {
|
|
77
|
+
const { key, value } = finding.fixAction.detail;
|
|
78
|
+
const entry = await updateFrontmatterField(finding.fixAction.filePath, key, value);
|
|
79
|
+
entry.rule = finding.rule;
|
|
80
|
+
fixLog.push(entry);
|
|
81
|
+
fixed++;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
86
|
+
fixErrors.push(`Fix failed for ${finding.rule}: ${msg}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return { ...checkResult, fixed, fixLog, fixErrors };
|
|
90
|
+
}
|
|
91
|
+
// --- Detection Rules ---
|
|
92
|
+
/** Rule 1: Task completion vs. slice plan checkbox */
|
|
93
|
+
ruleTaskVsPlan(taskResult, planEntry, slicePlanPath, slicePlanResult, sliceIndex) {
|
|
94
|
+
const findings = [];
|
|
95
|
+
if (!taskResult || !planEntry || !slicePlanPath || !slicePlanResult)
|
|
96
|
+
return findings;
|
|
97
|
+
const tasksComplete = taskResult.inferredStatus === 'complete';
|
|
98
|
+
const sliceChecked = planEntry.isChecked;
|
|
99
|
+
if (tasksComplete && !sliceChecked) {
|
|
100
|
+
// Find the line index of this entry in the plan file for fixing
|
|
101
|
+
const entryIdx = slicePlanResult.entries.findIndex((e) => e.index === sliceIndex);
|
|
102
|
+
findings.push({
|
|
103
|
+
rule: 'task-vs-plan',
|
|
104
|
+
severity: 'warning',
|
|
105
|
+
location: slicePlanPath,
|
|
106
|
+
description: `Tasks complete (${taskResult.completedTasks}/${taskResult.totalTasks}) but slice ${sliceIndex} is unchecked in plan`,
|
|
107
|
+
suggestedFix: `Check the slice plan entry for (${sliceIndex})`,
|
|
108
|
+
fixable: true,
|
|
109
|
+
fixAction: {
|
|
110
|
+
type: 'update-checkbox',
|
|
111
|
+
filePath: slicePlanPath,
|
|
112
|
+
detail: { lineIndex: entryIdx, checked: true, entryIndex: sliceIndex },
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
if (sliceChecked && !tasksComplete) {
|
|
117
|
+
const entryIdx = slicePlanResult.entries.findIndex((e) => e.index === sliceIndex);
|
|
118
|
+
findings.push({
|
|
119
|
+
rule: 'task-vs-plan',
|
|
120
|
+
severity: 'error',
|
|
121
|
+
location: slicePlanPath,
|
|
122
|
+
description: `Slice ${sliceIndex} is checked in plan but tasks are incomplete (${taskResult.completedTasks}/${taskResult.totalTasks})`,
|
|
123
|
+
suggestedFix: `Uncheck the slice plan entry for (${sliceIndex})`,
|
|
124
|
+
fixable: true,
|
|
125
|
+
fixAction: {
|
|
126
|
+
type: 'update-checkbox',
|
|
127
|
+
filePath: slicePlanPath,
|
|
128
|
+
detail: { lineIndex: entryIdx, checked: false, entryIndex: sliceIndex },
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
return findings;
|
|
133
|
+
}
|
|
134
|
+
/** Rule 2: Frontmatter status vs. computed state */
|
|
135
|
+
ruleFrontmatterVsComputed(frontmatter, taskResult, sliceDesignRelPath, projectPath) {
|
|
136
|
+
const findings = [];
|
|
137
|
+
if (!frontmatter?.found || !frontmatter.data.status)
|
|
138
|
+
return findings;
|
|
139
|
+
if (!taskResult)
|
|
140
|
+
return findings;
|
|
141
|
+
const fmStatus = frontmatter.data.status.toLowerCase();
|
|
142
|
+
const tasksComplete = taskResult.inferredStatus === 'complete';
|
|
143
|
+
const sliceDesignFullPath = sliceDesignRelPath
|
|
144
|
+
? join(projectPath, sliceDesignRelPath)
|
|
145
|
+
: frontmatter.filePath;
|
|
146
|
+
if (fmStatus === 'complete' && !tasksComplete) {
|
|
147
|
+
findings.push({
|
|
148
|
+
rule: 'frontmatter-vs-computed',
|
|
149
|
+
severity: 'error',
|
|
150
|
+
location: sliceDesignFullPath,
|
|
151
|
+
description: `Frontmatter status is "complete" but tasks are incomplete (${taskResult.completedTasks}/${taskResult.totalTasks})`,
|
|
152
|
+
suggestedFix: 'Update frontmatter status to "in-progress"',
|
|
153
|
+
fixable: true,
|
|
154
|
+
fixAction: {
|
|
155
|
+
type: 'update-frontmatter',
|
|
156
|
+
filePath: sliceDesignFullPath,
|
|
157
|
+
detail: { key: 'status', value: 'in-progress' },
|
|
158
|
+
},
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
if ((fmStatus === 'in-progress' || fmStatus === 'not-started') && tasksComplete) {
|
|
162
|
+
findings.push({
|
|
163
|
+
rule: 'frontmatter-vs-computed',
|
|
164
|
+
severity: 'warning',
|
|
165
|
+
location: sliceDesignFullPath,
|
|
166
|
+
description: `Frontmatter status is "${fmStatus}" but all tasks are complete (${taskResult.completedTasks}/${taskResult.totalTasks})`,
|
|
167
|
+
suggestedFix: 'Update frontmatter status to "complete"',
|
|
168
|
+
fixable: true,
|
|
169
|
+
fixAction: {
|
|
170
|
+
type: 'update-frontmatter',
|
|
171
|
+
filePath: sliceDesignFullPath,
|
|
172
|
+
detail: { key: 'status', value: 'complete' },
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
return findings;
|
|
177
|
+
}
|
|
178
|
+
/** Rule 3: Missing artifact cross-references */
|
|
179
|
+
ruleMissingArtifacts(docs, planEntry, sliceIndex) {
|
|
180
|
+
const findings = [];
|
|
181
|
+
const hasTaskFile = docs?.taskFile !== null && docs?.taskFile !== undefined;
|
|
182
|
+
const hasPlanEntry = planEntry !== null;
|
|
183
|
+
if (hasTaskFile && !hasPlanEntry) {
|
|
184
|
+
findings.push({
|
|
185
|
+
rule: 'missing-artifact',
|
|
186
|
+
severity: 'info',
|
|
187
|
+
location: docs.taskFile[0],
|
|
188
|
+
description: `Task file exists for slice ${sliceIndex} but no matching slice plan entry found`,
|
|
189
|
+
suggestedFix: 'Add an entry for this slice to the slice plan',
|
|
190
|
+
fixable: false,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
if (hasPlanEntry && !hasTaskFile) {
|
|
194
|
+
findings.push({
|
|
195
|
+
rule: 'missing-artifact',
|
|
196
|
+
severity: 'info',
|
|
197
|
+
location: `slice plan entry ${sliceIndex}`,
|
|
198
|
+
description: `Slice plan entry exists for ${sliceIndex} (${planEntry.name}) but no task file found`,
|
|
199
|
+
suggestedFix: 'Create a task file when ready to begin implementation',
|
|
200
|
+
fixable: false,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
return findings;
|
|
204
|
+
}
|
|
205
|
+
/** Rule 4: Plan checkbox vs. slice frontmatter status */
|
|
206
|
+
rulePlanVsFrontmatter(planEntry, frontmatter, slicePlanPath, sliceDesignRelPath, projectPath) {
|
|
207
|
+
const findings = [];
|
|
208
|
+
if (!planEntry || !frontmatter?.found || !frontmatter.data.status)
|
|
209
|
+
return findings;
|
|
210
|
+
const fmStatus = frontmatter.data.status.toLowerCase();
|
|
211
|
+
const planChecked = planEntry.isChecked;
|
|
212
|
+
const sliceDesignFullPath = sliceDesignRelPath
|
|
213
|
+
? join(projectPath, sliceDesignRelPath)
|
|
214
|
+
: frontmatter.filePath;
|
|
215
|
+
if (planChecked && fmStatus !== 'complete') {
|
|
216
|
+
findings.push({
|
|
217
|
+
rule: 'plan-vs-frontmatter',
|
|
218
|
+
severity: 'warning',
|
|
219
|
+
location: sliceDesignFullPath,
|
|
220
|
+
description: `Slice plan entry is checked but frontmatter status is "${fmStatus}"`,
|
|
221
|
+
suggestedFix: 'Update frontmatter status to "complete"',
|
|
222
|
+
fixable: true,
|
|
223
|
+
fixAction: {
|
|
224
|
+
type: 'update-frontmatter',
|
|
225
|
+
filePath: sliceDesignFullPath,
|
|
226
|
+
detail: { key: 'status', value: 'complete' },
|
|
227
|
+
},
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
if (!planChecked && fmStatus === 'complete' && slicePlanPath) {
|
|
231
|
+
findings.push({
|
|
232
|
+
rule: 'plan-vs-frontmatter',
|
|
233
|
+
severity: 'warning',
|
|
234
|
+
location: slicePlanPath,
|
|
235
|
+
description: `Frontmatter status is "complete" but slice plan entry is unchecked`,
|
|
236
|
+
suggestedFix: 'Check the slice plan entry',
|
|
237
|
+
fixable: true,
|
|
238
|
+
fixAction: {
|
|
239
|
+
type: 'update-checkbox',
|
|
240
|
+
filePath: slicePlanPath,
|
|
241
|
+
detail: { lineIndex: -1, checked: true },
|
|
242
|
+
},
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
return findings;
|
|
246
|
+
}
|
|
247
|
+
/** Rule 5: Task file frontmatter status vs. computed task completion */
|
|
248
|
+
ruleTaskFileStatus(taskResult, taskFrontmatter) {
|
|
249
|
+
const findings = [];
|
|
250
|
+
if (!taskResult || !taskFrontmatter?.found || !taskFrontmatter.data.status)
|
|
251
|
+
return findings;
|
|
252
|
+
const fmStatus = taskFrontmatter.data.status.toLowerCase().replace(/_/g, '-');
|
|
253
|
+
const computed = taskResult.inferredStatus; // 'complete' | 'in-progress' | 'not-started'
|
|
254
|
+
const taskFilePath = taskFrontmatter.filePath;
|
|
255
|
+
// Map task file status values to normalized form for comparison
|
|
256
|
+
// Task files use not_started/in_progress/complete in frontmatter
|
|
257
|
+
if (fmStatus === 'complete' && computed !== 'complete') {
|
|
258
|
+
findings.push({
|
|
259
|
+
rule: 'task-file-status',
|
|
260
|
+
severity: 'error',
|
|
261
|
+
location: taskFilePath,
|
|
262
|
+
description: `Task file status is "complete" but tasks are incomplete (${taskResult.completedTasks}/${taskResult.totalTasks})`,
|
|
263
|
+
suggestedFix: 'Update task file status to "in_progress"',
|
|
264
|
+
fixable: true,
|
|
265
|
+
fixAction: {
|
|
266
|
+
type: 'update-frontmatter',
|
|
267
|
+
filePath: taskFilePath,
|
|
268
|
+
detail: { key: 'status', value: 'in_progress' },
|
|
269
|
+
},
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
if (fmStatus !== 'complete' && computed === 'complete') {
|
|
273
|
+
findings.push({
|
|
274
|
+
rule: 'task-file-status',
|
|
275
|
+
severity: 'warning',
|
|
276
|
+
location: taskFilePath,
|
|
277
|
+
description: `Task file status is "${taskFrontmatter.data.status}" but all tasks are complete (${taskResult.completedTasks}/${taskResult.totalTasks})`,
|
|
278
|
+
suggestedFix: 'Update task file status to "complete"',
|
|
279
|
+
fixable: true,
|
|
280
|
+
fixAction: {
|
|
281
|
+
type: 'update-frontmatter',
|
|
282
|
+
filePath: taskFilePath,
|
|
283
|
+
detail: { key: 'status', value: 'complete' },
|
|
284
|
+
},
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
return findings;
|
|
288
|
+
}
|
|
289
|
+
// --- Helper methods ---
|
|
290
|
+
emptyResult(projectPath) {
|
|
291
|
+
return {
|
|
292
|
+
projectPath,
|
|
293
|
+
findings: [],
|
|
294
|
+
totalFindings: 0,
|
|
295
|
+
errors: 0,
|
|
296
|
+
warnings: 0,
|
|
297
|
+
infos: 0,
|
|
298
|
+
summary: 'No inconsistencies found',
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
buildResult(projectPath, findings) {
|
|
302
|
+
const errors = findings.filter((f) => f.severity === 'error').length;
|
|
303
|
+
const warnings = findings.filter((f) => f.severity === 'warning').length;
|
|
304
|
+
const infos = findings.filter((f) => f.severity === 'info').length;
|
|
305
|
+
const total = findings.length;
|
|
306
|
+
let summary;
|
|
307
|
+
if (total === 0) {
|
|
308
|
+
summary = 'No inconsistencies found';
|
|
309
|
+
}
|
|
310
|
+
else {
|
|
311
|
+
const parts = [];
|
|
312
|
+
if (errors > 0)
|
|
313
|
+
parts.push(`${errors} error${errors !== 1 ? 's' : ''}`);
|
|
314
|
+
if (warnings > 0)
|
|
315
|
+
parts.push(`${warnings} warning${warnings !== 1 ? 's' : ''}`);
|
|
316
|
+
if (infos > 0)
|
|
317
|
+
parts.push(`${infos} info${infos !== 1 ? 's' : ''}`);
|
|
318
|
+
summary = `${total} finding${total !== 1 ? 's' : ''}: ${parts.join(', ')}`;
|
|
319
|
+
}
|
|
320
|
+
return { projectPath, findings, totalFindings: total, errors, warnings, infos, summary };
|
|
321
|
+
}
|
|
322
|
+
resolveSlicePlanPath(project, projectPath) {
|
|
323
|
+
if (!project.fileSlicePlan)
|
|
324
|
+
return null;
|
|
325
|
+
const relPath = resolveArtifactPath('fileSlicePlan', project.fileSlicePlan);
|
|
326
|
+
return relPath ? join(projectPath, relPath) : null;
|
|
327
|
+
}
|
|
328
|
+
async safeDetectDocuments(projectPath, sliceIndex) {
|
|
329
|
+
try {
|
|
330
|
+
const docs = await this.introspector.detectDocuments(projectPath, sliceIndex);
|
|
331
|
+
return { taskFile: docs.taskFile, sliceDesign: docs.sliceDesign };
|
|
332
|
+
}
|
|
333
|
+
catch {
|
|
334
|
+
return null;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
async safeParseSlicePlan(project, projectPath) {
|
|
338
|
+
const planPath = this.resolveSlicePlanPath(project, projectPath);
|
|
339
|
+
if (!planPath)
|
|
340
|
+
return null;
|
|
341
|
+
try {
|
|
342
|
+
return await this.introspector.parseSlicePlan(planPath);
|
|
343
|
+
}
|
|
344
|
+
catch {
|
|
345
|
+
return null;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
async safeParseTaskFile(taskFilePaths, projectPath) {
|
|
349
|
+
if (!taskFilePaths || taskFilePaths.length === 0)
|
|
350
|
+
return null;
|
|
351
|
+
try {
|
|
352
|
+
const fullPaths = taskFilePaths.map((p) => join(projectPath, p));
|
|
353
|
+
return await this.introspector.parseTaskFile(fullPaths);
|
|
354
|
+
}
|
|
355
|
+
catch {
|
|
356
|
+
return null;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
async safeParseFrontmatter(sliceDesignRelPath, projectPath) {
|
|
360
|
+
if (!sliceDesignRelPath)
|
|
361
|
+
return null;
|
|
362
|
+
try {
|
|
363
|
+
return await this.introspector.parseFrontmatter(join(projectPath, sliceDesignRelPath));
|
|
364
|
+
}
|
|
365
|
+
catch {
|
|
366
|
+
return null;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
async safeParseTaskFileFrontmatter(taskFilePaths, projectPath) {
|
|
370
|
+
if (!taskFilePaths || taskFilePaths.length === 0)
|
|
371
|
+
return null;
|
|
372
|
+
// Parse frontmatter from the first task file (primary file has the frontmatter)
|
|
373
|
+
try {
|
|
374
|
+
return await this.introspector.parseFrontmatter(join(projectPath, taskFilePaths[0]));
|
|
375
|
+
}
|
|
376
|
+
catch {
|
|
377
|
+
return null;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
//# sourceMappingURL=ConsistencyChecker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConsistencyChecker.js","sourceRoot":"","sources":["../../src/introspection/ConsistencyChecker.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowNavigator.d.ts","sourceRoot":"","sources":["../../src/introspection/WorkflowNavigator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAEV,cAAc,EACd,UAAU,EAGX,MAAM,YAAY,CAAC;AAMpB;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAI9E;AAYD;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B;;OAEG;IACG,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC;IA2B9D;;;OAGG;IACG,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"WorkflowNavigator.d.ts","sourceRoot":"","sources":["../../src/introspection/WorkflowNavigator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAEV,cAAc,EACd,UAAU,EAGX,MAAM,YAAY,CAAC;AAMpB;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAI9E;AAYD;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B;;OAEG;IACG,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC;IA2B9D;;;OAGG;IACG,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAqHxD;;OAEG;YACW,iBAAiB;YAqDjB,iBAAiB;YAQjB,kBAAkB;IA4BhC,OAAO,CAAC,YAAY;CA0BrB"}
|
|
@@ -69,13 +69,22 @@ export class WorkflowNavigator {
|
|
|
69
69
|
const slice = status.activeSlice;
|
|
70
70
|
// Priority 2: No fileSlice
|
|
71
71
|
if (!slice || slice.status === 'no-active-slice') {
|
|
72
|
-
//
|
|
72
|
+
// No architecture → recommend creating architecture first
|
|
73
|
+
if (!project.fileArch && !status.slicePlan) {
|
|
74
|
+
return {
|
|
75
|
+
recommendation: 'Create architecture document',
|
|
76
|
+
rationale: 'No architecture document or slice plan is configured. Architecture defines the high-level structure before slicing into deliverable increments.',
|
|
77
|
+
suggestedCommand: 'cf set arch <index>',
|
|
78
|
+
summary: 'Create an architecture document to define project structure',
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
// Architecture exists but no slice plan
|
|
73
82
|
if (!status.slicePlan) {
|
|
74
83
|
return {
|
|
75
84
|
recommendation: 'Create or assign a slice plan',
|
|
76
|
-
rationale: '
|
|
85
|
+
rationale: 'Architecture is set but no slice plan is configured. A slice plan breaks the architecture into deliverable increments.',
|
|
77
86
|
suggestedCommand: 'cf set slicePlan <path>',
|
|
78
|
-
summary: 'Create
|
|
87
|
+
summary: 'Create a slice plan from the architecture',
|
|
79
88
|
};
|
|
80
89
|
}
|
|
81
90
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowNavigator.js","sourceRoot":"","sources":["../../src/introspection/WorkflowNavigator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AASjC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAEtE;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAA6B;IAC7D,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxC,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,SAAiB;IACzC,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACnD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,iBAAiB;IAC5B;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,OAAoB;QAClC,MAAM,MAAM,GAAmB;YAC7B,OAAO,EAAE,OAAO,CAAC,IAAI;YACrB,KAAK,EAAE,OAAO,CAAC,gBAAgB,IAAI,IAAI;YACvC,WAAW,EAAE,IAAI;YACjB,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,EAAE;SACZ,CAAC;QAEF,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QACxC,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,CAAC,OAAO,GAAG,GAAG,OAAO,CAAC,IAAI,+BAA+B,CAAC;YAChE,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,6BAA6B;QAC7B,MAAM,CAAC,WAAW,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAExE,0BAA0B;QAC1B,MAAM,CAAC,SAAS,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAEvE,gBAAgB;QAChB,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAE3C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO,CAAC,OAAoB;QAChC,6BAA6B;QAC7B,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YACzB,OAAO;gBACL,cAAc,EAAE,iBAAiB;gBACjC,SAAS,EAAE,4EAA4E;gBACvF,gBAAgB,EAAE,qCAAqC;gBACvD,OAAO,EAAE,+CAA+C;aACzD,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;QAEjC,2BAA2B;QAC3B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,iBAAiB,EAAE,CAAC;YACjD,
|
|
1
|
+
{"version":3,"file":"WorkflowNavigator.js","sourceRoot":"","sources":["../../src/introspection/WorkflowNavigator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import type { SlicePlanResult } from '../types.js';
|
|
2
2
|
/**
|
|
3
3
|
* Parse a slice plan document and extract entries with completion state.
|
|
4
|
+
* Supports two entry formats:
|
|
5
|
+
* - Indexed: `1. [ ] **(101) Slice Name**` — uses parenthesized index
|
|
6
|
+
* - Unindexed: `1. [ ] **Slice Name**` — uses sequential list number as index
|
|
4
7
|
* Section-aware: skips entries under Future Work, Implementation Order, Notes, Parent Document.
|
|
5
8
|
* Never throws — returns empty result on error.
|
|
6
9
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slicePlanParser.d.ts","sourceRoot":"","sources":["../../../src/introspection/parsers/slicePlanParser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAkB,eAAe,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"slicePlanParser.d.ts","sourceRoot":"","sources":["../../../src/introspection/parsers/slicePlanParser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAkB,eAAe,EAAE,MAAM,aAAa,CAAC;AAcnE;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAyD/E"}
|
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
import { readFile } from 'node:fs/promises';
|
|
2
|
-
/** Matches `N. [ ] **(NNN) Slice Name**`
|
|
3
|
-
const
|
|
2
|
+
/** Matches `N. [ ] **(NNN) Slice Name**` — indexed format */
|
|
3
|
+
const PLAN_INDEXED_RE = /^(\d+)\.\s+\[([ xX])\]\s+\*\*\((\d+)\)\s+(.+?)\*\*/;
|
|
4
|
+
/** Matches `N. [ ] **Slice Name**` — unindexed format (no parenthesized index) */
|
|
5
|
+
const PLAN_UNINDEXED_RE = /^(\d+)\.\s+\[([ xX])\]\s+\*\*([^(].*?)\*\*/;
|
|
4
6
|
/** Matches headings: #, ##, ### */
|
|
5
7
|
const HEADING_RE = /^#{1,3}\s+/;
|
|
6
|
-
/** Headings that do NOT contain slice entries
|
|
8
|
+
/** Headings that do NOT contain slice entries */
|
|
7
9
|
const NON_SLICE_HEADINGS = ['future work', 'implementation order', 'notes', 'parent document'];
|
|
8
10
|
/**
|
|
9
11
|
* Parse a slice plan document and extract entries with completion state.
|
|
12
|
+
* Supports two entry formats:
|
|
13
|
+
* - Indexed: `1. [ ] **(101) Slice Name**` — uses parenthesized index
|
|
14
|
+
* - Unindexed: `1. [ ] **Slice Name**` — uses sequential list number as index
|
|
10
15
|
* Section-aware: skips entries under Future Work, Implementation Order, Notes, Parent Document.
|
|
11
16
|
* Never throws — returns empty result on error.
|
|
12
17
|
*/
|
|
@@ -15,26 +20,41 @@ export async function parseSlicePlan(filePath) {
|
|
|
15
20
|
try {
|
|
16
21
|
const content = await readFile(filePath, 'utf-8');
|
|
17
22
|
const entries = [];
|
|
18
|
-
let inSliceSection = true;
|
|
23
|
+
let inSliceSection = true;
|
|
24
|
+
let unindexedCounter = 0;
|
|
19
25
|
for (const line of content.split('\n')) {
|
|
20
26
|
const stripped = line.trim();
|
|
21
27
|
if (HEADING_RE.test(stripped)) {
|
|
22
28
|
const heading = stripped.replace(/^#+\s+/, '').toLowerCase();
|
|
23
|
-
inSliceSection = !NON_SLICE_HEADINGS.some((ns) => heading.
|
|
29
|
+
inSliceSection = !NON_SLICE_HEADINGS.some((ns) => heading.startsWith(ns));
|
|
24
30
|
continue;
|
|
25
31
|
}
|
|
26
32
|
if (!inSliceSection)
|
|
27
33
|
continue;
|
|
28
|
-
|
|
29
|
-
|
|
34
|
+
// Try indexed format first (preferred)
|
|
35
|
+
const indexed = PLAN_INDEXED_RE.exec(stripped);
|
|
36
|
+
if (indexed) {
|
|
37
|
+
const isChecked = indexed[2].toLowerCase() === 'x';
|
|
38
|
+
entries.push({
|
|
39
|
+
index: parseInt(indexed[3], 10),
|
|
40
|
+
name: indexed[4].trim(),
|
|
41
|
+
status: isChecked ? 'complete' : 'not-started',
|
|
42
|
+
isChecked,
|
|
43
|
+
});
|
|
30
44
|
continue;
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
isChecked
|
|
37
|
-
|
|
45
|
+
}
|
|
46
|
+
// Fall back to unindexed format — use sequential counter as index
|
|
47
|
+
const unindexed = PLAN_UNINDEXED_RE.exec(stripped);
|
|
48
|
+
if (unindexed) {
|
|
49
|
+
unindexedCounter++;
|
|
50
|
+
const isChecked = unindexed[2].toLowerCase() === 'x';
|
|
51
|
+
entries.push({
|
|
52
|
+
index: unindexedCounter,
|
|
53
|
+
name: unindexed[3].trim(),
|
|
54
|
+
status: isChecked ? 'complete' : 'not-started',
|
|
55
|
+
isChecked,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
38
58
|
}
|
|
39
59
|
const completedSlices = entries.filter((e) => e.isChecked).length;
|
|
40
60
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slicePlanParser.js","sourceRoot":"","sources":["../../../src/introspection/parsers/slicePlanParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,
|
|
1
|
+
{"version":3,"file":"slicePlanParser.js","sourceRoot":"","sources":["../../../src/introspection/parsers/slicePlanParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -153,6 +153,47 @@ export interface FutureWorkCollectorResult {
|
|
|
153
153
|
completedItems: number;
|
|
154
154
|
markdown: string;
|
|
155
155
|
}
|
|
156
|
+
/** Severity level for consistency findings */
|
|
157
|
+
export type ConsistencySeverity = 'info' | 'warning' | 'error';
|
|
158
|
+
/** A single consistency finding from a detection rule */
|
|
159
|
+
export interface ConsistencyFinding {
|
|
160
|
+
rule: string;
|
|
161
|
+
severity: ConsistencySeverity;
|
|
162
|
+
location: string;
|
|
163
|
+
description: string;
|
|
164
|
+
suggestedFix: string;
|
|
165
|
+
fixable: boolean;
|
|
166
|
+
fixAction?: {
|
|
167
|
+
type: 'update-checkbox' | 'update-frontmatter';
|
|
168
|
+
filePath: string;
|
|
169
|
+
detail: Record<string, unknown>;
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/** Result of running all consistency checks on a project */
|
|
173
|
+
export interface ConsistencyCheckResult {
|
|
174
|
+
projectPath: string;
|
|
175
|
+
findings: ConsistencyFinding[];
|
|
176
|
+
totalFindings: number;
|
|
177
|
+
errors: number;
|
|
178
|
+
warnings: number;
|
|
179
|
+
infos: number;
|
|
180
|
+
summary: string;
|
|
181
|
+
}
|
|
182
|
+
/** Log entry for a single applied fix */
|
|
183
|
+
export interface FixLogEntry {
|
|
184
|
+
rule: string;
|
|
185
|
+
action: 'update-checkbox' | 'update-frontmatter';
|
|
186
|
+
filePath: string;
|
|
187
|
+
field?: string;
|
|
188
|
+
before: string;
|
|
189
|
+
after: string;
|
|
190
|
+
}
|
|
191
|
+
/** Result of running consistency checks with fix mode enabled */
|
|
192
|
+
export interface ConsistencyFixResult extends ConsistencyCheckResult {
|
|
193
|
+
fixed: number;
|
|
194
|
+
fixLog: FixLogEntry[];
|
|
195
|
+
fixErrors: string[];
|
|
196
|
+
}
|
|
156
197
|
/** Status of the currently active slice */
|
|
157
198
|
export interface SliceStatus {
|
|
158
199
|
name: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/introspection/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/introspection/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { FixLogEntry } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Update a checkbox on a specific line in a markdown file.
|
|
4
|
+
* Toggles between `[ ]` and `[x]` based on the `checked` parameter.
|
|
5
|
+
*/
|
|
6
|
+
export declare function updateCheckbox(filePath: string, lineIndex: number, checked: boolean): Promise<FixLogEntry>;
|
|
7
|
+
/**
|
|
8
|
+
* Update a YAML frontmatter field value in a markdown file.
|
|
9
|
+
* Finds the key in the frontmatter block and replaces its value.
|
|
10
|
+
*/
|
|
11
|
+
export declare function updateFrontmatterField(filePath: string, key: string, value: string): Promise<FixLogEntry>;
|
|
12
|
+
//# sourceMappingURL=markdownWriter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdownWriter.d.ts","sourceRoot":"","sources":["../../../src/introspection/writers/markdownWriter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;;GAGG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,WAAW,CAAC,CAkCtB;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,WAAW,CAAC,CA+DtB"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
2
|
+
/**
|
|
3
|
+
* Update a checkbox on a specific line in a markdown file.
|
|
4
|
+
* Toggles between `[ ]` and `[x]` based on the `checked` parameter.
|
|
5
|
+
*/
|
|
6
|
+
export async function updateCheckbox(filePath, lineIndex, checked) {
|
|
7
|
+
const content = await readFile(filePath, 'utf-8');
|
|
8
|
+
const lines = content.split('\n');
|
|
9
|
+
if (lineIndex < 0 || lineIndex >= lines.length) {
|
|
10
|
+
throw new Error(`Line index ${lineIndex} out of range (file has ${lines.length} lines)`);
|
|
11
|
+
}
|
|
12
|
+
const line = lines[lineIndex];
|
|
13
|
+
const uncheckedPattern = /\[ \]/;
|
|
14
|
+
const checkedPattern = /\[x\]/i;
|
|
15
|
+
if (!uncheckedPattern.test(line) && !checkedPattern.test(line)) {
|
|
16
|
+
throw new Error(`Line ${lineIndex} does not contain a checkbox pattern: "${line.trim()}"`);
|
|
17
|
+
}
|
|
18
|
+
const before = uncheckedPattern.test(line) ? '[ ]' : '[x]';
|
|
19
|
+
const after = checked ? '[x]' : '[ ]';
|
|
20
|
+
if (checked) {
|
|
21
|
+
lines[lineIndex] = line.replace(uncheckedPattern, '[x]');
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
lines[lineIndex] = line.replace(checkedPattern, '[ ]');
|
|
25
|
+
}
|
|
26
|
+
await writeFile(filePath, lines.join('\n'), 'utf-8');
|
|
27
|
+
return {
|
|
28
|
+
rule: '',
|
|
29
|
+
action: 'update-checkbox',
|
|
30
|
+
filePath,
|
|
31
|
+
before,
|
|
32
|
+
after,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Update a YAML frontmatter field value in a markdown file.
|
|
37
|
+
* Finds the key in the frontmatter block and replaces its value.
|
|
38
|
+
*/
|
|
39
|
+
export async function updateFrontmatterField(filePath, key, value) {
|
|
40
|
+
const content = await readFile(filePath, 'utf-8');
|
|
41
|
+
const lines = content.split('\n');
|
|
42
|
+
if (lines.length === 0 || lines[0].trim() !== '---') {
|
|
43
|
+
throw new Error(`File does not contain YAML frontmatter: ${filePath}`);
|
|
44
|
+
}
|
|
45
|
+
let closingIndex = -1;
|
|
46
|
+
for (let i = 1; i < lines.length; i++) {
|
|
47
|
+
if (lines[i].trim() === '---') {
|
|
48
|
+
closingIndex = i;
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (closingIndex === -1) {
|
|
53
|
+
throw new Error(`Frontmatter not closed in: ${filePath}`);
|
|
54
|
+
}
|
|
55
|
+
// Find the key within frontmatter bounds
|
|
56
|
+
let keyLineIndex = -1;
|
|
57
|
+
let beforeValue = '';
|
|
58
|
+
for (let i = 1; i < closingIndex; i++) {
|
|
59
|
+
const line = lines[i];
|
|
60
|
+
const colonIdx = line.indexOf(':');
|
|
61
|
+
if (colonIdx === -1)
|
|
62
|
+
continue;
|
|
63
|
+
const lineKey = line.slice(0, colonIdx).trim();
|
|
64
|
+
if (lineKey === key) {
|
|
65
|
+
keyLineIndex = i;
|
|
66
|
+
beforeValue = line.slice(colonIdx + 1).trim();
|
|
67
|
+
// Strip surrounding quotes
|
|
68
|
+
if (beforeValue.length >= 2 &&
|
|
69
|
+
((beforeValue.startsWith("'") && beforeValue.endsWith("'")) ||
|
|
70
|
+
(beforeValue.startsWith('"') && beforeValue.endsWith('"')))) {
|
|
71
|
+
beforeValue = beforeValue.slice(1, -1);
|
|
72
|
+
}
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (keyLineIndex === -1) {
|
|
77
|
+
throw new Error(`Frontmatter key "${key}" not found in: ${filePath}`);
|
|
78
|
+
}
|
|
79
|
+
// Replace the value, preserving the key and any leading whitespace
|
|
80
|
+
const originalLine = lines[keyLineIndex];
|
|
81
|
+
const colonIdx = originalLine.indexOf(':');
|
|
82
|
+
lines[keyLineIndex] = originalLine.slice(0, colonIdx + 1) + ' ' + value;
|
|
83
|
+
await writeFile(filePath, lines.join('\n'), 'utf-8');
|
|
84
|
+
return {
|
|
85
|
+
rule: '',
|
|
86
|
+
action: 'update-frontmatter',
|
|
87
|
+
filePath,
|
|
88
|
+
field: key,
|
|
89
|
+
before: beforeValue,
|
|
90
|
+
after: value,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=markdownWriter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdownWriter.js","sourceRoot":"","sources":["../../../src/introspection/writers/markdownWriter.ts"],"names":[],"mappings":"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"}
|
package/dist/node.d.ts
CHANGED
|
@@ -15,4 +15,6 @@ export { parseFutureWork } from './introspection/parsers/futureWorkParser.js';
|
|
|
15
15
|
export { detectDocuments, checkFileExists } from './introspection/parsers/documentDetector.js';
|
|
16
16
|
export { buildModel, scanDirectory } from './introspection/ProjectModelBuilder.js';
|
|
17
17
|
export { FutureWorkCollector } from './introspection/FutureWorkCollector.js';
|
|
18
|
+
export { ConsistencyChecker } from './introspection/ConsistencyChecker.js';
|
|
19
|
+
export { updateCheckbox, updateFrontmatterField } from './introspection/writers/markdownWriter.js';
|
|
18
20
|
//# sourceMappingURL=node.d.ts.map
|
package/dist/node.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAGzE,cAAc,oBAAoB,CAAC;AAGnC,cAAc,mBAAmB,CAAC;AAGlC,cAAc,mBAAmB,CAAC;AAGlC,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAG7G,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAC5F,OAAO,EAAE,gBAAgB,EAAE,MAAM,8CAA8C,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC/F,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AACnF,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC"}
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAGzE,cAAc,oBAAoB,CAAC;AAGnC,cAAc,mBAAmB,CAAC;AAGlC,cAAc,mBAAmB,CAAC;AAGlC,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAG7G,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAC5F,OAAO,EAAE,gBAAgB,EAAE,MAAM,8CAA8C,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC/F,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AACnF,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAC"}
|
package/dist/node.js
CHANGED
|
@@ -23,4 +23,6 @@ export { parseFutureWork } from './introspection/parsers/futureWorkParser.js';
|
|
|
23
23
|
export { detectDocuments, checkFileExists } from './introspection/parsers/documentDetector.js';
|
|
24
24
|
export { buildModel, scanDirectory } from './introspection/ProjectModelBuilder.js';
|
|
25
25
|
export { FutureWorkCollector } from './introspection/FutureWorkCollector.js';
|
|
26
|
+
export { ConsistencyChecker } from './introspection/ConsistencyChecker.js';
|
|
27
|
+
export { updateCheckbox, updateFrontmatterField } from './introspection/writers/markdownWriter.js';
|
|
26
28
|
//# sourceMappingURL=node.js.map
|
package/dist/node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,oEAAoE;AACpE,uEAAuE;AAEvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAEzE,0EAA0E;AAC1E,cAAc,oBAAoB,CAAC;AAEnC,8DAA8D;AAC9D,cAAc,mBAAmB,CAAC;AAElC,yDAAyD;AACzD,cAAc,mBAAmB,CAAC;AAElC,8DAA8D;AAC9D,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAE7G,yEAAyE;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAC5F,OAAO,EAAE,gBAAgB,EAAE,MAAM,8CAA8C,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC/F,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AACnF,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC"}
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,oEAAoE;AACpE,uEAAuE;AAEvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAEzE,0EAA0E;AAC1E,cAAc,oBAAoB,CAAC;AAEnC,8DAA8D;AAC9D,cAAc,mBAAmB,CAAC;AAElC,yDAAyD;AACzD,cAAc,mBAAmB,CAAC;AAElC,8DAA8D;AAC9D,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAE7G,yEAAyE;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAC5F,OAAO,EAAE,gBAAgB,EAAE,MAAM,8CAA8C,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC/F,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AACnF,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAC"}
|
package/package.json
CHANGED