codex-workflow-v2 2.0.0-alpha.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 (90) hide show
  1. package/README.md +71 -0
  2. package/dist/src/artifacts.d.ts +4 -0
  3. package/dist/src/artifacts.js +106 -0
  4. package/dist/src/artifacts.js.map +1 -0
  5. package/dist/src/cli.d.ts +2 -0
  6. package/dist/src/cli.js +356 -0
  7. package/dist/src/cli.js.map +1 -0
  8. package/dist/src/contracts.d.ts +313 -0
  9. package/dist/src/contracts.js +3 -0
  10. package/dist/src/contracts.js.map +1 -0
  11. package/dist/src/diagnostics.d.ts +19 -0
  12. package/dist/src/diagnostics.js +25 -0
  13. package/dist/src/diagnostics.js.map +1 -0
  14. package/dist/src/domain/discovery.d.ts +8 -0
  15. package/dist/src/domain/discovery.js +25 -0
  16. package/dist/src/domain/discovery.js.map +1 -0
  17. package/dist/src/domain/validation.d.ts +3 -0
  18. package/dist/src/domain/validation.js +96 -0
  19. package/dist/src/domain/validation.js.map +1 -0
  20. package/dist/src/errors.d.ts +6 -0
  21. package/dist/src/errors.js +11 -0
  22. package/dist/src/errors.js.map +1 -0
  23. package/dist/src/fs-utils.d.ts +4 -0
  24. package/dist/src/fs-utils.js +52 -0
  25. package/dist/src/fs-utils.js.map +1 -0
  26. package/dist/src/git.d.ts +19 -0
  27. package/dist/src/git.js +115 -0
  28. package/dist/src/git.js.map +1 -0
  29. package/dist/src/graph.d.ts +28 -0
  30. package/dist/src/graph.js +263 -0
  31. package/dist/src/graph.js.map +1 -0
  32. package/dist/src/index.d.ts +12 -0
  33. package/dist/src/index.js +13 -0
  34. package/dist/src/index.js.map +1 -0
  35. package/dist/src/memory.d.ts +9 -0
  36. package/dist/src/memory.js +242 -0
  37. package/dist/src/memory.js.map +1 -0
  38. package/dist/src/migration.d.ts +46 -0
  39. package/dist/src/migration.js +112 -0
  40. package/dist/src/migration.js.map +1 -0
  41. package/dist/src/repository.d.ts +12 -0
  42. package/dist/src/repository.js +69 -0
  43. package/dist/src/repository.js.map +1 -0
  44. package/dist/src/reviewer.d.ts +82 -0
  45. package/dist/src/reviewer.js +184 -0
  46. package/dist/src/reviewer.js.map +1 -0
  47. package/dist/src/state/lock.d.ts +13 -0
  48. package/dist/src/state/lock.js +100 -0
  49. package/dist/src/state/lock.js.map +1 -0
  50. package/dist/src/state/store.d.ts +45 -0
  51. package/dist/src/state/store.js +185 -0
  52. package/dist/src/state/store.js.map +1 -0
  53. package/dist/src/ulid.d.ts +2 -0
  54. package/dist/src/ulid.js +22 -0
  55. package/dist/src/ulid.js.map +1 -0
  56. package/dist/src/version.d.ts +2 -0
  57. package/dist/src/version.js +3 -0
  58. package/dist/src/version.js.map +1 -0
  59. package/dist/src/workflow.d.ts +93 -0
  60. package/dist/src/workflow.js +1276 -0
  61. package/dist/src/workflow.js.map +1 -0
  62. package/docs/decisions.md +38 -0
  63. package/docs/development-flow.md +69 -0
  64. package/docs/project-memory.md +38 -0
  65. package/docs/release.md +26 -0
  66. package/docs/validation-report.md +19 -0
  67. package/package.json +56 -0
  68. package/plugins/codex-workflow-gateway/.codex-plugin/plugin.json +25 -0
  69. package/plugins/codex-workflow-gateway/references/protocol.md +66 -0
  70. package/plugins/codex-workflow-gateway/scripts/install-or-update.sh +26 -0
  71. package/plugins/codex-workflow-gateway/skills/codex-workflow-gateway/SKILL.md +72 -0
  72. package/references/discovery.md +12 -0
  73. package/references/git-policy.md +7 -0
  74. package/references/state-machine.md +11 -0
  75. package/references/validation-and-review.md +13 -0
  76. package/roles/delivery-coordinator.md +10 -0
  77. package/roles/independent-reviewer.md +10 -0
  78. package/roles/scope-lead.md +11 -0
  79. package/roles/technical-planner.md +10 -0
  80. package/roles/worker.md +10 -0
  81. package/schemas/context-envelope.schema.json +58 -0
  82. package/schemas/discovery.schema.json +19 -0
  83. package/schemas/graph-binding.schema.json +30 -0
  84. package/schemas/milestone.schema.json +58 -0
  85. package/schemas/project-knowledge-map.schema.json +37 -0
  86. package/schemas/review-result.schema.json +30 -0
  87. package/schemas/task.schema.json +39 -0
  88. package/templates/brief.md +21 -0
  89. package/templates/plan.md +17 -0
  90. package/templates/result.md +13 -0
@@ -0,0 +1,242 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { lstatSync, readFileSync, readdirSync, realpathSync } from 'node:fs';
3
+ import path from 'node:path';
4
+ import { STATE_SCHEMA_VERSION, } from './contracts.js';
5
+ import { WorkflowError } from './errors.js';
6
+ export const KNOWLEDGE_CATEGORIES = [
7
+ 'agent-guidance',
8
+ 'onboarding',
9
+ 'architecture',
10
+ 'decisions',
11
+ 'commands',
12
+ 'ownership',
13
+ 'testing',
14
+ 'operations',
15
+ 'domain',
16
+ ];
17
+ const ignoredDirectories = new Set([
18
+ '.git',
19
+ '.worktrees',
20
+ '.test-dist',
21
+ 'node_modules',
22
+ 'dist',
23
+ 'build',
24
+ 'coverage',
25
+ ]);
26
+ export function scanProjectKnowledge(repositoryRoot, projectId, now = new Date()) {
27
+ const root = realpathSync(repositoryRoot);
28
+ const timestamp = now.toISOString();
29
+ const entries = [];
30
+ walk(root, root, (absolute, relative) => {
31
+ const category = classifyKnowledgePath(relative);
32
+ if (!category)
33
+ return;
34
+ const scope = normalizeScope(path.posix.dirname(relative));
35
+ entries.push({
36
+ id: sourceId(category, relative),
37
+ category,
38
+ path: relative,
39
+ scope,
40
+ authority: 'supporting',
41
+ contentHash: hashFile(absolute),
42
+ discoveredBy: 'repository-scan',
43
+ lastVerifiedAt: timestamp,
44
+ });
45
+ });
46
+ entries.sort(compareSources);
47
+ const gaps = knowledgeGaps(entries);
48
+ return {
49
+ schemaVersion: STATE_SCHEMA_VERSION,
50
+ revision: 0,
51
+ id: 'PROJECT-KNOWLEDGE-MAP',
52
+ projectId,
53
+ createdAt: timestamp,
54
+ updatedAt: timestamp,
55
+ kind: 'knowledge-map',
56
+ status: 'awaiting_approval',
57
+ entries,
58
+ gaps,
59
+ conflicts: [],
60
+ approval: null,
61
+ };
62
+ }
63
+ export function applyKnowledgeSelections(map, selections, actor, now = new Date()) {
64
+ const byId = new Map(map.entries.map((entry) => [entry.id, entry]));
65
+ const selectedIds = new Set();
66
+ for (const selection of selections) {
67
+ if (selectedIds.has(selection.sourceId)) {
68
+ throw new WorkflowError('INVALID_ARGUMENT', `Duplicate knowledge selection: ${selection.sourceId}`);
69
+ }
70
+ selectedIds.add(selection.sourceId);
71
+ if (!byId.has(selection.sourceId)) {
72
+ throw new WorkflowError('INVALID_ARGUMENT', `Unknown knowledge source: ${selection.sourceId}`);
73
+ }
74
+ }
75
+ const authority = new Map(selections.map((selection) => [selection.sourceId, selection.authority]));
76
+ const entries = map.entries
77
+ .map((entry) => ({ ...entry, authority: authority.get(entry.id) ?? entry.authority }))
78
+ .sort(compareSources);
79
+ const conflicts = knowledgeConflicts(entries);
80
+ const candidate = {
81
+ ...map,
82
+ entries,
83
+ gaps: knowledgeGaps(entries),
84
+ conflicts,
85
+ approval: null,
86
+ status: conflicts.length > 0 ? 'conflicted' : 'awaiting_approval',
87
+ };
88
+ if (conflicts.length > 0)
89
+ return candidate;
90
+ const mapHash = hashKnowledgeMap(candidate);
91
+ return {
92
+ ...candidate,
93
+ status: 'active',
94
+ approval: {
95
+ mapHash,
96
+ actor: actor.trim() || 'user',
97
+ approvedAt: now.toISOString(),
98
+ },
99
+ };
100
+ }
101
+ export function reconcileKnowledgeMap(current, scanned) {
102
+ const previous = new Map(current.entries.map((entry) => [`${entry.category}\0${entry.path}\0${entry.scope}`, entry]));
103
+ const entries = scanned.entries.map((entry) => {
104
+ const existing = previous.get(`${entry.category}\0${entry.path}\0${entry.scope}`);
105
+ return existing ? { ...entry, authority: existing.authority } : entry;
106
+ });
107
+ const conflicts = knowledgeConflicts(entries);
108
+ const candidate = {
109
+ ...scanned,
110
+ createdAt: current.createdAt,
111
+ entries: entries.sort(compareSources),
112
+ gaps: knowledgeGaps(entries),
113
+ conflicts,
114
+ status: conflicts.length > 0 ? 'conflicted' : 'awaiting_approval',
115
+ };
116
+ if (current.status !== 'active' || !current.approval)
117
+ return candidate;
118
+ return hashKnowledgeMap(candidate) === current.approval.mapHash
119
+ ? { ...candidate, status: 'active', approval: current.approval }
120
+ : { ...candidate, status: conflicts.length > 0 ? 'conflicted' : 'stale', approval: null };
121
+ }
122
+ export function inspectKnowledgeMap(current, scanned) {
123
+ const reconciled = reconcileKnowledgeMap(current, scanned);
124
+ return { ...reconciled, revision: current.revision, updatedAt: current.updatedAt };
125
+ }
126
+ export function hashKnowledgeMap(map) {
127
+ const stable = {
128
+ projectId: map.projectId,
129
+ entries: [...map.entries].sort(compareSources).map(({ lastVerifiedAt: _verified, ...entry }) => entry),
130
+ gaps: [...map.gaps].sort(compareGaps),
131
+ conflicts: [...map.conflicts].sort(compareConflicts),
132
+ };
133
+ return createHash('sha256').update(JSON.stringify(stable)).digest('hex');
134
+ }
135
+ export function selectKnowledgeSources(map, role, targetPaths = []) {
136
+ const targets = new Set(targetPaths.map(normalizeRelativePath));
137
+ const roleCategories = {
138
+ 'scope-lead': new Set(KNOWLEDGE_CATEGORIES),
139
+ 'technical-planner': new Set(['agent-guidance', 'onboarding', 'architecture', 'decisions', 'commands', 'ownership', 'testing', 'domain']),
140
+ 'delivery-coordinator': new Set(['agent-guidance', 'commands', 'ownership', 'testing', 'operations']),
141
+ worker: new Set(['agent-guidance', 'commands', 'testing']),
142
+ 'independent-reviewer': new Set(KNOWLEDGE_CATEGORIES),
143
+ };
144
+ return map.entries
145
+ .filter((entry) => entry.authority === 'canonical' || targets.has(entry.path))
146
+ .filter((entry) => roleCategories[role].has(entry.category) || targets.has(entry.path))
147
+ .map((entry) => entry.path)
148
+ .sort();
149
+ }
150
+ export function normalizeRelativePath(value) {
151
+ const normalized = value.replaceAll('\\', '/').replace(/^\.\//, '');
152
+ if (!normalized || normalized === '.' || path.posix.isAbsolute(normalized)) {
153
+ throw new WorkflowError('INVALID_ARGUMENT', `Knowledge path must be repository-relative: ${value}`);
154
+ }
155
+ const clean = path.posix.normalize(normalized);
156
+ if (clean === '..' || clean.startsWith('../')) {
157
+ throw new WorkflowError('INVALID_ARGUMENT', `Knowledge path escapes repository root: ${value}`);
158
+ }
159
+ return clean;
160
+ }
161
+ function walk(root, directory, visit) {
162
+ const entries = readdirSync(directory, { withFileTypes: true }).sort((left, right) => left.name.localeCompare(right.name));
163
+ for (const entry of entries) {
164
+ if (entry.isDirectory() && ignoredDirectories.has(entry.name))
165
+ continue;
166
+ const absolute = path.join(directory, entry.name);
167
+ if (entry.isSymbolicLink())
168
+ continue;
169
+ if (entry.isDirectory()) {
170
+ walk(root, absolute, visit);
171
+ continue;
172
+ }
173
+ if (!entry.isFile() || !lstatSync(absolute).isFile())
174
+ continue;
175
+ const relative = path.relative(root, absolute).replaceAll(path.sep, '/');
176
+ visit(absolute, normalizeRelativePath(relative));
177
+ }
178
+ }
179
+ function classifyKnowledgePath(relative) {
180
+ const lower = relative.toLowerCase();
181
+ const base = path.posix.basename(lower);
182
+ if (base === 'agents.md')
183
+ return 'agent-guidance';
184
+ if (/^readme(?:\.[a-z0-9_-]+)?$/.test(base))
185
+ return 'onboarding';
186
+ if (base === 'codeowners' || base === 'owners')
187
+ return 'ownership';
188
+ if (base === 'package.json' || base === 'makefile' || base === 'justfile' || /^taskfile(?:\..+)?$/.test(base))
189
+ return 'commands';
190
+ if (/(^|\/)(adr|adrs|decisions)(\/|$)/.test(lower) || /^adr[-_].+\.md$/.test(base))
191
+ return 'decisions';
192
+ if (/(^|\/)(architecture|architectures)(\/|$)/.test(lower) || /architecture.*\.md$/.test(base))
193
+ return 'architecture';
194
+ if (/(^|\/)(domain|domains)(\/|$)/.test(lower))
195
+ return 'domain';
196
+ if (/(^|\/)(operations|runbooks?)(\/|$)/.test(lower) || /^dockerfile/.test(base) || /^compose.*\.ya?ml$/.test(base))
197
+ return 'operations';
198
+ if (/(^|\/)(\.github\/workflows|tests?|testing)(\/|$)/.test(lower) || /^(vitest|jest|playwright|cypress|pytest|test).*(json|js|ts|mjs|cjs|toml|ini)$/.test(base))
199
+ return 'testing';
200
+ return null;
201
+ }
202
+ function knowledgeGaps(entries) {
203
+ const present = new Set(entries.map((entry) => entry.category));
204
+ return KNOWLEDGE_CATEGORIES
205
+ .filter((category) => !present.has(category))
206
+ .map((category) => ({ category, scope: '.', reason: `No ${category} source was discovered.` }));
207
+ }
208
+ function knowledgeConflicts(entries) {
209
+ const groups = new Map();
210
+ for (const entry of entries.filter((candidate) => candidate.authority === 'canonical')) {
211
+ const key = `${entry.category}\0${entry.scope}`;
212
+ groups.set(key, [...(groups.get(key) ?? []), entry]);
213
+ }
214
+ return [...groups.values()]
215
+ .filter((group) => group.length > 1)
216
+ .map((group) => ({
217
+ category: group[0].category,
218
+ scope: group[0].scope,
219
+ sourceIds: group.map((entry) => entry.id).sort(),
220
+ reason: 'More than one canonical source exists for the same category and scope.',
221
+ }))
222
+ .sort(compareConflicts);
223
+ }
224
+ function sourceId(category, relative) {
225
+ return `KS-${createHash('sha256').update(`${category}\0${relative}`).digest('hex').slice(0, 16)}`;
226
+ }
227
+ function hashFile(file) {
228
+ return createHash('sha256').update(readFileSync(file)).digest('hex');
229
+ }
230
+ function normalizeScope(value) {
231
+ return value === '.' || value === '' ? '.' : normalizeRelativePath(value);
232
+ }
233
+ function compareSources(left, right) {
234
+ return `${left.category}\0${left.scope}\0${left.path}`.localeCompare(`${right.category}\0${right.scope}\0${right.path}`);
235
+ }
236
+ function compareGaps(left, right) {
237
+ return `${left.category}\0${left.scope}`.localeCompare(`${right.category}\0${right.scope}`);
238
+ }
239
+ function compareConflicts(left, right) {
240
+ return `${left.category}\0${left.scope}`.localeCompare(`${right.category}\0${right.scope}`);
241
+ }
242
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { FileStateStore } from './state/store.js';
2
+ interface SnapshotFile {
3
+ path: string;
4
+ mode: number;
5
+ size: number;
6
+ sha256: string;
7
+ contentBase64: string;
8
+ }
9
+ interface LegacySnapshot {
10
+ format: 'codex-workflow-v1-snapshot';
11
+ version: 1;
12
+ projectId: string;
13
+ repositoryRootFingerprint: string;
14
+ git: {
15
+ head: string;
16
+ branch: string | null;
17
+ statusPorcelainV1: string[];
18
+ refs: string[];
19
+ };
20
+ files: SnapshotFile[];
21
+ }
22
+ export interface MigrationReport {
23
+ dryRun: boolean;
24
+ snapshotRequested: boolean;
25
+ projectId: string;
26
+ stateSchemaVersion: number;
27
+ entities: {
28
+ discoveries: number;
29
+ tasks: number;
30
+ milestones: number;
31
+ };
32
+ actions: string[];
33
+ legacy: {
34
+ detected: boolean;
35
+ paths: string[];
36
+ automaticMappingSupported: false;
37
+ };
38
+ snapshot: null | {
39
+ format: LegacySnapshot['format'];
40
+ contentHash: string;
41
+ file: string;
42
+ fileCount: number;
43
+ };
44
+ }
45
+ export declare function migrateState(repository: string, store: FileStateStore, dryRun: boolean, snapshotRequested?: boolean): MigrationReport;
46
+ export {};
@@ -0,0 +1,112 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { existsSync, lstatSync, readFileSync, readdirSync, writeFileSync } from 'node:fs';
3
+ import path from 'node:path';
4
+ import { gzipSync } from 'node:zlib';
5
+ import { STATE_SCHEMA_VERSION } from './contracts.js';
6
+ import { WorkflowError } from './errors.js';
7
+ import { ensureDirectory } from './fs-utils.js';
8
+ import { resolveRepositoryIdentity, runGit } from './repository.js';
9
+ const LEGACY_CANDIDATES = ['.tasks', '.increments', '.codex-workflow.json', '.codex-workflow.lock.json'];
10
+ export function migrateState(repository, store, dryRun, snapshotRequested = !dryRun) {
11
+ if (dryRun && snapshotRequested) {
12
+ throw new WorkflowError('INVALID_ARGUMENT', 'Choose either migration dry-run or snapshot creation.');
13
+ }
14
+ const identity = resolveRepositoryIdentity(repository);
15
+ store.registerProject(identity);
16
+ const legacyPaths = LEGACY_CANDIDATES.filter((candidate) => existsSync(path.join(identity.repositoryRoot, candidate)));
17
+ const report = {
18
+ dryRun,
19
+ snapshotRequested,
20
+ projectId: identity.projectId,
21
+ stateSchemaVersion: STATE_SCHEMA_VERSION,
22
+ entities: {
23
+ discoveries: store.listDiscoveries(identity.projectId).length,
24
+ tasks: store.listTasks(identity.projectId).length,
25
+ milestones: store.listMilestones(identity.projectId).length,
26
+ },
27
+ actions: [],
28
+ legacy: {
29
+ detected: legacyPaths.length > 0,
30
+ paths: legacyPaths,
31
+ automaticMappingSupported: false,
32
+ },
33
+ snapshot: null,
34
+ };
35
+ if (!snapshotRequested)
36
+ return report;
37
+ if (legacyPaths.length === 0) {
38
+ throw new WorkflowError('NOT_FOUND', 'No legacy V1 workflow state was detected.');
39
+ }
40
+ const snapshot = buildSnapshot(identity.repositoryRoot, identity.projectId, legacyPaths);
41
+ const bytes = gzipSync(Buffer.from(`${JSON.stringify(snapshot)}\n`, 'utf8'), { level: 9 });
42
+ const contentHash = createHash('sha256').update(bytes).digest('hex');
43
+ const directory = store.snapshotRoot(identity.projectId);
44
+ const file = path.join(directory, `${contentHash}.snapshot.json.gz`);
45
+ ensureDirectory(directory);
46
+ if (!existsSync(file))
47
+ writeFileSync(file, bytes, { mode: 0o600, flag: 'wx' });
48
+ report.actions.push('Created immutable legacy snapshot; no V1 state was imported or modified.');
49
+ report.snapshot = {
50
+ format: snapshot.format,
51
+ contentHash,
52
+ file,
53
+ fileCount: snapshot.files.length,
54
+ };
55
+ return report;
56
+ }
57
+ function buildSnapshot(repositoryRoot, projectId, legacyPaths) {
58
+ const files = legacyPaths.flatMap((relative) => collectFiles(repositoryRoot, relative));
59
+ files.sort((left, right) => left.path.localeCompare(right.path));
60
+ const branch = safeGit(repositoryRoot, ['symbolic-ref', '--short', 'HEAD']) || null;
61
+ return {
62
+ format: 'codex-workflow-v1-snapshot',
63
+ version: 1,
64
+ projectId,
65
+ repositoryRootFingerprint: createHash('sha256').update(path.resolve(repositoryRoot)).digest('hex'),
66
+ git: {
67
+ head: runGit(repositoryRoot, ['rev-parse', 'HEAD']),
68
+ branch,
69
+ statusPorcelainV1: safeGit(repositoryRoot, ['status', '--porcelain=v1', '--untracked-files=all'])
70
+ .split('\n')
71
+ .filter(Boolean)
72
+ .sort(),
73
+ refs: safeGit(repositoryRoot, ['for-each-ref', '--format=%(refname) %(objectname)'])
74
+ .split('\n')
75
+ .filter(Boolean)
76
+ .sort(),
77
+ },
78
+ files,
79
+ };
80
+ }
81
+ function collectFiles(repositoryRoot, relative) {
82
+ const absolute = path.join(repositoryRoot, relative);
83
+ const stat = lstatSync(absolute);
84
+ if (stat.isSymbolicLink()) {
85
+ throw new WorkflowError('TRANSITION_BLOCKED', `Legacy snapshot rejects symbolic link: ${relative}`);
86
+ }
87
+ if (stat.isDirectory()) {
88
+ return readdirSync(absolute)
89
+ .sort()
90
+ .flatMap((name) => collectFiles(repositoryRoot, path.join(relative, name)));
91
+ }
92
+ if (!stat.isFile()) {
93
+ throw new WorkflowError('TRANSITION_BLOCKED', `Legacy snapshot supports regular files only: ${relative}`);
94
+ }
95
+ const content = readFileSync(absolute);
96
+ return [{
97
+ path: relative.split(path.sep).join('/'),
98
+ mode: stat.mode & 0o777,
99
+ size: content.length,
100
+ sha256: createHash('sha256').update(content).digest('hex'),
101
+ contentBase64: content.toString('base64'),
102
+ }];
103
+ }
104
+ function safeGit(repositoryRoot, args) {
105
+ try {
106
+ return runGit(repositoryRoot, args);
107
+ }
108
+ catch {
109
+ return '';
110
+ }
111
+ }
112
+ //# sourceMappingURL=migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.js","sourceRoot":"","sources":["../../src/migration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface RepositoryIdentity {
2
+ projectId: string;
3
+ repositoryRoot: string;
4
+ gitCommonDir: string;
5
+ }
6
+ export declare function runGit(repositoryRoot: string, args: string[], allowFailure?: boolean): string;
7
+ export declare function resolveRepositoryIdentity(repository: string): RepositoryIdentity;
8
+ export declare function currentBranch(repositoryRoot: string): string | null;
9
+ export declare function headCommit(repositoryRoot: string): string;
10
+ export declare function changedFiles(repositoryRoot: string): string[];
11
+ export declare function isClean(repositoryRoot: string): boolean;
12
+ export declare function gitIsAncestor(repositoryRoot: string, ancestor: string, descendant: string): boolean;
@@ -0,0 +1,69 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { realpathSync } from 'node:fs';
3
+ import path from 'node:path';
4
+ import { spawnSync } from 'node:child_process';
5
+ import { WorkflowError } from './errors.js';
6
+ export function runGit(repositoryRoot, args, allowFailure = false) {
7
+ const result = spawnSync('git', ['-C', repositoryRoot, ...args], { encoding: 'utf8' });
8
+ if (result.status !== 0 && !allowFailure) {
9
+ throw new WorkflowError('COMMAND_FAILED', `git ${args.join(' ')} failed`, {
10
+ stdout: result.stdout.trim(),
11
+ stderr: result.stderr.trim(),
12
+ exitCode: result.status,
13
+ });
14
+ }
15
+ return result.stdout.trim();
16
+ }
17
+ export function resolveRepositoryIdentity(repository) {
18
+ const repositoryRoot = realpathSync(runGit(repository, ['rev-parse', '--show-toplevel']));
19
+ const rawCommonDir = runGit(repositoryRoot, ['rev-parse', '--git-common-dir']);
20
+ const commonCandidate = path.isAbsolute(rawCommonDir)
21
+ ? rawCommonDir
22
+ : path.resolve(repositoryRoot, rawCommonDir);
23
+ const gitCommonDir = realpathSync(commonCandidate);
24
+ const projectId = createHash('sha256').update(gitCommonDir).digest('hex').slice(0, 24);
25
+ return { projectId, repositoryRoot, gitCommonDir };
26
+ }
27
+ export function currentBranch(repositoryRoot) {
28
+ const branch = runGit(repositoryRoot, ['branch', '--show-current'], true);
29
+ return branch || null;
30
+ }
31
+ export function headCommit(repositoryRoot) {
32
+ return runGit(repositoryRoot, ['rev-parse', 'HEAD']);
33
+ }
34
+ export function changedFiles(repositoryRoot) {
35
+ const result = spawnSync('git', ['-C', repositoryRoot, 'status', '--porcelain=v1', '--untracked-files=all'], { encoding: 'utf8' });
36
+ if (result.status !== 0) {
37
+ throw new WorkflowError('COMMAND_FAILED', 'Unable to inspect Git working tree.', {
38
+ stdout: result.stdout.trim(),
39
+ stderr: result.stderr.trim(),
40
+ exitCode: result.status,
41
+ });
42
+ }
43
+ const output = result.stdout.trimEnd();
44
+ if (!output)
45
+ return [];
46
+ return output.split('\n').map((line) => {
47
+ const entry = line.slice(3).trim();
48
+ const renameTarget = entry.includes(' -> ') ? entry.split(' -> ').at(-1) : entry;
49
+ return renameTarget?.replaceAll('\\', '/') ?? entry;
50
+ });
51
+ }
52
+ export function isClean(repositoryRoot) {
53
+ return changedFiles(repositoryRoot).length === 0;
54
+ }
55
+ export function gitIsAncestor(repositoryRoot, ancestor, descendant) {
56
+ const result = spawnSync('git', ['-C', repositoryRoot, 'merge-base', '--is-ancestor', ancestor, descendant], { encoding: 'utf8' });
57
+ if (result.status === 0)
58
+ return true;
59
+ if (result.status === 1)
60
+ return false;
61
+ throw new WorkflowError('COMMAND_FAILED', 'Unable to verify Git ancestry.', {
62
+ ancestor,
63
+ descendant,
64
+ stdout: result.stdout.trim(),
65
+ stderr: result.stderr.trim(),
66
+ exitCode: result.status,
67
+ });
68
+ }
69
+ //# sourceMappingURL=repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ import type { ContextEnvelope, ReviewInput, TaskState } from './contracts.js';
2
+ export interface ReviewerProcessResult {
3
+ status: number | null;
4
+ stdout: string;
5
+ stderr: string;
6
+ }
7
+ export type ReviewerCommandRunner = (command: string, args: string[], options: {
8
+ cwd: string;
9
+ input: string;
10
+ }) => ReviewerProcessResult;
11
+ export interface StrictReviewOutput extends ReviewInput {
12
+ isolationProbe: 'denied' | 'written' | 'not-attempted';
13
+ }
14
+ export interface StrictReviewerLaunchResult {
15
+ review: ReviewInput;
16
+ verifiedIsolation: boolean;
17
+ command: string[];
18
+ processStatus: number | null;
19
+ stderr: string;
20
+ before: RepositorySeal;
21
+ after: RepositorySeal;
22
+ }
23
+ interface RepositorySeal {
24
+ headCommit: string;
25
+ changedFiles: string[];
26
+ contentHash: string;
27
+ }
28
+ declare const REVIEW_SCHEMA: {
29
+ readonly type: "object";
30
+ readonly additionalProperties: false;
31
+ readonly required: readonly ["status", "reviewer", "summary", "findings", "isolationProbe"];
32
+ readonly properties: {
33
+ readonly status: {
34
+ readonly enum: readonly ["passed", "failed", "unverified"];
35
+ };
36
+ readonly reviewer: {
37
+ readonly type: "string";
38
+ readonly minLength: 1;
39
+ };
40
+ readonly summary: {
41
+ readonly type: "string";
42
+ readonly minLength: 1;
43
+ };
44
+ readonly isolationProbe: {
45
+ readonly enum: readonly ["denied", "written", "not-attempted"];
46
+ };
47
+ readonly findings: {
48
+ readonly type: "array";
49
+ readonly items: {
50
+ readonly type: "object";
51
+ readonly additionalProperties: false;
52
+ readonly required: readonly ["id", "severity", "requirement", "summary", "evidence", "requiredAction"];
53
+ readonly properties: {
54
+ readonly id: {
55
+ readonly type: "string";
56
+ readonly minLength: 1;
57
+ };
58
+ readonly severity: {
59
+ readonly enum: readonly ["critical", "major", "minor"];
60
+ };
61
+ readonly requirement: {
62
+ readonly type: readonly ["string", "null"];
63
+ };
64
+ readonly summary: {
65
+ readonly type: "string";
66
+ readonly minLength: 1;
67
+ };
68
+ readonly evidence: {
69
+ readonly type: "string";
70
+ readonly minLength: 1;
71
+ };
72
+ readonly requiredAction: {
73
+ readonly type: "string";
74
+ readonly minLength: 1;
75
+ };
76
+ };
77
+ };
78
+ };
79
+ };
80
+ };
81
+ export declare function launchStrictReviewer(repositoryRoot: string, task: TaskState, taskRoot: string, envelope: ContextEnvelope, runner?: ReviewerCommandRunner): StrictReviewerLaunchResult;
82
+ export { REVIEW_SCHEMA };