@interf/compiler 0.1.9 → 0.1.11

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 (101) hide show
  1. package/README.md +37 -28
  2. package/dist/commands/benchmark.d.ts.map +1 -1
  3. package/dist/commands/benchmark.js +1 -8
  4. package/dist/commands/benchmark.js.map +1 -1
  5. package/dist/commands/compile.d.ts.map +1 -1
  6. package/dist/commands/compile.js.map +1 -1
  7. package/dist/commands/create-workflow-wizard.d.ts +65 -0
  8. package/dist/commands/create-workflow-wizard.d.ts.map +1 -0
  9. package/dist/commands/create-workflow-wizard.js +299 -0
  10. package/dist/commands/create-workflow-wizard.js.map +1 -0
  11. package/dist/commands/create.d.ts +1 -37
  12. package/dist/commands/create.d.ts.map +1 -1
  13. package/dist/commands/create.js +11 -313
  14. package/dist/commands/create.js.map +1 -1
  15. package/dist/commands/init.d.ts.map +1 -1
  16. package/dist/commands/init.js +2 -1
  17. package/dist/commands/init.js.map +1 -1
  18. package/dist/commands/reset.js +3 -3
  19. package/dist/commands/reset.js.map +1 -1
  20. package/dist/commands/verify.d.ts.map +1 -1
  21. package/dist/commands/verify.js +9 -0
  22. package/dist/commands/verify.js.map +1 -1
  23. package/dist/index.d.ts +2 -2
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +1 -1
  26. package/dist/index.js.map +1 -1
  27. package/dist/lib/agent-skills.d.ts +21 -0
  28. package/dist/lib/agent-skills.d.ts.map +1 -0
  29. package/dist/lib/agent-skills.js +215 -0
  30. package/dist/lib/agent-skills.js.map +1 -0
  31. package/dist/lib/agents.d.ts +11 -13
  32. package/dist/lib/agents.d.ts.map +1 -1
  33. package/dist/lib/agents.js +12 -212
  34. package/dist/lib/agents.js.map +1 -1
  35. package/dist/lib/filesystem.d.ts +0 -1
  36. package/dist/lib/filesystem.d.ts.map +1 -1
  37. package/dist/lib/filesystem.js +0 -5
  38. package/dist/lib/filesystem.js.map +1 -1
  39. package/dist/lib/interf-bootstrap.d.ts +13 -0
  40. package/dist/lib/interf-bootstrap.d.ts.map +1 -0
  41. package/dist/lib/interf-bootstrap.js +215 -0
  42. package/dist/lib/interf-bootstrap.js.map +1 -0
  43. package/dist/lib/interf-detect.d.ts +31 -0
  44. package/dist/lib/interf-detect.d.ts.map +1 -0
  45. package/dist/lib/interf-detect.js +146 -0
  46. package/dist/lib/interf-detect.js.map +1 -0
  47. package/dist/lib/interf-scaffold.d.ts +15 -0
  48. package/dist/lib/interf-scaffold.d.ts.map +1 -0
  49. package/dist/lib/interf-scaffold.js +592 -0
  50. package/dist/lib/interf-scaffold.js.map +1 -0
  51. package/dist/lib/interf.d.ts +4 -36
  52. package/dist/lib/interf.d.ts.map +1 -1
  53. package/dist/lib/interf.js +5 -1103
  54. package/dist/lib/interf.js.map +1 -1
  55. package/dist/lib/local-workflows.d.ts +7 -0
  56. package/dist/lib/local-workflows.d.ts.map +1 -1
  57. package/dist/lib/local-workflows.js +83 -10
  58. package/dist/lib/local-workflows.js.map +1 -1
  59. package/dist/lib/obsidian.d.ts +6 -0
  60. package/dist/lib/obsidian.d.ts.map +1 -0
  61. package/dist/lib/obsidian.js +166 -0
  62. package/dist/lib/obsidian.js.map +1 -0
  63. package/dist/lib/runtime.d.ts.map +1 -1
  64. package/dist/lib/runtime.js +1 -1
  65. package/dist/lib/runtime.js.map +1 -1
  66. package/dist/lib/schema.d.ts +1 -0
  67. package/dist/lib/schema.d.ts.map +1 -1
  68. package/dist/lib/schema.js +1 -1
  69. package/dist/lib/schema.js.map +1 -1
  70. package/dist/lib/state.d.ts +2 -4
  71. package/dist/lib/state.d.ts.map +1 -1
  72. package/dist/lib/state.js +1 -1
  73. package/dist/lib/state.js.map +1 -1
  74. package/dist/lib/util.d.ts +4 -0
  75. package/dist/lib/util.d.ts.map +1 -0
  76. package/dist/lib/util.js +14 -0
  77. package/dist/lib/util.js.map +1 -0
  78. package/dist/lib/validate.js +5 -8
  79. package/dist/lib/validate.js.map +1 -1
  80. package/dist/lib/workflow-definitions.d.ts.map +1 -1
  81. package/dist/lib/workflow-definitions.js +8 -0
  82. package/dist/lib/workflow-definitions.js.map +1 -1
  83. package/dist/lib/workflow-helpers.d.ts +41 -0
  84. package/dist/lib/workflow-helpers.d.ts.map +1 -0
  85. package/dist/lib/workflow-helpers.js +189 -0
  86. package/dist/lib/workflow-helpers.js.map +1 -0
  87. package/dist/lib/workflows-interface.d.ts +79 -0
  88. package/dist/lib/workflows-interface.d.ts.map +1 -0
  89. package/dist/lib/workflows-interface.js +625 -0
  90. package/dist/lib/workflows-interface.js.map +1 -0
  91. package/dist/lib/workflows-kb.d.ts +50 -0
  92. package/dist/lib/workflows-kb.d.ts.map +1 -0
  93. package/dist/lib/workflows-kb.js +282 -0
  94. package/dist/lib/workflows-kb.js.map +1 -0
  95. package/dist/lib/workflows.d.ts +10 -114
  96. package/dist/lib/workflows.d.ts.map +1 -1
  97. package/dist/lib/workflows.js +14 -1072
  98. package/dist/lib/workflows.js.map +1 -1
  99. package/package.json +8 -3
  100. package/skills/knowledge-base/compile/references/stage-entities.md +2 -2
  101. package/templates/knowledge-base/README.md +1 -1
@@ -1,213 +1,10 @@
1
- import { existsSync, readFileSync } from "node:fs";
2
- import { join, relative } from "node:path";
3
- import { countFilesRecursive, listFilesRecursive } from "./filesystem.js";
4
- import { createKnowledgeBase as createKnowledgeBaseScaffold, createInterface as createInterfaceScaffold, detectInterf, refreshWorkspaceBootstrapGuidance, readInterfConfig, resolveInterfaceKnowledgeBasePath, resolveKnowledgeBaseSourcePath, syncClaudeBootstrap, } from "./interf.js";
5
- import { buildSummarizePlan, writeSummarizePlan } from "./summarize-plan.js";
6
- import { loadState, computeInterfaceHealth, refreshKnowledgeBaseArtifacts, refreshInterfaceArtifacts, } from "./state.js";
7
- import { buildKnowledgeBaseSummarizeContract, buildStagePrompt, markRuntimeRunFailedAfterValidation, markRuntimeRunSucceededAfterValidation, runtimeRunStdoutContains, runExecutorSummarizeStage, runExecutorStage, validateStageContractAcceptance, } from "./runtime.js";
8
- import { formatInterfaceWorkflowStageStep, formatKnowledgeBaseWorkflowStageStep, getInterfaceWorkflow, getKnowledgeBaseWorkflow, getWorkflowStagePolicyNotes, resolveInterfaceWorkflowFromConfig, resolveKnowledgeBaseWorkflowFromConfig, } from "./workflow-definitions.js";
1
+ import { createKnowledgeBase as createKnowledgeBaseScaffold, createInterface as createInterfaceScaffold, detectInterf, } from "./interf.js";
9
2
  import { validateKnowledgeBaseSummarize, validateKnowledgeBaseCompile, validateInterfaceRetrieve, validateInterfacePlan, } from "./validate.js";
10
- import { parseJsonFrontmatter } from "./parse.js";
11
- const LOCAL_SKILL_READ_LIMIT = 50;
12
- function isMarkdownDoc(filePath) {
13
- return filePath.toLowerCase().endsWith(".md");
14
- }
15
- function workflowCreateDirectory() {
16
- return "workflow/create";
17
- }
18
- function workflowQueryDirectory() {
19
- return "workflow/use/query";
20
- }
21
- function workflowCompileStageDirectory(stageDir) {
22
- return `workflow/compile/stages/${stageDir}`;
23
- }
24
- function emptyLocalSkillContractExtension() {
25
- return {
26
- reads: [],
27
- count: 0,
28
- notes: [],
29
- localMode: null,
30
- effectiveMode: "builtin",
31
- modeSources: [],
32
- };
33
- }
34
- function readLocalInstructionMode(filePath) {
35
- try {
36
- const parsed = parseJsonFrontmatter(readFileSync(filePath, "utf8"));
37
- const mode = parsed?.frontmatter.mode;
38
- return mode === "extend" || mode === "override" ? mode : null;
39
- }
40
- catch {
41
- return null;
42
- }
43
- }
44
- function collectLocalSkillDocs(rootPath, directories) {
45
- return collectLocalSkillDocsRelativeTo(rootPath, rootPath, directories);
46
- }
47
- function collectLocalSkillDocsRelativeTo(rootPath, relativeToPath, directories) {
48
- const docs = new Map();
49
- const rootReadme = join(rootPath, "workflow", "README.md");
50
- if (existsSync(rootReadme)) {
51
- const read = relative(relativeToPath, rootReadme);
52
- docs.set(read, {
53
- read,
54
- absolutePath: rootReadme,
55
- mode: readLocalInstructionMode(rootReadme),
56
- });
57
- }
58
- for (const directory of directories) {
59
- for (const filePath of listFilesRecursive(join(rootPath, directory), isMarkdownDoc)) {
60
- const read = relative(relativeToPath, filePath);
61
- docs.set(read, {
62
- read,
63
- absolutePath: filePath,
64
- mode: readLocalInstructionMode(filePath),
65
- });
66
- }
67
- }
68
- return Array.from(docs.values())
69
- .sort((a, b) => a.read.localeCompare(b.read))
70
- .slice(0, LOCAL_SKILL_READ_LIMIT);
71
- }
72
- function buildLocalSkillContractExtension(rootPath, directories, purpose) {
73
- const docs = collectLocalSkillDocs(rootPath, directories);
74
- const reads = docs.map((doc) => doc.read);
75
- const modeSources = docs.filter((doc) => doc.mode !== null).map((doc) => doc.read);
76
- const localMode = docs.some((doc) => doc.mode === "override")
77
- ? "override"
78
- : docs.some((doc) => doc.mode === "extend")
79
- ? "extend"
80
- : null;
81
- if (docs.length === 0) {
82
- return emptyLocalSkillContractExtension();
83
- }
84
- return {
85
- reads,
86
- count: reads.length,
87
- notes: [
88
- `Read any local instruction docs listed under ${directories.join(", ")} before executing the core stage.`,
89
- localMode === "override"
90
- ? `${purpose} One or more local docs declare \`mode: override\`, so their workflow instructions replace Interf's bundled stage instructions for this run. They still do not bypass coverage proof, evidence weighting, required writes, or deterministic state transitions.`
91
- : `${purpose} These local workflow docs can refine the stage, but they do not bypass coverage proof, evidence weighting, required writes, or deterministic state transitions.`,
92
- ],
93
- localMode,
94
- effectiveMode: localMode ?? "builtin",
95
- modeSources,
96
- };
97
- }
98
- function buildLocalSkillContractExtensionRelativeTo(rootPath, relativeToPath, directories, purpose) {
99
- const docs = collectLocalSkillDocsRelativeTo(rootPath, relativeToPath, directories);
100
- const reads = docs.map((doc) => doc.read);
101
- const modeSources = docs.filter((doc) => doc.mode !== null).map((doc) => doc.read);
102
- const localMode = docs.some((doc) => doc.mode === "override")
103
- ? "override"
104
- : docs.some((doc) => doc.mode === "extend")
105
- ? "extend"
106
- : null;
107
- if (docs.length === 0) {
108
- return emptyLocalSkillContractExtension();
109
- }
110
- return {
111
- reads,
112
- count: reads.length,
113
- notes: [
114
- `Read any local instruction docs listed under ${directories.join(", ")} before executing the core stage.`,
115
- localMode === "override"
116
- ? `${purpose} One or more local docs declare \`mode: override\`, so their workflow instructions replace Interf's bundled stage instructions for this run. They still do not bypass coverage proof, evidence weighting, required writes, or deterministic state transitions.`
117
- : `${purpose} These local workflow docs can refine the stage, but they do not bypass coverage proof, evidence weighting, required writes, or deterministic state transitions.`,
118
- ],
119
- localMode,
120
- effectiveMode: localMode ?? "builtin",
121
- modeSources,
122
- };
123
- }
124
- function mergeLocalSkillContractExtensions(extensions) {
125
- const reads = Array.from(new Set(extensions.flatMap((extension) => extension.reads)));
126
- const notes = Array.from(new Set(extensions.flatMap((extension) => extension.notes)));
127
- const modeSources = Array.from(new Set(extensions.flatMap((extension) => extension.modeSources)));
128
- const localMode = extensions.some((extension) => extension.localMode === "override")
129
- ? "override"
130
- : extensions.some((extension) => extension.localMode === "extend")
131
- ? "extend"
132
- : null;
133
- return {
134
- reads,
135
- count: reads.length,
136
- notes,
137
- localMode,
138
- effectiveMode: localMode ?? "builtin",
139
- modeSources,
140
- };
141
- }
142
- function buildStageInstructions(bundledSkill, localSkills) {
143
- return {
144
- bundled_skill: bundledSkill,
145
- effective_mode: localSkills.effectiveMode,
146
- local_mode: localSkills.localMode,
147
- local_docs: localSkills.reads,
148
- mode_sources: localSkills.modeSources,
149
- };
150
- }
151
- function reportLine(reporter, message) {
152
- reporter?.line?.(message);
153
- }
154
- function reportBlankLine(reporter) {
155
- reporter?.blankLine?.();
156
- }
157
- function reportValidationFailure(reporter, summary) {
158
- reportBlankLine(reporter);
159
- reportLine(reporter, summary);
160
- }
161
- function isRetrieveStageComplete(dirPath) {
162
- const validation = validateInterfaceRetrieve(dirPath);
163
- return validation.required && validation.ok;
164
- }
165
- function resolveKnowledgeBaseContext(knowledgeBasePath) {
166
- const config = readInterfConfig(knowledgeBasePath);
167
- const workflowId = resolveKnowledgeBaseWorkflowFromConfig(config);
168
- return {
169
- knowledgeBaseName: config?.name ?? "knowledge-base",
170
- sourcePath: resolveKnowledgeBaseSourcePath(knowledgeBasePath, config),
171
- workflowId,
172
- };
173
- }
174
- function resolveInterfaceContext(knowledgeBasePath) {
175
- const config = readInterfConfig(knowledgeBasePath);
176
- const workflowId = resolveInterfaceWorkflowFromConfig(config);
177
- const connectedKnowledgeBasePath = resolveInterfaceKnowledgeBasePath(knowledgeBasePath);
178
- return {
179
- knowledgeBaseName: config?.name ?? "interface",
180
- connectedKnowledgeBasePath,
181
- sourcePath: connectedKnowledgeBasePath ? resolveKnowledgeBaseSourcePath(connectedKnowledgeBasePath) : null,
182
- workflowId,
183
- };
184
- }
185
- function knowledgeBaseExecutionStages(workflowId, knowledgeBasePath) {
186
- return getKnowledgeBaseWorkflow(workflowId, { workspacePath: knowledgeBasePath }).stages;
187
- }
188
- function interfaceExecutionStages(workflowId, interfacePath) {
189
- return getInterfaceWorkflow(workflowId, { workspacePath: interfacePath }).stages;
190
- }
191
- function bundledSkillForContractType(contractType) {
192
- switch (contractType) {
193
- case "kb-file-evidence":
194
- return "knowledge-base/summarize";
195
- case "kb-knowledge-layer":
196
- return "knowledge-base/compile";
197
- case "interface-plan":
198
- return "interface/create";
199
- case "interface-retrieval":
200
- return "interface/retrieve";
201
- case "interface-analysis":
202
- return "interface/analyze";
203
- case "interface-output":
204
- return "interface/compile";
205
- default: {
206
- const exhaustiveContractType = contractType;
207
- throw new Error(`Unsupported contract type: ${exhaustiveContractType}`);
208
- }
209
- }
210
- }
3
+ // ---------------------------------------------------------------------------
4
+ // Helper re-exports (so workflows-kb / workflows-interface can stay on "./workflow-helpers.js"
5
+ // but legacy imports from "./workflows.js" keep working)
6
+ // ---------------------------------------------------------------------------
7
+ export { workflowCreateDirectory, workflowQueryDirectory, workflowCompileStageDirectory, emptyLocalSkillContractExtension, buildLocalSkillContractExtension, buildLocalSkillContractExtensionRelativeTo, mergeLocalSkillContractExtensions, buildStageInstructions, reportLine, reportBlankLine, reportValidationFailure, bundledSkillForContractType, resolveStageAcceptance, validateStageOutcome, } from "./workflow-helpers.js";
211
8
  export function detectKnowledgeBase(cwd) {
212
9
  const detected = detectInterf(cwd);
213
10
  if (!detected)
@@ -241,867 +38,12 @@ export function verifyInterfCheck(check, knowledgeBasePath) {
241
38
  }
242
39
  }
243
40
  }
244
- function resolveStageAcceptance(targetType, workflowId, stageId, sourcePath, workspacePath) {
245
- const workflow = targetType === "knowledge-base"
246
- ? getKnowledgeBaseWorkflow(workflowId, {
247
- ...(sourcePath ? { sourcePath } : {}),
248
- ...(workspacePath ? { workspacePath } : {}),
249
- })
250
- : getInterfaceWorkflow(workflowId, {
251
- ...(sourcePath ? { sourcePath } : {}),
252
- ...(workspacePath ? { workspacePath } : {}),
253
- });
254
- return workflow.stages.find((stage) => stage.id === stageId)?.acceptance;
255
- }
256
- function validateStageOutcome(dirPath, validation) {
257
- if (!validation.ok)
258
- return validation;
259
- const acceptance = validateStageContractAcceptance(dirPath);
260
- if (!acceptance.ok) {
261
- return {
262
- ok: false,
263
- summary: acceptance.summary,
264
- };
265
- }
266
- return validation;
267
- }
268
- export async function planInterface(options) {
269
- const connectedKnowledgeBasePath = resolveInterfaceKnowledgeBasePath(options.knowledgeBasePath);
270
- const interfaceWorkflow = resolveInterfaceWorkflowFromConfig(readInterfConfig(options.knowledgeBasePath));
271
- const instructions = buildStageInstructions("interface/create", mergeLocalSkillContractExtensions([
272
- connectedKnowledgeBasePath
273
- ? buildLocalSkillContractExtensionRelativeTo(connectedKnowledgeBasePath, options.knowledgeBasePath, [workflowQueryDirectory()], "Use the connected knowledge-base workflow docs as higher-level guidance only if they materially improve the interface scaffold.")
274
- : emptyLocalSkillContractExtension(),
275
- buildLocalSkillContractExtension(options.knowledgeBasePath, [workflowCreateDirectory()], "Use the interface workflow's local create docs as scaffolding heuristics only if they materially improve the interface setup."),
276
- ]));
277
- const code = await runExecutorStage({
278
- executor: options.executor,
279
- knowledgeBasePath: options.knowledgeBasePath,
280
- targetType: "interface",
281
- knowledgeBaseName: options.name,
282
- workflow: interfaceWorkflow,
283
- workflowSourcePath: connectedKnowledgeBasePath ? resolveKnowledgeBaseSourcePath(connectedKnowledgeBasePath) : undefined,
284
- stage: "create-interface",
285
- stageLabel: "Create Interface",
286
- contractType: "interface-plan",
287
- summary: `Designing the initial runtime hypothesis for the ${options.name} interface.`,
288
- contract: buildInterfaceCreateContract({
289
- name: options.name,
290
- workflow: options.workflow,
291
- useCase: options.useCase,
292
- knowledgeBaseName: options.knowledgeBaseName,
293
- knowledgeBasePath: options.knowledgeBasePath,
294
- instructions,
295
- }),
296
- buildPrompt: (contractPath) => buildStagePrompt(instructions, contractPath, [
297
- "Emit exactly one startup line: STATUS: loaded interface creation contract.",
298
- "Emit STATUS: analyzed knowledge-base when the scaffold inputs and knowledge-base evidence have been reviewed.",
299
- "Emit STATUS: wrote compile plan after interf.json and compile-plan.md are updated and AGENTS.md still preserves the scaffold router/checklist.",
300
- "Emit DONE: interface create complete when the scaffold is ready for `interf compile`.",
301
- ]),
302
- });
303
- syncClaudeBootstrap(options.knowledgeBasePath);
304
- const validation = validateInterfacePlan(options.knowledgeBasePath);
305
- const emittedDone = runtimeRunStdoutContains(options.knowledgeBasePath, "DONE: interface create complete");
306
- if (validation.ok && (code === 0 || emittedDone)) {
307
- if (code !== 0) {
308
- markRuntimeRunSucceededAfterValidation(options.knowledgeBasePath, "create-interface completed successfully.");
309
- }
310
- return {
311
- ok: true,
312
- code: 0,
313
- summary: validation.summary,
314
- };
315
- }
316
- if (!validation.ok) {
317
- markRuntimeRunFailedAfterValidation(options.knowledgeBasePath, validation.summary);
318
- }
319
- return {
320
- ok: false,
321
- code,
322
- summary: validation.summary,
323
- };
324
- }
325
- export async function runKnowledgeBaseSummarize(options) {
326
- const context = resolveKnowledgeBaseContext(options.knowledgeBasePath);
327
- const sourcePath = options.sourcePath ?? context.sourcePath;
328
- const workflowId = context.workflowId;
329
- const stageDefinition = options.stageDefinition ?? knowledgeBaseExecutionStages(workflowId, options.knowledgeBasePath)[0];
330
- const stageStatusLabel = stageDefinition.label.toLowerCase();
331
- const plan = buildSummarizePlan(sourcePath, options.knowledgeBasePath, options.fullPass ? "all" : "pending");
332
- const planPath = writeSummarizePlan(options.knowledgeBasePath, plan);
333
- const localSkills = buildLocalSkillContractExtension(options.knowledgeBasePath, [workflowCompileStageDirectory(stageDefinition.skillDir)], "Use them to refine summary structure, evidence grouping, and summarization heuristics.");
334
- const instructions = buildStageInstructions(bundledSkillForContractType(stageDefinition.contractType), localSkills);
335
- if (options.reportSummary !== false) {
336
- reportLine(options.reporter, `${plan.sourceCount} source files, ${plan.summaryCount} summarized, ${plan.targetCount} to summarize`);
337
- }
338
- if (plan.targetCount === 0) {
339
- refreshKnowledgeBaseArtifacts(options.knowledgeBasePath, { ensureViewSpec: true });
340
- const validation = validateKnowledgeBaseSummarize(options.knowledgeBasePath);
341
- if (options.reportStep !== false) {
342
- reportLine(options.reporter, `${formatKnowledgeBaseWorkflowStageStep(workflowId, stageDefinition.id, { sourcePath })} skipped (no work required)`);
343
- }
344
- if (!validation.ok) {
345
- reportValidationFailure(options.reporter, validation.summary);
346
- }
347
- return {
348
- ok: validation.ok,
349
- code: validation.ok ? 0 : 1,
350
- skipped: true,
351
- plan,
352
- };
353
- }
354
- if (options.reportStep !== false) {
355
- reportLine(options.reporter, `${formatKnowledgeBaseWorkflowStageStep(workflowId, stageDefinition.id, { sourcePath })} (${plan.targetCount} files)`);
356
- }
357
- const code = await runExecutorSummarizeStage({
358
- executor: options.executor,
359
- knowledgeBasePath: options.knowledgeBasePath,
360
- targetType: "knowledge-base",
361
- knowledgeBaseName: context.knowledgeBaseName,
362
- workflow: workflowId,
363
- workflowSourcePath: sourcePath,
364
- stage: stageDefinition.id,
365
- stageLabel: stageDefinition.label,
366
- contractType: stageDefinition.contractType,
367
- summary: `Preparing ${stageDefinition.label.toLowerCase()} for ${plan.targetCount} source files.`,
368
- contract: buildKnowledgeBaseSummarizeContract({
369
- knowledgeBaseName: context.knowledgeBaseName,
370
- targetCount: plan.targetCount,
371
- sourcePath,
372
- planPath,
373
- workflowNotes: getWorkflowStagePolicyNotes("knowledge-base", workflowId, stageDefinition.id, sourcePath, options.knowledgeBasePath),
374
- localSkillDocs: localSkills.reads,
375
- instructions,
376
- acceptance: resolveStageAcceptance("knowledge-base", workflowId, stageDefinition.id, sourcePath, options.knowledgeBasePath),
377
- }),
378
- buildPrompt: (contractPath) => buildStagePrompt(instructions, contractPath, [
379
- `Emit exactly one startup line: STATUS: loaded ${stageStatusLabel} plan ${plan.targetCount} files.`,
380
- "The CLI owns live file-count progress. Do not emit per-file progress.",
381
- "Emit STATUS: batch committed after a completed batch has been merged into summaries/ and inventory.",
382
- `Emit DONE: ${stageStatusLabel} complete ${plan.targetCount}/${plan.targetCount} when finished.`,
383
- ]),
384
- completionCheck: () => validateKnowledgeBaseSummarize(options.knowledgeBasePath).ok &&
385
- validateStageContractAcceptance(options.knowledgeBasePath).ok,
386
- startingSummaryCount: plan.summaryCount,
387
- targetCount: plan.targetCount,
388
- });
389
- if (code !== 0) {
390
- return {
391
- ok: false,
392
- code,
393
- skipped: false,
394
- plan,
395
- };
396
- }
397
- refreshKnowledgeBaseArtifacts(options.knowledgeBasePath, { ensureViewSpec: true });
398
- const validation = validateStageOutcome(options.knowledgeBasePath, validateKnowledgeBaseSummarize(options.knowledgeBasePath));
399
- if (!validation.ok) {
400
- reportValidationFailure(options.reporter, validation.summary);
401
- markRuntimeRunFailedAfterValidation(options.knowledgeBasePath, validation.summary);
402
- }
403
- return {
404
- ok: validation.ok,
405
- code: validation.ok ? 0 : 1,
406
- skipped: false,
407
- plan,
408
- };
409
- }
410
- export async function runKnowledgeBaseCompile(options) {
411
- const knowledgeBaseConfig = readInterfConfig(options.knowledgeBasePath);
412
- const knowledgeBaseName = knowledgeBaseConfig?.name ?? "knowledge-base";
413
- const workflowId = resolveKnowledgeBaseWorkflowFromConfig(knowledgeBaseConfig);
414
- const sourcePath = options.sourcePath ?? resolveKnowledgeBaseSourcePath(options.knowledgeBasePath, knowledgeBaseConfig);
415
- const stageDefinition = options.stageDefinition ?? knowledgeBaseExecutionStages(workflowId, options.knowledgeBasePath).find((stage) => stage.contractType === "kb-knowledge-layer");
416
- const stageStatusLabel = stageDefinition.label.toLowerCase();
417
- const summaryCount = countFilesRecursive(join(options.knowledgeBasePath, "summaries"));
418
- if (options.reportStep !== false) {
419
- reportBlankLine(options.reporter);
420
- reportLine(options.reporter, `${formatKnowledgeBaseWorkflowStageStep(workflowId, stageDefinition.id, { sourcePath })} (building graph)`);
421
- }
422
- const instructions = buildStageInstructions(bundledSkillForContractType(stageDefinition.contractType), buildLocalSkillContractExtension(options.knowledgeBasePath, [workflowCompileStageDirectory(stageDefinition.skillDir)], "Use them to refine knowledge-base compile behavior, entity/claim extraction, and retrieval structure."));
423
- const code = await runExecutorStage({
424
- executor: options.executor,
425
- knowledgeBasePath: options.knowledgeBasePath,
426
- targetType: "knowledge-base",
427
- knowledgeBaseName,
428
- workflow: workflowId,
429
- workflowSourcePath: sourcePath,
430
- stage: stageDefinition.id,
431
- stageLabel: stageDefinition.label,
432
- contractType: stageDefinition.contractType,
433
- summary: `Preparing ${stageDefinition.label.toLowerCase()} for ${summaryCount} summary files.`,
434
- contract: buildKnowledgeBaseCompileContract(options.knowledgeBasePath, workflowId, summaryCount, instructions, stageDefinition.id, stageDefinition.skillDir),
435
- buildPrompt: (contractPath) => buildStagePrompt(instructions, contractPath, [
436
- `Emit exactly one startup line: STATUS: loaded ${stageStatusLabel} plan ${summaryCount} summary files.`,
437
- `Emit STATUS: inventoried ${summaryCount}/${summaryCount} after the inventory pass completes.`,
438
- `Emit STATUS: read X/${summaryCount} after each deep-read batch or every 25 files, whichever comes first.`,
439
- `Emit STATUS: wrote ${stageStatusLabel} outputs after knowledge/ and home.md are updated.`,
440
- `Emit DONE: ${stageStatusLabel} complete ${summaryCount}/${summaryCount} when state and navigation are updated.`,
441
- ]),
442
- completionCheck: () => validateKnowledgeBaseCompile(options.knowledgeBasePath).ok &&
443
- validateStageContractAcceptance(options.knowledgeBasePath).ok,
444
- });
445
- if (code !== 0) {
446
- return { ok: false, code };
447
- }
448
- refreshKnowledgeBaseArtifacts(options.knowledgeBasePath, { ensureViewSpec: true });
449
- const validation = validateStageOutcome(options.knowledgeBasePath, validateKnowledgeBaseCompile(options.knowledgeBasePath));
450
- if (!validation.ok) {
451
- reportValidationFailure(options.reporter, validation.summary);
452
- markRuntimeRunFailedAfterValidation(options.knowledgeBasePath, validation.summary);
453
- }
454
- return {
455
- ok: validation.ok,
456
- code: validation.ok ? 0 : 1,
457
- };
458
- }
459
- export async function compileKnowledgeBase(options) {
460
- refreshWorkspaceBootstrapGuidance(options.knowledgeBasePath);
461
- const { sourcePath, workflowId } = resolveKnowledgeBaseContext(options.knowledgeBasePath);
462
- const stages = knowledgeBaseExecutionStages(workflowId, options.knowledgeBasePath);
463
- let summarize = {
464
- ok: true,
465
- code: 0,
466
- skipped: true,
467
- plan: buildSummarizePlan(sourcePath, options.knowledgeBasePath),
468
- };
469
- let compile = null;
470
- let evidencePassCount = 0;
471
- for (const stageDefinition of stages) {
472
- if (stageDefinition.contractType === "kb-file-evidence") {
473
- summarize = await runKnowledgeBaseSummarize({
474
- executor: options.executor,
475
- knowledgeBasePath: options.knowledgeBasePath,
476
- sourcePath,
477
- reporter: options.reporter,
478
- reportSummary: evidencePassCount === 0,
479
- reportStep: true,
480
- stageDefinition,
481
- fullPass: evidencePassCount > 0,
482
- });
483
- evidencePassCount += 1;
484
- if (!summarize.ok) {
485
- return {
486
- ok: false,
487
- summarize,
488
- compile: null,
489
- failedStage: stageDefinition.id,
490
- };
491
- }
492
- continue;
493
- }
494
- compile = await runKnowledgeBaseCompile({
495
- executor: options.executor,
496
- knowledgeBasePath: options.knowledgeBasePath,
497
- sourcePath,
498
- reporter: options.reporter,
499
- reportStep: true,
500
- stageDefinition,
501
- });
502
- if (!compile.ok) {
503
- return {
504
- ok: false,
505
- summarize,
506
- compile,
507
- failedStage: stageDefinition.id,
508
- };
509
- }
510
- }
511
- return {
512
- ok: compile?.ok ?? summarize.ok,
513
- summarize,
514
- compile,
515
- failedStage: null,
516
- };
517
- }
518
- export async function runInterfaceRetrieve(options) {
519
- const context = resolveInterfaceContext(options.knowledgeBasePath);
520
- const sourcePath = options.sourcePath ?? context.sourcePath ?? resolveKnowledgeBaseSourcePath(resolveInterfaceKnowledgeBasePath(options.knowledgeBasePath) ?? options.knowledgeBasePath);
521
- const workflowId = context.workflowId;
522
- const connectedKnowledgeBasePath = context.connectedKnowledgeBasePath;
523
- const stageDefinition = options.stageDefinition ?? interfaceExecutionStages(workflowId, options.knowledgeBasePath).find((stage) => stage.contractType === "interface-retrieval");
524
- const stageStatusLabel = stageDefinition.label.toLowerCase();
525
- const knowledgeBaseSummaryTotal = connectedKnowledgeBasePath ? countFilesRecursive(join(connectedKnowledgeBasePath, "summaries")) : 0;
526
- if (options.reportStep !== false) {
527
- reportLine(options.reporter, formatInterfaceWorkflowStageStep(workflowId, stageDefinition.id, { sourcePath }));
528
- }
529
- const instructions = buildStageInstructions(bundledSkillForContractType(stageDefinition.contractType), mergeLocalSkillContractExtensions([
530
- connectedKnowledgeBasePath
531
- ? buildLocalSkillContractExtensionRelativeTo(connectedKnowledgeBasePath, options.knowledgeBasePath, [workflowQueryDirectory()], "Use the connected knowledge-base workflow docs as higher-level knowledge-base guidance before applying interface-local retrieve rules.")
532
- : emptyLocalSkillContractExtension(),
533
- buildLocalSkillContractExtension(options.knowledgeBasePath, [workflowCompileStageDirectory(stageDefinition.skillDir)], "Use interface-local docs to refine filters, expansion heuristics, ranking, and ontology hints."),
534
- ]));
535
- const code = await runExecutorStage({
536
- executor: options.executor,
537
- knowledgeBasePath: options.knowledgeBasePath,
538
- targetType: "interface",
539
- knowledgeBaseName: context.knowledgeBaseName,
540
- workflow: workflowId,
541
- workflowSourcePath: sourcePath,
542
- stage: stageDefinition.id,
543
- stageLabel: stageDefinition.label,
544
- contractType: stageDefinition.contractType,
545
- summary: `Preparing ${stageDefinition.label.toLowerCase()} across ${knowledgeBaseSummaryTotal} knowledge-base summaries.`,
546
- contract: buildInterfaceRetrieveContract(options.knowledgeBasePath, workflowId, knowledgeBaseSummaryTotal, instructions, stageDefinition.id, stageDefinition.skillDir),
547
- buildPrompt: (contractPath) => buildStagePrompt(instructions, contractPath, [
548
- `Emit exactly one startup line: STATUS: loaded ${stageStatusLabel} plan ${knowledgeBaseSummaryTotal} summary files.`,
549
- `Emit STATUS: scanned X/${knowledgeBaseSummaryTotal} after each scan batch or every 250 files, whichever comes first.`,
550
- "Emit STATUS: reviewed A abstracts, P expansion passes after the candidate-review phase is complete.",
551
- "Emit STATUS: selected R relevant, J rejected, D delta after filters are applied and the retrieved set is finalized.",
552
- `Emit DONE: ${stageStatusLabel} complete when \`.interf/relevant.json\`, \`.interf/coverage.json\`, and \`.interf/state.json\` are updated.`,
553
- ]),
554
- completionCheck: () => isRetrieveStageComplete(options.knowledgeBasePath) &&
555
- validateStageContractAcceptance(options.knowledgeBasePath).ok,
556
- });
557
- if (code !== 0) {
558
- return {
559
- ok: false,
560
- code,
561
- knowledgeBaseSummaryTotal,
562
- relevantCount: 0,
563
- deltaCount: 0,
564
- analyzeCount: 0,
565
- };
566
- }
567
- refreshInterfaceArtifacts(options.knowledgeBasePath, { ensureViewSpec: true });
568
- const validation = validateStageOutcome(options.knowledgeBasePath, validateInterfaceRetrieve(options.knowledgeBasePath));
569
- if (!validation.ok) {
570
- reportValidationFailure(options.reporter, validation.summary);
571
- markRuntimeRunFailedAfterValidation(options.knowledgeBasePath, validation.summary);
572
- }
573
- const queryState = loadState(options.knowledgeBasePath);
574
- const relevantCount = queryState?.relevant_count ?? 0;
575
- const deltaCount = queryState?.delta_count ?? relevantCount;
576
- const analyzeCount = deltaCount > 0 ? deltaCount : relevantCount;
577
- return {
578
- ok: validation.ok,
579
- code: validation.ok ? 0 : 1,
580
- knowledgeBaseSummaryTotal,
581
- relevantCount,
582
- deltaCount,
583
- analyzeCount,
584
- };
585
- }
586
- export async function runInterfaceAnalyze(options) {
587
- const interfaceConfig = readInterfConfig(options.knowledgeBasePath);
588
- const knowledgeBaseName = interfaceConfig?.name ?? "interface";
589
- const workflowId = resolveInterfaceWorkflowFromConfig(interfaceConfig);
590
- const connectedKnowledgeBasePath = resolveInterfaceKnowledgeBasePath(options.knowledgeBasePath);
591
- const sourcePath = options.sourcePath ?? (connectedKnowledgeBasePath ? resolveKnowledgeBaseSourcePath(connectedKnowledgeBasePath) : options.knowledgeBasePath);
592
- const stageDefinition = options.stageDefinition ?? interfaceExecutionStages(workflowId, options.knowledgeBasePath).find((stage) => stage.contractType === "interface-analysis");
593
- const stageStatusLabel = stageDefinition.label.toLowerCase();
594
- const queryState = loadState(options.knowledgeBasePath);
595
- const relevantCount = queryState?.relevant_count ?? 0;
596
- const deltaCount = queryState?.delta_count ?? relevantCount;
597
- const analyzeCount = deltaCount > 0 ? deltaCount : relevantCount;
598
- if (options.reportStep !== false) {
599
- reportBlankLine(options.reporter);
600
- reportLine(options.reporter, `${formatInterfaceWorkflowStageStep(workflowId, stageDefinition.id, { sourcePath })}${analyzeCount > 0 ? ` (${analyzeCount} files)` : ""}`);
601
- }
602
- const instructions = buildStageInstructions(bundledSkillForContractType(stageDefinition.contractType), mergeLocalSkillContractExtensions([
603
- connectedKnowledgeBasePath
604
- ? buildLocalSkillContractExtensionRelativeTo(connectedKnowledgeBasePath, options.knowledgeBasePath, [workflowQueryDirectory()], "Use the connected knowledge-base workflow docs as higher-level knowledge-base guidance before applying interface-local analyze rules.")
605
- : emptyLocalSkillContractExtension(),
606
- buildLocalSkillContractExtension(options.knowledgeBasePath, [workflowCompileStageDirectory(stageDefinition.skillDir)], "Use interface-local docs to refine the interface ontology, extraction schema, and evidence grouping."),
607
- ]));
608
- const code = await runExecutorStage({
609
- executor: options.executor,
610
- knowledgeBasePath: options.knowledgeBasePath,
611
- targetType: "interface",
612
- knowledgeBaseName,
613
- workflow: workflowId,
614
- workflowSourcePath: sourcePath,
615
- stage: stageDefinition.id,
616
- stageLabel: stageDefinition.label,
617
- contractType: stageDefinition.contractType,
618
- summary: `Preparing ${stageDefinition.label.toLowerCase()} for ${analyzeCount} interface summaries.`,
619
- contract: buildInterfaceAnalyzeContract(options.knowledgeBasePath, workflowId, analyzeCount, instructions, stageDefinition.id, stageDefinition.skillDir),
620
- buildPrompt: (contractPath) => buildStagePrompt(instructions, contractPath, [
621
- `Emit exactly one startup line: STATUS: loaded ${stageStatusLabel} plan ${analyzeCount} files.`,
622
- `Emit STATUS: analyzed X/${analyzeCount} after each batch or every 25 files, whichever comes first.`,
623
- `Emit STATUS: wrote ${stageStatusLabel} outputs after \`.interf/analysis.json\` is updated.`,
624
- `Emit DONE: ${stageStatusLabel} complete when state reflects the finished extraction pass.`,
625
- ]),
626
- completionCheck: () => {
627
- const state = loadState(options.knowledgeBasePath);
628
- return Boolean(state?.analyze_complete &&
629
- existsSync(join(options.knowledgeBasePath, ".interf", "analysis.json")) &&
630
- validateStageContractAcceptance(options.knowledgeBasePath).ok);
631
- },
632
- });
633
- if (code === 0) {
634
- refreshInterfaceArtifacts(options.knowledgeBasePath, { ensureViewSpec: true });
635
- }
636
- const acceptance = code === 0
637
- ? validateStageContractAcceptance(options.knowledgeBasePath)
638
- : { ok: false, summary: "Stage execution failed before acceptance validation." };
639
- if (code === 0 && !acceptance.ok) {
640
- reportValidationFailure(options.reporter, acceptance.summary);
641
- markRuntimeRunFailedAfterValidation(options.knowledgeBasePath, acceptance.summary);
642
- }
643
- return {
644
- ok: code === 0 && acceptance.ok,
645
- code: code === 0 && acceptance.ok ? 0 : 1,
646
- relevantCount,
647
- deltaCount,
648
- analyzeCount,
649
- };
650
- }
651
- export async function runInterfaceCompileStage(options) {
652
- const interfaceConfig = readInterfConfig(options.knowledgeBasePath);
653
- const knowledgeBaseName = interfaceConfig?.name ?? "interface";
654
- const workflowId = resolveInterfaceWorkflowFromConfig(interfaceConfig);
655
- const connectedKnowledgeBasePath = resolveInterfaceKnowledgeBasePath(options.knowledgeBasePath);
656
- const sourcePath = options.sourcePath ?? (connectedKnowledgeBasePath ? resolveKnowledgeBaseSourcePath(connectedKnowledgeBasePath) : options.knowledgeBasePath);
657
- const stageDefinition = options.stageDefinition ?? interfaceExecutionStages(workflowId, options.knowledgeBasePath).find((stage) => stage.contractType === "interface-output");
658
- const stageStatusLabel = stageDefinition.label.toLowerCase();
659
- const relevantCount = loadState(options.knowledgeBasePath)?.relevant_count ?? 0;
660
- if (options.reportStep !== false) {
661
- reportBlankLine(options.reporter);
662
- reportLine(options.reporter, formatInterfaceWorkflowStageStep(workflowId, stageDefinition.id, { sourcePath }));
663
- }
664
- const instructions = buildStageInstructions(bundledSkillForContractType(stageDefinition.contractType), mergeLocalSkillContractExtensions([
665
- connectedKnowledgeBasePath
666
- ? buildLocalSkillContractExtensionRelativeTo(connectedKnowledgeBasePath, options.knowledgeBasePath, [workflowQueryDirectory()], "Use the connected knowledge-base workflow docs as higher-level knowledge-base guidance before applying interface-local compile rules.")
667
- : emptyLocalSkillContractExtension(),
668
- buildLocalSkillContractExtension(options.knowledgeBasePath, [workflowCompileStageDirectory(stageDefinition.skillDir)], "Use interface-local docs to refine the output inventory, navigation, canvases, and final interface shape."),
669
- ]));
670
- const code = await runExecutorStage({
671
- executor: options.executor,
672
- knowledgeBasePath: options.knowledgeBasePath,
673
- targetType: "interface",
674
- knowledgeBaseName,
675
- workflow: workflowId,
676
- workflowSourcePath: sourcePath,
677
- stage: stageDefinition.id,
678
- stageLabel: stageDefinition.label,
679
- contractType: stageDefinition.contractType,
680
- summary: `Preparing ${stageDefinition.label.toLowerCase()} from ${relevantCount} relevant files.`,
681
- contract: buildInterfaceCompileContract(options.knowledgeBasePath, workflowId, relevantCount, instructions, stageDefinition.id, stageDefinition.skillDir),
682
- buildPrompt: (contractPath) => buildStagePrompt(instructions, contractPath, [
683
- `Emit exactly one startup line: STATUS: loaded ${stageStatusLabel} plan ${relevantCount} relevant files.`,
684
- "Emit STATUS: wrote entities X after the entity pass completes.",
685
- "Emit STATUS: wrote claims Y after the claim pass completes.",
686
- `Emit STATUS: wrote ${stageStatusLabel} outputs after local notes and home.md are updated.`,
687
- `Emit DONE: ${stageStatusLabel} complete when state is updated and temporary analysis artifacts are cleaned up.`,
688
- ]),
689
- completionCheck: () => computeInterfaceHealth(options.knowledgeBasePath).status === "compiled" &&
690
- validateStageContractAcceptance(options.knowledgeBasePath).ok,
691
- });
692
- if (code === 0) {
693
- refreshInterfaceArtifacts(options.knowledgeBasePath, { ensureViewSpec: true });
694
- }
695
- const acceptance = code === 0
696
- ? validateStageContractAcceptance(options.knowledgeBasePath)
697
- : { ok: false, summary: "Stage execution failed before acceptance validation." };
698
- if (code === 0 && !acceptance.ok) {
699
- reportValidationFailure(options.reporter, acceptance.summary);
700
- markRuntimeRunFailedAfterValidation(options.knowledgeBasePath, acceptance.summary);
701
- }
702
- return {
703
- ok: code === 0 && acceptance.ok,
704
- code: code === 0 && acceptance.ok ? 0 : 1,
705
- relevantCount,
706
- };
707
- }
708
- export async function compileInterface(options) {
709
- refreshWorkspaceBootstrapGuidance(options.knowledgeBasePath);
710
- const context = resolveInterfaceContext(options.knowledgeBasePath);
711
- const sourcePath = context.sourcePath ?? (context.connectedKnowledgeBasePath ? resolveKnowledgeBaseSourcePath(context.connectedKnowledgeBasePath) : options.knowledgeBasePath);
712
- const stages = interfaceExecutionStages(context.workflowId, options.knowledgeBasePath);
713
- let retrieve = {
714
- ok: true,
715
- code: 0,
716
- knowledgeBaseSummaryTotal: 0,
717
- relevantCount: 0,
718
- deltaCount: 0,
719
- analyzeCount: 0,
720
- };
721
- let analyze = null;
722
- let compile = null;
723
- for (const stageDefinition of stages) {
724
- if (stageDefinition.contractType === "interface-retrieval") {
725
- retrieve = await runInterfaceRetrieve({
726
- executor: options.executor,
727
- knowledgeBasePath: options.knowledgeBasePath,
728
- sourcePath,
729
- reporter: options.reporter,
730
- reportStep: true,
731
- stageDefinition,
732
- });
733
- if (!retrieve.ok) {
734
- return {
735
- ok: false,
736
- retrieve,
737
- analyze: null,
738
- compile: null,
739
- failedStage: stageDefinition.id,
740
- };
741
- }
742
- continue;
743
- }
744
- if (stageDefinition.contractType === "interface-analysis") {
745
- analyze = await runInterfaceAnalyze({
746
- executor: options.executor,
747
- knowledgeBasePath: options.knowledgeBasePath,
748
- sourcePath,
749
- reporter: options.reporter,
750
- reportStep: true,
751
- stageDefinition,
752
- });
753
- if (!analyze.ok) {
754
- return {
755
- ok: false,
756
- retrieve,
757
- analyze,
758
- compile: null,
759
- failedStage: stageDefinition.id,
760
- };
761
- }
762
- continue;
763
- }
764
- compile = await runInterfaceCompileStage({
765
- executor: options.executor,
766
- knowledgeBasePath: options.knowledgeBasePath,
767
- sourcePath,
768
- reporter: options.reporter,
769
- reportStep: true,
770
- stageDefinition,
771
- });
772
- if (!compile.ok) {
773
- return {
774
- ok: false,
775
- retrieve,
776
- analyze,
777
- compile,
778
- failedStage: stageDefinition.id,
779
- };
780
- }
781
- }
782
- return {
783
- ok: compile?.ok ?? analyze?.ok ?? retrieve.ok,
784
- retrieve,
785
- analyze,
786
- compile,
787
- failedStage: null,
788
- };
789
- }
790
- function buildInterfaceCreateContract(options) {
791
- const connectedKnowledgeBasePath = resolveInterfaceKnowledgeBasePath(options.knowledgeBasePath);
792
- const workflowSourcePath = connectedKnowledgeBasePath
793
- ? resolveKnowledgeBaseSourcePath(connectedKnowledgeBasePath)
794
- : undefined;
795
- const workflow = getInterfaceWorkflow(options.workflow, {
796
- sourcePath: workflowSourcePath,
797
- workspacePath: options.knowledgeBasePath,
798
- });
799
- const localSkills = mergeLocalSkillContractExtensions([
800
- connectedKnowledgeBasePath
801
- ? buildLocalSkillContractExtensionRelativeTo(connectedKnowledgeBasePath, options.knowledgeBasePath, [workflowQueryDirectory()], "Use the connected knowledge-base workflow docs as higher-level knowledge-base guidance only if they materially improve the interface scaffold.")
802
- : emptyLocalSkillContractExtension(),
803
- buildLocalSkillContractExtension(options.knowledgeBasePath, [workflowCreateDirectory()], "Use the interface workflow's local create docs as scaffolding heuristics only if they materially improve the interface setup."),
804
- ]);
805
- return {
806
- instructions: options.instructions,
807
- counts: {
808
- workflow_selected: 1,
809
- local_skill_docs: localSkills.count,
810
- },
811
- artifacts: {
812
- reads: [
813
- "AGENTS.md",
814
- "home.md",
815
- "../../AGENTS.md",
816
- "../../interf.json",
817
- "../../home.md",
818
- "../../knowledge/",
819
- "../../summaries/",
820
- ...localSkills.reads,
821
- ],
822
- writes: [
823
- "interf.json",
824
- "compile-plan.md",
825
- "AGENTS.md",
826
- "CLAUDE.md",
827
- ],
828
- verifies: [
829
- "interf verify interface-plan --json",
830
- ],
831
- },
832
- policies: {
833
- execution_mode: "deterministic",
834
- status_prefixes: ["STATUS:", "DONE:", "BLOCKED:", "ERROR:"],
835
- notes: [
836
- `Interface name: ${options.name}.`,
837
- `Selected workflow: ${workflow.id} (${workflow.label}).`,
838
- `Workflow stages: ${workflow.stages.map((stage) => `${stage.label} [${stage.id}]`).join(" -> ")}.`,
839
- `Use case: ${options.useCase}.`,
840
- `Connected knowledge-base: ${options.knowledgeBaseName} at ${connectedKnowledgeBasePath ?? "unknown"}.`,
841
- "The scaffold already exists with home.md, AGENTS.md, CLAUDE.md, interf.json, and the .interf runtime artifacts.",
842
- "Read the current local AGENTS.md and home.md first. They are the interface workspace bootstrap you are updating.",
843
- "Then consult ../../AGENTS.md and ../../home.md for parent knowledge-base navigation and evidence structure.",
844
- "This interface lives inside the parent knowledgeBase. Do not assume it will be opened as a standalone Obsidian vault.",
845
- "Do not recreate the vault or ask follow-up questions.",
846
- "Use the selected workflow as the starting point, then adapt it to the knowledge-base data and the use case.",
847
- "Edit the existing compile-plan.md scaffold in place. Preserve the stage headings and required subsection labels from the starter plan; refine the bullets and narrative instead of replacing the structure.",
848
- "Preserve the existing AGENTS.md scaffold sections, especially the manual access checklist, raw-source gate, and navigation/router guidance. Update only the interface-specific description and lines that must reflect the use case.",
849
- "Do not replace AGENTS.md with a shorter template.",
850
- "Analyze the knowledge-base and update only the interface definition files in this vault: interf.json, compile-plan.md, and AGENTS.md. CLAUDE.md is a generated mirror of AGENTS.md and will be rewritten by the harness.",
851
- ...localSkills.notes,
852
- ],
853
- },
854
- };
855
- }
856
- function buildKnowledgeBaseCompileContract(knowledgeBasePath, workflowId, summaryCount, instructions, stageId = "compile", stageSkillDir = "compile") {
857
- const sourcePath = resolveKnowledgeBaseSourcePath(knowledgeBasePath);
858
- const acceptance = resolveStageAcceptance("knowledge-base", workflowId, stageId, sourcePath, knowledgeBasePath);
859
- const localSkills = buildLocalSkillContractExtension(knowledgeBasePath, [workflowCompileStageDirectory(stageSkillDir)], "Use them to refine knowledge-base compile behavior, entity/claim extraction, and retrieval structure.");
860
- return {
861
- instructions,
862
- counts: {
863
- summary_total: summaryCount,
864
- local_skill_docs: localSkills.count,
865
- },
866
- ...(acceptance ? { acceptance } : {}),
867
- artifacts: {
868
- reads: [
869
- "AGENTS.md",
870
- "home.md",
871
- "interf.json",
872
- ".interf/state.json",
873
- "summaries/",
874
- ...localSkills.reads,
875
- ],
876
- writes: [
877
- ".interf/inventory.json",
878
- "knowledge/entities/",
879
- "knowledge/claims/",
880
- "knowledge/indexes/",
881
- "home.md",
882
- ".interf/state.json",
883
- ".interf/health.json",
884
- ],
885
- verifies: [
886
- "interf verify compile --json",
887
- ],
888
- },
889
- policies: {
890
- execution_mode: "deterministic",
891
- status_prefixes: ["STATUS:", "DONE:", "BLOCKED:", "ERROR:"],
892
- notes: [
893
- "Read `AGENTS.md` first for workspace navigation, evidence expectations, and command usage.",
894
- "Build or refresh `.interf/inventory.json` first, then use it as the progress ledger for the rest of the run.",
895
- "This stage is the knowledge-base compile pass. Treat synthesis outputs as evidence objects, not final truth.",
896
- "Use a multi-pass approach: inventory -> local evidence reading -> canonicalization -> retrieval optimization.",
897
- "Build retrieval-oriented outputs: canonical entities, cross-file claims, timelines, themes, and navigation indexes that make interface retrieval easier later.",
898
- "Write structured knowledge outputs under `knowledge/entities/`, `knowledge/claims/`, and `knowledge/indexes/`.",
899
- "Do not collapse the knowledge-base knowledge layer into flat files like `knowledge/entities.md` or `knowledge/claims.md`.",
900
- ...getWorkflowStagePolicyNotes("knowledge-base", workflowId, stageId, sourcePath, knowledgeBasePath),
901
- ...localSkills.notes,
902
- ],
903
- evidence_weighting: {
904
- required_fields: ["source_kind", "evidence_tier", "truth_mode", "state"],
905
- preserve_tiers: true,
906
- },
907
- working_set: {
908
- target_context_fraction: 0.4,
909
- strategy: "Batch summary reads into bounded working sets, then canonicalize and optimize retrieval in multiple passes.",
910
- },
911
- },
912
- };
913
- }
914
- function buildInterfaceRetrieveContract(interfacePath, workflowId, summaryCount, instructions, stageId = "retrieve", stageSkillDir = "retrieve") {
915
- const connectedKnowledgeBasePath = resolveInterfaceKnowledgeBasePath(interfacePath);
916
- const sourcePath = connectedKnowledgeBasePath ? resolveKnowledgeBaseSourcePath(connectedKnowledgeBasePath) : undefined;
917
- const acceptance = resolveStageAcceptance("interface", workflowId, stageId, sourcePath, interfacePath);
918
- const localSkills = mergeLocalSkillContractExtensions([
919
- connectedKnowledgeBasePath
920
- ? buildLocalSkillContractExtensionRelativeTo(connectedKnowledgeBasePath, interfacePath, [workflowQueryDirectory()], "Use the connected knowledge-base workflow docs as higher-level knowledge-base guidance before applying interface-local retrieve rules.")
921
- : emptyLocalSkillContractExtension(),
922
- buildLocalSkillContractExtension(interfacePath, [workflowCompileStageDirectory(stageSkillDir)], "Use interface-local docs to refine filters, expansion heuristics, ranking, and ontology hints."),
923
- ]);
924
- return {
925
- instructions,
926
- counts: {
927
- knowledge_base_summary_total: summaryCount,
928
- local_skill_docs: localSkills.count,
929
- },
930
- ...(acceptance ? { acceptance } : {}),
931
- artifacts: {
932
- reads: [
933
- "AGENTS.md",
934
- "home.md",
935
- "../../AGENTS.md",
936
- "../../home.md",
937
- "interf.json",
938
- "compile-plan.md",
939
- "../../.interf/source-access.json",
940
- "../../summaries/",
941
- ".interf/state.json",
942
- ...localSkills.reads,
943
- ],
944
- writes: [
945
- ".interf/relevant.json",
946
- ".interf/coverage.json",
947
- ".interf/state.json",
948
- ".interf/health.json",
949
- ],
950
- verifies: [
951
- "interf verify retrieve --json",
952
- ],
953
- },
954
- policies: {
955
- execution_mode: "deterministic",
956
- status_prefixes: ["STATUS:", "DONE:", "BLOCKED:", "ERROR:"],
957
- notes: [
958
- "Read local `AGENTS.md` first, then consult parent knowledge-base `../../AGENTS.md` and `../../home.md` before considering raw-source fallback.",
959
- "Access hierarchy for this stage is: local interface artifacts -> parent knowledge-base artifacts -> raw source files only when needed.",
960
- "Treat the interface runtime in compile-plan.md as an initial hypothesis, not a final truth.",
961
- "Scan ALL knowledge-base summaries frontmatter before making any selection.",
962
- "Review abstracts for the candidate set, expand through linked summaries when needed, and stop only when the retrieved set is coverage-complete for this interface.",
963
- "Selection quality is judged by the proof of reviewed, retrieved, and excluded files, not by superficial brevity.",
964
- "If you need raw-file fallback, inspect `../../.interf/source-access.json` first and verify one suggested path is readable. These are canonical absolute source-file paths shared by the parent knowledge base. If they are not reachable, continue from knowledge-base summaries and report that raw fallback was unavailable.",
965
- ...getWorkflowStagePolicyNotes("interface", workflowId, stageId, sourcePath, interfacePath),
966
- ...localSkills.notes,
967
- ],
968
- evidence_weighting: {
969
- required_fields: ["source_kind", "evidence_tier", "truth_mode", "state"],
970
- preserve_tiers: true,
971
- },
972
- working_set: {
973
- target_context_fraction: 0.15,
974
- strategy: "Frontmatter scan first, then abstract review, then linked expansion only where coverage proof requires it.",
975
- },
976
- },
977
- };
978
- }
979
- function buildInterfaceAnalyzeContract(interfacePath, workflowId, analyzeCount, instructions, stageId = "analyze", stageSkillDir = "analyze") {
980
- const connectedKnowledgeBasePath = resolveInterfaceKnowledgeBasePath(interfacePath);
981
- const sourcePath = connectedKnowledgeBasePath ? resolveKnowledgeBaseSourcePath(connectedKnowledgeBasePath) : undefined;
982
- const acceptance = resolveStageAcceptance("interface", workflowId, stageId, sourcePath, interfacePath);
983
- const localSkills = mergeLocalSkillContractExtensions([
984
- connectedKnowledgeBasePath
985
- ? buildLocalSkillContractExtensionRelativeTo(connectedKnowledgeBasePath, interfacePath, [workflowQueryDirectory()], "Use the connected knowledge-base workflow docs as higher-level knowledge-base guidance before applying interface-local analyze rules.")
986
- : emptyLocalSkillContractExtension(),
987
- buildLocalSkillContractExtension(interfacePath, [workflowCompileStageDirectory(stageSkillDir)], "Use interface-local docs to refine the interface ontology, extraction schema, and evidence grouping."),
988
- ]);
989
- return {
990
- instructions,
991
- counts: {
992
- relevant_total: analyzeCount,
993
- local_skill_docs: localSkills.count,
994
- },
995
- ...(acceptance ? { acceptance } : {}),
996
- artifacts: {
997
- reads: [
998
- "AGENTS.md",
999
- "home.md",
1000
- "../../AGENTS.md",
1001
- "../../home.md",
1002
- "interf.json",
1003
- "compile-plan.md",
1004
- ".interf/relevant.json",
1005
- "../../.interf/source-access.json",
1006
- "../../summaries/",
1007
- ".interf/state.json",
1008
- ...localSkills.reads,
1009
- ],
1010
- writes: [
1011
- ".interf/analysis.json",
1012
- ".interf/state.json",
1013
- ".interf/health.json",
1014
- ],
1015
- verifies: [],
1016
- },
1017
- policies: {
1018
- execution_mode: "deterministic",
1019
- status_prefixes: ["STATUS:", "DONE:", "BLOCKED:", "ERROR:"],
1020
- notes: [
1021
- "Read local `AGENTS.md` first, then consult parent knowledge-base `../../AGENTS.md` and `../../home.md` before considering raw-source fallback.",
1022
- "Access hierarchy for this stage is: local interface artifacts -> parent knowledge-base artifacts -> raw source files only when needed.",
1023
- "This is the deep extraction pass over the relevant set selected by retrieve.",
1024
- "Refine the interface runtime from evidence when the knowledge base clearly demands it.",
1025
- "Keep extraction local to the interface ontology and output goals.",
1026
- "If you need raw-file fallback, inspect `../../.interf/source-access.json` first and verify one suggested path is readable. These are canonical absolute source-file paths shared by the parent knowledge base. If they are not reachable, continue from knowledge-base summaries and report that raw fallback was unavailable.",
1027
- ...getWorkflowStagePolicyNotes("interface", workflowId, stageId, sourcePath, interfacePath),
1028
- ...localSkills.notes,
1029
- ],
1030
- evidence_weighting: {
1031
- required_fields: ["source_kind", "evidence_tier", "truth_mode", "state"],
1032
- preserve_tiers: true,
1033
- },
1034
- working_set: {
1035
- target_context_fraction: 0.3,
1036
- strategy: "Batch relevant summaries into bounded sets, derive local entities/claims, then merge before writing analysis artifacts.",
1037
- },
1038
- },
1039
- };
1040
- }
1041
- function buildInterfaceCompileContract(interfacePath, workflowId, relevantCount, instructions, stageId = "compile", stageSkillDir = "compile") {
1042
- const connectedKnowledgeBasePath = resolveInterfaceKnowledgeBasePath(interfacePath);
1043
- const sourcePath = connectedKnowledgeBasePath ? resolveKnowledgeBaseSourcePath(connectedKnowledgeBasePath) : undefined;
1044
- const acceptance = resolveStageAcceptance("interface", workflowId, stageId, sourcePath, interfacePath);
1045
- const localSkills = mergeLocalSkillContractExtensions([
1046
- connectedKnowledgeBasePath
1047
- ? buildLocalSkillContractExtensionRelativeTo(connectedKnowledgeBasePath, interfacePath, [workflowQueryDirectory()], "Use the connected knowledge-base workflow docs as higher-level knowledge-base guidance before applying interface-local compile rules.")
1048
- : emptyLocalSkillContractExtension(),
1049
- buildLocalSkillContractExtension(interfacePath, [workflowCompileStageDirectory(stageSkillDir)], "Use interface-local docs to refine the output inventory, navigation, canvases, and final interface shape."),
1050
- ]);
1051
- return {
1052
- instructions,
1053
- counts: {
1054
- relevant_total: relevantCount,
1055
- local_skill_docs: localSkills.count,
1056
- },
1057
- ...(acceptance ? { acceptance } : {}),
1058
- artifacts: {
1059
- reads: [
1060
- "AGENTS.md",
1061
- "home.md",
1062
- "../../AGENTS.md",
1063
- "../../home.md",
1064
- "interf.json",
1065
- "compile-plan.md",
1066
- ".interf/analysis.json",
1067
- ".interf/relevant.json",
1068
- "../../.interf/source-access.json",
1069
- "../../summaries/",
1070
- ...localSkills.reads,
1071
- ],
1072
- writes: [
1073
- "knowledge/",
1074
- "briefs/",
1075
- "summaries/",
1076
- "home.md",
1077
- ".interf/state.json",
1078
- ".interf/health.json",
1079
- ],
1080
- verifies: [],
1081
- },
1082
- policies: {
1083
- execution_mode: "deterministic",
1084
- status_prefixes: ["STATUS:", "DONE:", "BLOCKED:", "ERROR:"],
1085
- notes: [
1086
- "Read local `AGENTS.md` first, then consult parent knowledge-base `../../AGENTS.md` and `../../home.md` before considering raw-source fallback.",
1087
- "Access hierarchy for this stage is: local interface artifacts -> parent knowledge-base artifacts -> raw source files only when needed.",
1088
- "The interface is a local context shell for agents. Build it so an agent can navigate AGENTS.md -> home.md -> local knowledge/briefs/summaries -> knowledge-base summaries -> raw only when needed.",
1089
- "When local outputs cite knowledge-base evidence, point to the parent knowledge-base summary path `../../summaries/...`, not the interface-local `summaries/` folder.",
1090
- "Prefer durable local notes and indexes over monolithic summaries.",
1091
- "Delete stale analysis handoff artifacts once durable outputs and state have been written.",
1092
- "If you need raw-file fallback, inspect `../../.interf/source-access.json` first and verify one suggested path is readable. These are canonical absolute source-file paths shared by the parent knowledge base. If they are not reachable, continue from knowledge-base summaries and report that raw fallback was unavailable.",
1093
- ...getWorkflowStagePolicyNotes("interface", workflowId, stageId, sourcePath, interfacePath),
1094
- ...localSkills.notes,
1095
- ],
1096
- evidence_weighting: {
1097
- required_fields: ["source_kind", "evidence_tier", "truth_mode", "state"],
1098
- preserve_tiers: true,
1099
- },
1100
- working_set: {
1101
- target_context_fraction: 0.25,
1102
- strategy: "Use analysis artifacts as the compile ledger, then write entities, claims, briefs, and navigation in separate local passes.",
1103
- },
1104
- },
1105
- };
1106
- }
41
+ // ---------------------------------------------------------------------------
42
+ // Re-exports KB orchestration
43
+ // ---------------------------------------------------------------------------
44
+ export { runKnowledgeBaseSummarize, runKnowledgeBaseCompile, compileKnowledgeBase, } from "./workflows-kb.js";
45
+ // ---------------------------------------------------------------------------
46
+ // Re-exports — Interface orchestration
47
+ // ---------------------------------------------------------------------------
48
+ export { planInterface, runInterfaceRetrieve, runInterfaceAnalyze, runInterfaceCompileStage, compileInterface, } from "./workflows-interface.js";
1107
49
  //# sourceMappingURL=workflows.js.map