@jterrats/open-orchestra 0.1.0 → 0.2.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.
- package/CHANGELOG.md +53 -0
- package/README.md +17 -2
- package/dist/assets/web-console.js +743 -0
- package/dist/cli.js +157 -4
- package/dist/cli.js.map +1 -1
- package/dist/collaboration-flows.d.ts +5 -0
- package/dist/collaboration-flows.js +256 -0
- package/dist/collaboration-flows.js.map +1 -0
- package/dist/command-manifest.d.ts +11 -0
- package/dist/command-manifest.js +52 -0
- package/dist/command-manifest.js.map +1 -0
- package/dist/commands.d.ts +31 -0
- package/dist/commands.js +644 -2
- package/dist/commands.js.map +1 -1
- package/dist/constants.d.ts +4 -0
- package/dist/constants.js +22 -0
- package/dist/constants.js.map +1 -1
- package/dist/defaults.d.ts +7 -11
- package/dist/defaults.js +7 -625
- package/dist/defaults.js.map +1 -1
- package/dist/delegation-decision.d.ts +14 -0
- package/dist/delegation-decision.js +391 -0
- package/dist/delegation-decision.js.map +1 -0
- package/dist/detect-commands.d.ts +3 -0
- package/dist/detect-commands.js +28 -0
- package/dist/detect-commands.js.map +1 -0
- package/dist/diagram-validation.d.ts +36 -0
- package/dist/diagram-validation.js +118 -0
- package/dist/diagram-validation.js.map +1 -0
- package/dist/fs-utils.d.ts +2 -0
- package/dist/fs-utils.js +75 -6
- package/dist/fs-utils.js.map +1 -1
- package/dist/health-checks.d.ts +28 -0
- package/dist/health-checks.js +219 -0
- package/dist/health-checks.js.map +1 -0
- package/dist/health-commands.d.ts +2 -0
- package/dist/health-commands.js +18 -0
- package/dist/health-commands.js.map +1 -0
- package/dist/instruction-apply.d.ts +34 -0
- package/dist/instruction-apply.js +150 -0
- package/dist/instruction-apply.js.map +1 -0
- package/dist/instruction-blocks.d.ts +22 -0
- package/dist/instruction-blocks.js +120 -0
- package/dist/instruction-blocks.js.map +1 -0
- package/dist/instruction-imports.d.ts +12 -0
- package/dist/instruction-imports.js +45 -0
- package/dist/instruction-imports.js.map +1 -0
- package/dist/instruction-stale.d.ts +9 -0
- package/dist/instruction-stale.js +106 -0
- package/dist/instruction-stale.js.map +1 -0
- package/dist/instruction-types.d.ts +66 -0
- package/dist/instruction-types.js +2 -0
- package/dist/instruction-types.js.map +1 -0
- package/dist/instruction-updates.d.ts +4 -0
- package/dist/instruction-updates.js +5 -0
- package/dist/instruction-updates.js.map +1 -0
- package/dist/knowledge-base.d.ts +10 -0
- package/dist/knowledge-base.js +117 -0
- package/dist/knowledge-base.js.map +1 -0
- package/dist/mcp-oauth-proxy.d.ts +39 -0
- package/dist/mcp-oauth-proxy.js +80 -0
- package/dist/mcp-oauth-proxy.js.map +1 -0
- package/dist/pr-review.d.ts +20 -0
- package/dist/pr-review.js +142 -0
- package/dist/pr-review.js.map +1 -0
- package/dist/project-detection.d.ts +22 -0
- package/dist/project-detection.js +174 -0
- package/dist/project-detection.js.map +1 -0
- package/dist/prompt-registry.d.ts +56 -0
- package/dist/prompt-registry.js +163 -0
- package/dist/prompt-registry.js.map +1 -0
- package/dist/release-candidate.d.ts +41 -0
- package/dist/release-candidate.js +196 -0
- package/dist/release-candidate.js.map +1 -0
- package/dist/release-commands.d.ts +4 -0
- package/dist/release-commands.js +50 -0
- package/dist/release-commands.js.map +1 -0
- package/dist/roles/ai-support-roles.d.ts +11 -0
- package/dist/roles/ai-support-roles.js +67 -0
- package/dist/roles/ai-support-roles.js.map +1 -0
- package/dist/roles/core-roles.d.ts +11 -0
- package/dist/roles/core-roles.js +144 -0
- package/dist/roles/core-roles.js.map +1 -0
- package/dist/roles/engineering-roles.d.ts +11 -0
- package/dist/roles/engineering-roles.js +176 -0
- package/dist/roles/engineering-roles.js.map +1 -0
- package/dist/roles/governance-roles.d.ts +11 -0
- package/dist/roles/governance-roles.js +117 -0
- package/dist/roles/governance-roles.js.map +1 -0
- package/dist/roles/index.d.ts +11 -0
- package/dist/roles/index.js +17 -0
- package/dist/roles/index.js.map +1 -0
- package/dist/roles/platform-ops-roles.d.ts +11 -0
- package/dist/roles/platform-ops-roles.js +158 -0
- package/dist/roles/platform-ops-roles.js.map +1 -0
- package/dist/roles/qa-ux-roles.d.ts +11 -0
- package/dist/roles/qa-ux-roles.js +193 -0
- package/dist/roles/qa-ux-roles.js.map +1 -0
- package/dist/roles/release-ops-roles.d.ts +11 -0
- package/dist/roles/release-ops-roles.js +109 -0
- package/dist/roles/release-ops-roles.js.map +1 -0
- package/dist/runtime-adapters.d.ts +6 -0
- package/dist/runtime-adapters.js +88 -0
- package/dist/runtime-adapters.js.map +1 -0
- package/dist/runtime-bootstrap.d.ts +12 -0
- package/dist/runtime-bootstrap.js +85 -0
- package/dist/runtime-bootstrap.js.map +1 -0
- package/dist/skills.d.ts +36 -0
- package/dist/skills.js +665 -0
- package/dist/skills.js.map +1 -0
- package/dist/subagent-protocol.d.ts +41 -0
- package/dist/subagent-protocol.js +179 -0
- package/dist/subagent-protocol.js.map +1 -0
- package/dist/telemetry-consent.d.ts +24 -0
- package/dist/telemetry-consent.js +95 -0
- package/dist/telemetry-consent.js.map +1 -0
- package/dist/telemetry-export.d.ts +14 -0
- package/dist/telemetry-export.js +126 -0
- package/dist/telemetry-export.js.map +1 -0
- package/dist/telemetry-records.d.ts +3 -0
- package/dist/telemetry-records.js +96 -0
- package/dist/telemetry-records.js.map +1 -0
- package/dist/telemetry-redaction.d.ts +9 -0
- package/dist/telemetry-redaction.js +55 -0
- package/dist/telemetry-redaction.js.map +1 -0
- package/dist/telemetry-types.d.ts +52 -0
- package/dist/telemetry-types.js +2 -0
- package/dist/telemetry-types.js.map +1 -0
- package/dist/telemetry.d.ts +4 -0
- package/dist/telemetry.js +4 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/types.d.ts +176 -1
- package/dist/validation.d.ts +3 -1
- package/dist/validation.js +28 -5
- package/dist/validation.js.map +1 -1
- package/dist/web-api.js +167 -3
- package/dist/web-api.js.map +1 -1
- package/dist/web-console.js +6 -160
- package/dist/web-console.js.map +1 -1
- package/dist/workflow-gates.js +4 -2
- package/dist/workflow-gates.js.map +1 -1
- package/dist/workflow-services.js +125 -67
- package/dist/workflow-services.js.map +1 -1
- package/dist/workflow-templates.d.ts +10 -0
- package/dist/workflow-templates.js +141 -0
- package/dist/workflow-templates.js.map +1 -0
- package/dist/workspace-classification.d.ts +5 -0
- package/dist/workspace-classification.js +127 -0
- package/dist/workspace-classification.js.map +1 -0
- package/dist/workspace-validator.js +11 -1
- package/dist/workspace-validator.js.map +1 -1
- package/dist/workspace.d.ts +8 -4
- package/dist/workspace.js +111 -4
- package/dist/workspace.js.map +1 -1
- package/docs/dev-team-specialist-role-profiles.md +171 -0
- package/docs/mcp-oauth-proxy-evaluation.md +44 -0
- package/docs/multi-agent-orchestrator-backlog.md +413 -1
- package/docs/open-orchestra-dogfooding-findings.md +66 -0
- package/docs/orchestra-mvp.md +46 -1
- package/docs/runtime-adapters.md +86 -0
- package/docs/runtime-llm-flow.md +124 -0
- package/docs/setup-agents-dogfooding-findings.md +101 -0
- package/docs/skill-loading-strategy.md +114 -0
- package/docs/source-of-truth-and-agent-learning.md +83 -0
- package/package.json +9 -5
- package/rules/agent-roles.mdc +30 -0
- package/rules/ai-assisted-development.mdc +22 -0
- package/skills/agent-learning/SKILL.md +24 -0
- package/skills/agent-learning/manifest.json +40 -0
- package/skills/backlog-sync/SKILL.md +24 -0
- package/skills/backlog-sync/manifest.json +41 -0
- package/skills/diagram-export/SKILL.md +35 -0
- package/skills/diagram-export/manifest.json +40 -0
- package/skills/model-evaluation/SKILL.md +25 -0
- package/skills/model-evaluation/manifest.json +41 -0
- package/skills/playwright-evidence/SKILL.md +28 -0
- package/skills/playwright-evidence/manifest.json +46 -0
- package/skills/pr-review/SKILL.md +23 -0
- package/skills/pr-review/manifest.json +43 -0
- package/skills/prompt-registry/SKILL.md +24 -0
- package/skills/prompt-registry/manifest.json +45 -0
- package/skills/release-readiness/SKILL.md +25 -0
- package/skills/release-readiness/manifest.json +45 -0
- package/skills/source-of-truth/SKILL.md +24 -0
- package/skills/source-of-truth/manifest.json +47 -0
- package/skills/static-analysis/SKILL.md +26 -0
- package/skills/static-analysis/manifest.json +46 -0
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { appendEvent, loadWorkspace, readEvents } from "./workspace.js";
|
|
3
|
+
const REVIEW_STATUSES = new Set(["review", "approved"]);
|
|
4
|
+
const COMPLETE_STATUSES = new Set(["done", "canceled"]);
|
|
5
|
+
export function decideDelegation(input) {
|
|
6
|
+
const taskEvents = input.events.filter((event) => event.taskId === input.task.id);
|
|
7
|
+
const roleIds = new Set(input.roles.map((role) => role.id));
|
|
8
|
+
const complexityScore = taskComplexityScore(input.task);
|
|
9
|
+
const urgency = taskUrgency(input.task);
|
|
10
|
+
const taskLocks = locksForTask(input.task, input.locks);
|
|
11
|
+
const blockingConditions = delegationBlockingConditions(input.task, input.dependencies, taskLocks);
|
|
12
|
+
const contextBundle = requiredContextBundle(input, taskEvents);
|
|
13
|
+
const rationale = delegationRationale(input.task, complexityScore, urgency);
|
|
14
|
+
if (blockingConditions.length > 0) {
|
|
15
|
+
return buildDecision({
|
|
16
|
+
task: input.task,
|
|
17
|
+
recommendation: "no_delegation",
|
|
18
|
+
complexityScore,
|
|
19
|
+
urgency,
|
|
20
|
+
rationale: rationale.concat("Delegation is blocked until preconditions are resolved."),
|
|
21
|
+
blockingConditions,
|
|
22
|
+
contextBundle,
|
|
23
|
+
delegates: [],
|
|
24
|
+
expectedOutputs: [
|
|
25
|
+
"Resolve blocking conditions before assigning subagents.",
|
|
26
|
+
],
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
if (needsReviewDelegation(input.task, taskEvents)) {
|
|
30
|
+
const reviewRole = roleIds.has("qa") ? "qa" : "reviewer_critic";
|
|
31
|
+
return buildDecision({
|
|
32
|
+
task: input.task,
|
|
33
|
+
recommendation: "review_delegate",
|
|
34
|
+
complexityScore,
|
|
35
|
+
urgency,
|
|
36
|
+
rationale: rationale.concat("Task is in a review or evidence-bearing state."),
|
|
37
|
+
blockingConditions,
|
|
38
|
+
contextBundle,
|
|
39
|
+
delegates: [
|
|
40
|
+
assignment(reviewRole, "review", ["Review readiness or evidence exists."], input.task.paths ?? []),
|
|
41
|
+
],
|
|
42
|
+
expectedOutputs: [
|
|
43
|
+
"Review findings with approve/block/changes result.",
|
|
44
|
+
"Updated evidence or explicit residual risk notes.",
|
|
45
|
+
],
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
const candidates = candidateAssignments(input.task, roleIds);
|
|
49
|
+
if (candidates.length >= 2 && scopesAreDisjoint(candidates)) {
|
|
50
|
+
return buildDecision({
|
|
51
|
+
task: input.task,
|
|
52
|
+
recommendation: "parallel_delegate",
|
|
53
|
+
complexityScore,
|
|
54
|
+
urgency,
|
|
55
|
+
rationale: rationale.concat("Multiple role-fit delegates have disjoint write scopes."),
|
|
56
|
+
blockingConditions,
|
|
57
|
+
contextBundle,
|
|
58
|
+
delegates: candidates,
|
|
59
|
+
expectedOutputs: [
|
|
60
|
+
"Role-specific implementation or review artifacts.",
|
|
61
|
+
"Integration handoff summarizing touched scopes and residual risks.",
|
|
62
|
+
],
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
const preferredCandidate = candidates[0];
|
|
66
|
+
if (preferredCandidate && shouldDelegateSingle(input.task, complexityScore)) {
|
|
67
|
+
return buildDecision({
|
|
68
|
+
task: input.task,
|
|
69
|
+
recommendation: "single_delegate",
|
|
70
|
+
complexityScore,
|
|
71
|
+
urgency,
|
|
72
|
+
rationale: rationale.concat("Task has enough complexity or risk for a role-fit delegate."),
|
|
73
|
+
blockingConditions,
|
|
74
|
+
contextBundle,
|
|
75
|
+
delegates: [preferredCandidate],
|
|
76
|
+
expectedOutputs: [
|
|
77
|
+
"Role-scoped work artifact or handoff.",
|
|
78
|
+
"Unit tests, checks, or review evidence appropriate to the role.",
|
|
79
|
+
],
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
return buildDecision({
|
|
83
|
+
task: input.task,
|
|
84
|
+
recommendation: "local",
|
|
85
|
+
complexityScore,
|
|
86
|
+
urgency,
|
|
87
|
+
rationale: rationale.concat("Task is small enough for the parent/current agent to handle locally."),
|
|
88
|
+
blockingConditions,
|
|
89
|
+
contextBundle,
|
|
90
|
+
delegates: [],
|
|
91
|
+
expectedOutputs: [
|
|
92
|
+
"Local implementation with focused tests and final summary.",
|
|
93
|
+
],
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
export async function decideTaskDelegation(taskId, root = process.cwd(), { record = true } = {}) {
|
|
97
|
+
const workspace = await loadWorkspace(root);
|
|
98
|
+
const task = workspace.tasks.find((candidate) => candidate.id === taskId);
|
|
99
|
+
if (!task) {
|
|
100
|
+
throw new Error("unknown task: " + taskId);
|
|
101
|
+
}
|
|
102
|
+
const dependencies = dependencyReportForTask(task, workspace.tasks);
|
|
103
|
+
const decision = decideDelegation({
|
|
104
|
+
task,
|
|
105
|
+
dependencies,
|
|
106
|
+
locks: workspace.locks,
|
|
107
|
+
roles: workspace.roles,
|
|
108
|
+
events: await readEvents(root),
|
|
109
|
+
});
|
|
110
|
+
if (record) {
|
|
111
|
+
await appendEvent(root, {
|
|
112
|
+
type: "DELEGATION_DECIDED",
|
|
113
|
+
taskId,
|
|
114
|
+
actor: "parent",
|
|
115
|
+
summary: "Delegation decision: " + decision.recommendation,
|
|
116
|
+
metadata: { decision },
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
return decision;
|
|
120
|
+
}
|
|
121
|
+
export function latestDelegationDecision(events) {
|
|
122
|
+
const event = [...events]
|
|
123
|
+
.reverse()
|
|
124
|
+
.find((candidate) => candidate.type === "DELEGATION_DECIDED");
|
|
125
|
+
return event?.metadata.decision;
|
|
126
|
+
}
|
|
127
|
+
function buildDecision(input) {
|
|
128
|
+
return {
|
|
129
|
+
taskId: input.task.id,
|
|
130
|
+
recommendation: input.recommendation,
|
|
131
|
+
complexityScore: input.complexityScore,
|
|
132
|
+
urgency: input.urgency,
|
|
133
|
+
rationale: input.rationale,
|
|
134
|
+
blockingConditions: input.blockingConditions,
|
|
135
|
+
contextBundle: input.contextBundle,
|
|
136
|
+
expectedOutputs: input.expectedOutputs,
|
|
137
|
+
delegates: input.delegates,
|
|
138
|
+
disjointWriteScopes: scopesAreDisjoint(input.delegates),
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
function taskComplexityScore(task) {
|
|
142
|
+
return [
|
|
143
|
+
(task.acceptanceCriteria ?? []).length >= 3,
|
|
144
|
+
(task.paths ?? []).length >= 2,
|
|
145
|
+
(task.risks ?? []).length > 0,
|
|
146
|
+
(task.dependencies ?? []).length > 0,
|
|
147
|
+
Boolean(task.scope),
|
|
148
|
+
Boolean(task.testStrategy),
|
|
149
|
+
Boolean(task.architectureApproval?.proposal),
|
|
150
|
+
Boolean(task.riskGate?.impactAreas?.length),
|
|
151
|
+
].filter(Boolean).length;
|
|
152
|
+
}
|
|
153
|
+
function taskUrgency(task) {
|
|
154
|
+
const text = [task.title, task.goal, task.scope, ...(task.risks ?? [])]
|
|
155
|
+
.filter(Boolean)
|
|
156
|
+
.join(" ")
|
|
157
|
+
.toLowerCase();
|
|
158
|
+
return /urgent|hotfix|incident|production|critical/.test(text)
|
|
159
|
+
? "high"
|
|
160
|
+
: "normal";
|
|
161
|
+
}
|
|
162
|
+
function delegationBlockingConditions(task, dependencies, taskLocks) {
|
|
163
|
+
const blockers = [];
|
|
164
|
+
if (COMPLETE_STATUSES.has(task.status)) {
|
|
165
|
+
blockers.push("task is already complete or canceled");
|
|
166
|
+
}
|
|
167
|
+
if (!hasSufficientContext(task)) {
|
|
168
|
+
blockers.push("task is missing goal, scope, or acceptance criteria");
|
|
169
|
+
}
|
|
170
|
+
if (!dependencies.isSatisfied) {
|
|
171
|
+
blockers.push("incomplete dependencies: " +
|
|
172
|
+
dependencies.incomplete.map((dependency) => dependency.id).join(", "));
|
|
173
|
+
}
|
|
174
|
+
if (taskLocks.length > 0) {
|
|
175
|
+
blockers.push("active locks: " + taskLocks.map((lock) => lock.id).join(", "));
|
|
176
|
+
}
|
|
177
|
+
return blockers;
|
|
178
|
+
}
|
|
179
|
+
function hasSufficientContext(task) {
|
|
180
|
+
return Boolean(task.goal ||
|
|
181
|
+
task.scope ||
|
|
182
|
+
task.backlogItem ||
|
|
183
|
+
(task.acceptanceCriteria && task.acceptanceCriteria.length > 0));
|
|
184
|
+
}
|
|
185
|
+
function requiredContextBundle(input, events) {
|
|
186
|
+
const bundle = [
|
|
187
|
+
"task brief",
|
|
188
|
+
"owner role",
|
|
189
|
+
"dependencies",
|
|
190
|
+
"locks",
|
|
191
|
+
"acceptance criteria",
|
|
192
|
+
"paths",
|
|
193
|
+
"risks",
|
|
194
|
+
];
|
|
195
|
+
if (events.some((event) => event.type === "DECISION_RECORDED")) {
|
|
196
|
+
bundle.push("decisions");
|
|
197
|
+
}
|
|
198
|
+
if (events.some((event) => event.type === "HANDOFF_READY")) {
|
|
199
|
+
bundle.push("handoffs");
|
|
200
|
+
}
|
|
201
|
+
if (events.some((event) => event.type === "EVIDENCE_ADDED")) {
|
|
202
|
+
bundle.push("evidence");
|
|
203
|
+
}
|
|
204
|
+
if (input.skills?.selected.length) {
|
|
205
|
+
bundle.push("selected skills");
|
|
206
|
+
}
|
|
207
|
+
return bundle;
|
|
208
|
+
}
|
|
209
|
+
function delegationRationale(task, complexityScore, urgency) {
|
|
210
|
+
return [
|
|
211
|
+
"Complexity score: " + complexityScore,
|
|
212
|
+
"Urgency: " + urgency,
|
|
213
|
+
"Owner role: " + task.ownerRole,
|
|
214
|
+
];
|
|
215
|
+
}
|
|
216
|
+
function needsReviewDelegation(task, events) {
|
|
217
|
+
return (REVIEW_STATUSES.has(task.status) ||
|
|
218
|
+
events.some((event) => ["HANDOFF_READY", "EVIDENCE_ADDED", "REVIEW_RECORDED"].includes(event.type)));
|
|
219
|
+
}
|
|
220
|
+
function candidateAssignments(task, roleIds) {
|
|
221
|
+
const assignments = new Map();
|
|
222
|
+
const add = (role, rationale, scopes) => {
|
|
223
|
+
if (!roleIds.has(role)) {
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
const existing = assignments.get(role);
|
|
227
|
+
assignments.set(role, existing
|
|
228
|
+
? {
|
|
229
|
+
...existing,
|
|
230
|
+
rationale: unique(existing.rationale.concat(rationale)),
|
|
231
|
+
writeScopes: unique(existing.writeScopes.concat(scopes)),
|
|
232
|
+
}
|
|
233
|
+
: assignment(role, "execute", rationale, scopes));
|
|
234
|
+
};
|
|
235
|
+
if (task.ownerRole !== "parent") {
|
|
236
|
+
add(task.ownerRole, ["Task owner role matches delivery responsibility."], task.paths ?? []);
|
|
237
|
+
}
|
|
238
|
+
for (const area of task.riskGate?.impactAreas ?? []) {
|
|
239
|
+
const role = riskAreaRole(area);
|
|
240
|
+
if (role) {
|
|
241
|
+
add(role, ["Risk impact area requires specialist review: " + area], task.paths ?? []);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
for (const risk of task.risks ?? []) {
|
|
245
|
+
const role = riskTextRole(risk);
|
|
246
|
+
if (role) {
|
|
247
|
+
add(role, ["Risk text indicates specialist: " + risk], task.paths ?? []);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
for (const filePath of task.paths ?? []) {
|
|
251
|
+
const role = pathRole(filePath);
|
|
252
|
+
if (role) {
|
|
253
|
+
add(role, ["Path signal matches role: " + filePath], [filePath]);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return [...assignments.values()].sort((left, right) => left.role.localeCompare(right.role));
|
|
257
|
+
}
|
|
258
|
+
function assignment(role, mode, rationale, writeScopes) {
|
|
259
|
+
return {
|
|
260
|
+
role,
|
|
261
|
+
mode,
|
|
262
|
+
rationale,
|
|
263
|
+
writeScopes: unique(writeScopes),
|
|
264
|
+
expectedOutputs: mode === "review"
|
|
265
|
+
? ["review findings", "approval or blocking recommendation"]
|
|
266
|
+
: ["role-scoped artifact", "tests or evidence", "handoff summary"],
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
function shouldDelegateSingle(task, complexityScore) {
|
|
270
|
+
return complexityScore >= 2 || Boolean(task.risks?.length);
|
|
271
|
+
}
|
|
272
|
+
function scopesAreDisjoint(assignments) {
|
|
273
|
+
const scopes = assignments.flatMap((assignment) => assignment.writeScopes);
|
|
274
|
+
if (scopes.length === 0) {
|
|
275
|
+
return assignments.length <= 1;
|
|
276
|
+
}
|
|
277
|
+
for (let index = 0; index < scopes.length; index += 1) {
|
|
278
|
+
const current = scopes[index];
|
|
279
|
+
if (!current) {
|
|
280
|
+
continue;
|
|
281
|
+
}
|
|
282
|
+
for (const other of scopes.slice(index + 1)) {
|
|
283
|
+
if (pathsConflict(current, other)) {
|
|
284
|
+
return false;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return true;
|
|
289
|
+
}
|
|
290
|
+
function locksForTask(task, locks) {
|
|
291
|
+
return locks.filter((lock) => {
|
|
292
|
+
if (lock.taskId === task.id) {
|
|
293
|
+
return true;
|
|
294
|
+
}
|
|
295
|
+
return (task.paths ?? []).some((filePath) => pathsConflict(filePath, lock.path));
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
function dependencyReportForTask(task, tasks) {
|
|
299
|
+
const dependencies = (task.dependencies ?? []).map((dependencyId) => {
|
|
300
|
+
const dependency = tasks.find((candidate) => candidate.id === dependencyId);
|
|
301
|
+
if (!dependency) {
|
|
302
|
+
throw new Error("task " + task.id + " has unknown dependency: " + dependencyId);
|
|
303
|
+
}
|
|
304
|
+
return {
|
|
305
|
+
id: dependency.id,
|
|
306
|
+
status: dependency.status,
|
|
307
|
+
isComplete: ["approved", "done"].includes(dependency.status),
|
|
308
|
+
};
|
|
309
|
+
});
|
|
310
|
+
const incomplete = dependencies.filter((dependency) => !dependency.isComplete);
|
|
311
|
+
return {
|
|
312
|
+
taskId: task.id,
|
|
313
|
+
isSatisfied: incomplete.length === 0,
|
|
314
|
+
dependencies,
|
|
315
|
+
incomplete,
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
function riskAreaRole(area) {
|
|
319
|
+
return {
|
|
320
|
+
security: "security",
|
|
321
|
+
sre: "sre",
|
|
322
|
+
dba: "dba",
|
|
323
|
+
data: "data_engineer",
|
|
324
|
+
devops: "devops",
|
|
325
|
+
compliance: "compliance_privacy",
|
|
326
|
+
accessibility: "accessibility_reviewer",
|
|
327
|
+
ux: "ux_ui_designer",
|
|
328
|
+
}[area];
|
|
329
|
+
}
|
|
330
|
+
function riskTextRole(risk) {
|
|
331
|
+
const value = risk.toLowerCase();
|
|
332
|
+
if (/security|auth|secret|token/.test(value))
|
|
333
|
+
return "security";
|
|
334
|
+
if (/database|migration|query|schema/.test(value))
|
|
335
|
+
return "dba";
|
|
336
|
+
if (/data pipeline|data contract|analytics|lineage|backfill|etl/.test(value))
|
|
337
|
+
return "data_engineer";
|
|
338
|
+
if (/deploy|pipeline|infra|rollback/.test(value))
|
|
339
|
+
return "devops";
|
|
340
|
+
if (/availability|slo|latency|incident/.test(value))
|
|
341
|
+
return "sre";
|
|
342
|
+
if (/privacy|compliance|pii|retention/.test(value))
|
|
343
|
+
return "compliance_privacy";
|
|
344
|
+
if (/accessibility|screen reader|keyboard|focus|wcag/.test(value))
|
|
345
|
+
return "accessibility_reviewer";
|
|
346
|
+
if (/ux|responsive|mobile/.test(value))
|
|
347
|
+
return "ux_ui_designer";
|
|
348
|
+
return undefined;
|
|
349
|
+
}
|
|
350
|
+
function pathRole(filePath) {
|
|
351
|
+
const normalized = normalizePath(filePath);
|
|
352
|
+
if (/^(web|frontend|client|app)\//.test(normalized) ||
|
|
353
|
+
/\.(css|tsx|jsx)$/.test(normalized)) {
|
|
354
|
+
return "frontend_specialist";
|
|
355
|
+
}
|
|
356
|
+
if (/^(api|backend|server|services?)\//.test(normalized)) {
|
|
357
|
+
return "backend_specialist";
|
|
358
|
+
}
|
|
359
|
+
if (/^(mobile|ios|android)\//.test(normalized)) {
|
|
360
|
+
return "mobile_specialist";
|
|
361
|
+
}
|
|
362
|
+
if (/^(infra|terraform|k8s|\.github)\//.test(normalized) ||
|
|
363
|
+
/docker/.test(normalized)) {
|
|
364
|
+
return "devops";
|
|
365
|
+
}
|
|
366
|
+
if (/^(db|database|migrations)\//.test(normalized) ||
|
|
367
|
+
/\.sql$/.test(normalized)) {
|
|
368
|
+
return "dba";
|
|
369
|
+
}
|
|
370
|
+
if (/^(test|tests|e2e)\//.test(normalized) || /playwright/.test(normalized)) {
|
|
371
|
+
return "sdet";
|
|
372
|
+
}
|
|
373
|
+
if (/^(docs|documentation)\//.test(normalized) || /readme/.test(normalized)) {
|
|
374
|
+
return "technical_writer";
|
|
375
|
+
}
|
|
376
|
+
return undefined;
|
|
377
|
+
}
|
|
378
|
+
function pathsConflict(left, right) {
|
|
379
|
+
const normalizedLeft = normalizePath(left);
|
|
380
|
+
const normalizedRight = normalizePath(right);
|
|
381
|
+
return (normalizedLeft === normalizedRight ||
|
|
382
|
+
normalizedLeft.startsWith(normalizedRight + "/") ||
|
|
383
|
+
normalizedRight.startsWith(normalizedLeft + "/"));
|
|
384
|
+
}
|
|
385
|
+
function normalizePath(value) {
|
|
386
|
+
return value.split(path.sep).join("/").replace(/^\.\//, "");
|
|
387
|
+
}
|
|
388
|
+
function unique(values) {
|
|
389
|
+
return [...new Set(values.filter(Boolean))];
|
|
390
|
+
}
|
|
391
|
+
//# sourceMappingURL=delegation-decision.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegation-decision.js","sourceRoot":"","sources":["../src/delegation-decision.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { acceptDetectedProjectProfile, detectProjectProfile, } from "./project-detection.js";
|
|
2
|
+
export async function detectProfileCommand(options, io) {
|
|
3
|
+
const report = await detectProjectProfile();
|
|
4
|
+
if (options.json) {
|
|
5
|
+
io.log(JSON.stringify(report, null, 2));
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
io.log("Detected project profile signals: " + report.signals.length);
|
|
9
|
+
for (const signal of report.signals) {
|
|
10
|
+
io.log("- " + signal.id + ": " + signal.evidence.join(", "));
|
|
11
|
+
}
|
|
12
|
+
io.log("Recommended roles: " + report.recommendedRoles.join(", "));
|
|
13
|
+
io.log("Recommended skills: " + report.recommendedSkills.join(", "));
|
|
14
|
+
}
|
|
15
|
+
export async function detectAcceptCommand(options, io) {
|
|
16
|
+
const report = await acceptDetectedProjectProfile({
|
|
17
|
+
outputPath: stringOption(options.output) ?? ".agent-workflow/detected-profile.json",
|
|
18
|
+
});
|
|
19
|
+
if (options.json) {
|
|
20
|
+
io.log(JSON.stringify(report, null, 2));
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
io.log("Accepted detected profile with " + report.signals.length + " signal(s)");
|
|
24
|
+
}
|
|
25
|
+
function stringOption(value) {
|
|
26
|
+
return typeof value === "string" ? value : undefined;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=detect-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect-commands.js","sourceRoot":"","sources":["../src/detect-commands.ts"],"names":[],"mappings":"AACA,OAAO,EACL,4BAA4B,EAC5B,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAmB,EACnB,EAAS;IAET,MAAM,MAAM,GAAG,MAAM,oBAAoB,EAAE,CAAC;IAC5C,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,oCAAoC,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACrE,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACpC,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,EAAE,GAAG,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/D,CAAC;IACD,EAAE,CAAC,GAAG,CAAC,qBAAqB,GAAG,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACnE,EAAE,CAAC,GAAG,CAAC,sBAAsB,GAAG,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAmB,EACnB,EAAS;IAET,MAAM,MAAM,GAAG,MAAM,4BAA4B,CAAC;QAChD,UAAU,EACR,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,uCAAuC;KAC1E,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,CACJ,iCAAiC,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,YAAY,CACzE,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CACnB,KAA8C;IAE9C,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export interface CommandRunResult {
|
|
2
|
+
exitCode: number;
|
|
3
|
+
stdout: string;
|
|
4
|
+
stderr: string;
|
|
5
|
+
}
|
|
6
|
+
export interface DiagramCommandRunner {
|
|
7
|
+
run(command: string, args: string[]): Promise<CommandRunResult>;
|
|
8
|
+
}
|
|
9
|
+
export interface DiagramLintResult {
|
|
10
|
+
valid: boolean;
|
|
11
|
+
tool: "mmdc";
|
|
12
|
+
command: string;
|
|
13
|
+
args: string[];
|
|
14
|
+
exitCode: number | null;
|
|
15
|
+
stdout: string;
|
|
16
|
+
stderr: string;
|
|
17
|
+
missingTool: boolean;
|
|
18
|
+
installHint?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface DiagramEvidenceResult {
|
|
21
|
+
artifact: string;
|
|
22
|
+
content: string;
|
|
23
|
+
}
|
|
24
|
+
export type DiagramQuestionDomain = "architecture" | "workflow" | "integration" | "data" | "deployment";
|
|
25
|
+
export declare const diagramTypeDecisionMatrix: Record<DiagramQuestionDomain, string>;
|
|
26
|
+
export declare function recommendDiagramType(domain: DiagramQuestionDomain): string;
|
|
27
|
+
export declare function lintMermaidDiagram({ content, filePath, runner, }: {
|
|
28
|
+
content?: string;
|
|
29
|
+
filePath?: string;
|
|
30
|
+
runner?: DiagramCommandRunner;
|
|
31
|
+
}): Promise<DiagramLintResult>;
|
|
32
|
+
export declare function recordDiagramLintEvidence({ taskId, result, root, }: {
|
|
33
|
+
taskId: string;
|
|
34
|
+
result: DiagramLintResult;
|
|
35
|
+
root?: string;
|
|
36
|
+
}): Promise<DiagramEvidenceResult>;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { mkdtemp, readFile, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { appendEvent, writeArtifact } from "./workspace.js";
|
|
6
|
+
const MERMAID_CLI_INSTALL_HINT = "Install Mermaid CLI with npm install -D @mermaid-js/mermaid-cli or provide mmdc on PATH.";
|
|
7
|
+
export const diagramTypeDecisionMatrix = {
|
|
8
|
+
architecture: "C4/container or component diagram",
|
|
9
|
+
workflow: "flowchart or state diagram",
|
|
10
|
+
integration: "sequence diagram",
|
|
11
|
+
data: "entity relationship diagram",
|
|
12
|
+
deployment: "deployment or infrastructure diagram",
|
|
13
|
+
};
|
|
14
|
+
export function recommendDiagramType(domain) {
|
|
15
|
+
return diagramTypeDecisionMatrix[domain];
|
|
16
|
+
}
|
|
17
|
+
export async function lintMermaidDiagram({ content, filePath, runner = defaultDiagramCommandRunner, }) {
|
|
18
|
+
const tempDir = await mkdtemp(path.join(os.tmpdir(), "orchestra-mermaid-"));
|
|
19
|
+
const inputPath = path.join(tempDir, "diagram.mmd");
|
|
20
|
+
const outputPath = path.join(tempDir, "diagram.svg");
|
|
21
|
+
const diagramContent = content ?? (filePath ? await readFile(filePath, "utf8") : "");
|
|
22
|
+
if (diagramContent.trim() === "") {
|
|
23
|
+
throw new Error("diagram content is required");
|
|
24
|
+
}
|
|
25
|
+
await writeFile(inputPath, diagramContent, "utf8");
|
|
26
|
+
const args = ["-i", inputPath, "-o", outputPath];
|
|
27
|
+
try {
|
|
28
|
+
const result = await runner.run("mmdc", args);
|
|
29
|
+
return {
|
|
30
|
+
valid: result.exitCode === 0,
|
|
31
|
+
tool: "mmdc",
|
|
32
|
+
command: "mmdc",
|
|
33
|
+
args,
|
|
34
|
+
exitCode: result.exitCode,
|
|
35
|
+
stdout: result.stdout,
|
|
36
|
+
stderr: result.stderr,
|
|
37
|
+
missingTool: false,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
if (isMissingToolError(error)) {
|
|
42
|
+
return {
|
|
43
|
+
valid: false,
|
|
44
|
+
tool: "mmdc",
|
|
45
|
+
command: "mmdc",
|
|
46
|
+
args,
|
|
47
|
+
exitCode: null,
|
|
48
|
+
stdout: "",
|
|
49
|
+
stderr: String(error.message || error),
|
|
50
|
+
missingTool: true,
|
|
51
|
+
installHint: MERMAID_CLI_INSTALL_HINT,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
await rm(tempDir, { recursive: true, force: true });
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export async function recordDiagramLintEvidence({ taskId, result, root = process.cwd(), }) {
|
|
61
|
+
const fileName = `${taskId}-${Date.now()}-diagram-lint.md`;
|
|
62
|
+
const content = [
|
|
63
|
+
`# Mermaid Diagram Lint Evidence ${taskId}`,
|
|
64
|
+
"",
|
|
65
|
+
`- Tool: ${result.tool}`,
|
|
66
|
+
`- Command: ${result.command} ${result.args.join(" ")}`,
|
|
67
|
+
`- Exit code: ${result.exitCode ?? "missing-tool"}`,
|
|
68
|
+
`- Valid: ${result.valid}`,
|
|
69
|
+
`- Missing tool: ${result.missingTool}`,
|
|
70
|
+
result.installHint ? `- Install hint: ${result.installHint}` : "",
|
|
71
|
+
"",
|
|
72
|
+
"## stderr",
|
|
73
|
+
"",
|
|
74
|
+
result.stderr || "not applicable",
|
|
75
|
+
"",
|
|
76
|
+
]
|
|
77
|
+
.filter((line) => line !== "")
|
|
78
|
+
.join("\n");
|
|
79
|
+
const artifact = await writeArtifact(root, "evidence", fileName, content);
|
|
80
|
+
await appendEvent(root, {
|
|
81
|
+
type: "EVIDENCE_ADDED",
|
|
82
|
+
taskId,
|
|
83
|
+
actor: "architect",
|
|
84
|
+
summary: result.valid
|
|
85
|
+
? "Mermaid diagram lint passed"
|
|
86
|
+
: "Mermaid diagram lint did not pass",
|
|
87
|
+
artifacts: [artifact],
|
|
88
|
+
metadata: {
|
|
89
|
+
type: "diagram-lint",
|
|
90
|
+
exitCode: result.exitCode,
|
|
91
|
+
missingTool: result.missingTool,
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
return { artifact, content };
|
|
95
|
+
}
|
|
96
|
+
const defaultDiagramCommandRunner = {
|
|
97
|
+
run(command, args) {
|
|
98
|
+
return new Promise((resolve, reject) => {
|
|
99
|
+
execFile(command, args, (error, stdout, stderr) => {
|
|
100
|
+
if (error?.code === "ENOENT") {
|
|
101
|
+
reject(error);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const errorCode = error?.code;
|
|
105
|
+
const exitCode = typeof errorCode === "number" ? errorCode : 0;
|
|
106
|
+
resolve({
|
|
107
|
+
exitCode,
|
|
108
|
+
stdout: String(stdout),
|
|
109
|
+
stderr: String(stderr),
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
function isMissingToolError(error) {
|
|
116
|
+
return error?.code === "ENOENT";
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=diagram-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagram-validation.js","sourceRoot":"","sources":["../src/diagram-validation.ts"],"names":[],"mappings":"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"}
|
package/dist/fs-utils.d.ts
CHANGED
|
@@ -4,5 +4,7 @@ export declare function readJson<T>(filePath: string, fallback: T): Promise<T>;
|
|
|
4
4
|
export declare function writeJson(filePath: string, value: unknown, { overwrite }?: {
|
|
5
5
|
overwrite?: boolean | undefined;
|
|
6
6
|
}): Promise<void>;
|
|
7
|
+
export declare function updateJsonFile<T>(filePath: string, fallback: T, update: (current: T) => T | Promise<T>): Promise<T>;
|
|
7
8
|
export declare function appendJsonLine(filePath: string, value: unknown): Promise<void>;
|
|
8
9
|
export declare function resolveWorkflowPath(root: string, ...segments: string[]): string;
|
|
10
|
+
export declare function resolveWorkspaceWritePath(root: string, relativePath: string): string;
|