ai-spector 0.8.39 → 0.8.41

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.
Files changed (120) hide show
  1. package/dist/cli.js +165 -2
  2. package/dist/cli.js.map +1 -1
  3. package/dist/core/config/load.d.ts +4 -0
  4. package/dist/core/config/load.d.ts.map +1 -1
  5. package/dist/core/config/load.js +27 -6
  6. package/dist/core/config/load.js.map +1 -1
  7. package/dist/core/config/types.d.ts +5 -0
  8. package/dist/core/config/types.d.ts.map +1 -1
  9. package/dist/core/graph/config.d.ts +2 -0
  10. package/dist/core/graph/config.d.ts.map +1 -1
  11. package/dist/core/graph/config.js +17 -3
  12. package/dist/core/graph/config.js.map +1 -1
  13. package/dist/core/graph/index.d.ts +1 -1
  14. package/dist/core/graph/index.d.ts.map +1 -1
  15. package/dist/core/graph/index.js +1 -1
  16. package/dist/core/graph/index.js.map +1 -1
  17. package/dist/core/operations/check.d.ts +28 -0
  18. package/dist/core/operations/check.d.ts.map +1 -0
  19. package/dist/core/operations/check.js +211 -0
  20. package/dist/core/operations/check.js.map +1 -0
  21. package/dist/core/operations/context.d.ts +84 -0
  22. package/dist/core/operations/context.d.ts.map +1 -0
  23. package/dist/core/operations/context.js +164 -0
  24. package/dist/core/operations/context.js.map +1 -0
  25. package/dist/core/operations/extracted.d.ts +80 -0
  26. package/dist/core/operations/extracted.d.ts.map +1 -0
  27. package/dist/core/operations/extracted.js +135 -0
  28. package/dist/core/operations/extracted.js.map +1 -0
  29. package/dist/core/operations/hooks.d.ts.map +1 -1
  30. package/dist/core/operations/hooks.js +13 -0
  31. package/dist/core/operations/hooks.js.map +1 -1
  32. package/dist/core/operations/index.d.ts.map +1 -1
  33. package/dist/core/operations/index.js +34 -0
  34. package/dist/core/operations/index.js.map +1 -1
  35. package/dist/core/operations/init.d.ts +2 -0
  36. package/dist/core/operations/init.d.ts.map +1 -1
  37. package/dist/core/operations/init.js +19 -2
  38. package/dist/core/operations/init.js.map +1 -1
  39. package/dist/core/operations/lang.d.ts +9 -0
  40. package/dist/core/operations/lang.d.ts.map +1 -1
  41. package/dist/core/operations/lang.js +18 -0
  42. package/dist/core/operations/lang.js.map +1 -1
  43. package/dist/core/operations/review.d.ts +8 -0
  44. package/dist/core/operations/review.d.ts.map +1 -1
  45. package/dist/core/operations/review.js +36 -12
  46. package/dist/core/operations/review.js.map +1 -1
  47. package/dist/core/reviews/doc-resolve.d.ts +9 -3
  48. package/dist/core/reviews/doc-resolve.d.ts.map +1 -1
  49. package/dist/core/reviews/doc-resolve.js +30 -18
  50. package/dist/core/reviews/doc-resolve.js.map +1 -1
  51. package/dist/core/reviews/reconcile.d.ts.map +1 -1
  52. package/dist/core/reviews/reconcile.js +3 -4
  53. package/dist/core/reviews/reconcile.js.map +1 -1
  54. package/dist/core/reviews/staleness.d.ts +22 -0
  55. package/dist/core/reviews/staleness.d.ts.map +1 -0
  56. package/dist/core/reviews/staleness.js +78 -0
  57. package/dist/core/reviews/staleness.js.map +1 -0
  58. package/dist/core/reviews/storage.d.ts.map +1 -1
  59. package/dist/core/reviews/storage.js +38 -3
  60. package/dist/core/reviews/storage.js.map +1 -1
  61. package/dist/interfaces/cli/format/check.d.ts +3 -0
  62. package/dist/interfaces/cli/format/check.d.ts.map +1 -0
  63. package/dist/interfaces/cli/format/check.js +29 -0
  64. package/dist/interfaces/cli/format/check.js.map +1 -0
  65. package/dist/interfaces/cli/format/context.d.ts +5 -0
  66. package/dist/interfaces/cli/format/context.d.ts.map +1 -0
  67. package/dist/interfaces/cli/format/context.js +46 -0
  68. package/dist/interfaces/cli/format/context.js.map +1 -0
  69. package/dist/interfaces/cli/format/extracted.d.ts +6 -0
  70. package/dist/interfaces/cli/format/extracted.d.ts.map +1 -0
  71. package/dist/interfaces/cli/format/extracted.js +59 -0
  72. package/dist/interfaces/cli/format/extracted.js.map +1 -0
  73. package/dist/interfaces/cli/format/misc.d.ts +2 -1
  74. package/dist/interfaces/cli/format/misc.d.ts.map +1 -1
  75. package/dist/interfaces/cli/format/misc.js +8 -0
  76. package/dist/interfaces/cli/format/misc.js.map +1 -1
  77. package/dist/interfaces/cli/format/reviews.d.ts.map +1 -1
  78. package/dist/interfaces/cli/format/reviews.js +6 -2
  79. package/dist/interfaces/cli/format/reviews.js.map +1 -1
  80. package/dist/interfaces/mcp/schemas.d.ts +73 -2
  81. package/dist/interfaces/mcp/schemas.d.ts.map +1 -1
  82. package/dist/interfaces/mcp/schemas.js +71 -0
  83. package/dist/interfaces/mcp/schemas.js.map +1 -1
  84. package/dist/interfaces/mcp/server.js +63 -1
  85. package/dist/interfaces/mcp/server.js.map +1 -1
  86. package/dist/interfaces/mcp/tools/check.d.ts +4 -0
  87. package/dist/interfaces/mcp/tools/check.d.ts.map +1 -0
  88. package/dist/interfaces/mcp/tools/check.js +5 -0
  89. package/dist/interfaces/mcp/tools/check.js.map +1 -0
  90. package/dist/interfaces/mcp/tools/context.d.ts +6 -0
  91. package/dist/interfaces/mcp/tools/context.d.ts.map +1 -0
  92. package/dist/interfaces/mcp/tools/context.js +26 -0
  93. package/dist/interfaces/mcp/tools/context.js.map +1 -0
  94. package/dist/interfaces/mcp/tools/extracted.d.ts +7 -0
  95. package/dist/interfaces/mcp/tools/extracted.d.ts.map +1 -0
  96. package/dist/interfaces/mcp/tools/extracted.js +35 -0
  97. package/dist/interfaces/mcp/tools/extracted.js.map +1 -0
  98. package/dist/interfaces/sdk/index.d.ts +6 -0
  99. package/dist/interfaces/sdk/index.d.ts.map +1 -1
  100. package/dist/interfaces/sdk/index.js +6 -0
  101. package/dist/interfaces/sdk/index.js.map +1 -1
  102. package/package.json +1 -1
  103. package/scaffold/.ai-spector/.docflow/config/workspace.rules.json +13 -0
  104. package/scaffold/claude/.claude/skills/ai-spector-generate-basic-design/skill.md +18 -5
  105. package/scaffold/claude/.claude/skills/ai-spector-generate-srs/skill.md +26 -5
  106. package/scaffold/claude/CLAUDE.md +25 -2
  107. package/scaffold/cursor/WORKFLOW.md +16 -4
  108. package/scaffold/cursor/commands/_workflow.md +2 -1
  109. package/scaffold/cursor/skills/README.md +6 -1
  110. package/scaffold/cursor/skills/_skill-router.md +12 -2
  111. package/scaffold/cursor/skills/ai-spector/references/clarify.md +50 -0
  112. package/scaffold/cursor/skills/ai-spector/references/context-store.md +45 -0
  113. package/scaffold/cursor/skills/ai-spector/references/extract-specs.md +39 -0
  114. package/scaffold/cursor/skills/ai-spector/references/generate-workflow.md +38 -9
  115. package/scaffold/cursor/skills/ai-spector/references/plan-and-briefing.md +49 -0
  116. package/scaffold/cursor/skills/ai-spector/references/workspace-check.md +43 -0
  117. package/scaffold/cursor/skills/ai-spector-check/SKILL.md +30 -0
  118. package/scaffold/cursor/skills/ai-spector-generate-basic-design/SKILL.md +5 -1
  119. package/scaffold/cursor/skills/ai-spector-generate-srs/SKILL.md +5 -1
  120. package/schemas/context-store.schema.json +32 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/graph/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/graph/index.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ export { GraphSession } from "./session.js";
2
2
  export { ProjectSession, createProjectSession } from "./project.js";
3
3
  export { isKnowledgePayload, parseKnowledge, knowledgeHasDomainEntries, computeKnowledgeStats, knowledgeGraphCoverage, } from "./knowledge.js";
4
4
  export { parseSectionRegistry, findRegistryDocument, findRegistrySection, sectionHeading, sectionLabel, documentTemplate, registryDocuments, allRegistrySections, } from "./registry.js";
5
- export { parseDocflowConfig, primaryLanguage, languageCodes, } from "./config.js";
5
+ export { parseDocflowConfig, primaryLanguage, clientLanguage, languageCodes, } from "./config.js";
6
6
  export { parseProjectState, lastIndexRunAt, lastGraphMergedAt, } from "./state.js";
7
7
  export { auditGraphLayers, BUNDLE_SOURCE_ID, BUNDLE_BUSINESS_ID, } from "./layer-audit.js";
8
8
  export { normalizePatch, parseExtractPatch, simulatePatch, } from "./patch.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/graph/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAO5C,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGpE,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,yBAAyB,EACzB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AAexB,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AAOvB,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,aAAa,GACd,MAAM,aAAa,CAAC;AAOrB,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAOpB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAO1B,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,aAAa,GACd,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,2BAA2B,EAC3B,4BAA4B,EAC5B,qBAAqB,EACrB,4BAA4B,EAC5B,kBAAkB,GACnB,MAAM,wBAAwB,CAAC;AAmBhC,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EACL,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AAOrB,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,yBAAyB,EACzB,yBAAyB,EACzB,2BAA2B,EAC3B,iBAAiB,EACjB,uBAAuB,EACvB,YAAY,GACb,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,UAAU,EACV,YAAY,GACb,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/graph/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAO5C,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGpE,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,yBAAyB,EACzB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AAexB,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AAOvB,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,aAAa,GACd,MAAM,aAAa,CAAC;AAOrB,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAOpB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAO1B,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,aAAa,GACd,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,2BAA2B,EAC3B,4BAA4B,EAC5B,qBAAqB,EACrB,4BAA4B,EAC5B,kBAAkB,GACnB,MAAM,wBAAwB,CAAC;AAmBhC,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EACL,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AAOrB,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,yBAAyB,EACzB,yBAAyB,EACzB,2BAA2B,EAC3B,iBAAiB,EACjB,uBAAuB,EACvB,YAAY,GACb,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,UAAU,EACV,YAAY,GACb,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,28 @@
1
+ export type CheckSeverity = "error" | "warning";
2
+ export interface CheckFinding {
3
+ ruleId: string;
4
+ severity: CheckSeverity;
5
+ message: string;
6
+ /** Offending file or directory (relative to project root). */
7
+ path?: string;
8
+ /** Human-readable remediation hint. */
9
+ fix?: string;
10
+ /** True if `runCheck({ fix: true })` can repair it automatically. */
11
+ autoFixable?: boolean;
12
+ /** Set when --fix repaired the finding in this run. */
13
+ fixed?: boolean;
14
+ }
15
+ export interface CheckResult {
16
+ /** False when any error-severity finding remains unfixed. */
17
+ ok: boolean;
18
+ projectRoot: string;
19
+ findings: CheckFinding[];
20
+ checkedAt: string;
21
+ }
22
+ export interface CheckOptions {
23
+ root?: string;
24
+ /** Attempt to repair autoFixable findings. */
25
+ fix?: boolean;
26
+ }
27
+ export declare function runCheck(opts?: CheckOptions): Promise<CheckResult>;
28
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/core/operations/check.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,CAAC;AAEhD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,aAAa,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,uDAAuD;IACvD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,6DAA6D;IAC7D,EAAE,EAAE,OAAO,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAoDD,wBAAsB,QAAQ,CAAC,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CA+K5E"}
@@ -0,0 +1,211 @@
1
+ import { mkdir, readdir } from "node:fs/promises";
2
+ import { join, resolve } from "node:path";
3
+ import { loadDocflowConfig } from "../config/load.js";
4
+ import { pathExists, readJson } from "../util/fs.js";
5
+ const DEFAULT_RULES = [
6
+ { id: "STRUCT-001", severity: "error" },
7
+ { id: "STRUCT-002", severity: "error" },
8
+ { id: "STRUCT-003", severity: "warning" },
9
+ { id: "CFG-001", severity: "error" },
10
+ { id: "TMPL-001", severity: "warning" },
11
+ { id: "CTX-001", severity: "warning" },
12
+ { id: "GRAPH-001", severity: "warning" },
13
+ ];
14
+ async function loadRules(root) {
15
+ const cfgPath = join(root, ".ai-spector/.docflow/config/workspace.rules.json");
16
+ if (await pathExists(cfgPath)) {
17
+ try {
18
+ const loaded = await readJson(cfgPath);
19
+ if (Array.isArray(loaded.rules) && loaded.rules.length > 0) {
20
+ // Merge: config entries override defaults by id; defaults fill gaps.
21
+ const byId = new Map();
22
+ for (const r of DEFAULT_RULES)
23
+ byId.set(r.id, { ...r });
24
+ for (const r of loaded.rules)
25
+ byId.set(r.id, { ...byId.get(r.id), ...r });
26
+ return [...byId.values()];
27
+ }
28
+ }
29
+ catch {
30
+ // fall through to defaults; GRAPH/STRUCT rules still run
31
+ }
32
+ }
33
+ return DEFAULT_RULES;
34
+ }
35
+ function severityOf(rules, id, fallback) {
36
+ return rules.find((r) => r.id === id)?.severity ?? fallback;
37
+ }
38
+ function enabled(rules, id) {
39
+ const r = rules.find((x) => x.id === id);
40
+ return r ? r.enabled !== false : true;
41
+ }
42
+ export async function runCheck(opts = {}) {
43
+ const root = resolve(opts.root ?? process.cwd());
44
+ const rules = await loadRules(root);
45
+ const findings = [];
46
+ const add = (f) => findings.push(f);
47
+ const fixDir = async (rel) => {
48
+ if (!opts.fix)
49
+ return false;
50
+ await mkdir(join(root, rel), { recursive: true });
51
+ return true;
52
+ };
53
+ // Load config once for downstream rules.
54
+ let config;
55
+ let configReadable = false;
56
+ const configPath = ".ai-spector/docflow.config.json";
57
+ if (await pathExists(join(root, configPath))) {
58
+ try {
59
+ const loaded = await loadDocflowConfig(root);
60
+ config = loaded.config;
61
+ configReadable = true;
62
+ }
63
+ catch (e) {
64
+ if (enabled(rules, "STRUCT-002")) {
65
+ add({
66
+ ruleId: "STRUCT-002",
67
+ severity: severityOf(rules, "STRUCT-002", "error"),
68
+ message: `docflow.config.json is present but not parseable: ${e instanceof Error ? e.message : String(e)}`,
69
+ path: configPath,
70
+ });
71
+ }
72
+ }
73
+ }
74
+ else if (enabled(rules, "STRUCT-002")) {
75
+ add({
76
+ ruleId: "STRUCT-002",
77
+ severity: severityOf(rules, "STRUCT-002", "error"),
78
+ message: "docflow.config.json is missing — workspace is not initialized.",
79
+ path: configPath,
80
+ fix: "npx ai-spector init",
81
+ });
82
+ }
83
+ // STRUCT-001 — required directories.
84
+ if (enabled(rules, "STRUCT-001")) {
85
+ const required = ["docs/data-source", ".ai-spector/.docflow/config"];
86
+ for (const rel of required) {
87
+ if (!(await pathExists(join(root, rel)))) {
88
+ const fixed = await fixDir(rel);
89
+ add({
90
+ ruleId: "STRUCT-001",
91
+ severity: severityOf(rules, "STRUCT-001", "error"),
92
+ message: `Required directory missing: ${rel}`,
93
+ path: rel,
94
+ fix: `mkdir -p ${rel}`,
95
+ autoFixable: true,
96
+ fixed,
97
+ });
98
+ }
99
+ }
100
+ }
101
+ // CFG-001 — languages configured. Read the RAW config: loadDocflowConfig
102
+ // silently substitutes a default language for an empty array, so we must
103
+ // inspect the file as written to catch a genuinely unconfigured project.
104
+ if (enabled(rules, "CFG-001") && configReadable) {
105
+ let rawLangs;
106
+ try {
107
+ const raw = await readJson(join(root, configPath));
108
+ rawLangs = raw.languages;
109
+ }
110
+ catch {
111
+ rawLangs = undefined;
112
+ }
113
+ if (!Array.isArray(rawLangs) || rawLangs.length === 0) {
114
+ add({
115
+ ruleId: "CFG-001",
116
+ severity: severityOf(rules, "CFG-001", "error"),
117
+ message: "No output languages configured (languages[] is empty or missing).",
118
+ path: configPath,
119
+ fix: "npx ai-spector lang add <code>",
120
+ });
121
+ }
122
+ }
123
+ // STRUCT-003 — language output folders for each configured language.
124
+ if (enabled(rules, "STRUCT-003") && configReadable) {
125
+ for (const lang of config?.languages ?? []) {
126
+ const rel = `docs/srs/${lang.code}`;
127
+ if (!(await pathExists(join(root, rel)))) {
128
+ const fixed = await fixDir(rel);
129
+ add({
130
+ ruleId: "STRUCT-003",
131
+ severity: severityOf(rules, "STRUCT-003", "warning"),
132
+ message: `Output folder missing for configured language "${lang.code}": ${rel}`,
133
+ path: rel,
134
+ fix: `mkdir -p ${rel}`,
135
+ autoFixable: true,
136
+ fixed,
137
+ });
138
+ }
139
+ }
140
+ }
141
+ // TMPL-001 — templates dir present.
142
+ if (enabled(rules, "TMPL-001")) {
143
+ const rel = ".ai-spector/templates";
144
+ if (!(await pathExists(join(root, rel)))) {
145
+ add({
146
+ ruleId: "TMPL-001",
147
+ severity: severityOf(rules, "TMPL-001", "warning"),
148
+ message: "No templates directory found — generation will have no structure to follow.",
149
+ path: rel,
150
+ fix: "npx ai-spector init",
151
+ });
152
+ }
153
+ }
154
+ // CTX-001 — context store dir (created lazily; warn-only) and stale entries.
155
+ if (enabled(rules, "CTX-001")) {
156
+ const rel = ".ai-spector/.docflow/context";
157
+ if (!(await pathExists(join(root, rel)))) {
158
+ const fixed = await fixDir(rel);
159
+ add({
160
+ ruleId: "CTX-001",
161
+ severity: severityOf(rules, "CTX-001", "warning"),
162
+ message: "Context store directory does not exist yet (no clarifications recorded).",
163
+ path: rel,
164
+ autoFixable: true,
165
+ fixed,
166
+ });
167
+ }
168
+ else {
169
+ // Surface answers invalidated by source changes (flipped by `index`).
170
+ const files = (await readdir(join(root, rel)).catch(() => [])).filter((f) => f.endsWith(".json"));
171
+ for (const file of files) {
172
+ const store = await readJson(join(root, rel, file)).catch(() => undefined);
173
+ const stale = store?.entries?.filter((e) => e.status === "stale") ?? [];
174
+ if (stale.length > 0) {
175
+ const docType = store?.docType ?? file.slice(0, -".json".length);
176
+ add({
177
+ ruleId: "CTX-001",
178
+ severity: severityOf(rules, "CTX-001", "warning"),
179
+ message: `${stale.length} stale clarification(s) for "${docType}" (${stale
180
+ .map((e) => e.id)
181
+ .join(", ")}) — source files changed since they were answered.`,
182
+ path: `${rel}/${file}`,
183
+ fix: `Re-confirm with the user, then: npx ai-spector context resolve ${docType} <id> --answer "..."`,
184
+ });
185
+ }
186
+ }
187
+ }
188
+ }
189
+ // GRAPH-001 — graph.json parses (shallow; defers to `graph validate`).
190
+ if (enabled(rules, "GRAPH-001") && configReadable && config) {
191
+ const graphRel = config.paths.graph;
192
+ const graphAbs = join(root, graphRel);
193
+ if (await pathExists(graphAbs)) {
194
+ try {
195
+ await readJson(graphAbs);
196
+ }
197
+ catch (e) {
198
+ add({
199
+ ruleId: "GRAPH-001",
200
+ severity: severityOf(rules, "GRAPH-001", "warning"),
201
+ message: `graph.json is present but not parseable: ${e instanceof Error ? e.message : String(e)}`,
202
+ path: graphRel,
203
+ fix: "Re-run analyze/merge or restore from a known-good graph.",
204
+ });
205
+ }
206
+ }
207
+ }
208
+ const ok = !findings.some((f) => f.severity === "error" && !f.fixed);
209
+ return { ok, projectRoot: root, findings, checkedAt: new Date().toISOString() };
210
+ }
211
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/core/operations/check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ export type ContextEntryStatus = "open" | "answered" | "stale";
2
+ export type ContextEntrySource = "user" | "inferred" | "data-source";
3
+ export interface ContextEntry {
4
+ id: string;
5
+ question: string;
6
+ answer?: string;
7
+ status: ContextEntryStatus;
8
+ /** DAG node / section this informs, e.g. "srs.use-cases". */
9
+ scope?: string;
10
+ source: ContextEntrySource;
11
+ /** Files (relative to root) whose change makes this entry stale. */
12
+ sourceRefs?: string[];
13
+ createdAt: string;
14
+ answeredAt?: string;
15
+ answeredBy?: string;
16
+ }
17
+ export interface ContextStore {
18
+ version: number;
19
+ docType: string;
20
+ entries: ContextEntry[];
21
+ }
22
+ export interface ContextListOptions {
23
+ root?: string;
24
+ /** Doc type to list. Omit to list all stores. */
25
+ docType?: string;
26
+ status?: ContextEntryStatus;
27
+ }
28
+ export interface ContextListResult {
29
+ stores: ContextStore[];
30
+ total: number;
31
+ }
32
+ export interface ContextRecordOptions {
33
+ root?: string;
34
+ docType: string;
35
+ question: string;
36
+ /** Provide to record an already-answered clarification in one step. */
37
+ answer?: string;
38
+ scope?: string;
39
+ source?: ContextEntrySource;
40
+ sourceRefs?: string[];
41
+ answeredBy?: string;
42
+ }
43
+ export interface ContextRecordResult {
44
+ docType: string;
45
+ entry: ContextEntry;
46
+ storePath: string;
47
+ }
48
+ export interface ContextResolveOptions {
49
+ root?: string;
50
+ docType: string;
51
+ id: string;
52
+ answer: string;
53
+ answeredBy?: string;
54
+ }
55
+ export interface ContextResolveResult {
56
+ docType: string;
57
+ entry: ContextEntry;
58
+ storePath: string;
59
+ }
60
+ export interface ContextStaleScanOptions {
61
+ root?: string;
62
+ docType?: string;
63
+ }
64
+ export interface ContextStaleScanResult {
65
+ /** Doc types whose stores were scanned. */
66
+ docTypes: string[];
67
+ /** Answered entries whose sourceRefs were checked. */
68
+ checked: number;
69
+ /** Entries flipped from "answered" to "stale" in this run. */
70
+ markedStale: number;
71
+ /** Total entries currently stale (including previously stale). */
72
+ staleTotal: number;
73
+ }
74
+ export declare function contextStorePath(root: string, docType: string): string;
75
+ export declare function runContextList(opts?: ContextListOptions): Promise<ContextListResult>;
76
+ export declare function runContextRecord(opts: ContextRecordOptions): Promise<ContextRecordResult>;
77
+ /**
78
+ * Flip answered entries to "stale" when any of their sourceRefs changed on
79
+ * disk after the answer was recorded (mtime > answeredAt). A missing ref also
80
+ * counts as stale — the answer was grounded in a file that no longer exists.
81
+ */
82
+ export declare function runContextStaleScan(opts?: ContextStaleScanOptions): Promise<ContextStaleScanResult>;
83
+ export declare function runContextResolve(opts: ContextResolveOptions): Promise<ContextResolveResult>;
84
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/core/operations/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,164 @@
1
+ import { mkdir, readdir, stat } from "node:fs/promises";
2
+ import { dirname, join, resolve } from "node:path";
3
+ import { loadDocflowConfig } from "../config/load.js";
4
+ import { pathExists, readJson, writeJson } from "../util/fs.js";
5
+ // ── store IO ──────────────────────────────────────────────────────────────────
6
+ function contextDir(root) {
7
+ return join(root, ".ai-spector/.docflow/context");
8
+ }
9
+ export function contextStorePath(root, docType) {
10
+ return join(contextDir(root), `${docType}.json`);
11
+ }
12
+ async function resolveRoot(root) {
13
+ const loaded = await loadDocflowConfig(root ? resolve(root) : undefined);
14
+ return loaded.root;
15
+ }
16
+ async function loadStore(root, docType) {
17
+ const path = contextStorePath(root, docType);
18
+ if (await pathExists(path)) {
19
+ return readJson(path);
20
+ }
21
+ return { version: 1, docType, entries: [] };
22
+ }
23
+ async function saveStore(root, store) {
24
+ const path = contextStorePath(root, store.docType);
25
+ await mkdir(dirname(path), { recursive: true });
26
+ await writeJson(path, store);
27
+ return path;
28
+ }
29
+ function nextId(store) {
30
+ let max = 0;
31
+ for (const e of store.entries) {
32
+ const m = /^Q-(\d+)$/.exec(e.id);
33
+ if (m)
34
+ max = Math.max(max, Number(m[1]));
35
+ }
36
+ return `Q-${String(max + 1).padStart(3, "0")}`;
37
+ }
38
+ // ── operations ────────────────────────────────────────────────────────────────
39
+ export async function runContextList(opts = {}) {
40
+ const root = await resolveRoot(opts.root);
41
+ const dir = contextDir(root);
42
+ let docTypes = [];
43
+ if (opts.docType) {
44
+ docTypes = [opts.docType];
45
+ }
46
+ else if (await pathExists(dir)) {
47
+ docTypes = (await readdir(dir))
48
+ .filter((f) => f.endsWith(".json"))
49
+ .map((f) => f.slice(0, -".json".length));
50
+ }
51
+ const stores = [];
52
+ for (const docType of docTypes) {
53
+ const store = await loadStore(root, docType);
54
+ const entries = opts.status
55
+ ? store.entries.filter((e) => e.status === opts.status)
56
+ : store.entries;
57
+ if (opts.docType || entries.length > 0) {
58
+ stores.push({ ...store, entries });
59
+ }
60
+ }
61
+ return { stores, total: stores.reduce((n, s) => n + s.entries.length, 0) };
62
+ }
63
+ export async function runContextRecord(opts) {
64
+ if (!opts.docType)
65
+ throw new Error("docType is required");
66
+ if (!opts.question?.trim())
67
+ throw new Error("question is required");
68
+ const root = await resolveRoot(opts.root);
69
+ const store = await loadStore(root, opts.docType);
70
+ const now = new Date().toISOString();
71
+ const answered = opts.answer !== undefined && opts.answer.trim() !== "";
72
+ const entry = {
73
+ id: nextId(store),
74
+ question: opts.question.trim(),
75
+ status: answered ? "answered" : "open",
76
+ source: opts.source ?? "user",
77
+ createdAt: now,
78
+ ...(answered ? { answer: opts.answer.trim(), answeredAt: now } : {}),
79
+ ...(opts.scope ? { scope: opts.scope } : {}),
80
+ ...(opts.sourceRefs?.length ? { sourceRefs: opts.sourceRefs } : {}),
81
+ ...(answered && opts.answeredBy ? { answeredBy: opts.answeredBy } : {}),
82
+ };
83
+ store.entries.push(entry);
84
+ const storePath = await saveStore(root, store);
85
+ return { docType: opts.docType, entry, storePath };
86
+ }
87
+ /**
88
+ * Flip answered entries to "stale" when any of their sourceRefs changed on
89
+ * disk after the answer was recorded (mtime > answeredAt). A missing ref also
90
+ * counts as stale — the answer was grounded in a file that no longer exists.
91
+ */
92
+ export async function runContextStaleScan(opts = {}) {
93
+ const root = await resolveRoot(opts.root);
94
+ const dir = contextDir(root);
95
+ let docTypes = [];
96
+ if (opts.docType) {
97
+ docTypes = [opts.docType];
98
+ }
99
+ else if (await pathExists(dir)) {
100
+ docTypes = (await readdir(dir))
101
+ .filter((f) => f.endsWith(".json"))
102
+ .map((f) => f.slice(0, -".json".length));
103
+ }
104
+ let checked = 0;
105
+ let markedStale = 0;
106
+ let staleTotal = 0;
107
+ for (const docType of docTypes) {
108
+ const store = await loadStore(root, docType);
109
+ let dirty = false;
110
+ for (const entry of store.entries) {
111
+ if (entry.status === "stale") {
112
+ staleTotal++;
113
+ continue;
114
+ }
115
+ if (entry.status !== "answered" || !entry.sourceRefs?.length || !entry.answeredAt) {
116
+ continue;
117
+ }
118
+ checked++;
119
+ const answeredAtMs = Date.parse(entry.answeredAt);
120
+ let stale = false;
121
+ for (const ref of entry.sourceRefs) {
122
+ try {
123
+ const info = await stat(join(root, ref));
124
+ if (info.mtimeMs > answeredAtMs) {
125
+ stale = true;
126
+ break;
127
+ }
128
+ }
129
+ catch {
130
+ stale = true;
131
+ break;
132
+ }
133
+ }
134
+ if (stale) {
135
+ entry.status = "stale";
136
+ dirty = true;
137
+ markedStale++;
138
+ staleTotal++;
139
+ }
140
+ }
141
+ if (dirty) {
142
+ await saveStore(root, store);
143
+ }
144
+ }
145
+ return { docTypes, checked, markedStale, staleTotal };
146
+ }
147
+ export async function runContextResolve(opts) {
148
+ if (!opts.answer?.trim())
149
+ throw new Error("answer is required");
150
+ const root = await resolveRoot(opts.root);
151
+ const store = await loadStore(root, opts.docType);
152
+ const entry = store.entries.find((e) => e.id === opts.id);
153
+ if (!entry) {
154
+ throw new Error(`No context entry "${opts.id}" in store for docType "${opts.docType}"`);
155
+ }
156
+ entry.answer = opts.answer.trim();
157
+ entry.status = "answered";
158
+ entry.answeredAt = new Date().toISOString();
159
+ if (opts.answeredBy)
160
+ entry.answeredBy = opts.answeredBy;
161
+ const storePath = await saveStore(root, store);
162
+ return { docType: opts.docType, entry, storePath };
163
+ }
164
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/core/operations/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ import { type GraphMergeResult } from "./graph-merge.js";
2
+ import type { ExtractPatch } from "../graph/knowledge.js";
3
+ export type SpecStatus = "pending" | "approved" | "rejected";
4
+ export interface ExtractedSpec {
5
+ id: string;
6
+ /** Short statement of the spec (decision, constraint, identifier, threshold). */
7
+ statement: string;
8
+ /** Generated document(s) the spec was extracted from (relative paths). */
9
+ extractedFrom: string[];
10
+ status: SpecStatus;
11
+ /** Graph patch to merge on approval (nodes + edges). Optional — a spec may be informational only. */
12
+ patch?: ExtractPatch;
13
+ createdAt: string;
14
+ reviewedAt?: string;
15
+ reviewedBy?: string;
16
+ /** Reviewer note on approve/reject. */
17
+ note?: string;
18
+ }
19
+ export interface SpecStore {
20
+ version: number;
21
+ docType: string;
22
+ specs: ExtractedSpec[];
23
+ }
24
+ export interface SpecListOptions {
25
+ root?: string;
26
+ docType?: string;
27
+ status?: SpecStatus;
28
+ }
29
+ export interface SpecListResult {
30
+ stores: SpecStore[];
31
+ total: number;
32
+ }
33
+ export interface SpecRecordOptions {
34
+ root?: string;
35
+ docType: string;
36
+ specs: Array<{
37
+ statement: string;
38
+ extractedFrom: string[];
39
+ patch?: ExtractPatch;
40
+ }>;
41
+ }
42
+ export interface SpecRecordResult {
43
+ docType: string;
44
+ recorded: ExtractedSpec[];
45
+ storePath: string;
46
+ }
47
+ export interface SpecApproveOptions {
48
+ root?: string;
49
+ docType: string;
50
+ id: string;
51
+ by?: string;
52
+ note?: string;
53
+ /** Skip graph merge even when the spec has a patch (record-only approval). */
54
+ skipMerge?: boolean;
55
+ }
56
+ export interface SpecApproveResult {
57
+ docType: string;
58
+ spec: ExtractedSpec;
59
+ storePath: string;
60
+ /** Present when the spec had a patch and merge ran. */
61
+ merge?: GraphMergeResult;
62
+ }
63
+ export interface SpecRejectOptions {
64
+ root?: string;
65
+ docType: string;
66
+ id: string;
67
+ by?: string;
68
+ note?: string;
69
+ }
70
+ export interface SpecRejectResult {
71
+ docType: string;
72
+ spec: ExtractedSpec;
73
+ storePath: string;
74
+ }
75
+ export declare function specStorePath(root: string, docType: string): string;
76
+ export declare function runSpecList(opts?: SpecListOptions): Promise<SpecListResult>;
77
+ export declare function runSpecRecord(opts: SpecRecordOptions): Promise<SpecRecordResult>;
78
+ export declare function runSpecApprove(opts: SpecApproveOptions): Promise<SpecApproveResult>;
79
+ export declare function runSpecReject(opts: SpecRejectOptions): Promise<SpecRejectResult>;
80
+ //# sourceMappingURL=extracted.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extracted.d.ts","sourceRoot":"","sources":["../../../src/core/operations/extracted.ts"],"names":[],"mappings":"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"}