@orchestrator-claude/definitions 3.32.2 → 3.34.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/README.md +145 -0
- package/agents/adversarial-reviewer.md +2 -2
- package/agents/azure-devops-engineer.md +9 -1
- package/agents/cicd-platform-engineer.md +477 -0
- package/agents/debug-sidecar.md +6 -1
- package/agents/doc-sidecar.md +6 -1
- package/agents/frontend-engineer.md +173 -0
- package/agents/implementer.md +39 -23
- package/agents/methodology-researcher.md +2 -1
- package/agents/operational-artifact-builder.md +2 -1
- package/agents/orchestrator.md +47 -76
- package/agents/planner.md +2 -2
- package/agents/presentation-engineer.md +1 -1
- package/agents/python-data-engineer.md +214 -0
- package/agents/reviewer.md +16 -8
- package/agents/specifier.md +1 -1
- package/agents/task-generator.md +1 -1
- package/agents/test-sidecar.md +15 -4
- package/dist/cli.js +78 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/DiffCommand.js +1 -1
- package/dist/commands/DiffCommand.js.map +1 -1
- package/dist/commands/InstallCommand.d.ts +41 -0
- package/dist/commands/InstallCommand.d.ts.map +1 -0
- package/dist/commands/InstallCommand.js +253 -0
- package/dist/commands/InstallCommand.js.map +1 -0
- package/dist/http/ApiClient.d.ts +5 -0
- package/dist/http/ApiClient.d.ts.map +1 -1
- package/dist/http/ApiClient.js.map +1 -1
- package/dist/install/DevCheckoutDetector.d.ts +66 -0
- package/dist/install/DevCheckoutDetector.d.ts.map +1 -0
- package/dist/install/DevCheckoutDetector.js +150 -0
- package/dist/install/DevCheckoutDetector.js.map +1 -0
- package/dist/install/HooksWirer.d.ts +29 -0
- package/dist/install/HooksWirer.d.ts.map +1 -0
- package/dist/install/HooksWirer.js +80 -0
- package/dist/install/HooksWirer.js.map +1 -0
- package/dist/install/LocalDiffReporter.d.ts +25 -0
- package/dist/install/LocalDiffReporter.d.ts.map +1 -0
- package/dist/install/LocalDiffReporter.js +50 -0
- package/dist/install/LocalDiffReporter.js.map +1 -0
- package/dist/install/Materializer.d.ts +67 -0
- package/dist/install/Materializer.d.ts.map +1 -0
- package/dist/install/Materializer.js +196 -0
- package/dist/install/Materializer.js.map +1 -0
- package/dist/install/McpRegistrar.d.ts +63 -0
- package/dist/install/McpRegistrar.d.ts.map +1 -0
- package/dist/install/McpRegistrar.js +114 -0
- package/dist/install/McpRegistrar.js.map +1 -0
- package/dist/install/ProcessRunner.d.ts +25 -0
- package/dist/install/ProcessRunner.d.ts.map +1 -0
- package/dist/install/ProcessRunner.js +41 -0
- package/dist/install/ProcessRunner.js.map +1 -0
- package/dist/install/ProjectSettingsNeutralizer.d.ts +39 -0
- package/dist/install/ProjectSettingsNeutralizer.d.ts.map +1 -0
- package/dist/install/ProjectSettingsNeutralizer.js +100 -0
- package/dist/install/ProjectSettingsNeutralizer.js.map +1 -0
- package/dist/install/types.d.ts +52 -0
- package/dist/install/types.d.ts.map +1 -0
- package/dist/install/types.js +8 -0
- package/dist/install/types.js.map +1 -0
- package/dist/manifest/ManifestLoader.d.ts.map +1 -1
- package/dist/manifest/ManifestLoader.js +3 -2
- package/dist/manifest/ManifestLoader.js.map +1 -1
- package/dist/manifest/types.d.ts +3 -0
- package/dist/manifest/types.d.ts.map +1 -1
- package/dist/scripts/bundle-hooks.d.ts +39 -0
- package/dist/scripts/bundle-hooks.d.ts.map +1 -0
- package/dist/scripts/bundle-hooks.js +165 -0
- package/dist/scripts/bundle-hooks.js.map +1 -0
- package/dist/scripts/generate-manifest.d.ts +22 -3
- package/dist/scripts/generate-manifest.d.ts.map +1 -1
- package/dist/scripts/generate-manifest.js +78 -35
- package/dist/scripts/generate-manifest.js.map +1 -1
- package/hooks/dangling-guard.mjs +7426 -0
- package/hooks/dangling-guard.ts +223 -6
- package/hooks/gate-guardian.mjs +463 -0
- package/hooks/hooks.json +63 -0
- package/hooks/lib/additional-directories-sync.ts +295 -0
- package/hooks/lib/api-client.ts +388 -7
- package/hooks/lib/session-selection.ts +81 -0
- package/hooks/mailbox-listener.mjs +259 -0
- package/hooks/post-compact.mjs +7931 -0
- package/hooks/post-implement.mjs +238 -0
- package/hooks/session-start.mjs +8234 -0
- package/hooks/session-start.ts +264 -23
- package/hooks/sprint-registry.mjs +59 -0
- package/hooks/subagent-start.mjs +289 -0
- package/hooks/subagent-stop.mjs +7793 -0
- package/hooks/subagent-stop.ts +4 -2
- package/hooks/user-prompt.mjs +329 -0
- package/hooks/workflow-guard.mjs +7805 -0
- package/hooks/workflow-guard.ts +360 -119
- package/hooks-settings-template.json +63 -0
- package/manifest.json +124 -90
- package/mcp-servers.json +48 -0
- package/package.json +10 -4
- package/personas/auditor-compliance.md +104 -0
- package/personas/cfo-conservador.md +88 -0
- package/personas/designer-perfeccionista.md +104 -0
- package/personas/diretor-cetico-fmcg.md +80 -0
- package/personas/engenheiro-cetico-construcao.md +107 -0
- package/skills/artifact-generator/SKILL.md +1 -1
- package/skills/artifact-production/SKILL.md +28 -0
- package/skills/backlog-synthesis/SKILL.md +8 -3
- package/skills/checkpoint-protocol/SKILL.md +7 -0
- package/skills/infographic-engine/SKILL.md +116 -0
- package/skills/orchestrator/SKILL.md +93 -7
- package/skills/persona-library/SKILL.md +1 -1
- package/skills/project-conventions/SKILL.md +53 -30
- package/skills/project-management-enterprise/SKILL.md +1 -1
- package/skills/python-data-engineering/SKILL.md +792 -0
- package/skills/release/SKILL.md +29 -18
- package/skills/release/release.sh +65 -4
- package/skills/storybook-validated-loop/SKILL.md +110 -0
- package/skills/tdd-discipline/SKILL.md +16 -0
- package/skills/workflow-coordination/SKILL.md +117 -16
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { createRequire as __createRequireShim } from 'node:module'; const require = __createRequireShim(import.meta.url);
|
|
2
|
+
|
|
3
|
+
// hooks/mailbox-listener.ts
|
|
4
|
+
import {
|
|
5
|
+
readdirSync as readdirSync2,
|
|
6
|
+
readFileSync as readFileSync2,
|
|
7
|
+
unlinkSync as unlinkSync2,
|
|
8
|
+
renameSync,
|
|
9
|
+
existsSync,
|
|
10
|
+
mkdirSync as mkdirSync2,
|
|
11
|
+
writeFileSync as writeFileSync2
|
|
12
|
+
} from "node:fs";
|
|
13
|
+
import { join as join2 } from "node:path";
|
|
14
|
+
import { randomUUID } from "node:crypto";
|
|
15
|
+
|
|
16
|
+
// hooks/lib/api-client.ts
|
|
17
|
+
import { readFileSync, writeFileSync, mkdirSync, statSync, unlinkSync, readdirSync } from "node:fs";
|
|
18
|
+
import { join, dirname } from "node:path";
|
|
19
|
+
import { fileURLToPath } from "node:url";
|
|
20
|
+
var __filename = fileURLToPath(import.meta.url);
|
|
21
|
+
var __dirname = dirname(__filename);
|
|
22
|
+
var PROJECT_ROOT = join(__dirname, "..", "..", "..");
|
|
23
|
+
var STATE_DIR = join(PROJECT_ROOT, ".orchestrator", ".state");
|
|
24
|
+
var JWT_CACHE = join(STATE_DIR, "jwt-token");
|
|
25
|
+
var DEBUG_LOG = join(STATE_DIR, "hook-debug.log");
|
|
26
|
+
mkdirSync(STATE_DIR, { recursive: true });
|
|
27
|
+
var API_URL = process.env.ORCHESTRATOR_API_URL || "http://localhost:3001";
|
|
28
|
+
var AUTH_EMAIL = process.env.ORCHESTRATOR_ADMIN_EMAIL || process.env.ORCHESTRATOR_AUTH_EMAIL || "system@orchestrator.local";
|
|
29
|
+
var AUTH_PASSWORD = process.env.ORCHESTRATOR_ADMIN_PASSWORD || process.env.ORCHESTRATOR_AUTH_PASSWORD || "system123";
|
|
30
|
+
var PROJECT_ID = process.env.ORCHESTRATOR_PROJECT_ID || "";
|
|
31
|
+
function log(prefix, msg) {
|
|
32
|
+
const ts = (/* @__PURE__ */ new Date()).toISOString().replace(/\.\d+Z$/, "Z");
|
|
33
|
+
try {
|
|
34
|
+
const line = `[${ts}] ${prefix}: ${msg}
|
|
35
|
+
`;
|
|
36
|
+
writeFileSync(DEBUG_LOG, line, { flag: "a" });
|
|
37
|
+
} catch {
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
var LAST_COMPLETED_FILE = join(STATE_DIR, "last-completed-workflow.json");
|
|
41
|
+
var LAST_COMPLETED_TTL_MS = 60 * 60 * 1e3;
|
|
42
|
+
var INVOCATIONS_DIR = join(STATE_DIR, "invocations");
|
|
43
|
+
var INVOCATION_STATE_TTL_MS = 4 * 60 * 60 * 1e3;
|
|
44
|
+
var DISPATCH_INTENT_DIR = join(STATE_DIR, "dispatch-intent");
|
|
45
|
+
function outputContext(hookEvent, context) {
|
|
46
|
+
console.log(
|
|
47
|
+
JSON.stringify({
|
|
48
|
+
hookSpecificOutput: {
|
|
49
|
+
hookEventName: hookEvent,
|
|
50
|
+
additionalContext: context
|
|
51
|
+
}
|
|
52
|
+
})
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// hooks/mailbox-listener.ts
|
|
57
|
+
var HOOK = "MAILBOX-LISTENER";
|
|
58
|
+
async function readStdinPayload() {
|
|
59
|
+
const chunks = [];
|
|
60
|
+
for await (const chunk of process.stdin) {
|
|
61
|
+
chunks.push(chunk);
|
|
62
|
+
}
|
|
63
|
+
const raw = Buffer.concat(chunks).toString("utf-8").trim();
|
|
64
|
+
if (!raw) return {};
|
|
65
|
+
try {
|
|
66
|
+
return JSON.parse(raw);
|
|
67
|
+
} catch {
|
|
68
|
+
return {};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function consumeInbox(inboxPath, quarantinePath, paneRole) {
|
|
72
|
+
let files;
|
|
73
|
+
try {
|
|
74
|
+
files = readdirSync2(inboxPath).filter((f) => f.endsWith(".json") && !f.startsWith(".tmp-")).sort();
|
|
75
|
+
} catch {
|
|
76
|
+
return { consumed: [], errors: [] };
|
|
77
|
+
}
|
|
78
|
+
if (files.length === 0) {
|
|
79
|
+
return { consumed: [], errors: [] };
|
|
80
|
+
}
|
|
81
|
+
log(HOOK, `${files.length} message(s) in ${paneRole} inbox`);
|
|
82
|
+
const consumed = [];
|
|
83
|
+
const errors = [];
|
|
84
|
+
for (const file of files) {
|
|
85
|
+
const filePath = join2(inboxPath, file);
|
|
86
|
+
try {
|
|
87
|
+
const raw = readFileSync2(filePath, "utf-8");
|
|
88
|
+
const parsed = JSON.parse(raw);
|
|
89
|
+
if (!parsed.id || !parsed.from || !parsed.to || !parsed.body?.type) {
|
|
90
|
+
throw new Error(`Invalid envelope: missing required fields`);
|
|
91
|
+
}
|
|
92
|
+
unlinkSync2(filePath);
|
|
93
|
+
consumed.push(parsed);
|
|
94
|
+
log(
|
|
95
|
+
HOOK,
|
|
96
|
+
`Consumed: ${parsed.id} (${parsed.body.type} from ${parsed.from.role}-${parsed.from.index})`
|
|
97
|
+
);
|
|
98
|
+
} catch (err) {
|
|
99
|
+
const errMsg = err instanceof Error ? err.message : String(err);
|
|
100
|
+
errors.push(`${file}: ${errMsg}`);
|
|
101
|
+
log(HOOK, `Quarantine: ${file} \u2014 ${errMsg}`);
|
|
102
|
+
try {
|
|
103
|
+
mkdirSync2(quarantinePath, { recursive: true });
|
|
104
|
+
renameSync(filePath, join2(quarantinePath, file));
|
|
105
|
+
} catch {
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return { consumed, errors };
|
|
110
|
+
}
|
|
111
|
+
function buildContext(consumed, errors, paneRole) {
|
|
112
|
+
if (consumed.length === 0 && errors.length === 0) {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
const parts = [`[MAILBOX] ${consumed.length} new message(s) for ${paneRole}:`];
|
|
116
|
+
for (const msg of consumed) {
|
|
117
|
+
const from = `${msg.from.role}-${msg.from.index}`;
|
|
118
|
+
parts.push("");
|
|
119
|
+
parts.push(`--- Message from ${from} (${msg.body.type}) ---`);
|
|
120
|
+
switch (msg.body.type) {
|
|
121
|
+
case "task_assignment":
|
|
122
|
+
parts.push(`Task: ${msg.body.taskId}`);
|
|
123
|
+
parts.push(`Title: ${msg.body.title}`);
|
|
124
|
+
if (msg.body.description) parts.push(`Description: ${msg.body.description}`);
|
|
125
|
+
if (msg.body.acceptanceCriteria?.length) {
|
|
126
|
+
parts.push(`Acceptance Criteria:`);
|
|
127
|
+
for (const ac of msg.body.acceptanceCriteria) {
|
|
128
|
+
parts.push(` - ${ac}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
break;
|
|
132
|
+
case "task_complete":
|
|
133
|
+
parts.push(`Task: ${msg.body.taskId}`);
|
|
134
|
+
parts.push(`Summary: ${msg.body.summary}`);
|
|
135
|
+
break;
|
|
136
|
+
case "status_update":
|
|
137
|
+
parts.push(`Task: ${msg.body.taskId}`);
|
|
138
|
+
parts.push(`Progress: ${msg.body.progress}%`);
|
|
139
|
+
parts.push(`Status: ${msg.body.message}`);
|
|
140
|
+
break;
|
|
141
|
+
case "error_report":
|
|
142
|
+
parts.push(`Error: ${msg.body.errorCode}`);
|
|
143
|
+
parts.push(`Message: ${msg.body.message}`);
|
|
144
|
+
if (msg.body.taskId) parts.push(`Task: ${msg.body.taskId}`);
|
|
145
|
+
break;
|
|
146
|
+
case "ping":
|
|
147
|
+
parts.push(`Ping received \u2014 respond with pong if appropriate.`);
|
|
148
|
+
break;
|
|
149
|
+
case "pong":
|
|
150
|
+
parts.push(`Pong received \u2014 heartbeat confirmed.`);
|
|
151
|
+
break;
|
|
152
|
+
default:
|
|
153
|
+
parts.push(`Type: ${msg.body.type}`);
|
|
154
|
+
parts.push(`Raw: ${JSON.stringify(msg.body)}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
if (errors.length > 0) {
|
|
158
|
+
parts.push("");
|
|
159
|
+
parts.push(`[MAILBOX-WARN] ${errors.length} malformed message(s) quarantined:`);
|
|
160
|
+
for (const e of errors) {
|
|
161
|
+
parts.push(` - ${e}`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return parts.join("\n");
|
|
165
|
+
}
|
|
166
|
+
var SIDECAR_ROLE_ALLOWLIST = /* @__PURE__ */ new Set([
|
|
167
|
+
"debug-sidecar",
|
|
168
|
+
"test-sidecar",
|
|
169
|
+
"doc-sidecar"
|
|
170
|
+
]);
|
|
171
|
+
function enumerateSidecarAddresses(sprintId, deps = { readdirSync: readdirSync2, writeFileSync: writeFileSync2 }) {
|
|
172
|
+
const registryDir = `/tmp/${sprintId}/registry`;
|
|
173
|
+
let files;
|
|
174
|
+
try {
|
|
175
|
+
files = deps.readdirSync(registryDir);
|
|
176
|
+
} catch {
|
|
177
|
+
return [];
|
|
178
|
+
}
|
|
179
|
+
const results = [];
|
|
180
|
+
for (const filename of files) {
|
|
181
|
+
if (!filename.endsWith(".json")) continue;
|
|
182
|
+
const base = filename.slice(0, -5);
|
|
183
|
+
if (!base.includes("sidecar")) continue;
|
|
184
|
+
const lastDash = base.lastIndexOf("-");
|
|
185
|
+
if (lastDash === -1) continue;
|
|
186
|
+
const indexStr = base.slice(lastDash + 1);
|
|
187
|
+
const index = parseInt(indexStr, 10);
|
|
188
|
+
if (isNaN(index)) continue;
|
|
189
|
+
const role = base.slice(0, lastDash);
|
|
190
|
+
if (!SIDECAR_ROLE_ALLOWLIST.has(role)) continue;
|
|
191
|
+
results.push({ role, index });
|
|
192
|
+
}
|
|
193
|
+
return results;
|
|
194
|
+
}
|
|
195
|
+
function relaySidecarMessages(consumed, sprintId, paneRole, deps = { readdirSync: readdirSync2, writeFileSync: writeFileSync2 }) {
|
|
196
|
+
const roleComponent = paneRole.slice(0, paneRole.lastIndexOf("-"));
|
|
197
|
+
if (roleComponent !== "orchestrator") return;
|
|
198
|
+
const taskCompletes = consumed.filter((m) => m.body.type === "task_complete");
|
|
199
|
+
if (taskCompletes.length === 0) return;
|
|
200
|
+
const sidecars = enumerateSidecarAddresses(sprintId, deps);
|
|
201
|
+
if (sidecars.length === 0) return;
|
|
202
|
+
for (const msg of taskCompletes) {
|
|
203
|
+
for (const sidecar of sidecars) {
|
|
204
|
+
try {
|
|
205
|
+
const envelope = {
|
|
206
|
+
id: randomUUID(),
|
|
207
|
+
from: { role: "orchestrator", index: 0 },
|
|
208
|
+
to: { role: sidecar.role, index: sidecar.index },
|
|
209
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
210
|
+
body: msg.body
|
|
211
|
+
};
|
|
212
|
+
const sidecarAddr = `${sidecar.role}-${String(sidecar.index)}`;
|
|
213
|
+
const targetInbox = `/tmp/${sprintId}/mailbox/${sidecarAddr}/inbox`;
|
|
214
|
+
const targetPath = join2(targetInbox, `${envelope.id}.json`);
|
|
215
|
+
deps.writeFileSync(targetPath, JSON.stringify(envelope), "utf-8");
|
|
216
|
+
log(HOOK, `Relayed task_complete to ${sidecarAddr}: ${envelope.id}`);
|
|
217
|
+
} catch (err) {
|
|
218
|
+
const errMsg = err instanceof Error ? err.message : String(err);
|
|
219
|
+
log(HOOK, `Relay failed for ${sidecar.role}-${String(sidecar.index)}: ${errMsg}`);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
async function main() {
|
|
225
|
+
const sprintId = process.env.SPRINT_ID;
|
|
226
|
+
const paneRole = process.env.PANE_ROLE;
|
|
227
|
+
if (!sprintId || !paneRole) {
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
const inboxPath = `/tmp/${sprintId}/mailbox/${paneRole}/inbox`;
|
|
231
|
+
const quarantinePath = `/tmp/${sprintId}/mailbox/${paneRole}/quarantine`;
|
|
232
|
+
if (!existsSync(inboxPath)) {
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
let hookEventName;
|
|
236
|
+
if (!process.stdin.isTTY) {
|
|
237
|
+
try {
|
|
238
|
+
const payload = await readStdinPayload();
|
|
239
|
+
hookEventName = payload.hook_event_name;
|
|
240
|
+
} catch {
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
const { consumed, errors } = consumeInbox(inboxPath, quarantinePath, paneRole);
|
|
244
|
+
if (consumed.length === 0 && errors.length === 0) {
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
relaySidecarMessages(consumed, sprintId, paneRole);
|
|
248
|
+
const context = buildContext(consumed, errors, paneRole);
|
|
249
|
+
if (!context) {
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
const effectiveEvent = hookEventName === "SessionStart" ? "SessionStart" : "PostToolUse";
|
|
253
|
+
outputContext(effectiveEvent, context);
|
|
254
|
+
}
|
|
255
|
+
void main();
|
|
256
|
+
export {
|
|
257
|
+
enumerateSidecarAddresses,
|
|
258
|
+
relaySidecarMessages
|
|
259
|
+
};
|