engimcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/LICENSE +21 -0
  3. package/README.md +345 -0
  4. package/dist/audit/auditLog.d.ts +9 -0
  5. package/dist/audit/auditLog.js +20 -0
  6. package/dist/audit/auditLog.js.map +1 -0
  7. package/dist/bom/bomService.d.ts +23 -0
  8. package/dist/bom/bomService.js +44 -0
  9. package/dist/bom/bomService.js.map +1 -0
  10. package/dist/config/projectConfig.d.ts +16 -0
  11. package/dist/config/projectConfig.js +16 -0
  12. package/dist/config/projectConfig.js.map +1 -0
  13. package/dist/config/schema.d.ts +16 -0
  14. package/dist/config/schema.js +21 -0
  15. package/dist/config/schema.js.map +1 -0
  16. package/dist/context/contextPack.d.ts +31 -0
  17. package/dist/context/contextPack.js +142 -0
  18. package/dist/context/contextPack.js.map +1 -0
  19. package/dist/context/tokenBudget.d.ts +1 -0
  20. package/dist/context/tokenBudget.js +4 -0
  21. package/dist/context/tokenBudget.js.map +1 -0
  22. package/dist/decisions/decisionService.d.ts +21 -0
  23. package/dist/decisions/decisionService.js +62 -0
  24. package/dist/decisions/decisionService.js.map +1 -0
  25. package/dist/dev/smokeProjectStatus.d.ts +1 -0
  26. package/dist/dev/smokeProjectStatus.js +9 -0
  27. package/dist/dev/smokeProjectStatus.js.map +1 -0
  28. package/dist/documents/documentService.d.ts +83 -0
  29. package/dist/documents/documentService.js +371 -0
  30. package/dist/documents/documentService.js.map +1 -0
  31. package/dist/documents/frontmatter.d.ts +14 -0
  32. package/dist/documents/frontmatter.js +30 -0
  33. package/dist/documents/frontmatter.js.map +1 -0
  34. package/dist/documents/headings.d.ts +6 -0
  35. package/dist/documents/headings.js +15 -0
  36. package/dist/documents/headings.js.map +1 -0
  37. package/dist/documents/markdownParser.d.ts +2 -0
  38. package/dist/documents/markdownParser.js +3 -0
  39. package/dist/documents/markdownParser.js.map +1 -0
  40. package/dist/documents/sectionPatch.d.ts +7 -0
  41. package/dist/documents/sectionPatch.js +73 -0
  42. package/dist/documents/sectionPatch.js.map +1 -0
  43. package/dist/documents/templates.d.ts +1 -0
  44. package/dist/documents/templates.js +62 -0
  45. package/dist/documents/templates.js.map +1 -0
  46. package/dist/filesystem/filesystemService.d.ts +168 -0
  47. package/dist/filesystem/filesystemService.js +606 -0
  48. package/dist/filesystem/filesystemService.js.map +1 -0
  49. package/dist/git/gitAdapter.d.ts +25 -0
  50. package/dist/git/gitAdapter.js +99 -0
  51. package/dist/git/gitAdapter.js.map +1 -0
  52. package/dist/graph/graphBuilder.d.ts +27 -0
  53. package/dist/graph/graphBuilder.js +126 -0
  54. package/dist/graph/graphBuilder.js.map +1 -0
  55. package/dist/graph/impact.d.ts +18 -0
  56. package/dist/graph/impact.js +53 -0
  57. package/dist/graph/impact.js.map +1 -0
  58. package/dist/graph/relations.d.ts +7 -0
  59. package/dist/graph/relations.js +28 -0
  60. package/dist/graph/relations.js.map +1 -0
  61. package/dist/index.d.ts +2 -0
  62. package/dist/index.js +16 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/mcp/errors.d.ts +5 -0
  65. package/dist/mcp/errors.js +11 -0
  66. package/dist/mcp/errors.js.map +1 -0
  67. package/dist/mcp/prompts.d.ts +2 -0
  68. package/dist/mcp/prompts.js +39 -0
  69. package/dist/mcp/prompts.js.map +1 -0
  70. package/dist/mcp/resources.d.ts +2 -0
  71. package/dist/mcp/resources.js +36 -0
  72. package/dist/mcp/resources.js.map +1 -0
  73. package/dist/mcp/tools.d.ts +2 -0
  74. package/dist/mcp/tools.js +431 -0
  75. package/dist/mcp/tools.js.map +1 -0
  76. package/dist/project/pathSafety.d.ts +6 -0
  77. package/dist/project/pathSafety.js +137 -0
  78. package/dist/project/pathSafety.js.map +1 -0
  79. package/dist/project/projectInit.d.ts +11 -0
  80. package/dist/project/projectInit.js +81 -0
  81. package/dist/project/projectInit.js.map +1 -0
  82. package/dist/project/projectService.d.ts +36 -0
  83. package/dist/project/projectService.js +60 -0
  84. package/dist/project/projectService.js.map +1 -0
  85. package/dist/project/writeGuards.d.ts +3 -0
  86. package/dist/project/writeGuards.js +46 -0
  87. package/dist/project/writeGuards.js.map +1 -0
  88. package/dist/requirements/requirementService.d.ts +19 -0
  89. package/dist/requirements/requirementService.js +72 -0
  90. package/dist/requirements/requirementService.js.map +1 -0
  91. package/dist/runtime/options.d.ts +7 -0
  92. package/dist/runtime/options.js +34 -0
  93. package/dist/runtime/options.js.map +1 -0
  94. package/dist/search/ftsIndex.d.ts +29 -0
  95. package/dist/search/ftsIndex.js +96 -0
  96. package/dist/search/ftsIndex.js.map +1 -0
  97. package/dist/search/searchService.d.ts +20 -0
  98. package/dist/search/searchService.js +17 -0
  99. package/dist/search/searchService.js.map +1 -0
  100. package/dist/server.d.ts +2 -0
  101. package/dist/server.js +16 -0
  102. package/dist/server.js.map +1 -0
  103. package/dist/storage/sqlite.d.ts +15 -0
  104. package/dist/storage/sqlite.js +80 -0
  105. package/dist/storage/sqlite.js.map +1 -0
  106. package/dist/tasks/taskService.d.ts +17 -0
  107. package/dist/tasks/taskService.js +57 -0
  108. package/dist/tasks/taskService.js.map +1 -0
  109. package/dist/utils/atomicWrite.d.ts +1 -0
  110. package/dist/utils/atomicWrite.js +10 -0
  111. package/dist/utils/atomicWrite.js.map +1 -0
  112. package/dist/utils/errors.d.ts +1 -0
  113. package/dist/utils/errors.js +2 -0
  114. package/dist/utils/errors.js.map +1 -0
  115. package/dist/utils/ids.d.ts +3 -0
  116. package/dist/utils/ids.js +25 -0
  117. package/dist/utils/ids.js.map +1 -0
  118. package/dist/validation/checks.d.ts +1 -0
  119. package/dist/validation/checks.js +2 -0
  120. package/dist/validation/checks.js.map +1 -0
  121. package/dist/validation/validator.d.ts +18 -0
  122. package/dist/validation/validator.js +131 -0
  123. package/dist/validation/validator.js.map +1 -0
  124. package/dist/verification/testReportService.d.ts +19 -0
  125. package/dist/verification/testReportService.js +42 -0
  126. package/dist/verification/testReportService.js.map +1 -0
  127. package/dist/version.d.ts +1 -0
  128. package/dist/version.js +2 -0
  129. package/dist/version.js.map +1 -0
  130. package/package.json +49 -0
  131. package/templates/design_doc.md +24 -0
  132. package/templates/edr.md +58 -0
  133. package/templates/requirement.md +30 -0
  134. package/templates/task.md +22 -0
@@ -0,0 +1,142 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { buildDocumentRegistry } from "../documents/documentService.js";
3
+ import { queryGraph } from "../graph/graphBuilder.js";
4
+ import { assertAbsoluteRoot } from "../project/pathSafety.js";
5
+ import { validateProject } from "../validation/validator.js";
6
+ import { estimateTokens } from "./tokenBudget.js";
7
+ export async function buildContextPack(input) {
8
+ const root = assertAbsoluteRoot(input.root);
9
+ const maxTokens = input.max_tokens ?? 12000;
10
+ const registry = await buildDocumentRegistry(root);
11
+ const reasons = new Map();
12
+ const excluded = [];
13
+ const warnings = [];
14
+ for (const id of input.seed_ids ?? []) {
15
+ const document = registry.byId.get(id);
16
+ if (document) {
17
+ reasons.set(document.path, "seed document");
18
+ }
19
+ else {
20
+ warnings.push(`Seed document not found: ${id}`);
21
+ }
22
+ }
23
+ for (const id of input.seed_ids ?? []) {
24
+ const graph = await queryGraph({ root, id, direction: "both", depth: 1 });
25
+ for (const node of graph.nodes) {
26
+ const document = registry.byId.get(node.id);
27
+ if (document && !reasons.has(document.path)) {
28
+ reasons.set(document.path, `graph neighbor of ${id}`);
29
+ }
30
+ }
31
+ }
32
+ const taskTerms = normalizedTerms(input.task);
33
+ for (const document of registry.documents) {
34
+ if (reasons.has(document.path)) {
35
+ continue;
36
+ }
37
+ const content = await readFile(document.absolutePath, "utf8");
38
+ if (taskTerms.some((term) => content.toLowerCase().includes(term))) {
39
+ reasons.set(document.path, "matched task terms");
40
+ }
41
+ }
42
+ const matchedTaskDocuments = registry.documents.filter((document) => document.id && reasons.get(document.path) === "matched task terms");
43
+ for (const document of matchedTaskDocuments) {
44
+ const graph = await queryGraph({ root, id: document.id ?? "", direction: "both", depth: 1 });
45
+ for (const node of graph.nodes) {
46
+ const neighbor = registry.byId.get(node.id);
47
+ if (neighbor && !reasons.has(neighbor.path)) {
48
+ reasons.set(neighbor.path, `graph neighbor of ${document.id}`);
49
+ }
50
+ else if (neighbor && reasons.get(neighbor.path) === "matched task terms") {
51
+ reasons.set(neighbor.path, `matched task terms; graph neighbor of ${document.id}`);
52
+ }
53
+ }
54
+ }
55
+ const items = [];
56
+ let estimatedTokens = 0;
57
+ for (const document of registry.documents) {
58
+ const reason = reasons.get(document.path);
59
+ if (!reason) {
60
+ continue;
61
+ }
62
+ if (document.status === "superseded") {
63
+ excluded.push({ id: document.id, path: document.path, reason: "superseded" });
64
+ continue;
65
+ }
66
+ if (input.include_decisions === false && document.kind === "decision") {
67
+ excluded.push({ id: document.id, path: document.path, reason: "decisions excluded" });
68
+ continue;
69
+ }
70
+ if (input.include_open_tasks === false && document.kind === "task") {
71
+ excluded.push({ id: document.id, path: document.path, reason: "open tasks excluded" });
72
+ continue;
73
+ }
74
+ const fullContent = await readFile(document.absolutePath, "utf8");
75
+ const sectionContent = input.include_sections === false ? undefined : selectRelevantSection(fullContent, taskTerms);
76
+ const content = sectionContent ?? fullContent;
77
+ const tokens = estimateTokens(content);
78
+ if (estimatedTokens + tokens > maxTokens) {
79
+ excluded.push({ id: document.id, path: document.path, reason: "token budget exceeded" });
80
+ continue;
81
+ }
82
+ estimatedTokens += tokens;
83
+ items.push({
84
+ id: document.id,
85
+ path: document.path,
86
+ kind: document.kind,
87
+ reason,
88
+ content_mode: sectionContent ? "section" : "full",
89
+ content
90
+ });
91
+ }
92
+ if (input.include_validation ?? true) {
93
+ const validation = await validateProject({ root });
94
+ warnings.push(...validation.errors.map((error) => `${error.code}: ${error.message}`), ...validation.warnings.map((warning) => `${warning.code}: ${warning.message}`));
95
+ }
96
+ return {
97
+ pack_id: `CTX-${new Date().toISOString().replace(/[-:.TZ]/g, "")}`,
98
+ task: input.task,
99
+ estimated_tokens: estimatedTokens,
100
+ items,
101
+ excluded,
102
+ warnings
103
+ };
104
+ }
105
+ function normalizedTerms(task) {
106
+ return task
107
+ .toLowerCase()
108
+ .split(/[^a-z0-9]+/)
109
+ .filter((term) => term.length >= 4);
110
+ }
111
+ function selectRelevantSection(markdown, terms) {
112
+ if (terms.length === 0) {
113
+ return undefined;
114
+ }
115
+ const lines = markdown.split(/\r?\n/);
116
+ const sections = [];
117
+ for (let index = 0; index < lines.length; index += 1) {
118
+ const heading = lines[index]?.match(/^(#{1,6})\s+/);
119
+ if (!heading) {
120
+ continue;
121
+ }
122
+ const level = heading[1].length;
123
+ let end = lines.length;
124
+ for (let next = index + 1; next < lines.length; next += 1) {
125
+ const nextHeading = lines[next]?.match(/^(#{1,6})\s+/);
126
+ if (nextHeading && nextHeading[1].length <= level) {
127
+ end = next;
128
+ break;
129
+ }
130
+ }
131
+ sections.push({ start: index, end });
132
+ }
133
+ for (const section of sections) {
134
+ const content = lines.slice(section.start, section.end).join("\n").trim();
135
+ const lower = content.toLowerCase();
136
+ if (terms.some((term) => lower.includes(term))) {
137
+ return content;
138
+ }
139
+ }
140
+ return undefined;
141
+ }
142
+ //# sourceMappingURL=contextPack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contextPack.js","sourceRoot":"","sources":["../../src/context/contextPack.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function estimateTokens(text: string): number;
@@ -0,0 +1,4 @@
1
+ export function estimateTokens(text) {
2
+ return Math.ceil(text.length / 4);
3
+ }
4
+ //# sourceMappingURL=tokenBudget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenBudget.js","sourceRoot":"","sources":["../../src/context/tokenBudget.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,21 @@
1
+ export interface CreateDecisionInput {
2
+ root: string;
3
+ title: string;
4
+ status?: "proposed" | "accepted" | "deprecated" | "superseded";
5
+ context: string;
6
+ options: string[];
7
+ decision: string;
8
+ consequences: string;
9
+ related_requirements?: string[];
10
+ impacts?: string[];
11
+ dry_run?: boolean;
12
+ }
13
+ export declare function createDecision(input: CreateDecisionInput): Promise<{
14
+ id: string;
15
+ path: string;
16
+ content: string;
17
+ } | {
18
+ id: string;
19
+ path: string;
20
+ content?: undefined;
21
+ }>;
@@ -0,0 +1,62 @@
1
+ import { writeAuditLog } from "../audit/auditLog.js";
2
+ import { buildDocumentRegistry } from "../documents/documentService.js";
3
+ import { serializeDocument } from "../documents/frontmatter.js";
4
+ import { assertAbsoluteRoot, resolveSafePath } from "../project/pathSafety.js";
5
+ import { assertProjectWritable } from "../project/writeGuards.js";
6
+ import { atomicWrite } from "../utils/atomicWrite.js";
7
+ import { nextSequentialId, slugify } from "../utils/ids.js";
8
+ export async function createDecision(input) {
9
+ const root = assertAbsoluteRoot(input.root);
10
+ await assertProjectWritable(root);
11
+ const registry = await buildDocumentRegistry(root);
12
+ const id = nextSequentialId(registry.byId.keys(), "EDR", 4);
13
+ const relativePath = `docs/decisions/${id}-${slugify(input.title)}.md`;
14
+ const frontmatter = {
15
+ id,
16
+ kind: "decision",
17
+ status: input.status ?? "proposed",
18
+ date: new Date().toISOString().slice(0, 10),
19
+ title: input.title,
20
+ version: "0.1.0",
21
+ related_requirements: input.related_requirements ?? [],
22
+ impacts: input.impacts ?? [],
23
+ supersedes: []
24
+ };
25
+ const body = `# ${id}: ${input.title}
26
+
27
+ ## Status
28
+
29
+ ${input.status ?? "proposed"}
30
+
31
+ ## Context
32
+
33
+ ${input.context}
34
+
35
+ ## Options
36
+
37
+ ${input.options.map((option) => `- ${option}`).join("\n")}
38
+
39
+ ## Decision
40
+
41
+ ${input.decision}
42
+
43
+ ## Consequences
44
+
45
+ ${input.consequences}
46
+ `;
47
+ const content = serializeDocument(frontmatter, body);
48
+ if (input.dry_run) {
49
+ return { id, path: relativePath, content };
50
+ }
51
+ await atomicWrite(await resolveSafePath(root, relativePath), content);
52
+ await writeAuditLog({
53
+ root,
54
+ tool: "engi_decision_create",
55
+ target: id,
56
+ operation: "create",
57
+ result: "ok",
58
+ diff_summary: "decision created"
59
+ });
60
+ return { id, path: relativePath };
61
+ }
62
+ //# sourceMappingURL=decisionService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decisionService.js","sourceRoot":"","sources":["../../src/decisions/decisionService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAe5D,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAA0B;IAC7D,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,EAAE,GAAG,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAC5D,MAAM,YAAY,GAAG,kBAAkB,EAAE,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;IACvE,MAAM,WAAW,GAAG;QAClB,EAAE;QACF,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,UAAU;QAClC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QAC3C,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,OAAO,EAAE,OAAO;QAChB,oBAAoB,EAAE,KAAK,CAAC,oBAAoB,IAAI,EAAE;QACtD,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE;QAC5B,UAAU,EAAE,EAAE;KACf,CAAC;IACF,MAAM,IAAI,GAAG,KAAK,EAAE,KAAK,KAAK,CAAC,KAAK;;;;EAIpC,KAAK,CAAC,MAAM,IAAI,UAAU;;;;EAI1B,KAAK,CAAC,OAAO;;;;EAIb,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;;EAIvD,KAAK,CAAC,QAAQ;;;;EAId,KAAK,CAAC,YAAY;CACnB,CAAC;IACA,MAAM,OAAO,GAAG,iBAAiB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAErD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;IAC7C,CAAC;IAED,MAAM,WAAW,CAAC,MAAM,eAAe,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;IACtE,MAAM,aAAa,CAAC;QAClB,IAAI;QACJ,IAAI,EAAE,sBAAsB;QAC5B,MAAM,EAAE,EAAE;QACV,SAAS,EAAE,QAAQ;QACnB,MAAM,EAAE,IAAI;QACZ,YAAY,EAAE,kBAAkB;KACjC,CAAC,CAAC;IAEH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;AACpC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,9 @@
1
+ import { getProjectStatus } from "../project/projectService.js";
2
+ const root = process.env.ENGIMCP_SMOKE_ROOT ?? `${process.cwd()}/examples/rc_car_project_stub`;
3
+ const status = await getProjectStatus({
4
+ root,
5
+ include_validation_summary: true,
6
+ include_git_status: true
7
+ });
8
+ console.log(JSON.stringify(status, null, 2));
9
+ //# sourceMappingURL=smokeProjectStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smokeProjectStatus.js","sourceRoot":"","sources":["../../src/dev/smokeProjectStatus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,+BAA+B,CAAC;AAE/F,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC;IACpC,IAAI;IACJ,0BAA0B,EAAE,IAAI;IAChC,kBAAkB,EAAE,IAAI;CACzB,CAAC,CAAC;AAEH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,83 @@
1
+ import { type Heading } from "./headings.js";
2
+ import { type SectionPatchOperation } from "./sectionPatch.js";
3
+ export interface ManagedDocument {
4
+ id?: string;
5
+ path: string;
6
+ absolutePath: string;
7
+ kind?: string;
8
+ status?: string;
9
+ version?: string;
10
+ title?: string;
11
+ summary?: string;
12
+ frontmatter: Record<string, unknown>;
13
+ headings: Heading[];
14
+ frontmatterError?: string;
15
+ }
16
+ export interface DocumentRegistry {
17
+ documents: ManagedDocument[];
18
+ byId: Map<string, ManagedDocument>;
19
+ byPath: Map<string, ManagedDocument>;
20
+ }
21
+ export interface DocumentReadInput {
22
+ id?: string | null;
23
+ path?: string | null;
24
+ kind?: string | null;
25
+ mode?: "full" | "summary" | "frontmatter" | "headings" | "section";
26
+ heading_path?: string[] | null;
27
+ }
28
+ export interface DocumentReadResult {
29
+ id?: string;
30
+ path: string;
31
+ frontmatter: Record<string, unknown>;
32
+ content?: string;
33
+ headings?: string[];
34
+ links: string[];
35
+ }
36
+ export interface DocumentWriteResult {
37
+ ok: boolean;
38
+ changed: boolean;
39
+ path: string;
40
+ id?: string;
41
+ diff_summary: string;
42
+ audit_id?: string;
43
+ content?: string;
44
+ }
45
+ export interface DocumentCreateInput {
46
+ root: string;
47
+ kind: string;
48
+ id: string;
49
+ title: string;
50
+ path: string;
51
+ template: string;
52
+ frontmatter?: Record<string, unknown>;
53
+ dry_run?: boolean;
54
+ }
55
+ export interface FrontmatterPatchInput {
56
+ root: string;
57
+ id: string;
58
+ patch: Record<string, unknown>;
59
+ dry_run?: boolean;
60
+ }
61
+ export interface DocumentSectionPatchInput {
62
+ root: string;
63
+ id: string;
64
+ heading_path: string[];
65
+ operation: SectionPatchOperation;
66
+ content: string;
67
+ dry_run?: boolean;
68
+ }
69
+ export interface AddRelationshipInput {
70
+ root: string;
71
+ id: string;
72
+ relation_type: string;
73
+ target_id: string;
74
+ dry_run?: boolean;
75
+ }
76
+ export declare function discoverMarkdownDocuments(rootInput: string): Promise<ManagedDocument[]>;
77
+ export declare function buildDocumentRegistry(root: string): Promise<DocumentRegistry>;
78
+ export declare function readDocument(root: string, input: DocumentReadInput): Promise<DocumentReadResult>;
79
+ export declare function createDocument(input: DocumentCreateInput): Promise<DocumentWriteResult>;
80
+ export declare function patchDocumentFrontmatter(input: FrontmatterPatchInput): Promise<DocumentWriteResult>;
81
+ export declare function patchDocumentSection(input: DocumentSectionPatchInput): Promise<DocumentWriteResult>;
82
+ export declare function addDocumentRelationship(input: AddRelationshipInput): Promise<DocumentWriteResult>;
83
+ export declare function extractFrontmatterLinks(frontmatter: Record<string, unknown>): string[];