@orchestrator-claude/cli 1.4.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 +74 -0
- package/dist/api-client/OrchestratorAPIClient.d.ts +111 -0
- package/dist/api-client/OrchestratorAPIClient.d.ts.map +1 -0
- package/dist/api-client/OrchestratorAPIClient.js +176 -0
- package/dist/api-client/OrchestratorAPIClient.js.map +1 -0
- package/dist/api-client/index.d.ts +11 -0
- package/dist/api-client/index.d.ts.map +1 -0
- package/dist/api-client/index.js +10 -0
- package/dist/api-client/index.js.map +1 -0
- package/dist/api-client/retry.d.ts +29 -0
- package/dist/api-client/retry.d.ts.map +1 -0
- package/dist/api-client/retry.js +85 -0
- package/dist/api-client/retry.js.map +1 -0
- package/dist/api-client/types.d.ts +148 -0
- package/dist/api-client/types.d.ts.map +1 -0
- package/dist/api-client/types.js +10 -0
- package/dist/api-client/types.js.map +1 -0
- package/dist/commands/AgentsCommand.d.ts +74 -0
- package/dist/commands/AgentsCommand.d.ts.map +1 -0
- package/dist/commands/AgentsCommand.js +170 -0
- package/dist/commands/AgentsCommand.js.map +1 -0
- package/dist/commands/InitCommand.d.ts +63 -0
- package/dist/commands/InitCommand.d.ts.map +1 -0
- package/dist/commands/InitCommand.js +150 -0
- package/dist/commands/InitCommand.js.map +1 -0
- package/dist/commands/MigrateCommand.d.ts +93 -0
- package/dist/commands/MigrateCommand.d.ts.map +1 -0
- package/dist/commands/MigrateCommand.js +260 -0
- package/dist/commands/MigrateCommand.js.map +1 -0
- package/dist/commands/StatusCommand.d.ts +61 -0
- package/dist/commands/StatusCommand.d.ts.map +1 -0
- package/dist/commands/StatusCommand.js +142 -0
- package/dist/commands/StatusCommand.js.map +1 -0
- package/dist/commands/TemplatesCommand.d.ts +69 -0
- package/dist/commands/TemplatesCommand.d.ts.map +1 -0
- package/dist/commands/TemplatesCommand.js +147 -0
- package/dist/commands/TemplatesCommand.js.map +1 -0
- package/dist/commands/WorkflowCommand.d.ts +82 -0
- package/dist/commands/WorkflowCommand.d.ts.map +1 -0
- package/dist/commands/WorkflowCommand.js +203 -0
- package/dist/commands/WorkflowCommand.js.map +1 -0
- package/dist/config/CLIConfig.d.ts +66 -0
- package/dist/config/CLIConfig.d.ts.map +1 -0
- package/dist/config/CLIConfig.js +60 -0
- package/dist/config/CLIConfig.js.map +1 -0
- package/dist/formatters/OutputFormatter.d.ts +102 -0
- package/dist/formatters/OutputFormatter.d.ts.map +1 -0
- package/dist/formatters/OutputFormatter.js +182 -0
- package/dist/formatters/OutputFormatter.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +249 -0
- package/dist/index.js.map +1 -0
- package/dist/templates/.gitkeep +0 -0
- package/dist/templates/TemplateEngine.d.ts +90 -0
- package/dist/templates/TemplateEngine.d.ts.map +1 -0
- package/dist/templates/TemplateEngine.js +149 -0
- package/dist/templates/TemplateEngine.js.map +1 -0
- package/dist/templates/base/CLAUDE.md.hbs +362 -0
- package/dist/templates/base/claude/agents/implementer.md +446 -0
- package/dist/templates/base/claude/agents/orchestrator.md +155 -0
- package/dist/templates/base/claude/agents/planner.md +348 -0
- package/dist/templates/base/claude/agents/researcher.md +390 -0
- package/dist/templates/base/claude/agents/reviewer.md +444 -0
- package/dist/templates/base/claude/agents/specifier.md +331 -0
- package/dist/templates/base/claude/agents/task-generator.md +382 -0
- package/dist/templates/base/claude/hooks/post-artifact-generate.sh +39 -0
- package/dist/templates/base/claude/hooks/post-implement-validate.sh +139 -0
- package/dist/templates/base/claude/hooks/post-phase-checkpoint.sh +322 -0
- package/dist/templates/base/claude/hooks/pre-agent-invoke.sh +34 -0
- package/dist/templates/base/claude/hooks/pre-phase-advance.sh +40 -0
- package/dist/templates/base/claude/hooks/track-agent-invocation.sh +230 -0
- package/dist/templates/base/claude/orchestrator-config.json +141 -0
- package/dist/templates/base/claude/settings.json +80 -0
- package/dist/templates/base/claude/skills/artifact-validator/SKILL.md +226 -0
- package/dist/templates/base/claude/skills/docs-guardian/SKILL.md +230 -0
- package/dist/templates/base/claude/skills/kb-lookup/SKILL.md +257 -0
- package/dist/templates/base/claude/skills/phase-gate-evaluator/SKILL.md +274 -0
- package/dist/templates/base/claude/skills/workflow-status/SKILL.md +322 -0
- package/dist/templates/base/docker-compose.yml.hbs +20 -0
- package/dist/templates/base/mcp.json.hbs +37 -0
- package/dist/templates/base/orchestrator/.state/.gitkeep +0 -0
- package/dist/templates/base/orchestrator-index.json.hbs +37 -0
- package/dist/templates/base/package.json.hbs +40 -0
- package/dist/templates/default/.orchestrator/orchestrator-index.json +19 -0
- package/dist/templates/default/README.md +58 -0
- package/dist/templates/default/docker-compose.yml +24 -0
- package/dist/templates/default/template.json +10 -0
- package/dist/templates/projects/api/files/index.ts.hbs +30 -0
- package/dist/templates/projects/api/files/server.ts.hbs +63 -0
- package/dist/templates/projects/api/files/tsconfig.json.hbs +27 -0
- package/dist/templates/projects/api/files/vitest.config.ts.hbs +28 -0
- package/dist/templates/projects/api/template.config.json +238 -0
- package/dist/templates/projects/api/template.config.ts +149 -0
- package/dist/templates/projects/cli/files/cli.ts.hbs +50 -0
- package/dist/templates/projects/cli/files/index.ts.hbs +8 -0
- package/dist/templates/projects/cli/files/tsconfig.json.hbs +27 -0
- package/dist/templates/projects/cli/files/vitest.config.ts.hbs +28 -0
- package/dist/templates/projects/cli/template.config.json +213 -0
- package/dist/templates/projects/cli/template.config.ts +126 -0
- package/dist/templates/projects/frontend/files/App.tsx.hbs +31 -0
- package/dist/templates/projects/frontend/files/index.html.hbs +13 -0
- package/dist/templates/projects/frontend/files/main.tsx.hbs +22 -0
- package/dist/templates/projects/frontend/files/tsconfig.json.hbs +34 -0
- package/dist/templates/projects/frontend/files/tsconfig.node.json.hbs +10 -0
- package/dist/templates/projects/frontend/files/vite.config.ts.hbs +19 -0
- package/dist/templates/projects/frontend/files/vitest.config.ts.hbs +36 -0
- package/dist/templates/projects/frontend/template.config.json +241 -0
- package/dist/templates/projects/frontend/template.config.ts +153 -0
- package/dist/templates/projects/minimal/files/claude-settings.json.hbs +20 -0
- package/dist/templates/projects/minimal/files/env.example.hbs +17 -0
- package/dist/templates/projects/minimal/files/gitignore.hbs +41 -0
- package/dist/templates/projects/minimal/files/index.ts.hbs +13 -0
- package/dist/templates/projects/minimal/files/tsconfig.json.hbs +27 -0
- package/dist/templates/projects/minimal/template.config.json +185 -0
- package/dist/templates/projects/minimal/template.config.ts +88 -0
- package/package.json +37 -0
- package/templates/.gitkeep +0 -0
- package/templates/base/CLAUDE.md.hbs +362 -0
- package/templates/base/claude/agents/implementer.md +446 -0
- package/templates/base/claude/agents/orchestrator.md +155 -0
- package/templates/base/claude/agents/planner.md +348 -0
- package/templates/base/claude/agents/researcher.md +390 -0
- package/templates/base/claude/agents/reviewer.md +444 -0
- package/templates/base/claude/agents/specifier.md +331 -0
- package/templates/base/claude/agents/task-generator.md +382 -0
- package/templates/base/claude/hooks/post-artifact-generate.sh +39 -0
- package/templates/base/claude/hooks/post-implement-validate.sh +139 -0
- package/templates/base/claude/hooks/post-phase-checkpoint.sh +322 -0
- package/templates/base/claude/hooks/pre-agent-invoke.sh +34 -0
- package/templates/base/claude/hooks/pre-phase-advance.sh +40 -0
- package/templates/base/claude/hooks/track-agent-invocation.sh +230 -0
- package/templates/base/claude/orchestrator-config.json +141 -0
- package/templates/base/claude/settings.json +80 -0
- package/templates/base/claude/skills/artifact-validator/SKILL.md +226 -0
- package/templates/base/claude/skills/docs-guardian/SKILL.md +230 -0
- package/templates/base/claude/skills/kb-lookup/SKILL.md +257 -0
- package/templates/base/claude/skills/phase-gate-evaluator/SKILL.md +274 -0
- package/templates/base/claude/skills/workflow-status/SKILL.md +322 -0
- package/templates/base/docker-compose.yml.hbs +20 -0
- package/templates/base/mcp.json.hbs +37 -0
- package/templates/base/orchestrator/.state/.gitkeep +0 -0
- package/templates/base/orchestrator-index.json.hbs +37 -0
- package/templates/base/package.json.hbs +40 -0
- package/templates/default/.orchestrator/orchestrator-index.json +19 -0
- package/templates/default/README.md +58 -0
- package/templates/default/docker-compose.yml +24 -0
- package/templates/default/template.json +10 -0
- package/templates/projects/api/files/index.ts.hbs +30 -0
- package/templates/projects/api/files/server.ts.hbs +63 -0
- package/templates/projects/api/files/tsconfig.json.hbs +27 -0
- package/templates/projects/api/files/vitest.config.ts.hbs +28 -0
- package/templates/projects/api/template.config.json +238 -0
- package/templates/projects/api/template.config.ts +149 -0
- package/templates/projects/cli/files/cli.ts.hbs +50 -0
- package/templates/projects/cli/files/index.ts.hbs +8 -0
- package/templates/projects/cli/files/tsconfig.json.hbs +27 -0
- package/templates/projects/cli/files/vitest.config.ts.hbs +28 -0
- package/templates/projects/cli/template.config.json +213 -0
- package/templates/projects/cli/template.config.ts +126 -0
- package/templates/projects/frontend/files/App.tsx.hbs +31 -0
- package/templates/projects/frontend/files/index.html.hbs +13 -0
- package/templates/projects/frontend/files/main.tsx.hbs +22 -0
- package/templates/projects/frontend/files/tsconfig.json.hbs +34 -0
- package/templates/projects/frontend/files/tsconfig.node.json.hbs +10 -0
- package/templates/projects/frontend/files/vite.config.ts.hbs +19 -0
- package/templates/projects/frontend/files/vitest.config.ts.hbs +36 -0
- package/templates/projects/frontend/template.config.json +241 -0
- package/templates/projects/frontend/template.config.ts +153 -0
- package/templates/projects/minimal/files/claude-settings.json.hbs +20 -0
- package/templates/projects/minimal/files/env.example.hbs +17 -0
- package/templates/projects/minimal/files/gitignore.hbs +41 -0
- package/templates/projects/minimal/files/index.ts.hbs +13 -0
- package/templates/projects/minimal/files/tsconfig.json.hbs +27 -0
- package/templates/projects/minimal/template.config.json +185 -0
- package/templates/projects/minimal/template.config.ts +88 -0
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Track Agent Invocation Hook
|
|
3
|
+
# Registers agent invocations in orchestrator-index.json
|
|
4
|
+
#
|
|
5
|
+
# Usage (called by Claude Code hooks):
|
|
6
|
+
# track-agent-invocation.sh start (reads stdin JSON)
|
|
7
|
+
# track-agent-invocation.sh complete (reads stdin JSON)
|
|
8
|
+
#
|
|
9
|
+
# Claude Code passes JSON via stdin with structure:
|
|
10
|
+
# { "tool_name": "Task", "tool_input": { "subagent_type": "...", ... } }
|
|
11
|
+
|
|
12
|
+
set -e
|
|
13
|
+
|
|
14
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
15
|
+
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
16
|
+
INDEX_FILE="$PROJECT_ROOT/.orchestrator/orchestrator-index.json"
|
|
17
|
+
STATE_DIR="$PROJECT_ROOT/.orchestrator/.state"
|
|
18
|
+
INVOCATION_FILE="$STATE_DIR/current-invocation"
|
|
19
|
+
DEBUG_LOG="$STATE_DIR/hook-debug.log"
|
|
20
|
+
|
|
21
|
+
# Ensure state directory exists
|
|
22
|
+
mkdir -p "$STATE_DIR"
|
|
23
|
+
|
|
24
|
+
ACTION="${1:-}"
|
|
25
|
+
|
|
26
|
+
# Read stdin into variable (Claude Code passes JSON via stdin)
|
|
27
|
+
STDIN_DATA=""
|
|
28
|
+
if [ ! -t 0 ]; then
|
|
29
|
+
STDIN_DATA=$(cat)
|
|
30
|
+
fi
|
|
31
|
+
|
|
32
|
+
case "$ACTION" in
|
|
33
|
+
start)
|
|
34
|
+
# Extract agent info from stdin JSON
|
|
35
|
+
# Structure: { "tool_name": "Task", "tool_input": { "subagent_type": "...", ... } }
|
|
36
|
+
if [ -n "$STDIN_DATA" ]; then
|
|
37
|
+
# Debug: log received data
|
|
38
|
+
echo "[$(date -u +%Y-%m-%dT%H:%M:%SZ)] START stdin: $STDIN_DATA" >> "$DEBUG_LOG"
|
|
39
|
+
|
|
40
|
+
AGENT_NAME=$(echo "$STDIN_DATA" | node -e "
|
|
41
|
+
let data = '';
|
|
42
|
+
process.stdin.on('data', chunk => data += chunk);
|
|
43
|
+
process.stdin.on('end', () => {
|
|
44
|
+
try {
|
|
45
|
+
const json = JSON.parse(data);
|
|
46
|
+
// Try different structures
|
|
47
|
+
const type = json.tool_input?.subagent_type
|
|
48
|
+
|| json.subagent_type
|
|
49
|
+
|| json.tool_input?.type
|
|
50
|
+
|| 'unknown';
|
|
51
|
+
console.log(type);
|
|
52
|
+
} catch { console.log('unknown'); }
|
|
53
|
+
});
|
|
54
|
+
")
|
|
55
|
+
PHASE=$(echo "$STDIN_DATA" | node -e "
|
|
56
|
+
let data = '';
|
|
57
|
+
process.stdin.on('data', chunk => data += chunk);
|
|
58
|
+
process.stdin.on('end', () => {
|
|
59
|
+
try {
|
|
60
|
+
const json = JSON.parse(data);
|
|
61
|
+
const type = json.tool_input?.subagent_type
|
|
62
|
+
|| json.subagent_type
|
|
63
|
+
|| json.tool_input?.type
|
|
64
|
+
|| 'unknown';
|
|
65
|
+
const phaseMap = {
|
|
66
|
+
'specifier': 'specify',
|
|
67
|
+
'planner': 'plan',
|
|
68
|
+
'task-generator': 'tasks',
|
|
69
|
+
'implementer': 'implement',
|
|
70
|
+
'researcher': 'research',
|
|
71
|
+
'reviewer': 'review',
|
|
72
|
+
'orchestrator': 'orchestrate'
|
|
73
|
+
};
|
|
74
|
+
console.log(phaseMap[type] || type);
|
|
75
|
+
} catch { console.log('unknown'); }
|
|
76
|
+
});
|
|
77
|
+
")
|
|
78
|
+
elif [ -n "$CLAUDE_TOOL_INPUT" ]; then
|
|
79
|
+
# Fallback to environment variable
|
|
80
|
+
echo "[$(date -u +%Y-%m-%dT%H:%M:%SZ)] START env: $CLAUDE_TOOL_INPUT" >> "$DEBUG_LOG"
|
|
81
|
+
|
|
82
|
+
AGENT_NAME=$(echo "$CLAUDE_TOOL_INPUT" | node -e "
|
|
83
|
+
let data = '';
|
|
84
|
+
process.stdin.on('data', chunk => data += chunk);
|
|
85
|
+
process.stdin.on('end', () => {
|
|
86
|
+
try {
|
|
87
|
+
const json = JSON.parse(data);
|
|
88
|
+
const type = json.subagent_type || json.tool_input?.subagent_type || 'unknown';
|
|
89
|
+
console.log(type);
|
|
90
|
+
} catch { console.log('unknown'); }
|
|
91
|
+
});
|
|
92
|
+
")
|
|
93
|
+
PHASE="unknown"
|
|
94
|
+
else
|
|
95
|
+
echo "[$(date -u +%Y-%m-%dT%H:%M:%SZ)] START no input received" >> "$DEBUG_LOG"
|
|
96
|
+
AGENT_NAME="unknown"
|
|
97
|
+
PHASE="unknown"
|
|
98
|
+
fi
|
|
99
|
+
|
|
100
|
+
# Generate invocation ID
|
|
101
|
+
INVOCATION_ID="inv-$(date +%s)-$(head -c 4 /dev/urandom | xxd -p)"
|
|
102
|
+
STARTED_AT=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
103
|
+
|
|
104
|
+
# Get workflow ID from index
|
|
105
|
+
WORKFLOW_ID=""
|
|
106
|
+
if [ -f "$INDEX_FILE" ]; then
|
|
107
|
+
WORKFLOW_ID=$(node -e "
|
|
108
|
+
const fs = require('fs');
|
|
109
|
+
try {
|
|
110
|
+
const idx = JSON.parse(fs.readFileSync('$INDEX_FILE', 'utf8'));
|
|
111
|
+
console.log(idx.activeWorkflow?.id || 'wf-standalone-' + Date.now());
|
|
112
|
+
} catch { console.log('wf-standalone-' + Date.now()); }
|
|
113
|
+
")
|
|
114
|
+
fi
|
|
115
|
+
|
|
116
|
+
# Save invocation state
|
|
117
|
+
echo "$INVOCATION_ID" > "$INVOCATION_FILE"
|
|
118
|
+
|
|
119
|
+
# Update orchestrator-index.json
|
|
120
|
+
if [ -f "$INDEX_FILE" ]; then
|
|
121
|
+
node -e "
|
|
122
|
+
const fs = require('fs');
|
|
123
|
+
const indexPath = '$INDEX_FILE';
|
|
124
|
+
const idx = JSON.parse(fs.readFileSync(indexPath, 'utf8'));
|
|
125
|
+
|
|
126
|
+
if (!idx.agentInvocations) idx.agentInvocations = [];
|
|
127
|
+
|
|
128
|
+
idx.agentInvocations.push({
|
|
129
|
+
id: '$INVOCATION_ID',
|
|
130
|
+
agentName: '$AGENT_NAME',
|
|
131
|
+
phase: '$PHASE',
|
|
132
|
+
workflowId: '$WORKFLOW_ID',
|
|
133
|
+
startedAt: '$STARTED_AT',
|
|
134
|
+
completedAt: null,
|
|
135
|
+
status: 'running',
|
|
136
|
+
durationMs: 0
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
fs.writeFileSync(indexPath, JSON.stringify(idx, null, 2));
|
|
140
|
+
console.log(JSON.stringify({ invocationId: '$INVOCATION_ID', startedAt: '$STARTED_AT' }));
|
|
141
|
+
"
|
|
142
|
+
else
|
|
143
|
+
echo '{"invocationId": "'$INVOCATION_ID'", "startedAt": "'$STARTED_AT'", "warning": "No index file found"}'
|
|
144
|
+
fi
|
|
145
|
+
;;
|
|
146
|
+
|
|
147
|
+
complete)
|
|
148
|
+
# Get invocation ID from state file
|
|
149
|
+
INVOCATION_ID=""
|
|
150
|
+
if [ -f "$INVOCATION_FILE" ]; then
|
|
151
|
+
INVOCATION_ID=$(cat "$INVOCATION_FILE")
|
|
152
|
+
fi
|
|
153
|
+
|
|
154
|
+
if [ -z "$INVOCATION_ID" ]; then
|
|
155
|
+
echo '{"success": false, "error": "No invocation ID found"}'
|
|
156
|
+
exit 0 # Don't fail the hook
|
|
157
|
+
fi
|
|
158
|
+
|
|
159
|
+
# Debug log
|
|
160
|
+
if [ -n "$STDIN_DATA" ]; then
|
|
161
|
+
echo "[$(date -u +%Y-%m-%dT%H:%M:%SZ)] COMPLETE stdin: $STDIN_DATA" >> "$DEBUG_LOG"
|
|
162
|
+
fi
|
|
163
|
+
|
|
164
|
+
# Determine status - default to success
|
|
165
|
+
STATUS="success"
|
|
166
|
+
SUMMARY="Completed"
|
|
167
|
+
|
|
168
|
+
COMPLETED_AT=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
169
|
+
|
|
170
|
+
# Update orchestrator-index.json
|
|
171
|
+
if [ -f "$INDEX_FILE" ]; then
|
|
172
|
+
node -e "
|
|
173
|
+
const fs = require('fs');
|
|
174
|
+
const indexPath = '$INDEX_FILE';
|
|
175
|
+
const idx = JSON.parse(fs.readFileSync(indexPath, 'utf8'));
|
|
176
|
+
|
|
177
|
+
const invocations = idx.agentInvocations || [];
|
|
178
|
+
const invIdx = invocations.findIndex(i => i.id === '$INVOCATION_ID');
|
|
179
|
+
|
|
180
|
+
if (invIdx === -1) {
|
|
181
|
+
console.log(JSON.stringify({ success: false, error: 'Invocation not found' }));
|
|
182
|
+
process.exit(0);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const inv = invocations[invIdx];
|
|
186
|
+
const startTime = new Date(inv.startedAt).getTime();
|
|
187
|
+
const endTime = new Date('$COMPLETED_AT').getTime();
|
|
188
|
+
const durationMs = endTime - startTime;
|
|
189
|
+
|
|
190
|
+
invocations[invIdx] = {
|
|
191
|
+
...inv,
|
|
192
|
+
completedAt: '$COMPLETED_AT',
|
|
193
|
+
status: '$STATUS' === 'success' ? 'completed' : 'failed',
|
|
194
|
+
durationMs,
|
|
195
|
+
result: {
|
|
196
|
+
status: '$STATUS',
|
|
197
|
+
summary: '$SUMMARY'
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
idx.agentInvocations = invocations;
|
|
202
|
+
|
|
203
|
+
// Update statistics
|
|
204
|
+
if (idx.statistics) {
|
|
205
|
+
idx.statistics.totalInvocations = invocations.length;
|
|
206
|
+
idx.statistics.lastActivity = '$COMPLETED_AT';
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
fs.writeFileSync(indexPath, JSON.stringify(idx, null, 2));
|
|
210
|
+
console.log(JSON.stringify({ success: true, durationMs }));
|
|
211
|
+
"
|
|
212
|
+
else
|
|
213
|
+
echo '{"success": false, "error": "No index file found"}'
|
|
214
|
+
fi
|
|
215
|
+
|
|
216
|
+
# Clean up state file
|
|
217
|
+
rm -f "$INVOCATION_FILE"
|
|
218
|
+
;;
|
|
219
|
+
|
|
220
|
+
*)
|
|
221
|
+
echo "Usage: $0 {start|complete}"
|
|
222
|
+
echo ""
|
|
223
|
+
echo "This script is called by Claude Code hooks."
|
|
224
|
+
echo "It reads JSON from stdin with structure:"
|
|
225
|
+
echo ' { "tool_name": "Task", "tool_input": { "subagent_type": "...", ... } }'
|
|
226
|
+
echo ""
|
|
227
|
+
echo "Debug log: $DEBUG_LOG"
|
|
228
|
+
exit 0
|
|
229
|
+
;;
|
|
230
|
+
esac
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://orchestrator.ai/schemas/orchestrator-config.json",
|
|
3
|
+
"version": "1.0",
|
|
4
|
+
"_description": "Configuracoes customizadas do Orchestrator. NAO e lido pelo Claude Code CLI - usado pelo codigo TypeScript do Orchestrator.",
|
|
5
|
+
|
|
6
|
+
"project": {
|
|
7
|
+
"name": "orchestrator",
|
|
8
|
+
"description": "Sistema de Orquestracao Autonomo para Claude Code"
|
|
9
|
+
},
|
|
10
|
+
|
|
11
|
+
"agents": {
|
|
12
|
+
"orchestrator": {
|
|
13
|
+
"prompt": ".claude/agents/orchestrator.md",
|
|
14
|
+
"description": "Orchestrator v2 - Minimal decision agent using deterministic MCP tools (getContext, executeAction, canAdvance)",
|
|
15
|
+
"capabilities": ["invoke_subagents", "access_mcp"],
|
|
16
|
+
"version": "2.0"
|
|
17
|
+
},
|
|
18
|
+
"specifier": {
|
|
19
|
+
"prompt": ".claude/agents/specifier.md",
|
|
20
|
+
"description": "Gera especificacoes tecnicas de features",
|
|
21
|
+
"capabilities": ["access_research", "kb_lookup"]
|
|
22
|
+
},
|
|
23
|
+
"planner": {
|
|
24
|
+
"prompt": ".claude/agents/planner.md",
|
|
25
|
+
"description": "Elabora planos tecnicos de implementacao",
|
|
26
|
+
"capabilities": ["access_research", "kb_lookup"]
|
|
27
|
+
},
|
|
28
|
+
"task-generator": {
|
|
29
|
+
"prompt": ".claude/agents/task-generator.md",
|
|
30
|
+
"description": "Gera backlog de tarefas atomicas",
|
|
31
|
+
"capabilities": ["kb_lookup"]
|
|
32
|
+
},
|
|
33
|
+
"implementer": {
|
|
34
|
+
"prompt": ".claude/agents/implementer.md",
|
|
35
|
+
"description": "Executa implementacao de tarefas",
|
|
36
|
+
"capabilities": ["code_write", "run_tests"]
|
|
37
|
+
},
|
|
38
|
+
"researcher": {
|
|
39
|
+
"prompt": ".claude/agents/researcher.md",
|
|
40
|
+
"description": "Conduz pesquisas tecnicas via Perplexity",
|
|
41
|
+
"capabilities": ["access_perplexity"]
|
|
42
|
+
},
|
|
43
|
+
"reviewer": {
|
|
44
|
+
"prompt": ".claude/agents/reviewer.md",
|
|
45
|
+
"description": "Revisa e valida artefatos e codigo",
|
|
46
|
+
"capabilities": ["validate_artifacts", "code_review"]
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
|
|
50
|
+
"skills": {
|
|
51
|
+
"artifact-validator": {
|
|
52
|
+
"definition": ".claude/skills/artifact-validator/SKILL.md",
|
|
53
|
+
"description": "Valida artefatos contra schemas e regras de negocio",
|
|
54
|
+
"auto_invoke": true,
|
|
55
|
+
"triggers": ["after_artifact_generation", "before_phase_advance"]
|
|
56
|
+
},
|
|
57
|
+
"kb-lookup": {
|
|
58
|
+
"definition": ".claude/skills/kb-lookup/SKILL.md",
|
|
59
|
+
"description": "Busca informacoes na knowledge base do projeto",
|
|
60
|
+
"auto_invoke": true,
|
|
61
|
+
"triggers": ["when_context_needed", "when_rules_referenced"]
|
|
62
|
+
},
|
|
63
|
+
"phase-gate-evaluator": {
|
|
64
|
+
"definition": ".claude/skills/phase-gate-evaluator/SKILL.md",
|
|
65
|
+
"description": "Avalia gates entre fases do workflow",
|
|
66
|
+
"auto_invoke": true,
|
|
67
|
+
"triggers": ["before_phase_advance"]
|
|
68
|
+
},
|
|
69
|
+
"workflow-status": {
|
|
70
|
+
"definition": ".claude/skills/workflow-status/SKILL.md",
|
|
71
|
+
"description": "Consulta status detalhado do workflow atual",
|
|
72
|
+
"auto_invoke": false,
|
|
73
|
+
"triggers": ["on_demand"]
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
|
|
77
|
+
"workflows": {
|
|
78
|
+
"feature_development": {
|
|
79
|
+
"phases": ["research", "specify", "plan", "tasks", "implement"],
|
|
80
|
+
"gates": {
|
|
81
|
+
"research": "research-complete",
|
|
82
|
+
"specify": "specification-complete",
|
|
83
|
+
"plan": "plan-complete",
|
|
84
|
+
"tasks": "tasks-complete",
|
|
85
|
+
"implement": "implementation-complete"
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
"bug_fix": {
|
|
89
|
+
"phases": ["triage", "specify", "implement", "verify"],
|
|
90
|
+
"gates": {
|
|
91
|
+
"triage": "triage-complete",
|
|
92
|
+
"specify": "bugfix-spec-complete",
|
|
93
|
+
"implement": "fix-implemented",
|
|
94
|
+
"verify": "fix-verified"
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
"refactoring": {
|
|
98
|
+
"phases": ["analyze", "plan", "implement", "verify"],
|
|
99
|
+
"gates": {
|
|
100
|
+
"analyze": "analysis-complete",
|
|
101
|
+
"plan": "refactor-plan-complete",
|
|
102
|
+
"implement": "refactor-implemented",
|
|
103
|
+
"verify": "refactor-verified"
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
|
|
108
|
+
"knowledge_base": {
|
|
109
|
+
"root": ".orchestrator/memory/knowledge-base",
|
|
110
|
+
"tiers": {
|
|
111
|
+
"core": {
|
|
112
|
+
"path": "core",
|
|
113
|
+
"immutable": true,
|
|
114
|
+
"files": ["CONSTITUTION.md"]
|
|
115
|
+
},
|
|
116
|
+
"contextual": {
|
|
117
|
+
"path": "contextual",
|
|
118
|
+
"immutable": false,
|
|
119
|
+
"files": ["project-context.md", "tech-stack.md"]
|
|
120
|
+
},
|
|
121
|
+
"research": {
|
|
122
|
+
"path": "research",
|
|
123
|
+
"cache": true,
|
|
124
|
+
"ttl_hours": 24
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
|
|
129
|
+
"quality": {
|
|
130
|
+
"validation": {
|
|
131
|
+
"schema_validation": true,
|
|
132
|
+
"business_rules_validation": true,
|
|
133
|
+
"lint_on_write": true,
|
|
134
|
+
"test_on_write": true
|
|
135
|
+
},
|
|
136
|
+
"checkpoints": {
|
|
137
|
+
"auto_checkpoint_on_artifact": true,
|
|
138
|
+
"checkpoint_message_format": "[orchestrator] {phase}: {artifact_type} - {description}"
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
{
|
|
2
|
+
"permissions": {
|
|
3
|
+
"allow": [
|
|
4
|
+
"Bash(npm:*)",
|
|
5
|
+
"Bash(npx:*)",
|
|
6
|
+
"Bash(node:*)",
|
|
7
|
+
"Bash(git:*)",
|
|
8
|
+
"Bash(mkdir:*)",
|
|
9
|
+
"Bash(ls:*)",
|
|
10
|
+
"Bash(cat:*)",
|
|
11
|
+
"Bash(tree:*)",
|
|
12
|
+
"Read(.orchestrator/**)",
|
|
13
|
+
"Read(project-guidelines/**)",
|
|
14
|
+
"Read(src/**)",
|
|
15
|
+
"Read(tests/**)",
|
|
16
|
+
"Read(docs/**)",
|
|
17
|
+
"Write(.orchestrator/**)",
|
|
18
|
+
"Write(src/**)",
|
|
19
|
+
"Write(tests/**)",
|
|
20
|
+
"Write(docs/**)",
|
|
21
|
+
"mcp__orchestrator-tools__*",
|
|
22
|
+
"mcp__perplexity__*",
|
|
23
|
+
"mcp__knowledge-base__*"
|
|
24
|
+
],
|
|
25
|
+
"deny": [
|
|
26
|
+
"Bash(rm -rf /)",
|
|
27
|
+
"Bash(rm -rf ~)",
|
|
28
|
+
"Write(.env)",
|
|
29
|
+
"Write(.env.*)",
|
|
30
|
+
"Read(.env)",
|
|
31
|
+
"Read(.env.*)"
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
"env": {
|
|
35
|
+
"ORCHESTRATOR_ROOT": ".orchestrator",
|
|
36
|
+
"NODE_ENV": "development"
|
|
37
|
+
},
|
|
38
|
+
"hooks": {
|
|
39
|
+
"PreToolUse": [
|
|
40
|
+
{
|
|
41
|
+
"matcher": "Task",
|
|
42
|
+
"hooks": [
|
|
43
|
+
{
|
|
44
|
+
"type": "command",
|
|
45
|
+
"command": ".claude/hooks/track-agent-invocation.sh start",
|
|
46
|
+
"timeout": 5000,
|
|
47
|
+
"on_failure": "ignore"
|
|
48
|
+
}
|
|
49
|
+
]
|
|
50
|
+
}
|
|
51
|
+
],
|
|
52
|
+
"PostToolUse": [
|
|
53
|
+
{
|
|
54
|
+
"matcher": "Task",
|
|
55
|
+
"hooks": [
|
|
56
|
+
{
|
|
57
|
+
"type": "command",
|
|
58
|
+
"command": ".claude/hooks/track-agent-invocation.sh complete",
|
|
59
|
+
"timeout": 5000,
|
|
60
|
+
"on_failure": "ignore"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"type": "command",
|
|
64
|
+
"command": ".claude/hooks/post-implement-validate.sh",
|
|
65
|
+
"timeout": 10000,
|
|
66
|
+
"on_failure": "warn"
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"type": "command",
|
|
70
|
+
"command": ".claude/hooks/post-phase-checkpoint.sh",
|
|
71
|
+
"timeout": 30000,
|
|
72
|
+
"on_failure": "ignore"
|
|
73
|
+
}
|
|
74
|
+
]
|
|
75
|
+
}
|
|
76
|
+
]
|
|
77
|
+
},
|
|
78
|
+
"enableAllProjectMcpServers": true,
|
|
79
|
+
"alwaysThinkingEnabled": true
|
|
80
|
+
}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: artifact-validator
|
|
3
|
+
description: Valida artefatos do Orchestrator contra JSON schemas e regras de negocio da CONSTITUTION. Use apos geracao de artefatos (spec, plan, tasks) ou antes de avancar fase.
|
|
4
|
+
allowed-tools: Read, Grep, Glob
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Artifact Validator Skill
|
|
8
|
+
|
|
9
|
+
## Descricao
|
|
10
|
+
|
|
11
|
+
Esta skill valida artefatos do sistema de orquestracao contra:
|
|
12
|
+
1. **JSON Schemas**: Estrutura e tipos obrigatorios
|
|
13
|
+
2. **Regras de Negocio**: Definidas na CONSTITUTION.md
|
|
14
|
+
3. **Consistencia**: Referencias internas e dependencias
|
|
15
|
+
|
|
16
|
+
## Quando Usar
|
|
17
|
+
|
|
18
|
+
Use esta skill quando:
|
|
19
|
+
- Apos geracao de qualquer artefato (spec, plan, tasks, implementation)
|
|
20
|
+
- Antes de avancar para proxima fase do workflow
|
|
21
|
+
- Quando solicitado revisao de artefato existente
|
|
22
|
+
- Para verificar integridade de artefatos apos edicao
|
|
23
|
+
|
|
24
|
+
## Invocacao
|
|
25
|
+
|
|
26
|
+
Exemplos de como invocar esta skill:
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
"Valide o artefato specification em .orchestrator/artifacts/specify/spec.md"
|
|
30
|
+
|
|
31
|
+
"Verifique se o plano esta conforme o schema de plan"
|
|
32
|
+
|
|
33
|
+
"Valide tasks.md contra regras de negocio da CONSTITUTION"
|
|
34
|
+
|
|
35
|
+
"Faca validacao completa do artefato de implementacao"
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Parametros
|
|
39
|
+
|
|
40
|
+
| Parametro | Tipo | Obrigatorio | Descricao |
|
|
41
|
+
|-----------|------|-------------|-----------|
|
|
42
|
+
| `artifact_path` | string | Sim | Caminho do artefato a validar |
|
|
43
|
+
| `artifact_type` | enum | Sim | specification, plan, tasks, implementation, research |
|
|
44
|
+
| `validation_level` | enum | Nao | schema (apenas estrutura), business (apenas regras), full (ambos) |
|
|
45
|
+
|
|
46
|
+
### Valores de validation_level
|
|
47
|
+
|
|
48
|
+
- **schema**: Valida apenas estrutura JSON/Markdown e campos obrigatorios
|
|
49
|
+
- **business**: Valida apenas regras de negocio da CONSTITUTION
|
|
50
|
+
- **full** (default): Executa ambas validacoes
|
|
51
|
+
|
|
52
|
+
## Output
|
|
53
|
+
|
|
54
|
+
A skill retorna resultado estruturado:
|
|
55
|
+
|
|
56
|
+
```json
|
|
57
|
+
{
|
|
58
|
+
"isValid": true | false,
|
|
59
|
+
"validationLevel": "schema" | "business" | "full",
|
|
60
|
+
"artifactType": "specification",
|
|
61
|
+
"artifactPath": ".orchestrator/artifacts/specify/spec.md",
|
|
62
|
+
"timestamp": "2025-12-09T10:30:00Z",
|
|
63
|
+
|
|
64
|
+
"schemaValidation": {
|
|
65
|
+
"passed": true,
|
|
66
|
+
"errors": [],
|
|
67
|
+
"warnings": []
|
|
68
|
+
},
|
|
69
|
+
|
|
70
|
+
"businessValidation": {
|
|
71
|
+
"passed": true,
|
|
72
|
+
"errors": [],
|
|
73
|
+
"warnings": [],
|
|
74
|
+
"rulesChecked": [
|
|
75
|
+
"CONSTITUTION.rule.001",
|
|
76
|
+
"CONSTITUTION.rule.002"
|
|
77
|
+
]
|
|
78
|
+
},
|
|
79
|
+
|
|
80
|
+
"errors": [
|
|
81
|
+
{
|
|
82
|
+
"code": "SCHEMA_001",
|
|
83
|
+
"field": "requisitos.RF-001.criterio_aceite",
|
|
84
|
+
"message": "Campo obrigatorio ausente",
|
|
85
|
+
"severity": "error",
|
|
86
|
+
"suggestion": "Adicione criterios de aceite verificaveis para RF-001"
|
|
87
|
+
}
|
|
88
|
+
],
|
|
89
|
+
|
|
90
|
+
"warnings": [
|
|
91
|
+
{
|
|
92
|
+
"code": "BUSINESS_W001",
|
|
93
|
+
"field": "escopo.out_scope",
|
|
94
|
+
"message": "Out of scope sem justificativa",
|
|
95
|
+
"severity": "warning",
|
|
96
|
+
"suggestion": "Adicione justificativa para cada item out of scope"
|
|
97
|
+
}
|
|
98
|
+
],
|
|
99
|
+
|
|
100
|
+
"suggestions": [
|
|
101
|
+
"Considere adicionar metricas de performance em RNF",
|
|
102
|
+
"Referencie o research-context se disponivel"
|
|
103
|
+
],
|
|
104
|
+
|
|
105
|
+
"summary": {
|
|
106
|
+
"totalErrors": 1,
|
|
107
|
+
"totalWarnings": 1,
|
|
108
|
+
"canProceed": false
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Regras de Validacao
|
|
114
|
+
|
|
115
|
+
### Schema Validation
|
|
116
|
+
|
|
117
|
+
#### Specification (spec.md)
|
|
118
|
+
- Campos obrigatorios: metadata, sumario, escopo, requisitos_funcionais
|
|
119
|
+
- Cada RF deve ter: id, descricao, ator, criterio_aceite
|
|
120
|
+
- Cada RNF deve ter: id, metrica, target
|
|
121
|
+
|
|
122
|
+
#### Plan (plan.md)
|
|
123
|
+
- Campos obrigatorios: metadata, arquitetura, fases, dependencias
|
|
124
|
+
- Cada fase deve ter: id, descricao, entregaveis, estimativa
|
|
125
|
+
- Dependencias devem referenciar fases existentes
|
|
126
|
+
|
|
127
|
+
#### Tasks (tasks.md)
|
|
128
|
+
- Campos obrigatorios: metadata, backlog, dependencias
|
|
129
|
+
- Cada task deve ter: id, titulo, descricao, criterio_aceite, estimativa
|
|
130
|
+
- Dependencias devem formar DAG (sem ciclos)
|
|
131
|
+
|
|
132
|
+
#### Implementation
|
|
133
|
+
- Campos obrigatorios: metadata, task_id, arquivos_modificados
|
|
134
|
+
- Cada arquivo deve ter: path, tipo_mudanca, descricao_mudanca
|
|
135
|
+
- task_id deve existir em tasks.md
|
|
136
|
+
|
|
137
|
+
### Business Validation
|
|
138
|
+
|
|
139
|
+
Regras extraidas de CONSTITUTION.md:
|
|
140
|
+
|
|
141
|
+
1. **CONST-001**: Todo requisito deve ter criterio de aceite mensuravel
|
|
142
|
+
2. **CONST-002**: Out of scope deve ter justificativa explicita
|
|
143
|
+
3. **CONST-003**: Estimativas devem estar em unidades padrao (horas/dias)
|
|
144
|
+
4. **CONST-004**: Referencias a outros artefatos devem ser validas
|
|
145
|
+
5. **CONST-005**: Nomes de arquivos devem seguir convencao do projeto
|
|
146
|
+
|
|
147
|
+
## Integracao com TypeScript
|
|
148
|
+
|
|
149
|
+
Esta skill invoca o handler TypeScript:
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
// src/presentation/skills/ArtifactValidatorSkillHandler.ts
|
|
153
|
+
|
|
154
|
+
export class ArtifactValidatorSkillHandler {
|
|
155
|
+
async handle(params: ValidationParams): Promise<ValidationResult> {
|
|
156
|
+
// 1. Carrega artefato do path
|
|
157
|
+
// 2. Executa SchemaValidator (infrastructure)
|
|
158
|
+
// 3. Executa ConstitutionValidator (domain)
|
|
159
|
+
// 4. Combina resultados
|
|
160
|
+
// 5. Retorna ValidationResult
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## Exemplos de Uso
|
|
166
|
+
|
|
167
|
+
### Validacao Schema Only
|
|
168
|
+
```
|
|
169
|
+
User: "Valide a estrutura do spec.md"
|
|
170
|
+
Skill: artifact-validator com validation_level=schema
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### Validacao Business Only
|
|
174
|
+
```
|
|
175
|
+
User: "Verifique se o plano atende as regras da CONSTITUTION"
|
|
176
|
+
Skill: artifact-validator com validation_level=business
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Validacao Completa (Default)
|
|
180
|
+
```
|
|
181
|
+
User: "Valide completamente o artefato tasks.md"
|
|
182
|
+
Skill: artifact-validator com validation_level=full
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## Comportamento em Caso de Erro
|
|
186
|
+
|
|
187
|
+
### Artefato Nao Encontrado
|
|
188
|
+
```json
|
|
189
|
+
{
|
|
190
|
+
"isValid": false,
|
|
191
|
+
"errors": [{
|
|
192
|
+
"code": "ARTIFACT_NOT_FOUND",
|
|
193
|
+
"message": "Artefato nao encontrado: {path}"
|
|
194
|
+
}]
|
|
195
|
+
}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### Tipo Desconhecido
|
|
199
|
+
```json
|
|
200
|
+
{
|
|
201
|
+
"isValid": false,
|
|
202
|
+
"errors": [{
|
|
203
|
+
"code": "UNKNOWN_TYPE",
|
|
204
|
+
"message": "Tipo de artefato desconhecido: {type}"
|
|
205
|
+
}]
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### Erro de Parse
|
|
210
|
+
```json
|
|
211
|
+
{
|
|
212
|
+
"isValid": false,
|
|
213
|
+
"errors": [{
|
|
214
|
+
"code": "PARSE_ERROR",
|
|
215
|
+
"message": "Erro ao parsear artefato: {details}"
|
|
216
|
+
}]
|
|
217
|
+
}
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## Notas Importantes
|
|
221
|
+
|
|
222
|
+
1. Esta skill **NAO** modifica artefatos, apenas valida
|
|
223
|
+
2. Validacao **full** e sempre recomendada antes de avancar fase
|
|
224
|
+
3. Warnings **NAO** impedem avanco, mas devem ser revisados
|
|
225
|
+
4. Errors **IMPEDEM** avanco e devem ser corrigidos
|
|
226
|
+
5. Sugestoes sao opcionais mas melhoram qualidade
|