codex-orchestrator 0.1.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 (122) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +94 -0
  3. package/dist/src/cli.d.ts +3 -0
  4. package/dist/src/cli.d.ts.map +1 -0
  5. package/dist/src/cli.js +253 -0
  6. package/dist/src/cli.js.map +1 -0
  7. package/dist/src/codex/command-adapter.d.ts +27 -0
  8. package/dist/src/codex/command-adapter.d.ts.map +1 -0
  9. package/dist/src/codex/command-adapter.js +49 -0
  10. package/dist/src/codex/command-adapter.js.map +1 -0
  11. package/dist/src/config/constants.d.ts +6 -0
  12. package/dist/src/config/constants.d.ts.map +1 -0
  13. package/dist/src/config/constants.js +13 -0
  14. package/dist/src/config/constants.js.map +1 -0
  15. package/dist/src/config/schema.d.ts +87 -0
  16. package/dist/src/config/schema.d.ts.map +1 -0
  17. package/dist/src/config/schema.js +180 -0
  18. package/dist/src/config/schema.js.map +1 -0
  19. package/dist/src/git/worktree.d.ts +50 -0
  20. package/dist/src/git/worktree.d.ts.map +1 -0
  21. package/dist/src/git/worktree.js +139 -0
  22. package/dist/src/git/worktree.js.map +1 -0
  23. package/dist/src/github/gh-cli.d.ts +11 -0
  24. package/dist/src/github/gh-cli.d.ts.map +1 -0
  25. package/dist/src/github/gh-cli.js +28 -0
  26. package/dist/src/github/gh-cli.js.map +1 -0
  27. package/dist/src/github/gh-issue-adapter.d.ts +15 -0
  28. package/dist/src/github/gh-issue-adapter.d.ts.map +1 -0
  29. package/dist/src/github/gh-issue-adapter.js +193 -0
  30. package/dist/src/github/gh-issue-adapter.js.map +1 -0
  31. package/dist/src/github/gh-pull-request-adapter.d.ts +9 -0
  32. package/dist/src/github/gh-pull-request-adapter.d.ts.map +1 -0
  33. package/dist/src/github/gh-pull-request-adapter.js +39 -0
  34. package/dist/src/github/gh-pull-request-adapter.js.map +1 -0
  35. package/dist/src/github/issues.d.ts +80 -0
  36. package/dist/src/github/issues.d.ts.map +1 -0
  37. package/dist/src/github/issues.js +122 -0
  38. package/dist/src/github/issues.js.map +1 -0
  39. package/dist/src/github/pull-requests.d.ts +24 -0
  40. package/dist/src/github/pull-requests.d.ts.map +1 -0
  41. package/dist/src/github/pull-requests.js +21 -0
  42. package/dist/src/github/pull-requests.js.map +1 -0
  43. package/dist/src/index.d.ts +31 -0
  44. package/dist/src/index.d.ts.map +1 -0
  45. package/dist/src/index.js +17 -0
  46. package/dist/src/index.js.map +1 -0
  47. package/dist/src/package-info.d.ts +6 -0
  48. package/dist/src/package-info.d.ts.map +1 -0
  49. package/dist/src/package-info.js +13 -0
  50. package/dist/src/package-info.js.map +1 -0
  51. package/dist/src/process/command.d.ts +15 -0
  52. package/dist/src/process/command.d.ts.map +1 -0
  53. package/dist/src/process/command.js +34 -0
  54. package/dist/src/process/command.js.map +1 -0
  55. package/dist/src/runner/command-utils.d.ts +5 -0
  56. package/dist/src/runner/command-utils.d.ts.map +1 -0
  57. package/dist/src/runner/command-utils.js +19 -0
  58. package/dist/src/runner/command-utils.js.map +1 -0
  59. package/dist/src/runner/issue-state-machine.d.ts +39 -0
  60. package/dist/src/runner/issue-state-machine.d.ts.map +1 -0
  61. package/dist/src/runner/issue-state-machine.js +119 -0
  62. package/dist/src/runner/issue-state-machine.js.map +1 -0
  63. package/dist/src/runner/issue-tree.d.ts +62 -0
  64. package/dist/src/runner/issue-tree.d.ts.map +1 -0
  65. package/dist/src/runner/issue-tree.js +376 -0
  66. package/dist/src/runner/issue-tree.js.map +1 -0
  67. package/dist/src/runner/local-state.d.ts +31 -0
  68. package/dist/src/runner/local-state.d.ts.map +1 -0
  69. package/dist/src/runner/local-state.js +125 -0
  70. package/dist/src/runner/local-state.js.map +1 -0
  71. package/dist/src/runner/plan-auto-command.d.ts +30 -0
  72. package/dist/src/runner/plan-auto-command.d.ts.map +1 -0
  73. package/dist/src/runner/plan-auto-command.js +611 -0
  74. package/dist/src/runner/plan-auto-command.js.map +1 -0
  75. package/dist/src/runner/prompt.d.ts +108 -0
  76. package/dist/src/runner/prompt.d.ts.map +1 -0
  77. package/dist/src/runner/prompt.js +322 -0
  78. package/dist/src/runner/prompt.js.map +1 -0
  79. package/dist/src/runner/recovery.d.ts +24 -0
  80. package/dist/src/runner/recovery.d.ts.map +1 -0
  81. package/dist/src/runner/recovery.js +62 -0
  82. package/dist/src/runner/recovery.js.map +1 -0
  83. package/dist/src/runner/safety.d.ts +14 -0
  84. package/dist/src/runner/safety.d.ts.map +1 -0
  85. package/dist/src/runner/safety.js +46 -0
  86. package/dist/src/runner/safety.js.map +1 -0
  87. package/dist/src/runner/scoped-auto-command.d.ts +29 -0
  88. package/dist/src/runner/scoped-auto-command.d.ts.map +1 -0
  89. package/dist/src/runner/scoped-auto-command.js +262 -0
  90. package/dist/src/runner/scoped-auto-command.js.map +1 -0
  91. package/dist/src/runner/status-command.d.ts +17 -0
  92. package/dist/src/runner/status-command.d.ts.map +1 -0
  93. package/dist/src/runner/status-command.js +72 -0
  94. package/dist/src/runner/status-command.js.map +1 -0
  95. package/dist/src/setup/github-label-adapter.d.ts +13 -0
  96. package/dist/src/setup/github-label-adapter.d.ts.map +1 -0
  97. package/dist/src/setup/github-label-adapter.js +28 -0
  98. package/dist/src/setup/github-label-adapter.js.map +1 -0
  99. package/dist/src/setup/labels.d.ts +27 -0
  100. package/dist/src/setup/labels.d.ts.map +1 -0
  101. package/dist/src/setup/labels.js +42 -0
  102. package/dist/src/setup/labels.js.map +1 -0
  103. package/dist/src/setup/project-config.d.ts +15 -0
  104. package/dist/src/setup/project-config.d.ts.map +1 -0
  105. package/dist/src/setup/project-config.js +124 -0
  106. package/dist/src/setup/project-config.js.map +1 -0
  107. package/dist/src/setup/setup-command.d.ts +22 -0
  108. package/dist/src/setup/setup-command.d.ts.map +1 -0
  109. package/dist/src/setup/setup-command.js +104 -0
  110. package/dist/src/setup/setup-command.js.map +1 -0
  111. package/dist/src/setup/workflows.d.ts +11 -0
  112. package/dist/src/setup/workflows.d.ts.map +1 -0
  113. package/dist/src/setup/workflows.js +60 -0
  114. package/dist/src/setup/workflows.js.map +1 -0
  115. package/package.json +45 -0
  116. package/prompts/setup-skill.md +11 -0
  117. package/prompts/workflows/breakdown-review.md +4 -0
  118. package/prompts/workflows/issue-breakdown.md +4 -0
  119. package/prompts/workflows/issue-tree-orchestration.md +4 -0
  120. package/prompts/workflows/prd.md +4 -0
  121. package/prompts/workflows/scoped-implementation.md +4 -0
  122. package/prompts/workflows/triage.md +4 -0
@@ -0,0 +1,29 @@
1
+ import { type CodexCommandRunInput, type CodexCommandRunResult } from '../codex/command-adapter.js';
2
+ import type { GitHubIssueAdapter } from '../github/issues.js';
3
+ import type { GitHubPullRequest, GitHubPullRequestAdapter } from '../github/pull-requests.js';
4
+ import { GitWorktreeManager } from '../git/worktree.js';
5
+ import { type ShellCommandExecutor } from '../process/command.js';
6
+ export interface ScopedAutoCommandOptions {
7
+ targetRoot: string;
8
+ issueNumber: number;
9
+ issueAdapter?: GitHubIssueAdapter;
10
+ pullRequestAdapter?: GitHubPullRequestAdapter;
11
+ git?: GitWorktreeManager;
12
+ codexAdapter?: {
13
+ run(input: CodexCommandRunInput): Promise<CodexCommandRunResult>;
14
+ };
15
+ shellExecutor?: ShellCommandExecutor;
16
+ now?: Date;
17
+ }
18
+ export interface ScopedAutoCommandResult {
19
+ issueNumber: number;
20
+ branchName: string;
21
+ worktreePath: string;
22
+ promptPath: string;
23
+ reportPath: string;
24
+ pullRequest?: GitHubPullRequest;
25
+ status: 'review-ready' | 'blocked' | 'promotion-requested';
26
+ reportComment: string;
27
+ }
28
+ export declare function runScopedAutoCommand(options: ScopedAutoCommandOptions): Promise<ScopedAutoCommandResult>;
29
+ //# sourceMappingURL=scoped-auto-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scoped-auto-command.d.ts","sourceRoot":"","sources":["../../../src/runner/scoped-auto-command.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuB,KAAK,oBAAoB,EAAE,KAAK,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAIzH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAC9F,OAAO,EAAE,kBAAkB,EAAwB,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAA+B,KAAK,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAkB/F,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAClC,kBAAkB,CAAC,EAAE,wBAAwB,CAAC;IAC9C,GAAG,CAAC,EAAE,kBAAkB,CAAC;IACzB,YAAY,CAAC,EAAE;QAAE,GAAG,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAA;KAAE,CAAC;IACpF,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,MAAM,EAAE,cAAc,GAAG,SAAS,GAAG,qBAAqB,CAAC;IAC3D,aAAa,EAAE,MAAM,CAAC;CACvB;AAQD,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAyK9G"}
@@ -0,0 +1,262 @@
1
+ import { mkdir, readFile } from 'node:fs/promises';
2
+ import { dirname, join, resolve } from 'node:path';
3
+ import { CodexCommandAdapter } from '../codex/command-adapter.js';
4
+ import { GhCliIssueAdapter } from '../github/gh-issue-adapter.js';
5
+ import { GhCliPullRequestAdapter } from '../github/gh-pull-request-adapter.js';
6
+ import { GitWorktreeManager, renderBranchTemplate } from '../git/worktree.js';
7
+ import { defaultShellCommandExecutor } from '../process/command.js';
8
+ import { bulletList, formatSessionTimestamp, readRunnerConfig } from './command-utils.js';
9
+ import { claimIssue, discoverIssueWork } from './issue-state-machine.js';
10
+ import { RunnerStateStore } from './local-state.js';
11
+ import { buildScopedImplementationPrompt, readScopedCompletionReport, sessionPromptPath, sessionReportPath, writeDurablePrompt, } from './prompt.js';
12
+ import { validateChangedPaths, validateCompletionReportSafety, validateNoAgentOwnedGitPublication, } from './safety.js';
13
+ export async function runScopedAutoCommand(options) {
14
+ const targetRoot = resolve(options.targetRoot);
15
+ const now = options.now ?? new Date();
16
+ const config = await readRunnerConfig(targetRoot);
17
+ const issueAdapter = options.issueAdapter ?? new GhCliIssueAdapter(config.github.owner, config.github.repo);
18
+ const pullRequestAdapter = options.pullRequestAdapter ?? new GhCliPullRequestAdapter(config.github.owner, config.github.repo);
19
+ const git = options.git ?? new GitWorktreeManager();
20
+ const shellExecutor = options.shellExecutor ?? defaultShellCommandExecutor;
21
+ const codexAdapter = options.codexAdapter ?? new CodexCommandAdapter(config);
22
+ const issue = await issueAdapter.getIssue(options.issueNumber);
23
+ if (!issue) {
24
+ throw new Error(`Issue #${options.issueNumber} was not found`);
25
+ }
26
+ const decision = discoverIssueWork([issue], config)[0];
27
+ if (!decision || decision.kind !== 'eligible' || decision.mode !== 'scoped-issue') {
28
+ const reason = decision?.kind === 'skipped' ? decision.reason : 'not scoped agent:auto';
29
+ throw new Error(`Issue #${options.issueNumber} is not eligible for scoped agent:auto execution: ${reason}`);
30
+ }
31
+ const workflowPath = config.workflows.scopedImplementation.promptPath;
32
+ if (!workflowPath) {
33
+ throw new Error('Scoped implementation workflow prompt not found at undefined');
34
+ }
35
+ const workflowPromptPath = join(targetRoot, workflowPath);
36
+ const workflowPromptText = await readWorkflowPrompt(workflowPromptPath);
37
+ const branchName = renderBranchTemplate(config.branches.scopedIssue, { issueNumber: options.issueNumber });
38
+ const worktreePath = join(targetRoot, config.runner.workspaceRoot, `issue-${options.issueNumber}`);
39
+ let promptPath = '';
40
+ let reportPath = '';
41
+ let pullRequest;
42
+ await claimIssue(issueAdapter, config, options.issueNumber, 'scoped-issue', now);
43
+ try {
44
+ await git.createIssueWorktree({
45
+ targetRoot,
46
+ workspacePath: worktreePath,
47
+ branchName,
48
+ baseBranch: config.branches.base,
49
+ });
50
+ const sessionId = `issue-${options.issueNumber}-${formatSessionTimestamp(now)}`;
51
+ promptPath = sessionPromptPath({ targetRoot, config, issueNumber: options.issueNumber, sessionId });
52
+ reportPath = sessionReportPath({ targetRoot, config, issueNumber: options.issueNumber, sessionId });
53
+ const isolatedHomePath = join(targetRoot, config.runner.stateDir, 'codex-home', sessionId);
54
+ await mkdir(dirname(reportPath), { recursive: true });
55
+ await mkdir(isolatedHomePath, { recursive: true });
56
+ const promptText = buildScopedImplementationPrompt({
57
+ issue,
58
+ config,
59
+ workflowPromptText,
60
+ promptPath,
61
+ reportPath,
62
+ branchName,
63
+ worktreePath,
64
+ });
65
+ await writeDurablePrompt({
66
+ targetRoot,
67
+ config,
68
+ issueNumber: options.issueNumber,
69
+ sessionId,
70
+ promptText,
71
+ });
72
+ const store = new RunnerStateStore(targetRoot, config);
73
+ await store.upsertRun({
74
+ issueNumber: options.issueNumber,
75
+ mode: 'scoped-issue',
76
+ workspacePath: worktreePath,
77
+ sessionId,
78
+ branchName,
79
+ promptPath,
80
+ reportPath,
81
+ retryCount: 0,
82
+ createdAt: now.toISOString(),
83
+ updatedAt: now.toISOString(),
84
+ });
85
+ const beforeHead = await git.getHead(worktreePath);
86
+ const codexResult = await codexAdapter.run({
87
+ targetRoot,
88
+ config,
89
+ worktreePath,
90
+ promptPath,
91
+ promptText,
92
+ reportPath,
93
+ isolatedHomePath,
94
+ issueNumber: options.issueNumber,
95
+ sessionId,
96
+ branchName,
97
+ });
98
+ const afterHead = await git.getHead(worktreePath);
99
+ const publicationViolations = validateNoAgentOwnedGitPublication(beforeHead, afterHead);
100
+ if (publicationViolations.length > 0) {
101
+ return finishBlocked(baseResult(options.issueNumber, branchName, worktreePath, promptPath, reportPath), issueAdapter, config, publicationViolations.map((violation) => violation.message), [], [], []);
102
+ }
103
+ if (codexResult.exitCode !== 0) {
104
+ return finishBlocked(baseResult(options.issueNumber, branchName, worktreePath, promptPath, reportPath), issueAdapter, config, [`Codex exited with code ${codexResult.exitCode}: ${codexResult.stderr || codexResult.stdout}`], [], [], []);
105
+ }
106
+ let report;
107
+ try {
108
+ const reportResult = await readScopedCompletionReport(reportPath);
109
+ if (reportResult.kind === 'missing') {
110
+ return finishBlocked(baseResult(options.issueNumber, branchName, worktreePath, promptPath, reportPath), issueAdapter, config, ['Codex did not write CODEX_ORCHESTRATOR_REPORT_FILE; runner cannot prove safety contract.'], [], [], []);
111
+ }
112
+ report = reportResult.report;
113
+ }
114
+ catch (error) {
115
+ const message = error instanceof Error ? error.message : 'Invalid scoped completion report';
116
+ return finishBlocked(baseResult(options.issueNumber, branchName, worktreePath, promptPath, reportPath), issueAdapter, config, [message], [], [], []);
117
+ }
118
+ if (report.status === 'needs-promotion') {
119
+ return finishPromotionRequested(baseResult(options.issueNumber, branchName, worktreePath, promptPath, reportPath), issueAdapter, config, report);
120
+ }
121
+ const changedFiles = await git.listChangedFiles(worktreePath);
122
+ if (changedFiles.length === 0) {
123
+ return finishBlocked(baseResult(options.issueNumber, branchName, worktreePath, promptPath, reportPath), issueAdapter, config, ['Codex completed without file changes'], [], report.skippedChecks, report.residualRisks);
124
+ }
125
+ const violations = [
126
+ ...validateChangedPaths(changedFiles, config),
127
+ ...validateCompletionReportSafety(report),
128
+ ];
129
+ if (violations.length > 0) {
130
+ return finishBlocked(baseResult(options.issueNumber, branchName, worktreePath, promptPath, reportPath), issueAdapter, config, violations.map((violation) => violation.message), changedFiles, report.skippedChecks, report.residualRisks);
131
+ }
132
+ const validation = await runConfiguredChecks(config, worktreePath, shellExecutor, report.validation);
133
+ const residualRisks = [...report.residualRisks];
134
+ if (validation.some((line) => line.status === 'failed')) {
135
+ residualRisks.push('One or more configured checks failed.');
136
+ }
137
+ await git.commitAll({ worktreePath, message: `Codex: implement issue #${options.issueNumber}` });
138
+ await git.pushBranch({ worktreePath, branchName });
139
+ pullRequest = await pullRequestAdapter.createDraftPullRequest({
140
+ title: renderTemplate(config.pullRequests.scopedIssueTitle, options.issueNumber),
141
+ body: buildPullRequestBody(options.issueNumber, changedFiles, validation, report.skippedChecks, residualRisks),
142
+ headBranch: branchName,
143
+ baseBranch: config.branches.base,
144
+ });
145
+ const reportComment = buildReviewReport(options.issueNumber, pullRequest, changedFiles, validation, report.skippedChecks, residualRisks);
146
+ await issueAdapter.removeLabels(options.issueNumber, [config.github.labels.running.name]);
147
+ await issueAdapter.addLabels(options.issueNumber, [config.github.labels.review.name]);
148
+ await issueAdapter.postComment(options.issueNumber, reportComment);
149
+ await store.removeRun(options.issueNumber);
150
+ return {
151
+ ...baseResult(options.issueNumber, branchName, worktreePath, promptPath, reportPath),
152
+ status: 'review-ready',
153
+ pullRequest,
154
+ reportComment,
155
+ };
156
+ }
157
+ catch (error) {
158
+ const message = error instanceof Error ? error.message : 'scoped execution failed';
159
+ if (pullRequest) {
160
+ throw new Error(`Scoped execution failed after draft PR creation (${pullRequest.url}); not marking issue blocked: ${message}`);
161
+ }
162
+ return finishBlocked(baseResult(options.issueNumber, branchName, worktreePath, promptPath, reportPath), issueAdapter, config, [message], [], [], []);
163
+ }
164
+ }
165
+ async function readWorkflowPrompt(path) {
166
+ try {
167
+ return await readFile(path, 'utf8');
168
+ }
169
+ catch (error) {
170
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
171
+ throw new Error(`Scoped implementation workflow prompt not found at ${path}`);
172
+ }
173
+ throw error;
174
+ }
175
+ }
176
+ async function runConfiguredChecks(config, worktreePath, shellExecutor, reportValidation) {
177
+ const lines = [...reportValidation];
178
+ for (const [name, command] of Object.entries(config.checks)) {
179
+ const result = await shellExecutor(command, { cwd: worktreePath });
180
+ lines.push({
181
+ command,
182
+ status: result.exitCode === 0 ? 'passed' : 'failed',
183
+ summary: `${name}: ${result.exitCode === 0 ? 'passed' : result.stderr || result.stdout || `exit ${result.exitCode}`}`,
184
+ });
185
+ }
186
+ return lines;
187
+ }
188
+ async function finishBlocked(result, issueAdapter, config, reasons, changedFiles, skippedChecks, residualRisks) {
189
+ const reportComment = [
190
+ `codex-orchestrator blocked scoped execution for #${result.issueNumber}`,
191
+ 'Reasons',
192
+ ...bulletList(reasons),
193
+ 'Changed Files',
194
+ ...bulletList(changedFiles),
195
+ 'Skipped Checks',
196
+ ...bulletList(skippedChecks),
197
+ 'Residual Risks',
198
+ ...bulletList(residualRisks),
199
+ ].join('\n');
200
+ await issueAdapter.removeLabels(result.issueNumber, [config.github.labels.running.name]);
201
+ await issueAdapter.addLabels(result.issueNumber, [config.github.labels.blocked.name]);
202
+ await issueAdapter.postComment(result.issueNumber, reportComment);
203
+ return { ...result, status: 'blocked', reportComment };
204
+ }
205
+ async function finishPromotionRequested(result, issueAdapter, config, report) {
206
+ const promotion = report.promotion;
207
+ if (!promotion) {
208
+ throw new Error('promotion is required for needs-promotion');
209
+ }
210
+ const reportComment = [
211
+ `codex-orchestrator promotion requested for #${result.issueNumber}`,
212
+ `Reason: ${promotion.reason}`,
213
+ 'Criteria',
214
+ ...bulletList(promotion.criteria),
215
+ 'Evidence',
216
+ ...bulletList(promotion.evidence),
217
+ 'Review this evidence and replace agent:auto with agent:plan-auto when parent issue-tree orchestration is desired.',
218
+ ].join('\n');
219
+ await issueAdapter.removeLabels(result.issueNumber, [config.github.labels.running.name]);
220
+ await issueAdapter.addLabels(result.issueNumber, [config.github.labels.blocked.name]);
221
+ await issueAdapter.postComment(result.issueNumber, reportComment);
222
+ return { ...result, status: 'promotion-requested', reportComment };
223
+ }
224
+ function buildReviewReport(issueNumber, pullRequest, changedFiles, validation, skippedChecks, residualRisks) {
225
+ return [
226
+ `codex-orchestrator review report for #${issueNumber}`,
227
+ 'Pull Request',
228
+ `- ${pullRequest.url}`,
229
+ 'Changes',
230
+ ...bulletList(changedFiles),
231
+ 'Validation',
232
+ ...validation.map((line) => `- ${line.command}: ${line.status} - ${line.summary}`),
233
+ 'Skipped Checks',
234
+ ...bulletList(skippedChecks),
235
+ 'Residual Risks',
236
+ ...bulletList(residualRisks),
237
+ ].join('\n');
238
+ }
239
+ function buildPullRequestBody(issueNumber, changedFiles, validation, skippedChecks, residualRisks) {
240
+ return [
241
+ `Closes #${issueNumber}`,
242
+ '',
243
+ 'Changed files:',
244
+ ...bulletList(changedFiles),
245
+ '',
246
+ 'Validation:',
247
+ ...validation.map((line) => `- ${line.command}: ${line.status} - ${line.summary}`),
248
+ '',
249
+ 'Skipped checks:',
250
+ ...bulletList(skippedChecks),
251
+ '',
252
+ 'Residual risks:',
253
+ ...bulletList(residualRisks),
254
+ ].join('\n');
255
+ }
256
+ function baseResult(issueNumber, branchName, worktreePath, promptPath, reportPath) {
257
+ return { issueNumber, branchName, worktreePath, promptPath, reportPath };
258
+ }
259
+ function renderTemplate(template, issueNumber) {
260
+ return template.replaceAll('${issueNumber}', String(issueNumber));
261
+ }
262
+ //# sourceMappingURL=scoped-auto-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scoped-auto-command.js","sourceRoot":"","sources":["../../../src/runner/scoped-auto-command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { GitHubIssueAdapter } from '../github/issues.js';
2
+ import { type IssueDiscoveryDecision } from './issue-state-machine.js';
3
+ import { type RecoveryEntry } from './recovery.js';
4
+ export interface StatusCommandOptions {
5
+ targetRoot: string;
6
+ issueAdapter?: GitHubIssueAdapter;
7
+ dryRun?: boolean;
8
+ }
9
+ export interface StatusCommandResult {
10
+ output: string;
11
+ dryRun: boolean;
12
+ eligible: IssueDiscoveryDecision[];
13
+ skipped: IssueDiscoveryDecision[];
14
+ recovery: RecoveryEntry[];
15
+ }
16
+ export declare function runStatusCommand(options: StatusCommandOptions): Promise<StatusCommandResult>;
17
+ //# sourceMappingURL=status-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-command.d.ts","sourceRoot":"","sources":["../../../src/runner/status-command.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,OAAO,EAAqB,KAAK,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAE1F,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAEzE,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,sBAAsB,EAAE,CAAC;IACnC,OAAO,EAAE,sBAAsB,EAAE,CAAC;IAClC,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAqClG"}
@@ -0,0 +1,72 @@
1
+ import { resolve } from 'node:path';
2
+ import { GhCliIssueAdapter } from '../github/gh-issue-adapter.js';
3
+ import { readRunnerConfig } from './command-utils.js';
4
+ import { discoverIssueWork } from './issue-state-machine.js';
5
+ import { RunnerStateStore } from './local-state.js';
6
+ import { reconcileRunnerState } from './recovery.js';
7
+ export async function runStatusCommand(options) {
8
+ const targetRoot = resolve(options.targetRoot);
9
+ const config = await readRunnerConfig(targetRoot);
10
+ const adapter = options.issueAdapter ?? new GhCliIssueAdapter(config.github.owner, config.github.repo);
11
+ const discoveryLabels = [
12
+ config.github.labels.auto.name,
13
+ config.github.labels.planAuto.name,
14
+ config.github.labels.manual.name,
15
+ config.github.labels.blocked.name,
16
+ config.github.labels.running.name,
17
+ config.github.labels.review.name,
18
+ ];
19
+ const issues = await adapter.listOpenIssuesWithAnyLabel(discoveryLabels);
20
+ const decisions = discoverIssueWork(issues, config);
21
+ const eligible = decisions.filter((decision) => (decision.kind === 'eligible'));
22
+ const skipped = decisions.filter((decision) => (decision.kind === 'skipped'));
23
+ const recovery = await reconcileRunnerState({
24
+ store: new RunnerStateStore(targetRoot, config),
25
+ issueAdapter: adapter,
26
+ config,
27
+ now: new Date(),
28
+ allowClarificationResume: false,
29
+ updateLocalState: false,
30
+ });
31
+ const dryRun = options.dryRun ?? false;
32
+ return {
33
+ output: formatStatusOutput(config, targetRoot, dryRun, eligible, skipped, recovery),
34
+ dryRun,
35
+ eligible,
36
+ skipped,
37
+ recovery,
38
+ };
39
+ }
40
+ function formatStatusOutput(config, targetRoot, dryRun, eligible, skipped, recovery) {
41
+ return [
42
+ 'codex-orchestrator status',
43
+ `repo: ${config.github.owner}/${config.github.repo}`,
44
+ `target: ${targetRoot}`,
45
+ `mode: ${dryRun ? 'dry-run' : 'status'}`,
46
+ 'eligible:',
47
+ ...formatEligible(eligible),
48
+ 'skipped:',
49
+ ...formatSkipped(skipped),
50
+ 'recovery:',
51
+ ...formatRecovery(recovery),
52
+ ].join('\n');
53
+ }
54
+ function formatEligible(eligible) {
55
+ if (eligible.length === 0) {
56
+ return [' - none'];
57
+ }
58
+ return eligible.map((decision) => ` - #${decision.issueNumber} ${decision.mode}: ${decision.reason}`);
59
+ }
60
+ function formatSkipped(skipped) {
61
+ if (skipped.length === 0) {
62
+ return [' - none'];
63
+ }
64
+ return skipped.map((decision) => ` - #${decision.issueNumber} ${decision.reasonCode}: ${decision.reason}`);
65
+ }
66
+ function formatRecovery(recovery) {
67
+ if (recovery.length === 0) {
68
+ return [' - none'];
69
+ }
70
+ return recovery.map((entry) => ` - #${entry.issueNumber} ${entry.status}: ${entry.reason}`);
71
+ }
72
+ //# sourceMappingURL=status-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-command.js","sourceRoot":"","sources":["../../../src/runner/status-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAA+B,MAAM,0BAA0B,CAAC;AAC1F,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAsB,MAAM,eAAe,CAAC;AAgBzE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAA6B;IAClE,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,IAAI,IAAI,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvG,MAAM,eAAe,GAAG;QACtB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI;QAC9B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI;QAClC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI;QAChC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI;QACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI;QACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI;KACjC,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,0BAA0B,CAAC,eAAe,CAAC,CAAC;IACzE,MAAM,SAAS,GAAG,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAqE,EAAE,CAAC,CACjH,QAAQ,CAAC,IAAI,KAAK,UAAU,CAC7B,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAoE,EAAE,CAAC,CAC/G,QAAQ,CAAC,IAAI,KAAK,SAAS,CAC5B,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC;QAC1C,KAAK,EAAE,IAAI,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC;QAC/C,YAAY,EAAE,OAAO;QACrB,MAAM;QACN,GAAG,EAAE,IAAI,IAAI,EAAE;QACf,wBAAwB,EAAE,KAAK;QAC/B,gBAAgB,EAAE,KAAK;KACxB,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC;IAEvC,OAAO;QACL,MAAM,EAAE,kBAAkB,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC;QACnF,MAAM;QACN,QAAQ;QACR,OAAO;QACP,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CACzB,MAA+B,EAC/B,UAAkB,EAClB,MAAe,EACf,QAAiE,EACjE,OAA+D,EAC/D,QAAyB;IAEzB,OAAO;QACL,2BAA2B;QAC3B,SAAS,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;QACpD,WAAW,UAAU,EAAE;QACvB,SAAS,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE;QACxC,WAAW;QACX,GAAG,cAAc,CAAC,QAAQ,CAAC;QAC3B,UAAU;QACV,GAAG,aAAa,CAAC,OAAO,CAAC;QACzB,WAAW;QACX,GAAG,cAAc,CAAC,QAAQ,CAAC;KAC5B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,QAAiE;IACvF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,UAAU,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;AACzG,CAAC;AAED,SAAS,aAAa,CAAC,OAA+D;IACpF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,UAAU,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,UAAU,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;AAC9G,CAAC;AAED,SAAS,cAAc,CAAC,QAAyB;IAC/C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,UAAU,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;AAC/F,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { LabelDefinition } from '../config/schema.js';
2
+ import type { CommandExecutor } from '../github/gh-cli.js';
3
+ import type { GitHubLabelAdapter } from './labels.js';
4
+ export declare class GhCliLabelAdapter implements GitHubLabelAdapter {
5
+ private readonly repo;
6
+ private readonly executor;
7
+ constructor(owner: string, repo: string, executor?: CommandExecutor);
8
+ listLabels(): Promise<Array<{
9
+ name: string;
10
+ }>>;
11
+ createLabel(label: LabelDefinition): Promise<void>;
12
+ }
13
+ //# sourceMappingURL=github-label-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-label-adapter.d.ts","sourceRoot":"","sources":["../../../src/setup/github-label-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,qBAAa,iBAAkB,YAAW,kBAAkB;IAC1D,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;gBAExB,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,eAAmC;IAKhF,UAAU,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAO9C,WAAW,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;CAahE"}
@@ -0,0 +1,28 @@
1
+ import { defaultGhExecutor } from '../github/gh-cli.js';
2
+ export class GhCliLabelAdapter {
3
+ repo;
4
+ executor;
5
+ constructor(owner, repo, executor = defaultGhExecutor) {
6
+ this.repo = `${owner}/${repo}`;
7
+ this.executor = executor;
8
+ }
9
+ async listLabels() {
10
+ const result = await this.executor('gh', ['label', 'list', '--repo', this.repo, '--limit', '200', '--json', 'name']);
11
+ const parsed = JSON.parse(result.stdout);
12
+ return parsed.flatMap((label) => (typeof label.name === 'string' ? [{ name: label.name }] : []));
13
+ }
14
+ async createLabel(label) {
15
+ await this.executor('gh', [
16
+ 'label',
17
+ 'create',
18
+ label.name,
19
+ '--repo',
20
+ this.repo,
21
+ '--color',
22
+ label.color,
23
+ '--description',
24
+ label.description,
25
+ ]);
26
+ }
27
+ }
28
+ //# sourceMappingURL=github-label-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-label-adapter.js","sourceRoot":"","sources":["../../../src/setup/github-label-adapter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD,MAAM,OAAO,iBAAiB;IACX,IAAI,CAAS;IACb,QAAQ,CAAkB;IAE3C,YAAmB,KAAa,EAAE,IAAY,EAAE,WAA4B,iBAAiB;QAC3F,IAAI,CAAC,IAAI,GAAG,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAEM,KAAK,CAAC,UAAU;QACrB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;QACrH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAA8B,CAAC;QAEtE,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnG,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,KAAsB;QAC7C,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;YACxB,OAAO;YACP,QAAQ;YACR,KAAK,CAAC,IAAI;YACV,QAAQ;YACR,IAAI,CAAC,IAAI;YACT,SAAS;YACT,KAAK,CAAC,KAAK;YACX,eAAe;YACf,KAAK,CAAC,WAAW;SAClB,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,27 @@
1
+ import type { LabelDefinition, LabelPreparationPolicy } from '../config/schema.js';
2
+ export interface GitHubLabelAdapter {
3
+ listLabels(): Promise<Array<{
4
+ name: string;
5
+ }>>;
6
+ createLabel(label: LabelDefinition): Promise<void>;
7
+ }
8
+ export interface LabelPlan {
9
+ policy: LabelPreparationPolicy;
10
+ existing: string[];
11
+ missing: LabelDefinition[];
12
+ created: LabelDefinition[];
13
+ wouldCreate: LabelDefinition[];
14
+ }
15
+ export declare function planLabels(adapter: GitHubLabelAdapter, labels: Record<string, LabelDefinition>, policy: LabelPreparationPolicy, dryRun: boolean): Promise<LabelPlan>;
16
+ export declare class InMemoryGitHubLabelAdapter implements GitHubLabelAdapter {
17
+ private readonly labels;
18
+ createdLabels: LabelDefinition[];
19
+ constructor(labels?: Array<{
20
+ name: string;
21
+ }>);
22
+ listLabels(): Promise<Array<{
23
+ name: string;
24
+ }>>;
25
+ createLabel(label: LabelDefinition): Promise<void>;
26
+ }
27
+ //# sourceMappingURL=labels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labels.d.ts","sourceRoot":"","sources":["../../../src/setup/labels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAEnF,MAAM,WAAW,kBAAkB;IACjC,UAAU,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IAC/C,WAAW,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,sBAAsB,CAAC;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,WAAW,EAAE,eAAe,EAAE,CAAC;CAChC;AAED,wBAAsB,UAAU,CAC9B,OAAO,EAAE,kBAAkB,EAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EACvC,MAAM,EAAE,sBAAsB,EAC9B,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,SAAS,CAAC,CAsBpB;AAED,qBAAa,0BAA2B,YAAW,kBAAkB;IACnE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsC;IAEtD,aAAa,EAAE,eAAe,EAAE,CAAM;gBAE1B,MAAM,GAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAM;IAU1C,UAAU,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAI9C,WAAW,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;CAIhE"}
@@ -0,0 +1,42 @@
1
+ export async function planLabels(adapter, labels, policy, dryRun) {
2
+ const existingLabels = await adapter.listLabels();
3
+ const existing = existingLabels.map((label) => label.name);
4
+ const existingNames = new Set(existing);
5
+ const missing = Object.values(labels).filter((label) => !existingNames.has(label.name));
6
+ const created = [];
7
+ const wouldCreate = policy === 'create-missing' ? missing : [];
8
+ if (policy === 'create-missing' && !dryRun) {
9
+ for (const label of missing) {
10
+ await adapter.createLabel(label);
11
+ created.push(label);
12
+ }
13
+ }
14
+ return {
15
+ policy,
16
+ existing,
17
+ missing,
18
+ created,
19
+ wouldCreate,
20
+ };
21
+ }
22
+ export class InMemoryGitHubLabelAdapter {
23
+ labels = new Map();
24
+ createdLabels = [];
25
+ constructor(labels = []) {
26
+ for (const label of labels) {
27
+ this.labels.set(label.name, {
28
+ name: label.name,
29
+ color: '000000',
30
+ description: '',
31
+ });
32
+ }
33
+ }
34
+ async listLabels() {
35
+ return Array.from(this.labels.values()).map((label) => ({ name: label.name }));
36
+ }
37
+ async createLabel(label) {
38
+ this.labels.set(label.name, label);
39
+ this.createdLabels.push(label);
40
+ }
41
+ }
42
+ //# sourceMappingURL=labels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labels.js","sourceRoot":"","sources":["../../../src/setup/labels.ts"],"names":[],"mappings":"AAeA,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,OAA2B,EAC3B,MAAuC,EACvC,MAA8B,EAC9B,MAAe;IAEf,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;IAClD,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3D,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACxF,MAAM,OAAO,GAAsB,EAAE,CAAC;IACtC,MAAM,WAAW,GAAG,MAAM,KAAK,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/D,IAAI,MAAM,KAAK,gBAAgB,IAAI,CAAC,MAAM,EAAE,CAAC;QAC3C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM;QACN,QAAQ;QACR,OAAO;QACP,OAAO;QACP,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,0BAA0B;IACpB,MAAM,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEtD,aAAa,GAAsB,EAAE,CAAC;IAE7C,YAAmB,SAAkC,EAAE;QACrD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE;gBAC1B,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,KAAK,EAAE,QAAQ;gBACf,WAAW,EAAE,EAAE;aAChB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,UAAU;QACrB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACjF,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,KAAsB;QAC7C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ import type { CodexOrchestratorConfig, LabelPreparationPolicy } from '../config/schema.js';
2
+ import type { WorkflowConfigMap } from './workflows.js';
3
+ export interface BuildProjectConfigInput {
4
+ owner: string;
5
+ repo: string;
6
+ prepareLabels: LabelPreparationPolicy;
7
+ workflows: WorkflowConfigMap;
8
+ }
9
+ export declare const defaultLabels: CodexOrchestratorConfig['github']['labels'];
10
+ export declare function buildProjectConfig(input: BuildProjectConfigInput): CodexOrchestratorConfig;
11
+ export declare function readExistingConfig(configPath: string): Promise<Record<string, unknown> | undefined>;
12
+ export declare function assertNoRuntimeState(value: Record<string, unknown> | undefined): void;
13
+ export declare function writeProjectConfig(targetRoot: string, config: CodexOrchestratorConfig): Promise<string>;
14
+ export declare function projectConfigPath(targetRoot: string): string;
15
+ //# sourceMappingURL=project-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-config.d.ts","sourceRoot":"","sources":["../../../src/setup/project-config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,uBAAuB,EAAmB,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE5G,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,sBAAsB,CAAC;IACtC,SAAS,EAAE,iBAAiB,CAAC;CAC9B;AAED,eAAO,MAAM,aAAa,EAAE,uBAAuB,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAQrE,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,uBAAuB,CAwE1F;AAED,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAWzG;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,IAAI,CASrF;AAED,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CAW7G;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE5D"}