@jterrats/open-orchestra 0.4.2-beta.1 → 0.5.0-beta.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.
- package/AGENTS.md +5 -3
- package/README.md +29 -5
- package/dist/advisory-artifacts.d.ts +20 -0
- package/dist/advisory-artifacts.js +136 -0
- package/dist/advisory-artifacts.js.map +1 -0
- package/dist/assets/web-console.js +436 -4
- package/dist/cli.js +16 -117
- package/dist/cli.js.map +1 -1
- package/dist/command-manifest.d.ts +6 -0
- package/dist/command-manifest.js +141 -43
- package/dist/command-manifest.js.map +1 -1
- package/dist/command-utils.d.ts +5 -0
- package/dist/command-utils.js +23 -0
- package/dist/command-utils.js.map +1 -1
- package/dist/commands.d.ts +7 -42
- package/dist/commands.js +214 -1356
- package/dist/commands.js.map +1 -1
- package/dist/constants.js +3 -0
- package/dist/constants.js.map +1 -1
- package/dist/context-budget.d.ts +4 -0
- package/dist/context-budget.js +119 -0
- package/dist/context-budget.js.map +1 -0
- package/dist/delivery-commands.d.ts +10 -0
- package/dist/delivery-commands.js +152 -0
- package/dist/delivery-commands.js.map +1 -0
- package/dist/github.d.ts +50 -1
- package/dist/github.js +234 -0
- package/dist/github.js.map +1 -1
- package/dist/health-checks.d.ts +1 -0
- package/dist/health-checks.js +11 -1
- package/dist/health-checks.js.map +1 -1
- package/dist/health-commands.js +2 -0
- package/dist/health-commands.js.map +1 -1
- package/dist/mcp-oauth-proxy.d.ts +32 -0
- package/dist/mcp-oauth-proxy.js +120 -0
- package/dist/mcp-oauth-proxy.js.map +1 -1
- package/dist/memory.d.ts +2 -1
- package/dist/memory.js +71 -10
- package/dist/memory.js.map +1 -1
- package/dist/package-update-check.d.ts +5 -1
- package/dist/package-update-check.js +20 -8
- package/dist/package-update-check.js.map +1 -1
- package/dist/planning-commands.d.ts +14 -0
- package/dist/planning-commands.js +372 -0
- package/dist/planning-commands.js.map +1 -0
- package/dist/release-candidate.d.ts +2 -0
- package/dist/release-candidate.js +9 -14
- package/dist/release-candidate.js.map +1 -1
- package/dist/release-commands.d.ts +2 -0
- package/dist/release-commands.js +58 -6
- package/dist/release-commands.js.map +1 -1
- package/dist/release-readiness.d.ts +49 -0
- package/dist/release-readiness.js +172 -0
- package/dist/release-readiness.js.map +1 -0
- package/dist/runtime-commands.js +11 -4
- package/dist/runtime-commands.js.map +1 -1
- package/dist/runtime-execution-renderer.js +2 -0
- package/dist/runtime-execution-renderer.js.map +1 -1
- package/dist/runtime-execution.d.ts +4 -2
- package/dist/runtime-execution.js +11 -4
- package/dist/runtime-execution.js.map +1 -1
- package/dist/setup-agents-import.d.ts +42 -0
- package/dist/setup-agents-import.js +335 -0
- package/dist/setup-agents-import.js.map +1 -0
- package/dist/skills-catalog-service.d.ts +2 -0
- package/dist/skills-catalog-service.js +8 -0
- package/dist/skills-catalog-service.js.map +1 -0
- package/dist/skills-catalog.d.ts +2 -0
- package/dist/skills-catalog.js +389 -0
- package/dist/skills-catalog.js.map +1 -0
- package/dist/skills-commands.js +1 -11
- package/dist/skills-commands.js.map +1 -1
- package/dist/skills-events.d.ts +9 -0
- package/dist/skills-events.js +50 -0
- package/dist/skills-events.js.map +1 -0
- package/dist/skills-memory.d.ts +18 -0
- package/dist/skills-memory.js +127 -0
- package/dist/skills-memory.js.map +1 -0
- package/dist/skills-planning.d.ts +2 -0
- package/dist/skills-planning.js +87 -0
- package/dist/skills-planning.js.map +1 -0
- package/dist/skills-render.d.ts +14 -0
- package/dist/skills-render.js +83 -0
- package/dist/skills-render.js.map +1 -0
- package/dist/skills-validation.d.ts +2 -0
- package/dist/skills-validation.js +49 -0
- package/dist/skills-validation.js.map +1 -0
- package/dist/skills.d.ts +6 -42
- package/dist/skills.js +6 -773
- package/dist/skills.js.map +1 -1
- package/dist/task-graph-commands.d.ts +14 -0
- package/dist/task-graph-commands.js +367 -0
- package/dist/task-graph-commands.js.map +1 -0
- package/dist/tool-commands.js +8 -0
- package/dist/tool-commands.js.map +1 -1
- package/dist/types/context.d.ts +12 -0
- package/dist/types/context.js +2 -0
- package/dist/types/context.js.map +1 -0
- package/dist/types/metrics.d.ts +114 -0
- package/dist/types/metrics.js +2 -0
- package/dist/types/metrics.js.map +1 -0
- package/dist/types/model-config.d.ts +212 -0
- package/dist/types/model-config.js +2 -0
- package/dist/types/model-config.js.map +1 -0
- package/dist/types/runtime.d.ts +93 -0
- package/dist/types/runtime.js +2 -0
- package/dist/types/runtime.js.map +1 -0
- package/dist/types/skills.d.ts +147 -0
- package/dist/types/skills.js +2 -0
- package/dist/types/skills.js.map +1 -0
- package/dist/types/tasks.d.ts +171 -0
- package/dist/types/tasks.js +2 -0
- package/dist/types/tasks.js.map +1 -0
- package/dist/types/workflow-run.d.ts +79 -0
- package/dist/types/workflow-run.js +2 -0
- package/dist/types/workflow-run.js.map +1 -0
- package/dist/types.d.ts +13 -798
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/dist/upgrade-commands.d.ts +2 -0
- package/dist/upgrade-commands.js +65 -0
- package/dist/upgrade-commands.js.map +1 -0
- package/dist/web-api-read-routes.d.ts +5 -0
- package/dist/web-api-read-routes.js +37 -0
- package/dist/web-api-read-routes.js.map +1 -0
- package/dist/web-api.d.ts +1 -3
- package/dist/web-api.js +145 -44
- package/dist/web-api.js.map +1 -1
- package/dist/web-console-sections.d.ts +2 -0
- package/dist/web-console-sections.js +7 -0
- package/dist/web-console-sections.js.map +1 -0
- package/dist/web-console.js +23 -3
- package/dist/web-console.js.map +1 -1
- package/dist/workflow-approval-service.d.ts +9 -0
- package/dist/workflow-approval-service.js +126 -0
- package/dist/workflow-approval-service.js.map +1 -0
- package/dist/workflow-approval-utils.d.ts +10 -0
- package/dist/workflow-approval-utils.js +82 -0
- package/dist/workflow-approval-utils.js.map +1 -0
- package/dist/workflow-budget-utils.d.ts +7 -0
- package/dist/workflow-budget-utils.js +96 -0
- package/dist/workflow-budget-utils.js.map +1 -0
- package/dist/workflow-evidence-service.d.ts +7 -0
- package/dist/workflow-evidence-service.js +100 -0
- package/dist/workflow-evidence-service.js.map +1 -0
- package/dist/workflow-run-commands.d.ts +8 -0
- package/dist/workflow-run-commands.js +479 -0
- package/dist/workflow-run-commands.js.map +1 -0
- package/dist/workflow-services.d.ts +8 -18
- package/dist/workflow-services.js +30 -481
- package/dist/workflow-services.js.map +1 -1
- package/dist/workflow-summary-service.d.ts +4 -0
- package/dist/workflow-summary-service.js +82 -0
- package/dist/workflow-summary-service.js.map +1 -0
- package/dist/workflow-templates.d.ts +1 -0
- package/dist/workflow-templates.js +1 -0
- package/dist/workflow-templates.js.map +1 -1
- package/dist/workspace.d.ts +18 -1
- package/dist/workspace.js +72 -4
- package/dist/workspace.js.map +1 -1
- package/docs/command-contracts.md +22 -0
- package/docs/mcp-oauth-proxy-evaluation.md +14 -0
- package/docs/orchestra-mvp.md +158 -114
- package/docs/package-naming.md +20 -0
- package/docs/persona-workflows.md +209 -0
- package/docs/runtime-adapters.md +19 -14
- package/docs/runtime-llm-flow.md +29 -28
- package/docs/setup-agents-bridge.md +61 -0
- package/docs/traceability-flow.md +89 -0
- package/package.json +9 -7
package/dist/github.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { execFile } from "node:child_process";
|
|
2
2
|
import { promisify } from "node:util";
|
|
3
|
+
import { removeUndefined } from "./command-utils.js";
|
|
4
|
+
import { addEvidence, addTask, listEvidence, listTasks, previewWorkflowGate, updateTask, } from "./workflow-services.js";
|
|
3
5
|
const execFileAsync = promisify(execFile);
|
|
6
|
+
const SYNC_MARKER_PREFIX = "<!-- orchestra-sync:";
|
|
4
7
|
export async function createPullRequest(opts) {
|
|
5
8
|
const args = ["pr", "create", "--title", opts.title, "--body", opts.body];
|
|
6
9
|
if (opts.baseBranch) {
|
|
@@ -10,6 +13,237 @@ export async function createPullRequest(opts) {
|
|
|
10
13
|
const url = stdout.trim();
|
|
11
14
|
return { url };
|
|
12
15
|
}
|
|
16
|
+
export async function syncGitHubIssueToTask(options) {
|
|
17
|
+
const root = options.root ?? process.cwd();
|
|
18
|
+
const transport = options.transport ?? "gh";
|
|
19
|
+
const runner = resolveGitHubRunner(options);
|
|
20
|
+
const issue = await fetchGitHubIssue(options.issue, runner);
|
|
21
|
+
const taskId = options.taskId ?? `GH-${issue.number}`;
|
|
22
|
+
const existing = (await listTasks(root)).find((task) => task.id === taskId);
|
|
23
|
+
const nextTask = issueTaskInput(issue, taskId, options, existing);
|
|
24
|
+
const commands = [];
|
|
25
|
+
let action = "none";
|
|
26
|
+
if (!existing) {
|
|
27
|
+
action = "create";
|
|
28
|
+
if (!options.dryRun) {
|
|
29
|
+
await addTask(nextTask, root);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
else if (taskNeedsUpdate(existing, nextTask)) {
|
|
33
|
+
action = "update";
|
|
34
|
+
if (!options.dryRun) {
|
|
35
|
+
await updateTask(nextTask, root);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const releaseReadiness = await previewReadinessForSync(taskId, root, options, existing);
|
|
39
|
+
const comment = await syncIssueComment({
|
|
40
|
+
issue,
|
|
41
|
+
taskId,
|
|
42
|
+
releaseReadiness,
|
|
43
|
+
root,
|
|
44
|
+
runner,
|
|
45
|
+
options,
|
|
46
|
+
commands,
|
|
47
|
+
});
|
|
48
|
+
const closed = await closeIssueIfAllowed({
|
|
49
|
+
issue,
|
|
50
|
+
taskId,
|
|
51
|
+
releaseReadiness,
|
|
52
|
+
runner,
|
|
53
|
+
options,
|
|
54
|
+
commands,
|
|
55
|
+
});
|
|
56
|
+
if (!options.dryRun) {
|
|
57
|
+
await addEvidence({
|
|
58
|
+
task: taskId,
|
|
59
|
+
role: "developer",
|
|
60
|
+
type: "report",
|
|
61
|
+
summary: `GitHub issue #${issue.number} synchronized (${action})`,
|
|
62
|
+
}, root);
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
issue,
|
|
66
|
+
taskId,
|
|
67
|
+
action,
|
|
68
|
+
comment,
|
|
69
|
+
closed,
|
|
70
|
+
dryRun: Boolean(options.dryRun),
|
|
71
|
+
transport,
|
|
72
|
+
fallback: transport === "gh"
|
|
73
|
+
? "If gh is unavailable, run this workflow through a tracker MCP skill/adapter and provide an injected runner with equivalent issue/comment/close operations."
|
|
74
|
+
: "MCP skill transport requires a runtime-provided runner; the local CLI cannot call agent MCP tools directly.",
|
|
75
|
+
commands,
|
|
76
|
+
releaseReadiness,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
export class GhCliRunner {
|
|
80
|
+
async run(args) {
|
|
81
|
+
try {
|
|
82
|
+
const { stdout } = await execFileAsync("gh", args);
|
|
83
|
+
return stdout.trim();
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
if (isMissingGh(error)) {
|
|
87
|
+
throw new Error("GitHub sync transport 'gh' requires GitHub CLI. Install gh, or run sync through a tracker MCP skill/adapter that injects equivalent issue/comment/close operations.", { cause: error });
|
|
88
|
+
}
|
|
89
|
+
throw error;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function resolveGitHubRunner(options) {
|
|
94
|
+
if (options.runner)
|
|
95
|
+
return options.runner;
|
|
96
|
+
if ((options.transport ?? "gh") === "mcp-skill") {
|
|
97
|
+
throw new Error("MCP skill transport is a runtime fallback, not a local child process. Execute the tracker MCP skill from the agent runtime and inject a GitHubRunner-compatible adapter, or use --transport gh.");
|
|
98
|
+
}
|
|
99
|
+
return new GhCliRunner();
|
|
100
|
+
}
|
|
101
|
+
function isMissingGh(error) {
|
|
102
|
+
return (error instanceof Error &&
|
|
103
|
+
"code" in error &&
|
|
104
|
+
error.code === "ENOENT");
|
|
105
|
+
}
|
|
106
|
+
async function fetchGitHubIssue(issue, runner) {
|
|
107
|
+
const payload = await runner.run([
|
|
108
|
+
"issue",
|
|
109
|
+
"view",
|
|
110
|
+
String(issue),
|
|
111
|
+
"--json",
|
|
112
|
+
"number,title,body,state,url,labels,milestone",
|
|
113
|
+
]);
|
|
114
|
+
const data = JSON.parse(payload);
|
|
115
|
+
return removeUndefined({
|
|
116
|
+
number: data.number,
|
|
117
|
+
title: data.title,
|
|
118
|
+
body: data.body,
|
|
119
|
+
state: data.state,
|
|
120
|
+
url: data.url,
|
|
121
|
+
labels: (data.labels ?? []).map((label) => label.name ?? ""),
|
|
122
|
+
milestone: data.milestone?.title,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
function issueTaskInput(issue, taskId, options, existing) {
|
|
126
|
+
return removeUndefined({
|
|
127
|
+
id: taskId,
|
|
128
|
+
title: issue.title,
|
|
129
|
+
ownerRole: options.ownerRole ?? existing?.ownerRole ?? "developer",
|
|
130
|
+
dependencies: existing?.dependencies ?? [],
|
|
131
|
+
status: options.status ?? existing?.status,
|
|
132
|
+
backlogItem: issue.url ?? `#${issue.number}`,
|
|
133
|
+
goal: firstSection(issue.body, "User Story") ?? existing?.goal,
|
|
134
|
+
scope: issue.milestone ?? existing?.scope,
|
|
135
|
+
acceptanceCriteria: listSection(issue.body, "Acceptance Criteria") ??
|
|
136
|
+
existing?.acceptanceCriteria,
|
|
137
|
+
risks: issue.labels.length > 0 ? issue.labels : existing?.risks,
|
|
138
|
+
testStrategy: firstSection(issue.body, "Test Evidence Required") ??
|
|
139
|
+
existing?.testStrategy,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
function taskNeedsUpdate(existing, next) {
|
|
143
|
+
return (existing.title !== next.title ||
|
|
144
|
+
existing.ownerRole !== next.ownerRole ||
|
|
145
|
+
existing.backlogItem !== next.backlogItem ||
|
|
146
|
+
JSON.stringify(existing.acceptanceCriteria ?? []) !==
|
|
147
|
+
JSON.stringify(next.acceptanceCriteria ?? []));
|
|
148
|
+
}
|
|
149
|
+
async function previewReadinessForSync(taskId, root, options, existing) {
|
|
150
|
+
if (options.dryRun && !existing) {
|
|
151
|
+
return { passed: false, missing: ["taskNotCreatedInDryRun"] };
|
|
152
|
+
}
|
|
153
|
+
const gate = await previewWorkflowGate("release-readiness", taskId, root);
|
|
154
|
+
return { passed: gate.passed, missing: gate.missing };
|
|
155
|
+
}
|
|
156
|
+
async function syncIssueComment(input) {
|
|
157
|
+
if (!input.options.comment)
|
|
158
|
+
return "skipped";
|
|
159
|
+
const body = await renderSyncComment(input.issue, input.taskId, input.releaseReadiness, input.root);
|
|
160
|
+
const repo = await input.runner.run([
|
|
161
|
+
"repo",
|
|
162
|
+
"view",
|
|
163
|
+
"--json",
|
|
164
|
+
"nameWithOwner",
|
|
165
|
+
]);
|
|
166
|
+
const repoName = JSON.parse(repo)
|
|
167
|
+
.nameWithOwner;
|
|
168
|
+
const comments = await input.runner.run([
|
|
169
|
+
"api",
|
|
170
|
+
`repos/${repoName}/issues/${input.issue.number}/comments`,
|
|
171
|
+
]);
|
|
172
|
+
const existing = JSON.parse(comments).find((comment) => comment.body.includes(syncMarker(input.taskId)));
|
|
173
|
+
if (existing) {
|
|
174
|
+
const args = [
|
|
175
|
+
"api",
|
|
176
|
+
"--method",
|
|
177
|
+
"PATCH",
|
|
178
|
+
`repos/${repoName}/issues/comments/${existing.id}`,
|
|
179
|
+
"-f",
|
|
180
|
+
`body=${body}`,
|
|
181
|
+
];
|
|
182
|
+
input.commands.push(args);
|
|
183
|
+
if (!input.options.dryRun)
|
|
184
|
+
await input.runner.run(args);
|
|
185
|
+
return "updated";
|
|
186
|
+
}
|
|
187
|
+
const args = ["issue", "comment", String(input.issue.number), "--body", body];
|
|
188
|
+
input.commands.push(args);
|
|
189
|
+
if (!input.options.dryRun)
|
|
190
|
+
await input.runner.run(args);
|
|
191
|
+
return "created";
|
|
192
|
+
}
|
|
193
|
+
async function closeIssueIfAllowed(input) {
|
|
194
|
+
if (!input.options.close)
|
|
195
|
+
return false;
|
|
196
|
+
if (!input.releaseReadiness.passed && !input.options.acceptedRisk) {
|
|
197
|
+
throw new Error("github sync close requires passing release-readiness or --accepted-risk");
|
|
198
|
+
}
|
|
199
|
+
const args = [
|
|
200
|
+
"issue",
|
|
201
|
+
"close",
|
|
202
|
+
String(input.issue.number),
|
|
203
|
+
"--comment",
|
|
204
|
+
input.options.acceptedRisk
|
|
205
|
+
? `Closed by Open Orchestra with accepted risk: ${input.options.acceptedRisk}`
|
|
206
|
+
: `Closed by Open Orchestra after release-readiness passed for ${input.taskId}.`,
|
|
207
|
+
];
|
|
208
|
+
input.commands.push(args);
|
|
209
|
+
if (!input.options.dryRun)
|
|
210
|
+
await input.runner.run(args);
|
|
211
|
+
return true;
|
|
212
|
+
}
|
|
213
|
+
async function renderSyncComment(issue, taskId, releaseReadiness, root) {
|
|
214
|
+
const evidence = await listEvidence(taskId, root);
|
|
215
|
+
return [
|
|
216
|
+
syncMarker(taskId),
|
|
217
|
+
`Open Orchestra sync for ${taskId}`,
|
|
218
|
+
"",
|
|
219
|
+
`- Issue: #${issue.number}`,
|
|
220
|
+
`- Release readiness: ${releaseReadiness.passed ? "passed" : "blocked"}`,
|
|
221
|
+
`- Missing: ${releaseReadiness.missing.join(", ") || "none"}`,
|
|
222
|
+
`- Evidence: ${evidence.length}`,
|
|
223
|
+
].join("\n");
|
|
224
|
+
}
|
|
225
|
+
function syncMarker(taskId) {
|
|
226
|
+
return `${SYNC_MARKER_PREFIX}${taskId} -->`;
|
|
227
|
+
}
|
|
228
|
+
function firstSection(body, heading) {
|
|
229
|
+
return listSection(body, heading)?.join("; ");
|
|
230
|
+
}
|
|
231
|
+
function listSection(body, heading) {
|
|
232
|
+
if (!body)
|
|
233
|
+
return undefined;
|
|
234
|
+
const pattern = new RegExp(`##\\s+${escapeRegExp(heading)}\\s*\\n([\\s\\S]*?)(?=\\n##\\s+|$)`, "i");
|
|
235
|
+
const match = body.match(pattern);
|
|
236
|
+
if (!match?.[1])
|
|
237
|
+
return undefined;
|
|
238
|
+
const items = match[1]
|
|
239
|
+
.split("\n")
|
|
240
|
+
.map((line) => line.replace(/^[-*]\s*/, "").trim())
|
|
241
|
+
.filter(Boolean);
|
|
242
|
+
return items.length > 0 ? items : undefined;
|
|
243
|
+
}
|
|
244
|
+
function escapeRegExp(value) {
|
|
245
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
246
|
+
}
|
|
13
247
|
export function buildPrBody(summary, qaIterations) {
|
|
14
248
|
const lines = [];
|
|
15
249
|
lines.push(`## Summary`);
|
package/dist/github.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github.js","sourceRoot":"","sources":["../src/github.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAY1C,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAqB;IAErB,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1E,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;IACD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC1B,OAAO,EAAE,GAAG,EAAE,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,OAA2B,EAC3B,YAAoB;IAEpB,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACzB,KAAK,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACjE,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,oBAAoB,YAAY,EAAE,CAAC,CAAC;IAC/C,KAAK,CAAC,IAAI,CAAC,eAAe,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,IACE,OAAO,CAAC,IAAI,CAAC,kBAAkB;QAC/B,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAC1C,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACrC,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxD,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC,CAAC;QAC/B,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC1B,KAAK,MAAM,EAAE,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QAChC,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAC1B,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,IAAI,CACR,gFAAgF,CACjF,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../src/github.ts"],"names":[],"mappings":"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"}
|
package/dist/health-checks.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ export interface HealthCheckItem {
|
|
|
11
11
|
export interface HealthCheckReport {
|
|
12
12
|
generatedAt: string;
|
|
13
13
|
packageRoot: string;
|
|
14
|
+
workspaceRoot: string;
|
|
14
15
|
overallStatus: "healthy" | "degraded" | "unhealthy";
|
|
15
16
|
workspaceClassification: WorkspaceClassification;
|
|
16
17
|
checks: HealthCheckItem[];
|
package/dist/health-checks.js
CHANGED
|
@@ -2,13 +2,18 @@ import { execFile } from "node:child_process";
|
|
|
2
2
|
import { access, readFile } from "node:fs/promises";
|
|
3
3
|
import { dirname, join } from "node:path";
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { FILES } from "./constants.js";
|
|
6
|
+
import { readJson, resolveWorkflowPath } from "./fs-utils.js";
|
|
5
7
|
import { validateWorkspace } from "./workspace-validator.js";
|
|
6
8
|
import { classifyWorkspace } from "./workspace-classification.js";
|
|
7
9
|
const PACKAGE_ROOT = dirname(dirname(fileURLToPath(import.meta.url)));
|
|
8
10
|
const COMMAND_TIMEOUT_MS = 3000;
|
|
9
11
|
export async function getLocalHealthReport({ root = process.cwd(), includeNetwork = false, runner = runCommand, } = {}) {
|
|
10
12
|
const packageJson = await readPackageJson();
|
|
11
|
-
const workspaceClassification = await classifyWorkspace({
|
|
13
|
+
const workspaceClassification = await classifyWorkspace({
|
|
14
|
+
root,
|
|
15
|
+
advisory: await isAdvisoryWorkspace(root),
|
|
16
|
+
});
|
|
12
17
|
const checks = [
|
|
13
18
|
packageCheck(packageJson),
|
|
14
19
|
workspaceClassificationCheck(workspaceClassification),
|
|
@@ -22,11 +27,16 @@ export async function getLocalHealthReport({ root = process.cwd(), includeNetwor
|
|
|
22
27
|
return {
|
|
23
28
|
generatedAt: new Date().toISOString(),
|
|
24
29
|
packageRoot: PACKAGE_ROOT,
|
|
30
|
+
workspaceRoot: root,
|
|
25
31
|
workspaceClassification,
|
|
26
32
|
overallStatus: overallHealthStatus(checks),
|
|
27
33
|
checks,
|
|
28
34
|
};
|
|
29
35
|
}
|
|
36
|
+
async function isAdvisoryWorkspace(root) {
|
|
37
|
+
const config = await readJson(resolveWorkflowPath(root, FILES.config), {});
|
|
38
|
+
return config.mode === "advisory";
|
|
39
|
+
}
|
|
30
40
|
async function readPackageJson() {
|
|
31
41
|
return JSON.parse(await readFile(join(PACKAGE_ROOT, "package.json"), "utf8"));
|
|
32
42
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health-checks.js","sourceRoot":"","sources":["../src/health-checks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"health-checks.js","sourceRoot":"","sources":["../src/health-checks.ts"],"names":[],"mappings":"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"}
|
package/dist/health-commands.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { getLocalHealthReport } from "./health-checks.js";
|
|
2
|
+
import { targetRootOption } from "./command-utils.js";
|
|
2
3
|
export async function healthCommand(options, io) {
|
|
3
4
|
const report = await getLocalHealthReport({
|
|
5
|
+
root: targetRootOption(options),
|
|
4
6
|
includeNetwork: Boolean(options.network),
|
|
5
7
|
});
|
|
6
8
|
if (options.json) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health-commands.js","sourceRoot":"","sources":["../src/health-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"health-commands.js","sourceRoot":"","sources":["../src/health-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGtD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAmB,EACnB,EAAS;IAET,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC;QACxC,IAAI,EAAE,gBAAgB,CAAC,OAAO,CAAC;QAC/B,cAAc,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;KACzC,CAAC,CAAC;IACH,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IACD,EAAE,CAAC,GAAG,CAAC,yBAAyB,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;IACzD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,EAAE,GAAG,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QACtE,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACtB,EAAE,CAAC,GAAG,CAAC,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -6,8 +6,11 @@ export interface McpOAuthProxyConfig {
|
|
|
6
6
|
serverUrl: string;
|
|
7
7
|
authorizationUrl?: string;
|
|
8
8
|
tokenUrl?: string;
|
|
9
|
+
registrationUrl?: string;
|
|
9
10
|
clientId?: string;
|
|
10
11
|
clientSecret?: string;
|
|
12
|
+
clientName?: string;
|
|
13
|
+
dynamicRegistration?: boolean;
|
|
11
14
|
scopes?: string[];
|
|
12
15
|
tokenStorage: McpSecretStorage;
|
|
13
16
|
tokenPath?: string;
|
|
@@ -45,6 +48,19 @@ export interface McpOAuthStartResult {
|
|
|
45
48
|
token: McpTokenStatus;
|
|
46
49
|
proxyReady: boolean;
|
|
47
50
|
}
|
|
51
|
+
export interface McpOAuthAuthorizationServerMetadata {
|
|
52
|
+
issuer?: string;
|
|
53
|
+
authorizationEndpoint: string;
|
|
54
|
+
tokenEndpoint: string;
|
|
55
|
+
registrationEndpoint?: string;
|
|
56
|
+
scopesSupported?: string[];
|
|
57
|
+
}
|
|
58
|
+
export interface McpOAuthDynamicClientRegistration {
|
|
59
|
+
clientId: string;
|
|
60
|
+
clientSecret?: string;
|
|
61
|
+
clientIdIssuedAt?: number;
|
|
62
|
+
clientSecretExpiresAt?: number;
|
|
63
|
+
}
|
|
48
64
|
export interface McpAuthenticatedRequest {
|
|
49
65
|
method?: string;
|
|
50
66
|
path: string;
|
|
@@ -58,6 +74,22 @@ export interface McpAuthenticatedResponse {
|
|
|
58
74
|
}
|
|
59
75
|
export declare function evaluateMcpOAuthProxy(config: McpOAuthProxyConfig): McpProxyEvaluation;
|
|
60
76
|
export declare function validateMcpOAuthProxyConfig(config: McpOAuthProxyConfig): string[];
|
|
77
|
+
export declare function discoverMcpOAuthMetadata({ serverUrl, fetchFn, }: {
|
|
78
|
+
serverUrl: string;
|
|
79
|
+
fetchFn?: typeof fetch;
|
|
80
|
+
}): Promise<McpOAuthAuthorizationServerMetadata>;
|
|
81
|
+
export declare function registerMcpOAuthClient({ metadata, clientName, redirectUris, scopes, fetchFn, }: {
|
|
82
|
+
metadata: McpOAuthAuthorizationServerMetadata;
|
|
83
|
+
clientName?: string;
|
|
84
|
+
redirectUris: string[];
|
|
85
|
+
scopes?: string[];
|
|
86
|
+
fetchFn?: typeof fetch;
|
|
87
|
+
}): Promise<McpOAuthDynamicClientRegistration>;
|
|
88
|
+
export declare function resolveMcpOAuthDiscoveryConfig({ config, redirectUris, fetchFn, }: {
|
|
89
|
+
config: McpOAuthProxyConfig;
|
|
90
|
+
redirectUris: string[];
|
|
91
|
+
fetchFn?: typeof fetch;
|
|
92
|
+
}): Promise<McpOAuthProxyConfig>;
|
|
61
93
|
export declare function readMcpTokenStatus(config: McpOAuthProxyConfig, now?: Date): Promise<McpTokenStatus>;
|
|
62
94
|
export declare function loadMcpToken(config: McpOAuthProxyConfig): Promise<McpTokenState>;
|
|
63
95
|
export declare function saveMcpToken(config: McpOAuthProxyConfig, token: McpTokenState): Promise<void>;
|
package/dist/mcp-oauth-proxy.js
CHANGED
|
@@ -50,6 +50,10 @@ export function validateMcpOAuthProxyConfig(config) {
|
|
|
50
50
|
if (config.tokenUrl && !config.tokenUrl.startsWith("https://")) {
|
|
51
51
|
risks.push("tokenUrl must use https");
|
|
52
52
|
}
|
|
53
|
+
if (config.registrationUrl &&
|
|
54
|
+
!config.registrationUrl.startsWith("https://")) {
|
|
55
|
+
risks.push("registrationUrl must use https");
|
|
56
|
+
}
|
|
53
57
|
if (config.refreshWindowSeconds < 30) {
|
|
54
58
|
risks.push("refreshWindowSeconds must be at least 30");
|
|
55
59
|
}
|
|
@@ -63,6 +67,75 @@ export function validateMcpOAuthProxyConfig(config) {
|
|
|
63
67
|
}
|
|
64
68
|
return risks;
|
|
65
69
|
}
|
|
70
|
+
export async function discoverMcpOAuthMetadata({ serverUrl, fetchFn = fetch, }) {
|
|
71
|
+
const server = new URL(serverUrl);
|
|
72
|
+
if (server.protocol !== "https:") {
|
|
73
|
+
throw new Error("MCP OAuth discovery requires https serverUrl");
|
|
74
|
+
}
|
|
75
|
+
const discoveryUrl = new URL("/.well-known/oauth-authorization-server", server.origin);
|
|
76
|
+
const response = await fetchFn(discoveryUrl);
|
|
77
|
+
if (!response.ok) {
|
|
78
|
+
throw new Error(`OAuth discovery returned HTTP ${response.status}`);
|
|
79
|
+
}
|
|
80
|
+
const payload = (await response.json());
|
|
81
|
+
return removeUndefinedMetadata({
|
|
82
|
+
issuer: optionalStringField(payload, "issuer"),
|
|
83
|
+
authorizationEndpoint: stringField(payload, "authorization_endpoint"),
|
|
84
|
+
tokenEndpoint: stringField(payload, "token_endpoint"),
|
|
85
|
+
registrationEndpoint: optionalStringField(payload, "registration_endpoint"),
|
|
86
|
+
scopesSupported: stringArrayField(payload, "scopes_supported"),
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
export async function registerMcpOAuthClient({ metadata, clientName = "Open Orchestra MCP OAuth Proxy", redirectUris, scopes = [], fetchFn = fetch, }) {
|
|
90
|
+
if (!metadata.registrationEndpoint?.startsWith("https://")) {
|
|
91
|
+
throw new Error("OAuth dynamic registration endpoint is unavailable");
|
|
92
|
+
}
|
|
93
|
+
const response = await fetchFn(metadata.registrationEndpoint, {
|
|
94
|
+
method: "POST",
|
|
95
|
+
headers: { "content-type": "application/json" },
|
|
96
|
+
body: JSON.stringify({
|
|
97
|
+
client_name: clientName,
|
|
98
|
+
redirect_uris: redirectUris,
|
|
99
|
+
grant_types: ["authorization_code", "refresh_token"],
|
|
100
|
+
response_types: ["code"],
|
|
101
|
+
token_endpoint_auth_method: "client_secret_post",
|
|
102
|
+
...(scopes.length > 0 ? { scope: scopes.join(" ") } : {}),
|
|
103
|
+
}),
|
|
104
|
+
});
|
|
105
|
+
if (!response.ok) {
|
|
106
|
+
throw new Error(`OAuth dynamic registration returned HTTP ${response.status}`);
|
|
107
|
+
}
|
|
108
|
+
const payload = (await response.json());
|
|
109
|
+
return removeUndefinedRegistration({
|
|
110
|
+
clientId: stringField(payload, "client_id"),
|
|
111
|
+
clientSecret: optionalStringField(payload, "client_secret"),
|
|
112
|
+
clientIdIssuedAt: numberField(payload, "client_id_issued_at"),
|
|
113
|
+
clientSecretExpiresAt: numberField(payload, "client_secret_expires_at"),
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
export async function resolveMcpOAuthDiscoveryConfig({ config, redirectUris, fetchFn = fetch, }) {
|
|
117
|
+
const metadata = await discoverMcpOAuthMetadata({
|
|
118
|
+
serverUrl: config.serverUrl,
|
|
119
|
+
fetchFn,
|
|
120
|
+
});
|
|
121
|
+
const registration = config.dynamicRegistration && !config.clientId
|
|
122
|
+
? await registerMcpOAuthClient({
|
|
123
|
+
metadata,
|
|
124
|
+
redirectUris,
|
|
125
|
+
fetchFn,
|
|
126
|
+
...(config.clientName ? { clientName: config.clientName } : {}),
|
|
127
|
+
...(config.scopes ? { scopes: config.scopes } : {}),
|
|
128
|
+
})
|
|
129
|
+
: undefined;
|
|
130
|
+
return removeUndefinedConfig({
|
|
131
|
+
...config,
|
|
132
|
+
authorizationUrl: config.authorizationUrl ?? metadata.authorizationEndpoint,
|
|
133
|
+
tokenUrl: config.tokenUrl ?? metadata.tokenEndpoint,
|
|
134
|
+
registrationUrl: config.registrationUrl ?? metadata.registrationEndpoint,
|
|
135
|
+
clientId: config.clientId ?? registration?.clientId,
|
|
136
|
+
clientSecret: config.clientSecret ?? registration?.clientSecret,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
66
139
|
export async function readMcpTokenStatus(config, now = new Date()) {
|
|
67
140
|
const token = await loadMcpToken(config).catch(() => undefined);
|
|
68
141
|
if (!token) {
|
|
@@ -106,6 +179,15 @@ export async function forceRefreshMcpToken({ config, fetchFn = fetch, }) {
|
|
|
106
179
|
};
|
|
107
180
|
}
|
|
108
181
|
export async function startMcpOAuthProxy({ config, fetchFn = fetch, openBrowser = true, }) {
|
|
182
|
+
if (config.dynamicRegistration ||
|
|
183
|
+
!config.authorizationUrl ||
|
|
184
|
+
!config.tokenUrl) {
|
|
185
|
+
config = await resolveMcpOAuthDiscoveryConfig({
|
|
186
|
+
config,
|
|
187
|
+
redirectUris: ["http://127.0.0.1/callback"],
|
|
188
|
+
fetchFn,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
109
191
|
const risks = validateMcpOAuthProxyConfig(config);
|
|
110
192
|
if (risks.length > 0) {
|
|
111
193
|
throw new Error("invalid MCP OAuth proxy config: " + risks.join("; "));
|
|
@@ -128,6 +210,20 @@ export async function proxyMcpHttpRequest({ config, request, fetchFn = fetch, })
|
|
|
128
210
|
if (target.protocol !== "https:") {
|
|
129
211
|
throw new Error("MCP proxy target must use https");
|
|
130
212
|
}
|
|
213
|
+
const response = await fetchMcpWithToken({ target, request, token, fetchFn });
|
|
214
|
+
if (response.status !== 401) {
|
|
215
|
+
return response;
|
|
216
|
+
}
|
|
217
|
+
const refreshed = await refreshTokenWithEndpoint(config, token, fetchFn);
|
|
218
|
+
await saveMcpToken(config, refreshed);
|
|
219
|
+
return fetchMcpWithToken({
|
|
220
|
+
target,
|
|
221
|
+
request,
|
|
222
|
+
token: refreshed,
|
|
223
|
+
fetchFn,
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
async function fetchMcpWithToken({ target, request, token, fetchFn, }) {
|
|
131
227
|
const headers = new Headers(request.headers);
|
|
132
228
|
headers.set("authorization", "Bearer " + token.accessToken);
|
|
133
229
|
const init = {
|
|
@@ -312,6 +408,21 @@ function stringField(payload, key) {
|
|
|
312
408
|
}
|
|
313
409
|
return value;
|
|
314
410
|
}
|
|
411
|
+
function optionalStringField(payload, key) {
|
|
412
|
+
const value = payload[key];
|
|
413
|
+
return typeof value === "string" && value.trim() !== "" ? value : undefined;
|
|
414
|
+
}
|
|
415
|
+
function numberField(payload, key) {
|
|
416
|
+
const value = payload[key];
|
|
417
|
+
return typeof value === "number" ? value : undefined;
|
|
418
|
+
}
|
|
419
|
+
function stringArrayField(payload, key) {
|
|
420
|
+
const value = payload[key];
|
|
421
|
+
if (!Array.isArray(value)) {
|
|
422
|
+
return undefined;
|
|
423
|
+
}
|
|
424
|
+
return value.filter((entry) => typeof entry === "string" && entry.trim() !== "");
|
|
425
|
+
}
|
|
315
426
|
function tokenNeedsRefresh(token, now, refreshWindowSeconds) {
|
|
316
427
|
return (now.getTime() >=
|
|
317
428
|
new Date(token.expiresAt).getTime() - refreshWindowSeconds * 1000);
|
|
@@ -337,6 +448,15 @@ function ensureTrailingSlash(value) {
|
|
|
337
448
|
function removeUndefinedResponse(response) {
|
|
338
449
|
return Object.fromEntries(Object.entries(response).filter(([, value]) => value !== undefined));
|
|
339
450
|
}
|
|
451
|
+
function removeUndefinedConfig(config) {
|
|
452
|
+
return Object.fromEntries(Object.entries(config).filter(([, value]) => value !== undefined));
|
|
453
|
+
}
|
|
454
|
+
function removeUndefinedMetadata(metadata) {
|
|
455
|
+
return Object.fromEntries(Object.entries(metadata).filter(([, value]) => value !== undefined));
|
|
456
|
+
}
|
|
457
|
+
function removeUndefinedRegistration(registration) {
|
|
458
|
+
return Object.fromEntries(Object.entries(registration).filter(([, value]) => value !== undefined));
|
|
459
|
+
}
|
|
340
460
|
function base64Url(input) {
|
|
341
461
|
return input
|
|
342
462
|
.toString("base64")
|