@diff-review-system/drs 4.1.0 → 5.0.0-rc.1

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 (145) hide show
  1. package/.pi/agents/task/okf-wiki-maintainer.md +72 -0
  2. package/.pi/workflows/github-pr-fix-review-issues-stacked.yaml +2 -0
  3. package/.pi/workflows/github-pr-review-post.yaml +29 -19
  4. package/.pi/workflows/github-pr-review.yaml +23 -0
  5. package/.pi/workflows/github-pr-update-agents-md-stacked.yaml +2 -0
  6. package/.pi/workflows/gitlab-mr-fix-review-issues-stacked.yaml +2 -0
  7. package/.pi/workflows/gitlab-mr-review.yaml +6 -0
  8. package/.pi/workflows/gitlab-mr-update-agents-md-stacked.yaml +2 -0
  9. package/.pi/workflows/release-changelog-finalize.yaml +10 -0
  10. package/.pi/workflows/repository-wiki-check.yaml +40 -0
  11. package/.pi/workflows/repository-wiki-sync.yaml +187 -0
  12. package/.wiki-site/.vitepress/config.mts +452 -0
  13. package/.wiki-site/.vitepress/theme/PageLead.vue +122 -0
  14. package/.wiki-site/.vitepress/theme/index.ts +12 -0
  15. package/.wiki-site/.vitepress/theme/style.css +270 -0
  16. package/README.md +38 -4
  17. package/dist/cli/index.js +3 -127
  18. package/dist/cli/index.js.map +1 -1
  19. package/dist/cli/init.d.ts.map +1 -1
  20. package/dist/cli/init.js +0 -3
  21. package/dist/cli/init.js.map +1 -1
  22. package/dist/cli/run-agent.d.ts +3 -0
  23. package/dist/cli/run-agent.d.ts.map +1 -1
  24. package/dist/cli/run-agent.js +56 -5
  25. package/dist/cli/run-agent.js.map +1 -1
  26. package/dist/cli/wiki.d.ts +3 -0
  27. package/dist/cli/wiki.d.ts.map +1 -0
  28. package/dist/cli/wiki.js +174 -0
  29. package/dist/cli/wiki.js.map +1 -0
  30. package/dist/cli/workflow.d.ts +2 -0
  31. package/dist/cli/workflow.d.ts.map +1 -1
  32. package/dist/cli/workflow.js +344 -31
  33. package/dist/cli/workflow.js.map +1 -1
  34. package/dist/github/client.d.ts.map +1 -1
  35. package/dist/github/client.js +2 -2
  36. package/dist/github/client.js.map +1 -1
  37. package/dist/github/platform-adapter.d.ts.map +1 -1
  38. package/dist/github/platform-adapter.js +15 -1
  39. package/dist/github/platform-adapter.js.map +1 -1
  40. package/dist/gitlab/client.d.ts +4 -0
  41. package/dist/gitlab/client.d.ts.map +1 -1
  42. package/dist/gitlab/client.js +17 -1
  43. package/dist/gitlab/client.js.map +1 -1
  44. package/dist/gitlab/platform-adapter.d.ts.map +1 -1
  45. package/dist/gitlab/platform-adapter.js +17 -1
  46. package/dist/gitlab/platform-adapter.js.map +1 -1
  47. package/dist/lib/agent-permissions.d.ts +44 -0
  48. package/dist/lib/agent-permissions.d.ts.map +1 -0
  49. package/dist/lib/agent-permissions.js +358 -0
  50. package/dist/lib/agent-permissions.js.map +1 -0
  51. package/dist/lib/agent-result.d.ts +2 -0
  52. package/dist/lib/agent-result.d.ts.map +1 -1
  53. package/dist/lib/comment-poster.d.ts +1 -1
  54. package/dist/lib/comment-poster.d.ts.map +1 -1
  55. package/dist/lib/comment-poster.js +38 -16
  56. package/dist/lib/comment-poster.js.map +1 -1
  57. package/dist/lib/config.d.ts +6 -1
  58. package/dist/lib/config.d.ts.map +1 -1
  59. package/dist/lib/config.js +17 -0
  60. package/dist/lib/config.js.map +1 -1
  61. package/dist/lib/error-comment-poster.d.ts +1 -1
  62. package/dist/lib/error-comment-poster.d.ts.map +1 -1
  63. package/dist/lib/error-comment-poster.js +15 -7
  64. package/dist/lib/error-comment-poster.js.map +1 -1
  65. package/dist/lib/okf-wiki.d.ts +65 -0
  66. package/dist/lib/okf-wiki.d.ts.map +1 -0
  67. package/dist/lib/okf-wiki.js +647 -0
  68. package/dist/lib/okf-wiki.js.map +1 -0
  69. package/dist/lib/platform-client.d.ts +2 -0
  70. package/dist/lib/platform-client.d.ts.map +1 -1
  71. package/dist/lib/project-setup.d.ts +0 -3
  72. package/dist/lib/project-setup.d.ts.map +1 -1
  73. package/dist/lib/project-setup.js +1 -15
  74. package/dist/lib/project-setup.js.map +1 -1
  75. package/dist/lib/review-artifact.d.ts +11 -1
  76. package/dist/lib/review-artifact.d.ts.map +1 -1
  77. package/dist/lib/review-artifact.js +202 -0
  78. package/dist/lib/review-artifact.js.map +1 -1
  79. package/dist/lib/review-orchestrator.d.ts +6 -1
  80. package/dist/lib/review-orchestrator.d.ts.map +1 -1
  81. package/dist/lib/review-orchestrator.js +3 -1
  82. package/dist/lib/review-orchestrator.js.map +1 -1
  83. package/dist/lib/wiki-delta.d.ts +71 -0
  84. package/dist/lib/wiki-delta.d.ts.map +1 -0
  85. package/dist/lib/wiki-delta.js +524 -0
  86. package/dist/lib/wiki-delta.js.map +1 -0
  87. package/dist/lib/wiki-run-summary.d.ts +45 -0
  88. package/dist/lib/wiki-run-summary.d.ts.map +1 -0
  89. package/dist/lib/wiki-run-summary.js +168 -0
  90. package/dist/lib/wiki-run-summary.js.map +1 -0
  91. package/dist/lib/wiki-search.d.ts +24 -0
  92. package/dist/lib/wiki-search.d.ts.map +1 -0
  93. package/dist/lib/wiki-search.js +200 -0
  94. package/dist/lib/wiki-search.js.map +1 -0
  95. package/dist/lib/wiki-site-graph.d.ts +33 -0
  96. package/dist/lib/wiki-site-graph.d.ts.map +1 -0
  97. package/dist/lib/wiki-site-graph.js +446 -0
  98. package/dist/lib/wiki-site-graph.js.map +1 -0
  99. package/dist/lib/wiki-site-safety.d.ts +6 -0
  100. package/dist/lib/wiki-site-safety.d.ts.map +1 -0
  101. package/dist/lib/wiki-site-safety.js +83 -0
  102. package/dist/lib/wiki-site-safety.js.map +1 -0
  103. package/dist/lib/wiki-site-smoke.d.ts +16 -0
  104. package/dist/lib/wiki-site-smoke.d.ts.map +1 -0
  105. package/dist/lib/wiki-site-smoke.js +270 -0
  106. package/dist/lib/wiki-site-smoke.js.map +1 -0
  107. package/dist/lib/wiki-site.d.ts +26 -0
  108. package/dist/lib/wiki-site.d.ts.map +1 -0
  109. package/dist/lib/wiki-site.js +221 -0
  110. package/dist/lib/wiki-site.js.map +1 -0
  111. package/dist/lib/workflow/planning.d.ts +1 -0
  112. package/dist/lib/workflow/planning.d.ts.map +1 -1
  113. package/dist/lib/workflow/planning.js +53 -2
  114. package/dist/lib/workflow/planning.js.map +1 -1
  115. package/dist/lib/workflow/types.d.ts +5 -0
  116. package/dist/lib/workflow/types.d.ts.map +1 -1
  117. package/dist/lib/workflow-artifacts.d.ts.map +1 -1
  118. package/dist/lib/workflow-artifacts.js +23 -1
  119. package/dist/lib/workflow-artifacts.js.map +1 -1
  120. package/dist/pi/sdk.d.ts.map +1 -1
  121. package/dist/pi/sdk.js +270 -17
  122. package/dist/pi/sdk.js.map +1 -1
  123. package/dist/runtime/built-in-paths.d.ts +0 -1
  124. package/dist/runtime/built-in-paths.d.ts.map +1 -1
  125. package/dist/runtime/built-in-paths.js +0 -7
  126. package/dist/runtime/built-in-paths.js.map +1 -1
  127. package/dist/runtime/client.d.ts +3 -0
  128. package/dist/runtime/client.d.ts.map +1 -1
  129. package/dist/runtime/client.js +4 -0
  130. package/dist/runtime/client.js.map +1 -1
  131. package/dist/temporal/executor.d.ts.map +1 -1
  132. package/dist/temporal/executor.js +9 -2
  133. package/dist/temporal/executor.js.map +1 -1
  134. package/dist/temporal/retry-policy.d.ts +1 -1
  135. package/dist/temporal/retry-policy.d.ts.map +1 -1
  136. package/dist/temporal/retry-policy.js +6 -1
  137. package/dist/temporal/retry-policy.js.map +1 -1
  138. package/dist/temporal/workflows.d.ts.map +1 -1
  139. package/dist/temporal/workflows.js +16 -3
  140. package/dist/temporal/workflows.js.map +1 -1
  141. package/package.json +23 -13
  142. package/dist/lib/skills.d.ts +0 -16
  143. package/dist/lib/skills.d.ts.map +0 -1
  144. package/dist/lib/skills.js +0 -140
  145. package/dist/lib/skills.js.map +0 -1
@@ -0,0 +1,524 @@
1
+ import { createHash } from 'crypto';
2
+ import { execFile } from 'child_process';
3
+ import { lstat, mkdir, readFile, readdir, readlink, realpath, rename, rm, writeFile, } from 'fs/promises';
4
+ import { dirname, isAbsolute, relative, resolve, sep } from 'path';
5
+ import { promisify } from 'util';
6
+ import { loadOkfProvenanceMap } from './okf-wiki.js';
7
+ import { resolveWithinWorkingDir } from './path-utils.js';
8
+ const execFileAsync = promisify(execFile);
9
+ const WIKI_STATE_VERSION = 1;
10
+ const MAX_CHANGED_PATHS = 500;
11
+ const DEFAULT_WIKI_INSTRUCTIONS_PATH = '.drs/wiki-instructions.md';
12
+ /** Plan a generate, reconciliation, delta update, or model-free no-op run. */
13
+ export async function planWikiUpdate(workingDir, root = 'wiki', statePath = '.drs/wiki-state.json', options = {}) {
14
+ const paths = resolveWikiPaths(workingDir, root, statePath);
15
+ await assertSafeWikiPaths(workingDir, paths);
16
+ const instructions = await resolveWikiInstructions(workingDir, options);
17
+ assertInstructionsOutsideBundle(paths, instructions);
18
+ await requireGitRepository(workingDir);
19
+ const [gitHead, sourceFiles] = await Promise.all([
20
+ runGit(workingDir, ['rev-parse', 'HEAD']),
21
+ listSourceFiles(workingDir, paths, instructions.filePath),
22
+ ]);
23
+ const sourceSnapshot = await fingerprintSourceFiles(workingDir, sourceFiles);
24
+ const sourceHash = sourceSnapshot.hash;
25
+ const wikiExists = await isDirectory(paths.absoluteRoot);
26
+ const state = await readWikiState(paths.absoluteStatePath);
27
+ if (!wikiExists) {
28
+ return createPlan('generate', 'Wiki bundle does not exist.', paths, gitHead, sourceHash, instructions);
29
+ }
30
+ const wikiHash = await hashDirectory(paths.absoluteRoot);
31
+ if (!state) {
32
+ return createPlan('reconcile', 'Wiki state is missing or invalid.', paths, gitHead, sourceHash, instructions, { wikiHash });
33
+ }
34
+ if (state.root !== paths.root) {
35
+ return createPlan('reconcile', `Wiki state targets ${state.root} instead of ${paths.root}.`, paths, gitHead, sourceHash, instructions, { state, wikiHash });
36
+ }
37
+ if (state.instructionsHash !== instructions.fileHash) {
38
+ return createPlan('reconcile', 'Wiki instructions changed since the last recorded wiki state.', paths, gitHead, sourceHash, instructions, { state, wikiHash });
39
+ }
40
+ if (state.sourceHash !== sourceHash) {
41
+ const changedPaths = state.sourceFiles
42
+ ? compareSourceFiles(state.sourceFiles, sourceSnapshot.files)
43
+ : await collectChangedSourcePaths(workingDir, paths, state, sourceFiles.map((entry) => entry.path), instructions.filePath);
44
+ return createPlan('update', `${changedPaths.length} source path(s) changed since the last recorded wiki state.`, paths, gitHead, sourceHash, instructions, {
45
+ state,
46
+ wikiHash,
47
+ changedPaths,
48
+ candidateConcepts: collectCandidateConcepts(state.sourceConcepts, changedPaths),
49
+ });
50
+ }
51
+ if (state.wikiHash !== wikiHash) {
52
+ return createPlan('reconcile', 'Wiki content changed without a corresponding state update.', paths, gitHead, sourceHash, instructions, { state, wikiHash });
53
+ }
54
+ return createPlan('noop', 'Source and wiki content match the recorded state.', paths, gitHead, sourceHash, instructions, { state, wikiHash });
55
+ }
56
+ /** Record source and wiki fingerprints after successful index synchronization and validation. */
57
+ export async function recordWikiState(workingDir, root = 'wiki', statePath = '.drs/wiki-state.json', options = {}) {
58
+ const paths = resolveWikiPaths(workingDir, root, statePath);
59
+ await assertSafeWikiPaths(workingDir, paths);
60
+ const instructions = await resolveWikiInstructions(workingDir, options);
61
+ assertInstructionsOutsideBundle(paths, instructions);
62
+ await requireGitRepository(workingDir);
63
+ if (!(await isDirectory(paths.absoluteRoot))) {
64
+ throw new Error(`Cannot record wiki state because the bundle does not exist: ${paths.root}`);
65
+ }
66
+ const [gitHead, sourceFiles, wikiHash] = await Promise.all([
67
+ runGit(workingDir, ['rev-parse', 'HEAD']),
68
+ listSourceFiles(workingDir, paths, instructions.filePath),
69
+ hashDirectory(paths.absoluteRoot),
70
+ ]);
71
+ const sourceSnapshot = await fingerprintSourceFiles(workingDir, sourceFiles, true);
72
+ const sourceConcepts = await loadOkfProvenanceMap(workingDir, paths.root);
73
+ const state = {
74
+ version: WIKI_STATE_VERSION,
75
+ okfVersion: '0.1',
76
+ root: paths.root,
77
+ gitHead,
78
+ sourceHash: sourceSnapshot.hash,
79
+ sourceFiles: sourceSnapshot.files,
80
+ wikiHash,
81
+ ...(instructions.fileHash ? { instructionsHash: instructions.fileHash } : {}),
82
+ ...(Object.keys(sourceConcepts).length > 0 ? { sourceConcepts } : {}),
83
+ updatedAt: new Date().toISOString(),
84
+ };
85
+ await mkdir(dirname(paths.absoluteStatePath), { recursive: true });
86
+ const temporaryPath = `${paths.absoluteStatePath}.tmp-${process.pid}-${Date.now()}`;
87
+ try {
88
+ await writeFile(temporaryPath, `${JSON.stringify(state, null, 2)}\n`, 'utf-8');
89
+ await rename(temporaryPath, paths.absoluteStatePath);
90
+ }
91
+ finally {
92
+ await rm(temporaryPath, { force: true });
93
+ }
94
+ return state;
95
+ }
96
+ /** Fail CI check mode when running the workflow changed the bundle or its state file. */
97
+ export async function checkWikiClean(workingDir, root = 'wiki', statePath = '.drs/wiki-state.json') {
98
+ const paths = resolveWikiPaths(workingDir, root, statePath);
99
+ await assertSafeWikiPaths(workingDir, paths);
100
+ await requireGitRepository(workingDir);
101
+ const [trackedChanges, untrackedChanges, ignoredChanges] = await Promise.all([
102
+ listNullSeparatedGitOutput(workingDir, [
103
+ '--literal-pathspecs',
104
+ 'diff',
105
+ '--name-only',
106
+ '-z',
107
+ 'HEAD',
108
+ '--',
109
+ paths.root,
110
+ paths.statePath,
111
+ ]),
112
+ listNullSeparatedGitOutput(workingDir, [
113
+ '--literal-pathspecs',
114
+ 'ls-files',
115
+ '--others',
116
+ '--exclude-standard',
117
+ '-z',
118
+ '--',
119
+ paths.root,
120
+ paths.statePath,
121
+ ]),
122
+ listNullSeparatedGitOutput(workingDir, [
123
+ '--literal-pathspecs',
124
+ 'ls-files',
125
+ '--others',
126
+ '--ignored',
127
+ '--exclude-standard',
128
+ '-z',
129
+ '--',
130
+ paths.root,
131
+ paths.statePath,
132
+ ]),
133
+ ]);
134
+ const changedPaths = [
135
+ ...new Set([...trackedChanges, ...untrackedChanges, ...ignoredChanges]),
136
+ ].sort();
137
+ return {
138
+ clean: changedPaths.length === 0,
139
+ root: paths.root,
140
+ statePath: paths.statePath,
141
+ changedPaths,
142
+ };
143
+ }
144
+ /**
145
+ * Resolve the effective repository wiki brief. The persistent brief lives outside the portable
146
+ * bundle (default `.drs/wiki-instructions.md`); a one-run `instructions` value is appended after
147
+ * the file content so precedence stays explicit and deterministic.
148
+ */
149
+ export async function resolveWikiInstructions(workingDir, options = {}) {
150
+ const requestedPath = normalizeRelativePath(options.instructionsPath ?? DEFAULT_WIKI_INSTRUCTIONS_PATH, 'Wiki instructions path');
151
+ const absolutePath = resolveWithinWorkingDir(workingDir, requestedPath, 'read');
152
+ await assertNoSymlinkAncestors(workingDir, absolutePath, 'Wiki instructions path');
153
+ const filePath = toPosixPath(relative(resolve(workingDir), absolutePath));
154
+ let fileContent = '';
155
+ try {
156
+ const stats = await lstat(absolutePath);
157
+ if (stats.isSymbolicLink()) {
158
+ throw new Error(`Wiki instructions path cannot be a symbolic link: ${filePath}`);
159
+ }
160
+ if (!stats.isFile()) {
161
+ throw new Error(`Wiki instructions path must be a file: ${filePath}`);
162
+ }
163
+ fileContent = (await readFile(absolutePath, 'utf-8')).trim();
164
+ }
165
+ catch (error) {
166
+ if (!isMissingPathError(error))
167
+ throw error;
168
+ }
169
+ const inputContent = options.instructions?.trim() ?? '';
170
+ const source = fileContent && inputContent
171
+ ? 'combined'
172
+ : fileContent
173
+ ? 'file'
174
+ : inputContent
175
+ ? 'input'
176
+ : 'none';
177
+ const content = source === 'combined' ? `${fileContent}\n\n${inputContent}` : fileContent || inputContent;
178
+ return {
179
+ content,
180
+ ...(content ? { hash: hashValue(content) } : {}),
181
+ ...(fileContent ? { fileHash: hashValue(fileContent) } : {}),
182
+ source,
183
+ filePath,
184
+ };
185
+ }
186
+ function assertInstructionsOutsideBundle(paths, instructions) {
187
+ if (isPathWithin(instructions.filePath, paths.root)) {
188
+ throw new Error('Wiki instructions path must be outside the portable OKF bundle.');
189
+ }
190
+ }
191
+ function createPlan(mode, reason, paths, gitHead, sourceHash, instructions, details = {}) {
192
+ const changedPaths = details.changedPaths ?? [];
193
+ return {
194
+ mode,
195
+ shouldRun: mode !== 'noop',
196
+ reason,
197
+ root: paths.root,
198
+ statePath: paths.statePath,
199
+ gitHead,
200
+ ...(details.state?.gitHead ? { previousGitHead: details.state.gitHead } : {}),
201
+ sourceHash,
202
+ ...(details.state?.sourceHash ? { previousSourceHash: details.state.sourceHash } : {}),
203
+ ...(details.wikiHash ? { wikiHash: details.wikiHash } : {}),
204
+ ...(details.state?.wikiHash ? { previousWikiHash: details.state.wikiHash } : {}),
205
+ changedPaths: changedPaths.slice(0, MAX_CHANGED_PATHS),
206
+ changedPathCount: changedPaths.length,
207
+ changedPathsTruncated: changedPaths.length > MAX_CHANGED_PATHS,
208
+ candidateConcepts: (details.candidateConcepts ?? []).slice(0, MAX_CHANGED_PATHS),
209
+ instructions: instructions.content,
210
+ instructionsSource: instructions.source,
211
+ ...(instructions.hash ? { instructionsHash: instructions.hash } : {}),
212
+ ...(details.state?.instructionsHash
213
+ ? { previousInstructionsHash: details.state.instructionsHash }
214
+ : {}),
215
+ };
216
+ }
217
+ function resolveWikiPaths(workingDir, root, statePath) {
218
+ const requestedRoot = normalizeRelativePath(root, 'Wiki bundle root');
219
+ const requestedStatePath = normalizeRelativePath(statePath, 'Wiki state path');
220
+ const absoluteWorkingDir = resolve(workingDir);
221
+ const absoluteRoot = resolveWithinWorkingDir(workingDir, requestedRoot, 'access');
222
+ const absoluteStatePath = resolveWithinWorkingDir(workingDir, requestedStatePath, 'access');
223
+ if (absoluteRoot === absoluteWorkingDir) {
224
+ throw new Error('Wiki bundle root must be a subdirectory of the working directory.');
225
+ }
226
+ const normalizedRoot = toPosixPath(relative(absoluteWorkingDir, absoluteRoot));
227
+ const normalizedStatePath = toPosixPath(relative(absoluteWorkingDir, absoluteStatePath));
228
+ if (isPathWithin(normalizedStatePath, normalizedRoot)) {
229
+ throw new Error('Wiki state path must be outside the portable OKF bundle.');
230
+ }
231
+ return {
232
+ absoluteRoot,
233
+ absoluteStatePath,
234
+ root: normalizedRoot,
235
+ statePath: normalizedStatePath,
236
+ };
237
+ }
238
+ async function assertSafeWikiPaths(workingDir, paths) {
239
+ await Promise.all([
240
+ assertNoSymlinkAncestors(workingDir, paths.absoluteRoot, 'Wiki bundle root'),
241
+ assertNoSymlinkAncestors(workingDir, paths.absoluteStatePath, 'Wiki state path'),
242
+ ]);
243
+ }
244
+ async function assertNoSymlinkAncestors(workingDir, targetPath, label) {
245
+ const absoluteWorkingDir = resolve(workingDir);
246
+ const relativePath = relative(absoluteWorkingDir, targetPath);
247
+ let currentPath = absoluteWorkingDir;
248
+ for (const part of relativePath.split(sep).filter(Boolean)) {
249
+ currentPath = resolve(currentPath, part);
250
+ try {
251
+ if ((await lstat(currentPath)).isSymbolicLink()) {
252
+ throw new Error(`${label} cannot contain symbolic links: ${relativePath}`);
253
+ }
254
+ }
255
+ catch (error) {
256
+ if (isMissingPathError(error))
257
+ return;
258
+ throw error;
259
+ }
260
+ }
261
+ }
262
+ function normalizeRelativePath(value, label) {
263
+ const trimmed = value.trim();
264
+ if (!trimmed)
265
+ throw new Error(`${label} cannot be empty.`);
266
+ if (isAbsolute(trimmed))
267
+ throw new Error(`${label} must be repository-relative: ${trimmed}`);
268
+ return trimmed;
269
+ }
270
+ async function requireGitRepository(workingDir) {
271
+ const gitRoot = await realpath(resolve(await runGit(workingDir, ['rev-parse', '--show-toplevel'])));
272
+ const realWorkingDir = await realpath(resolve(workingDir));
273
+ if (gitRoot !== realWorkingDir) {
274
+ throw new Error(`Wiki delta workflow must run from the repository root: ${gitRoot}`);
275
+ }
276
+ }
277
+ async function listSourceFiles(workingDir, paths, excludePath) {
278
+ const [stagedOutput, untracked] = await Promise.all([
279
+ runGit(workingDir, ['ls-files', '--stage', '-z'], false, false),
280
+ listNullSeparatedGitOutput(workingDir, ['ls-files', '--others', '--exclude-standard', '-z']),
281
+ ]);
282
+ const entries = new Map();
283
+ for (const value of splitNullSeparatedOutput(stagedOutput)) {
284
+ const separator = value.indexOf('\t');
285
+ if (separator < 0)
286
+ continue;
287
+ const metadata = value.slice(0, separator).split(' ');
288
+ const filePath = toPosixPath(value.slice(separator + 1));
289
+ if (metadata[2] !== '0')
290
+ continue;
291
+ entries.set(filePath, {
292
+ path: filePath,
293
+ ...(metadata[0] === '160000' && metadata[1] ? { gitlinkOid: metadata[1] } : {}),
294
+ });
295
+ }
296
+ for (const filePath of untracked) {
297
+ entries.set(filePath, { path: filePath });
298
+ }
299
+ return [...entries.values()]
300
+ .filter((entry) => !isPathWithin(entry.path, paths.root) &&
301
+ entry.path !== paths.statePath &&
302
+ entry.path !== excludePath)
303
+ .sort((left, right) => compareStrings(left.path, right.path));
304
+ }
305
+ async function fingerprintSourceFiles(workingDir, entries, rejectDirtySubmodules = false) {
306
+ const hash = createHash('sha256');
307
+ const files = Object.create(null);
308
+ for (const entry of entries) {
309
+ const fingerprint = await fingerprintSourcePath(workingDir, entry, rejectDirtySubmodules);
310
+ if (!fingerprint)
311
+ continue;
312
+ files[entry.path] = fingerprint;
313
+ hash.update(`path:${entry.path}\0${fingerprint}\0`);
314
+ }
315
+ return { hash: hash.digest('hex'), files };
316
+ }
317
+ async function fingerprintSourcePath(workingDir, entry, rejectDirtySubmodules = false) {
318
+ const absolutePath = resolveWithinWorkingDir(workingDir, entry.path, 'read');
319
+ let fileStat;
320
+ try {
321
+ fileStat = await lstat(absolutePath);
322
+ }
323
+ catch (error) {
324
+ if (entry.gitlinkOid)
325
+ return hashValue(`gitlink:${entry.gitlinkOid}`);
326
+ if (isMissingPathError(error))
327
+ return null;
328
+ throw error;
329
+ }
330
+ if (fileStat.isDirectory() && entry.gitlinkOid) {
331
+ return fingerprintSubmodule(absolutePath, entry.gitlinkOid, rejectDirtySubmodules);
332
+ }
333
+ const hash = createHash('sha256');
334
+ if (fileStat.isSymbolicLink()) {
335
+ hash.update(`symlink:${await readlink(absolutePath)}\0`);
336
+ }
337
+ else if (fileStat.isFile()) {
338
+ hash.update(`file:executable:${fileStat.mode & 0o111 ? 'yes' : 'no'}\0`);
339
+ hash.update(await readFile(absolutePath));
340
+ }
341
+ else {
342
+ return null;
343
+ }
344
+ return hash.digest('hex');
345
+ }
346
+ async function fingerprintSubmodule(absolutePath, gitlinkOid, rejectDirty) {
347
+ const submoduleRoot = await runGit(absolutePath, ['rev-parse', '--show-toplevel'], true);
348
+ if (!submoduleRoot)
349
+ return hashValue(`gitlink:${gitlinkOid}`);
350
+ const [realSubmoduleRoot, realAbsolutePath] = await Promise.all([
351
+ realpath(resolve(submoduleRoot)),
352
+ realpath(absolutePath),
353
+ ]);
354
+ if (realSubmoduleRoot !== realAbsolutePath)
355
+ return hashValue(`gitlink:${gitlinkOid}`);
356
+ const [head, status] = await Promise.all([
357
+ runGit(absolutePath, ['rev-parse', 'HEAD']),
358
+ runGit(absolutePath, ['status', '--porcelain=v1', '-z', '--untracked-files=all'], false, false),
359
+ ]);
360
+ if (!status)
361
+ return hashValue(`gitlink:${head}`);
362
+ if (rejectDirty) {
363
+ throw new Error(`Cannot record wiki state while Git submodule is dirty: ${absolutePath}`);
364
+ }
365
+ const [diff, untracked] = await Promise.all([
366
+ runGit(absolutePath, ['diff', '--binary', 'HEAD'], false, false),
367
+ listNullSeparatedGitOutput(absolutePath, ['ls-files', '--others', '--exclude-standard', '-z']),
368
+ ]);
369
+ const hash = createHash('sha256');
370
+ hash.update(`gitlink:dirty:head:${head}\0diff:\0${diff}\0`);
371
+ for (const filePath of untracked.sort()) {
372
+ const fingerprint = await fingerprintSourcePath(absolutePath, { path: filePath });
373
+ if (fingerprint)
374
+ hash.update(`untracked:${filePath}\0${fingerprint}\0`);
375
+ }
376
+ return hash.digest('hex');
377
+ }
378
+ async function hashDirectory(absoluteRoot, relativeDirectory = '') {
379
+ const hash = createHash('sha256');
380
+ await addDirectoryToHash(hash, absoluteRoot, relativeDirectory);
381
+ return hash.digest('hex');
382
+ }
383
+ async function addDirectoryToHash(hash, absoluteDirectory, relativeDirectory) {
384
+ const entries = await readdir(absoluteDirectory, { withFileTypes: true });
385
+ for (const entry of entries.sort((left, right) => compareStrings(left.name, right.name))) {
386
+ const absolutePath = resolve(absoluteDirectory, entry.name);
387
+ const relativePath = relativeDirectory ? `${relativeDirectory}/${entry.name}` : entry.name;
388
+ if (entry.isDirectory()) {
389
+ hash.update(`dir:${relativePath}\0`);
390
+ await addDirectoryToHash(hash, absolutePath, relativePath);
391
+ }
392
+ else if (entry.isFile()) {
393
+ hash.update(`file:${relativePath}\0`);
394
+ hash.update(await readFile(absolutePath));
395
+ hash.update('\0');
396
+ }
397
+ else if (entry.isSymbolicLink()) {
398
+ hash.update(`symlink:${relativePath}:${await readlink(absolutePath)}\0`);
399
+ }
400
+ }
401
+ }
402
+ async function readWikiState(absoluteStatePath) {
403
+ try {
404
+ const value = JSON.parse(await readFile(absoluteStatePath, 'utf-8'));
405
+ if (!isRecord(value))
406
+ return null;
407
+ if (value.version !== WIKI_STATE_VERSION ||
408
+ value.okfVersion !== '0.1' ||
409
+ typeof value.root !== 'string' ||
410
+ typeof value.gitHead !== 'string' ||
411
+ !isFullObjectId(value.gitHead) ||
412
+ typeof value.sourceHash !== 'string' ||
413
+ (value.sourceFiles !== undefined && !isSourceFileManifest(value.sourceFiles)) ||
414
+ typeof value.wikiHash !== 'string' ||
415
+ (value.instructionsHash !== undefined && typeof value.instructionsHash !== 'string') ||
416
+ (value.sourceConcepts !== undefined && !isSourceConceptManifest(value.sourceConcepts)) ||
417
+ typeof value.updatedAt !== 'string') {
418
+ return null;
419
+ }
420
+ return value;
421
+ }
422
+ catch {
423
+ return null;
424
+ }
425
+ }
426
+ async function collectChangedSourcePaths(workingDir, paths, state, sourceFiles, excludePath) {
427
+ const [committed, working, untracked] = await Promise.all([
428
+ listNullSeparatedGitOutput(workingDir, ['diff', '--name-only', '-z', '--end-of-options', `${state.gitHead}..HEAD`], true),
429
+ listNullSeparatedGitOutput(workingDir, ['diff', '--name-only', '-z', 'HEAD']),
430
+ listNullSeparatedGitOutput(workingDir, ['ls-files', '--others', '--exclude-standard', '-z']),
431
+ ]);
432
+ const changed = [...new Set([...committed, ...working, ...untracked])]
433
+ .filter((filePath) => !isPathWithin(filePath, paths.root) &&
434
+ filePath !== paths.statePath &&
435
+ filePath !== excludePath)
436
+ .sort();
437
+ return changed.length > 0 ? changed : sourceFiles;
438
+ }
439
+ function compareSourceFiles(previous, current) {
440
+ return [...new Set([...Object.keys(previous), ...Object.keys(current)])]
441
+ .filter((filePath) => previous[filePath] !== current[filePath])
442
+ .sort();
443
+ }
444
+ /** Map changed source paths to the concepts that cited them in the previously recorded state. */
445
+ function collectCandidateConcepts(sourceConcepts, changedPaths) {
446
+ if (!sourceConcepts)
447
+ return [];
448
+ const candidates = new Set();
449
+ for (const changedPath of changedPaths) {
450
+ if (!Object.prototype.hasOwnProperty.call(sourceConcepts, changedPath))
451
+ continue;
452
+ for (const concept of sourceConcepts[changedPath] ?? []) {
453
+ candidates.add(concept);
454
+ }
455
+ }
456
+ return [...candidates].sort(compareStrings);
457
+ }
458
+ async function listNullSeparatedGitOutput(workingDir, args, allowFailure = false) {
459
+ const output = await runGit(workingDir, args, allowFailure, false);
460
+ return splitNullSeparatedOutput(output).map(toPosixPath);
461
+ }
462
+ async function runGit(workingDir, args, allowFailure = false, trim = true) {
463
+ try {
464
+ const { stdout } = await execFileAsync('git', ['--no-pager', ...args], {
465
+ cwd: workingDir,
466
+ encoding: 'utf-8',
467
+ maxBuffer: 10 * 1024 * 1024,
468
+ });
469
+ return trim ? stdout.trim() : stdout;
470
+ }
471
+ catch (error) {
472
+ if (allowFailure)
473
+ return '';
474
+ throw new Error(`Git command failed: git ${args.join(' ')}: ${errorMessage(error)}`, {
475
+ cause: error,
476
+ });
477
+ }
478
+ }
479
+ function splitNullSeparatedOutput(output) {
480
+ return output.split('\0').filter((value) => value.length > 0);
481
+ }
482
+ async function isDirectory(targetPath) {
483
+ try {
484
+ return (await lstat(targetPath)).isDirectory();
485
+ }
486
+ catch {
487
+ return false;
488
+ }
489
+ }
490
+ function isPathWithin(filePath, directoryPath) {
491
+ return filePath === directoryPath || filePath.startsWith(`${directoryPath}/`);
492
+ }
493
+ function toPosixPath(value) {
494
+ return sep === '/' ? value : value.split(sep).join('/');
495
+ }
496
+ function compareStrings(left, right) {
497
+ return left < right ? -1 : left > right ? 1 : 0;
498
+ }
499
+ function isRecord(value) {
500
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
501
+ }
502
+ function isSourceFileManifest(value) {
503
+ return (isRecord(value) &&
504
+ Object.entries(value).every(([filePath, fingerprint]) => filePath.length > 0 && typeof fingerprint === 'string'));
505
+ }
506
+ function isSourceConceptManifest(value) {
507
+ return (isRecord(value) &&
508
+ Object.entries(value).every(([filePath, concepts]) => filePath.length > 0 &&
509
+ Array.isArray(concepts) &&
510
+ concepts.every((concept) => typeof concept === 'string')));
511
+ }
512
+ function isFullObjectId(value) {
513
+ return /^(?:[0-9a-f]{40}|[0-9a-f]{64})$/i.test(value);
514
+ }
515
+ function isMissingPathError(error) {
516
+ return isRecord(error) && error.code === 'ENOENT';
517
+ }
518
+ function hashValue(value) {
519
+ return createHash('sha256').update(value).digest('hex');
520
+ }
521
+ function errorMessage(error) {
522
+ return error instanceof Error ? error.message : String(error);
523
+ }
524
+ //# sourceMappingURL=wiki-delta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiki-delta.js","sourceRoot":"","sources":["../../src/lib/wiki-delta.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { AgentWorkspaceChanges } from './agent-permissions.js';
2
+ import type { OkfBundleValidationResult } from './okf-wiki.js';
3
+ import { type AgentUsageSummary, type UsageSummary } from './review-usage.js';
4
+ import type { WikiUpdatePlan } from './wiki-delta.js';
5
+ export interface WikiRunSummary {
6
+ mode: WikiUpdatePlan['mode'];
7
+ changedSourceCount: number;
8
+ concepts: {
9
+ total: number;
10
+ added: number;
11
+ edited: number;
12
+ deleted: number;
13
+ };
14
+ validation: {
15
+ errors: number;
16
+ warnings: number;
17
+ };
18
+ graph: OkfBundleValidationResult['graph'];
19
+ provenance: {
20
+ coveredConcepts: number;
21
+ uncoveredConcepts: number;
22
+ coverage: number;
23
+ };
24
+ model: {
25
+ invoked: boolean;
26
+ id?: string;
27
+ turns: number;
28
+ usage: UsageSummary;
29
+ };
30
+ elapsedMs: number;
31
+ instructionsHash?: string;
32
+ }
33
+ export interface CreateWikiRunSummaryOptions {
34
+ plan: WikiUpdatePlan;
35
+ validation: OkfBundleValidationResult;
36
+ modelInvoked: boolean;
37
+ usage?: AgentUsageSummary;
38
+ workspaceChanges?: AgentWorkspaceChanges;
39
+ elapsedMs: number;
40
+ }
41
+ export declare function createWikiRunSummary(options: CreateWikiRunSummaryOptions): WikiRunSummary;
42
+ export declare function formatWikiRunSummaryHuman(summary: WikiRunSummary): string;
43
+ export declare function formatWikiRunSummaryMarkdown(summary: WikiRunSummary): string;
44
+ export declare function getWikiRunSummary(value: unknown): WikiRunSummary | undefined;
45
+ //# sourceMappingURL=wiki-run-summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiki-run-summary.d.ts","sourceRoot":"","sources":["../../src/lib/wiki-run-summary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,UAAU,EAAE;QACV,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,KAAK,EAAE,yBAAyB,CAAC,OAAO,CAAC,CAAC;IAC1C,UAAU,EAAE;QACV,eAAe,EAAE,MAAM,CAAC;QACxB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,KAAK,EAAE;QACL,OAAO,EAAE,OAAO,CAAC;QACjB,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,YAAY,CAAC;KACrB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,cAAc,CAAC;IACrB,UAAU,EAAE,yBAAyB,CAAC;IACtC,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,gBAAgB,CAAC,EAAE,qBAAqB,CAAC;IACzC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,cAAc,CAuCzF;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAazE;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CA+B5E;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,GAAG,SAAS,CAsC5E"}