feed-the-machine 1.0.0 → 1.2.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/bin/generate-manifest.mjs +253 -0
- package/bin/install.mjs +134 -4
- package/docs/HOOKS.md +243 -0
- package/docs/INBOX.md +233 -0
- package/ftm/SKILL.md +34 -0
- package/ftm-audit/SKILL.md +69 -0
- package/ftm-brainstorm/SKILL.md +51 -0
- package/ftm-browse/SKILL.md +39 -0
- package/ftm-capture/SKILL.md +370 -0
- package/ftm-capture.yml +4 -0
- package/ftm-codex-gate/SKILL.md +59 -0
- package/ftm-config/SKILL.md +35 -0
- package/ftm-council/SKILL.md +56 -0
- package/ftm-dashboard/SKILL.md +163 -0
- package/ftm-debug/SKILL.md +84 -0
- package/ftm-diagram/SKILL.md +44 -0
- package/ftm-executor/SKILL.md +97 -0
- package/ftm-git/SKILL.md +60 -0
- package/ftm-inbox/backend/__init__.py +0 -0
- package/ftm-inbox/backend/__pycache__/main.cpython-314.pyc +0 -0
- package/ftm-inbox/backend/adapters/__init__.py +0 -0
- package/ftm-inbox/backend/adapters/_retry.py +64 -0
- package/ftm-inbox/backend/adapters/base.py +230 -0
- package/ftm-inbox/backend/adapters/freshservice.py +104 -0
- package/ftm-inbox/backend/adapters/gmail.py +125 -0
- package/ftm-inbox/backend/adapters/jira.py +136 -0
- package/ftm-inbox/backend/adapters/registry.py +192 -0
- package/ftm-inbox/backend/adapters/slack.py +110 -0
- package/ftm-inbox/backend/db/__init__.py +0 -0
- package/ftm-inbox/backend/db/connection.py +54 -0
- package/ftm-inbox/backend/db/schema.py +78 -0
- package/ftm-inbox/backend/executor/__init__.py +7 -0
- package/ftm-inbox/backend/executor/engine.py +149 -0
- package/ftm-inbox/backend/executor/step_runner.py +98 -0
- package/ftm-inbox/backend/main.py +103 -0
- package/ftm-inbox/backend/models/__init__.py +1 -0
- package/ftm-inbox/backend/models/unified_task.py +36 -0
- package/ftm-inbox/backend/planner/__init__.py +6 -0
- package/ftm-inbox/backend/planner/__pycache__/__init__.cpython-314.pyc +0 -0
- package/ftm-inbox/backend/planner/__pycache__/generator.cpython-314.pyc +0 -0
- package/ftm-inbox/backend/planner/__pycache__/schema.cpython-314.pyc +0 -0
- package/ftm-inbox/backend/planner/generator.py +127 -0
- package/ftm-inbox/backend/planner/schema.py +34 -0
- package/ftm-inbox/backend/requirements.txt +5 -0
- package/ftm-inbox/backend/routes/__init__.py +0 -0
- package/ftm-inbox/backend/routes/__pycache__/plan.cpython-314.pyc +0 -0
- package/ftm-inbox/backend/routes/execute.py +186 -0
- package/ftm-inbox/backend/routes/health.py +52 -0
- package/ftm-inbox/backend/routes/inbox.py +68 -0
- package/ftm-inbox/backend/routes/plan.py +271 -0
- package/ftm-inbox/bin/launchagent.mjs +91 -0
- package/ftm-inbox/bin/setup.mjs +188 -0
- package/ftm-inbox/bin/start.sh +10 -0
- package/ftm-inbox/bin/status.sh +17 -0
- package/ftm-inbox/bin/stop.sh +8 -0
- package/ftm-inbox/config.example.yml +55 -0
- package/ftm-inbox/package-lock.json +2898 -0
- package/ftm-inbox/package.json +26 -0
- package/ftm-inbox/postcss.config.js +6 -0
- package/ftm-inbox/src/app.css +199 -0
- package/ftm-inbox/src/app.html +18 -0
- package/ftm-inbox/src/lib/api.ts +166 -0
- package/ftm-inbox/src/lib/components/ExecutionLog.svelte +81 -0
- package/ftm-inbox/src/lib/components/InboxFeed.svelte +143 -0
- package/ftm-inbox/src/lib/components/PlanStep.svelte +271 -0
- package/ftm-inbox/src/lib/components/PlanView.svelte +206 -0
- package/ftm-inbox/src/lib/components/StreamPanel.svelte +99 -0
- package/ftm-inbox/src/lib/components/TaskCard.svelte +190 -0
- package/ftm-inbox/src/lib/components/ui/EmptyState.svelte +63 -0
- package/ftm-inbox/src/lib/components/ui/KawaiiCard.svelte +86 -0
- package/ftm-inbox/src/lib/components/ui/PillButton.svelte +106 -0
- package/ftm-inbox/src/lib/components/ui/StatusBadge.svelte +67 -0
- package/ftm-inbox/src/lib/components/ui/StreamDrawer.svelte +149 -0
- package/ftm-inbox/src/lib/components/ui/ThemeToggle.svelte +80 -0
- package/ftm-inbox/src/lib/theme.ts +47 -0
- package/ftm-inbox/src/routes/+layout.svelte +76 -0
- package/ftm-inbox/src/routes/+page.svelte +401 -0
- package/ftm-inbox/static/favicon.png +0 -0
- package/ftm-inbox/svelte.config.js +12 -0
- package/ftm-inbox/tailwind.config.ts +63 -0
- package/ftm-inbox/tsconfig.json +13 -0
- package/ftm-inbox/vite.config.ts +6 -0
- package/ftm-intent/SKILL.md +44 -0
- package/ftm-manifest.json +3794 -0
- package/ftm-map/SKILL.md +259 -0
- package/ftm-map/scripts/db.py +391 -0
- package/ftm-map/scripts/index.py +341 -0
- package/ftm-map/scripts/parser.py +455 -0
- package/ftm-map/scripts/queries/.gitkeep +0 -0
- package/ftm-map/scripts/queries/javascript-tags.scm +23 -0
- package/ftm-map/scripts/queries/python-tags.scm +17 -0
- package/ftm-map/scripts/queries/typescript-tags.scm +29 -0
- package/ftm-map/scripts/query.py +149 -0
- package/ftm-map/scripts/requirements.txt +2 -0
- package/ftm-map/scripts/setup-hooks.sh +27 -0
- package/ftm-map/scripts/setup.sh +45 -0
- package/ftm-map/scripts/test_db.py +124 -0
- package/ftm-map/scripts/test_parser.py +106 -0
- package/ftm-map/scripts/test_query.py +66 -0
- package/ftm-map/scripts/tests/fixtures/__init__.py +0 -0
- package/ftm-map/scripts/tests/fixtures/sample_project/api.ts +16 -0
- package/ftm-map/scripts/tests/fixtures/sample_project/auth.py +15 -0
- package/ftm-map/scripts/tests/fixtures/sample_project/utils.js +16 -0
- package/ftm-map/scripts/views.py +545 -0
- package/ftm-mind/SKILL.md +173 -66
- package/ftm-pause/SKILL.md +43 -0
- package/ftm-researcher/SKILL.md +275 -0
- package/ftm-researcher/evals/agent-diversity.yaml +17 -0
- package/ftm-researcher/evals/synthesis-quality.yaml +12 -0
- package/ftm-researcher/evals/trigger-accuracy.yaml +39 -0
- package/ftm-researcher/references/adaptive-search.md +116 -0
- package/ftm-researcher/references/agent-prompts.md +193 -0
- package/ftm-researcher/references/council-integration.md +193 -0
- package/ftm-researcher/references/output-format.md +203 -0
- package/ftm-researcher/references/synthesis-pipeline.md +165 -0
- package/ftm-researcher/scripts/score_credibility.py +234 -0
- package/ftm-researcher/scripts/validate_research.py +92 -0
- package/ftm-resume/SKILL.md +47 -0
- package/ftm-retro/SKILL.md +54 -0
- package/ftm-routine/SKILL.md +170 -0
- package/ftm-state/blackboard/capabilities.json +5 -0
- package/ftm-state/blackboard/capabilities.schema.json +27 -0
- package/ftm-upgrade/SKILL.md +41 -0
- package/ftm-upgrade/scripts/check-version.sh +1 -1
- package/ftm-upgrade/scripts/upgrade.sh +1 -1
- package/hooks/ftm-blackboard-enforcer.sh +94 -0
- package/hooks/ftm-discovery-reminder.sh +90 -0
- package/hooks/ftm-drafts-gate.sh +61 -0
- package/hooks/ftm-event-logger.mjs +107 -0
- package/hooks/ftm-map-autodetect.sh +79 -0
- package/hooks/ftm-pending-sync-check.sh +22 -0
- package/hooks/ftm-plan-gate.sh +96 -0
- package/hooks/ftm-post-commit-trigger.sh +57 -0
- package/hooks/settings-template.json +81 -0
- package/install.sh +140 -11
- package/package.json +12 -2
|
@@ -0,0 +1,3794 @@
|
|
|
1
|
+
{
|
|
2
|
+
"generated_at": "2026-03-20T22:33:20.211Z",
|
|
3
|
+
"skills": [
|
|
4
|
+
{
|
|
5
|
+
"name": "ftm",
|
|
6
|
+
"description": "Universal entry point for all ftm skills. Routes freeform text to the right ftm skill. ftm-mind is the default cognitive entry point for all unclassified input.",
|
|
7
|
+
"trigger_file": "ftm.yml",
|
|
8
|
+
"skill_directory": "ftm/",
|
|
9
|
+
"events_emits": [],
|
|
10
|
+
"events_listens": [],
|
|
11
|
+
"blackboard_reads": [],
|
|
12
|
+
"blackboard_writes": [],
|
|
13
|
+
"requirements": [
|
|
14
|
+
{
|
|
15
|
+
"type": "config",
|
|
16
|
+
"name": "~/.claude/ftm-config.yml",
|
|
17
|
+
"required": false,
|
|
18
|
+
"description": "legacy_router_fallback setting"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"type": "reference",
|
|
22
|
+
"name": "~/.claude/ftm-state/blackboard/context.json",
|
|
23
|
+
"required": false,
|
|
24
|
+
"description": "session state for blackboard update on routing"
|
|
25
|
+
}
|
|
26
|
+
],
|
|
27
|
+
"risk": {
|
|
28
|
+
"level": "read_only",
|
|
29
|
+
"scope": "reads blackboard context.json and updates session_metadata.skills_invoked before routing; does not modify any project files",
|
|
30
|
+
"rollback": "no mutations to reverse; blackboard update is a metadata append"
|
|
31
|
+
},
|
|
32
|
+
"approval_gates": [
|
|
33
|
+
{
|
|
34
|
+
"trigger": "ftm-mind failure AND legacy_router_fallback enabled",
|
|
35
|
+
"action": "fall back to keyword routing automatically (no user gate needed)"
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
"complexity_routing": {
|
|
39
|
+
"micro": "auto",
|
|
40
|
+
"small": "auto",
|
|
41
|
+
"medium": "auto",
|
|
42
|
+
"large": "auto",
|
|
43
|
+
"xl": "auto"
|
|
44
|
+
},
|
|
45
|
+
"fallbacks": [
|
|
46
|
+
{
|
|
47
|
+
"condition": "ftm-mind fails or times out",
|
|
48
|
+
"action": "check legacy_router_fallback in ftm-config.yml; if true, use keyword matching; if false, report failure"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"condition": "blackboard context.json missing",
|
|
52
|
+
"action": "skip blackboard update, proceed with routing"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"condition": "skill tool unavailable for target skill",
|
|
56
|
+
"action": "report routing failure to user with the target skill name"
|
|
57
|
+
}
|
|
58
|
+
],
|
|
59
|
+
"capabilities": [],
|
|
60
|
+
"event_payloads": {
|
|
61
|
+
"(none)": []
|
|
62
|
+
},
|
|
63
|
+
"references": [],
|
|
64
|
+
"has_evals": false,
|
|
65
|
+
"warnings": [],
|
|
66
|
+
"size_bytes": 5206,
|
|
67
|
+
"enabled": true
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"name": "ftm-audit",
|
|
71
|
+
"description": "Dual-purpose wiring audit that verifies all code is actually connected to the running application. Combines static analysis (knip) with adversarial LLM audit and auto-fixes anything it finds. Use when user says \"audit\", \"wiring check\", \"verify wiring\", \"dead code\", \"check imports\", \"unused code\", \"find dead code\", or \"audit wiring\". Also auto-invoked by ftm-executor after each task.",
|
|
72
|
+
"trigger_file": "ftm-audit.yml",
|
|
73
|
+
"skill_directory": "ftm-audit/",
|
|
74
|
+
"events_emits": [
|
|
75
|
+
"audit_complete",
|
|
76
|
+
"issue_found",
|
|
77
|
+
"task_completed"
|
|
78
|
+
],
|
|
79
|
+
"events_listens": [
|
|
80
|
+
"code_committed",
|
|
81
|
+
"review_complete"
|
|
82
|
+
],
|
|
83
|
+
"blackboard_reads": [
|
|
84
|
+
"~/.claude/ftm-state/blackboard/context.json",
|
|
85
|
+
"~/.claude/ftm-state/blackboard/experiences/index.json",
|
|
86
|
+
"~/.claude/ftm-state/blackboard/patterns.json"
|
|
87
|
+
],
|
|
88
|
+
"blackboard_writes": [
|
|
89
|
+
"~/.claude/ftm-state/blackboard/context.json",
|
|
90
|
+
"~/.claude/ftm-state/blackboard/experiences/YYYY-MM-DD_task-slug.json"
|
|
91
|
+
],
|
|
92
|
+
"requirements": [
|
|
93
|
+
{
|
|
94
|
+
"type": "tool",
|
|
95
|
+
"name": "knip",
|
|
96
|
+
"required": false,
|
|
97
|
+
"description": "static dead-code and unused-export analysis (Layer 1)"
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"type": "tool",
|
|
101
|
+
"name": "node",
|
|
102
|
+
"required": true,
|
|
103
|
+
"description": "runtime for knip via npx"
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"type": "config",
|
|
107
|
+
"name": "knip.config.ts",
|
|
108
|
+
"required": false,
|
|
109
|
+
"description": "custom knip configuration at project root"
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"type": "reference",
|
|
113
|
+
"name": "references/protocols/PROJECT-PATTERNS.md",
|
|
114
|
+
"required": true,
|
|
115
|
+
"description": "framework detection table and dimension activation matrix"
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
"type": "reference",
|
|
119
|
+
"name": "references/strategies/AUTO-FIX-STRATEGIES.md",
|
|
120
|
+
"required": true,
|
|
121
|
+
"description": "fix actions by finding type"
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"type": "reference",
|
|
125
|
+
"name": "references/protocols/WIRING-CONTRACTS.md",
|
|
126
|
+
"required": false,
|
|
127
|
+
"description": "wiring contract schema for plan-driven audits"
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
"type": "reference",
|
|
131
|
+
"name": "references/protocols/RUNTIME-WIRING.md",
|
|
132
|
+
"required": false,
|
|
133
|
+
"description": "runtime verification protocol"
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"type": "reference",
|
|
137
|
+
"name": "references/templates/REPORT-FORMAT.md",
|
|
138
|
+
"required": true,
|
|
139
|
+
"description": "structured report template"
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
"type": "tool",
|
|
143
|
+
"name": "$HOME/.claude/skills/ftm-browse/bin/ftm-browse",
|
|
144
|
+
"required": false,
|
|
145
|
+
"description": "runtime wiring verification via browser (Phase 3)"
|
|
146
|
+
}
|
|
147
|
+
],
|
|
148
|
+
"risk": {
|
|
149
|
+
"level": "medium_write",
|
|
150
|
+
"scope": "modifies source files to fix wiring issues (auto-fix layer); also adds/removes imports and route registrations; reads codebase broadly",
|
|
151
|
+
"rollback": "git checkout on auto-fixed files; all changes are tracked in the changelog report before being applied"
|
|
152
|
+
},
|
|
153
|
+
"approval_gates": [
|
|
154
|
+
{
|
|
155
|
+
"trigger": "auto-fix proposed for a finding",
|
|
156
|
+
"action": "report proposed change before applying (show \"Proposed: ...\" format)"
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
"trigger": "finding flagged MANUAL_INTERVENTION_NEEDED",
|
|
160
|
+
"action": "surface to user with suggested action, do not auto-fix"
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
"trigger": "re-verification still fails after 3 iterations",
|
|
164
|
+
"action": "stop and report remaining issues to user"
|
|
165
|
+
}
|
|
166
|
+
],
|
|
167
|
+
"complexity_routing": {
|
|
168
|
+
"micro": "auto",
|
|
169
|
+
"small": "auto",
|
|
170
|
+
"medium": "plan_first",
|
|
171
|
+
"large": "plan_first",
|
|
172
|
+
"xl": "always_ask"
|
|
173
|
+
},
|
|
174
|
+
"fallbacks": [
|
|
175
|
+
{
|
|
176
|
+
"condition": "knip not installed and npx unavailable",
|
|
177
|
+
"action": "skip Layer 1, run Layer 2 adversarial audit only"
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
"condition": "no package.json found",
|
|
181
|
+
"action": "skip knip entirely, run adversarial audit only"
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
"condition": "ftm-browse not installed",
|
|
185
|
+
"action": "skip Phase 3 runtime wiring check, log reason and continue"
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
"condition": "dev server not running",
|
|
189
|
+
"action": "skip Phase 3 runtime wiring check, log reason and continue"
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
"condition": "wiring contracts absent",
|
|
193
|
+
"action": "run pure Layer 1 + Layer 2 analysis without contract checking"
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
"condition": "project has no identifiable entry point",
|
|
197
|
+
"action": "skip knip, run adversarial audit only"
|
|
198
|
+
}
|
|
199
|
+
],
|
|
200
|
+
"capabilities": [
|
|
201
|
+
{
|
|
202
|
+
"type": "cli",
|
|
203
|
+
"name": "knip",
|
|
204
|
+
"required": false,
|
|
205
|
+
"description": "dead code detection via npx knip"
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
"type": "cli",
|
|
209
|
+
"name": "node",
|
|
210
|
+
"required": true,
|
|
211
|
+
"description": "JavaScript runtime for npx"
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
"type": "cli",
|
|
215
|
+
"name": "$HOME/.claude/skills/ftm-browse/bin/ftm-browse",
|
|
216
|
+
"required": false,
|
|
217
|
+
"description": "headless browser for runtime wiring"
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
"type": "mcp",
|
|
221
|
+
"name": "git",
|
|
222
|
+
"required": false,
|
|
223
|
+
"description": "diff scope for Layer 2 adversarial audit"
|
|
224
|
+
}
|
|
225
|
+
],
|
|
226
|
+
"event_payloads": {
|
|
227
|
+
"audit_complete": [
|
|
228
|
+
{
|
|
229
|
+
"field": "skill",
|
|
230
|
+
"type": "string",
|
|
231
|
+
"description": "\"ftm-audit\""
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
"field": "findings_count",
|
|
235
|
+
"type": "number",
|
|
236
|
+
"description": "total issues found across all layers"
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
"field": "auto_fixed_count",
|
|
240
|
+
"type": "number",
|
|
241
|
+
"description": "issues auto-remediated by Layer 3"
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
"field": "manual_count",
|
|
245
|
+
"type": "number",
|
|
246
|
+
"description": "issues requiring manual intervention"
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
"field": "scope",
|
|
250
|
+
"type": "string[]",
|
|
251
|
+
"description": "file paths audited"
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
"field": "duration_ms",
|
|
255
|
+
"type": "number",
|
|
256
|
+
"description": "total audit duration"
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
"field": "layers_run",
|
|
260
|
+
"type": "string[]",
|
|
261
|
+
"description": "which layers executed (e.g., [\"layer1\", \"layer2\", \"layer3\"])"
|
|
262
|
+
}
|
|
263
|
+
],
|
|
264
|
+
"issue_found": [
|
|
265
|
+
{
|
|
266
|
+
"field": "skill",
|
|
267
|
+
"type": "string",
|
|
268
|
+
"description": "\"ftm-audit\""
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
"field": "layer",
|
|
272
|
+
"type": "string",
|
|
273
|
+
"description": "\"layer1\" | \"layer2\" | \"layer3\""
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
"field": "dimension",
|
|
277
|
+
"type": "string",
|
|
278
|
+
"description": "D1 | D2 | D3 | D4 | D5 (for Layer 2 findings)"
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
"field": "finding_type",
|
|
282
|
+
"type": "string",
|
|
283
|
+
"description": "exports | types | duplicates | UNWIRED_COMPONENT | etc."
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
"field": "file_path",
|
|
287
|
+
"type": "string",
|
|
288
|
+
"description": "affected file"
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
"field": "symbol",
|
|
292
|
+
"type": "string",
|
|
293
|
+
"description": "affected symbol name"
|
|
294
|
+
},
|
|
295
|
+
{
|
|
296
|
+
"field": "severity",
|
|
297
|
+
"type": "string",
|
|
298
|
+
"description": "CRITICAL | HIGH | MEDIUM | LOW"
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
"field": "auto_fixable",
|
|
302
|
+
"type": "boolean",
|
|
303
|
+
"description": "whether Layer 3 can fix this automatically"
|
|
304
|
+
}
|
|
305
|
+
],
|
|
306
|
+
"task_completed": [
|
|
307
|
+
{
|
|
308
|
+
"field": "skill",
|
|
309
|
+
"type": "string",
|
|
310
|
+
"description": "\"ftm-audit\""
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
"field": "result",
|
|
314
|
+
"type": "string",
|
|
315
|
+
"description": "\"pass\" | \"pass_with_fixes\" | \"fail\""
|
|
316
|
+
},
|
|
317
|
+
{
|
|
318
|
+
"field": "findings_count",
|
|
319
|
+
"type": "number",
|
|
320
|
+
"description": "total findings"
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
"field": "auto_fixed_count",
|
|
324
|
+
"type": "number",
|
|
325
|
+
"description": "auto-remediated count"
|
|
326
|
+
},
|
|
327
|
+
{
|
|
328
|
+
"field": "manual_count",
|
|
329
|
+
"type": "number",
|
|
330
|
+
"description": "manual intervention needed"
|
|
331
|
+
}
|
|
332
|
+
]
|
|
333
|
+
},
|
|
334
|
+
"references": [],
|
|
335
|
+
"has_evals": false,
|
|
336
|
+
"warnings": [],
|
|
337
|
+
"size_bytes": 11433,
|
|
338
|
+
"enabled": true
|
|
339
|
+
},
|
|
340
|
+
{
|
|
341
|
+
"name": "ftm-brainstorm",
|
|
342
|
+
"description": "Research-powered Socratic brainstorming that dispatches parallel agents to search the web and GitHub for real-world patterns, then synthesizes findings into actionable suggestions with citations. Use this skill whenever the user wants to brainstorm, explore ideas, think through a feature, plan a project, or flesh out a concept before building. Also triggers when the user pastes a large block of text (notes, prior brainstorm, meeting transcript, spec draft, stream-of-consciousness dump) and wants to turn it into something buildable — phrases like \"help me build this\", \"turn this into a plan\", \"here's what I've been thinking\", or just a big paste followed by \"what do you think?\" or \"go\". Triggers on \"brainstorm\", \"help me think through\", \"I have an idea for\", \"how should I approach\", \"let's explore\", \"what if we built\", \"I'm thinking about\", \"help me figure out\", or any conversation where the user has a concept they want to develop before writing code. Even vague ideas like \"I want to build something that...\" or \"what's the best way to...\" should trigger this skill.",
|
|
343
|
+
"trigger_file": "ftm-brainstorm.yml",
|
|
344
|
+
"skill_directory": "ftm-brainstorm/",
|
|
345
|
+
"events_emits": [
|
|
346
|
+
"plan_generated",
|
|
347
|
+
"task_completed"
|
|
348
|
+
],
|
|
349
|
+
"events_listens": [
|
|
350
|
+
"task_received",
|
|
351
|
+
"research_complete"
|
|
352
|
+
],
|
|
353
|
+
"blackboard_reads": [
|
|
354
|
+
"~/.claude/ftm-state/blackboard/context.json",
|
|
355
|
+
"~/.claude/ftm-state/blackboard/experiences/index.json",
|
|
356
|
+
"~/.claude/ftm-state/blackboard/patterns.json"
|
|
357
|
+
],
|
|
358
|
+
"blackboard_writes": [
|
|
359
|
+
"~/.claude/ftm-state/blackboard/context.json",
|
|
360
|
+
"~/.claude/ftm-state/blackboard/experiences/YYYY-MM-DD_task-slug.json"
|
|
361
|
+
],
|
|
362
|
+
"requirements": [
|
|
363
|
+
{
|
|
364
|
+
"type": "config",
|
|
365
|
+
"name": "~/.claude/ftm-config.yml",
|
|
366
|
+
"required": false,
|
|
367
|
+
"description": "model profile for planning agents"
|
|
368
|
+
},
|
|
369
|
+
{
|
|
370
|
+
"type": "reference",
|
|
371
|
+
"name": "references/agent-prompts.md",
|
|
372
|
+
"required": true,
|
|
373
|
+
"description": "research agent prompt templates"
|
|
374
|
+
},
|
|
375
|
+
{
|
|
376
|
+
"type": "reference",
|
|
377
|
+
"name": "references/plan-template.md",
|
|
378
|
+
"required": true,
|
|
379
|
+
"description": "plan document generation template"
|
|
380
|
+
},
|
|
381
|
+
{
|
|
382
|
+
"type": "reference",
|
|
383
|
+
"name": "~/.claude/ftm-state/blackboard/context.json",
|
|
384
|
+
"required": false,
|
|
385
|
+
"description": "session state and active constraints"
|
|
386
|
+
},
|
|
387
|
+
{
|
|
388
|
+
"type": "reference",
|
|
389
|
+
"name": "~/.claude/ftm-state/blackboard/experiences/index.json",
|
|
390
|
+
"required": false,
|
|
391
|
+
"description": "past brainstorm lessons"
|
|
392
|
+
},
|
|
393
|
+
{
|
|
394
|
+
"type": "reference",
|
|
395
|
+
"name": "~/.claude/ftm-state/blackboard/patterns.json",
|
|
396
|
+
"required": false,
|
|
397
|
+
"description": "execution and user behavior patterns"
|
|
398
|
+
}
|
|
399
|
+
],
|
|
400
|
+
"risk": {
|
|
401
|
+
"level": "low_write",
|
|
402
|
+
"scope": "writes plan documents to ~/.claude/plans/; writes blackboard context and experience files; does not modify project source code",
|
|
403
|
+
"rollback": "delete generated plan file; blackboard writes can be reverted by editing JSON files"
|
|
404
|
+
},
|
|
405
|
+
"approval_gates": [
|
|
406
|
+
{
|
|
407
|
+
"trigger": "Phase 3 plan generation ready",
|
|
408
|
+
"action": "present \"Here's what I think we've landed on\" summary and wait for explicit user approval before generating plan"
|
|
409
|
+
},
|
|
410
|
+
{
|
|
411
|
+
"trigger": "plan document generated",
|
|
412
|
+
"action": "present plan incrementally (vision → tasks → agents/waves) and get approval at each step"
|
|
413
|
+
},
|
|
414
|
+
{
|
|
415
|
+
"trigger": "research returns thin results on all agents",
|
|
416
|
+
"action": "note research gaps, present fewer suggestions, do not fabricate citations"
|
|
417
|
+
}
|
|
418
|
+
],
|
|
419
|
+
"complexity_routing": {
|
|
420
|
+
"micro": "auto",
|
|
421
|
+
"small": "auto",
|
|
422
|
+
"medium": "plan_first",
|
|
423
|
+
"large": "plan_first",
|
|
424
|
+
"xl": "always_ask"
|
|
425
|
+
},
|
|
426
|
+
"fallbacks": [
|
|
427
|
+
{
|
|
428
|
+
"condition": "ftm-researcher not available",
|
|
429
|
+
"action": "dispatch 3 direct parallel research agents (web/github/competitive) using built-in prompts from references/agent-prompts.md"
|
|
430
|
+
},
|
|
431
|
+
{
|
|
432
|
+
"condition": "no git repo detected in Phase 0",
|
|
433
|
+
"action": "skip repo scan, ask about tech stack during intake"
|
|
434
|
+
},
|
|
435
|
+
{
|
|
436
|
+
"condition": "blackboard missing or empty",
|
|
437
|
+
"action": "proceed without experience-informed shortcuts, rely on direct analysis"
|
|
438
|
+
},
|
|
439
|
+
{
|
|
440
|
+
"condition": "ftm-config.yml missing",
|
|
441
|
+
"action": "use session default model for all agents"
|
|
442
|
+
}
|
|
443
|
+
],
|
|
444
|
+
"capabilities": [
|
|
445
|
+
{
|
|
446
|
+
"type": "mcp",
|
|
447
|
+
"name": "WebSearch",
|
|
448
|
+
"required": false,
|
|
449
|
+
"description": "web research agents use for blog posts and case studies"
|
|
450
|
+
},
|
|
451
|
+
{
|
|
452
|
+
"type": "mcp",
|
|
453
|
+
"name": "WebFetch",
|
|
454
|
+
"required": false,
|
|
455
|
+
"description": "GitHub exploration and competitive analysis"
|
|
456
|
+
},
|
|
457
|
+
{
|
|
458
|
+
"type": "mcp",
|
|
459
|
+
"name": "sequential-thinking",
|
|
460
|
+
"required": false,
|
|
461
|
+
"description": "complex trade-off analysis during synthesis"
|
|
462
|
+
}
|
|
463
|
+
],
|
|
464
|
+
"event_payloads": {
|
|
465
|
+
"plan_generated": [
|
|
466
|
+
{
|
|
467
|
+
"field": "skill",
|
|
468
|
+
"type": "string",
|
|
469
|
+
"description": "\"ftm-brainstorm\""
|
|
470
|
+
},
|
|
471
|
+
{
|
|
472
|
+
"field": "plan_path",
|
|
473
|
+
"type": "string",
|
|
474
|
+
"description": "absolute path to generated plan file"
|
|
475
|
+
},
|
|
476
|
+
{
|
|
477
|
+
"field": "plan_title",
|
|
478
|
+
"type": "string",
|
|
479
|
+
"description": "human-readable plan title"
|
|
480
|
+
},
|
|
481
|
+
{
|
|
482
|
+
"field": "task_count",
|
|
483
|
+
"type": "number",
|
|
484
|
+
"description": "total tasks in the plan"
|
|
485
|
+
},
|
|
486
|
+
{
|
|
487
|
+
"field": "wave_count",
|
|
488
|
+
"type": "number",
|
|
489
|
+
"description": "number of parallel execution waves"
|
|
490
|
+
}
|
|
491
|
+
],
|
|
492
|
+
"task_completed": [
|
|
493
|
+
{
|
|
494
|
+
"field": "skill",
|
|
495
|
+
"type": "string",
|
|
496
|
+
"description": "\"ftm-brainstorm\""
|
|
497
|
+
},
|
|
498
|
+
{
|
|
499
|
+
"field": "task_title",
|
|
500
|
+
"type": "string",
|
|
501
|
+
"description": "title of the brainstorm topic"
|
|
502
|
+
},
|
|
503
|
+
{
|
|
504
|
+
"field": "duration_ms",
|
|
505
|
+
"type": "number",
|
|
506
|
+
"description": "total session duration"
|
|
507
|
+
}
|
|
508
|
+
]
|
|
509
|
+
},
|
|
510
|
+
"references": [
|
|
511
|
+
"agent-prompts.md",
|
|
512
|
+
"plan-template.md"
|
|
513
|
+
],
|
|
514
|
+
"has_evals": true,
|
|
515
|
+
"warnings": [],
|
|
516
|
+
"size_bytes": 21640,
|
|
517
|
+
"enabled": true
|
|
518
|
+
},
|
|
519
|
+
{
|
|
520
|
+
"name": "ftm-browse",
|
|
521
|
+
"description": "Headless browser daemon for visual verification and web interaction. Gives agents the ability to navigate, screenshot, click, fill forms, and inspect ARIA trees via CLI commands. Use when user says \"browse\", \"screenshot\", \"visual\", \"look at the app\", \"open browser\", \"check the page\", \"navigate to\", \"take a screenshot\", \"visual verification\".",
|
|
522
|
+
"trigger_file": "ftm-browse.yml",
|
|
523
|
+
"skill_directory": "ftm-browse/",
|
|
524
|
+
"events_emits": [
|
|
525
|
+
"task_completed"
|
|
526
|
+
],
|
|
527
|
+
"events_listens": [],
|
|
528
|
+
"blackboard_reads": [],
|
|
529
|
+
"blackboard_writes": [],
|
|
530
|
+
"requirements": [
|
|
531
|
+
{
|
|
532
|
+
"type": "tool",
|
|
533
|
+
"name": "$HOME/.claude/skills/ftm-browse/bin/ftm-browse",
|
|
534
|
+
"required": true,
|
|
535
|
+
"description": "headless browser CLI binary"
|
|
536
|
+
},
|
|
537
|
+
{
|
|
538
|
+
"type": "tool",
|
|
539
|
+
"name": "npx playwright install chromium",
|
|
540
|
+
"required": true,
|
|
541
|
+
"description": "Chromium browser engine (first-time setup)"
|
|
542
|
+
}
|
|
543
|
+
],
|
|
544
|
+
"risk": {
|
|
545
|
+
"level": "low_write",
|
|
546
|
+
"scope": "navigates browser, takes screenshots saved to ~/.ftm-browse/screenshots/; does not modify project source files; form fills and clicks can have side effects on the target application",
|
|
547
|
+
"rollback": "no project file mutations; browser interactions on local dev servers are typically reversible by reloading"
|
|
548
|
+
},
|
|
549
|
+
"approval_gates": [
|
|
550
|
+
{
|
|
551
|
+
"trigger": "auth redirect detected during supervised execution",
|
|
552
|
+
"action": "STOP immediately, present options (retry/skip/abort/manual), wait for user choice"
|
|
553
|
+
},
|
|
554
|
+
{
|
|
555
|
+
"trigger": "unexpected browser state during plan step",
|
|
556
|
+
"action": "STOP, take screenshot, present situation to user, wait for explicit choice"
|
|
557
|
+
},
|
|
558
|
+
{
|
|
559
|
+
"trigger": "supervised mode enabled AND state mismatch detected",
|
|
560
|
+
"action": "halt and report before proceeding"
|
|
561
|
+
}
|
|
562
|
+
],
|
|
563
|
+
"complexity_routing": {
|
|
564
|
+
"micro": "auto",
|
|
565
|
+
"small": "auto",
|
|
566
|
+
"medium": "auto",
|
|
567
|
+
"large": "auto",
|
|
568
|
+
"xl": "auto"
|
|
569
|
+
},
|
|
570
|
+
"fallbacks": [
|
|
571
|
+
{
|
|
572
|
+
"condition": "daemon binary not found at expected path",
|
|
573
|
+
"action": "report installation instructions and stop"
|
|
574
|
+
},
|
|
575
|
+
{
|
|
576
|
+
"condition": "Chromium not installed",
|
|
577
|
+
"action": "instruct user to run \"npx playwright install chromium\" and stop"
|
|
578
|
+
},
|
|
579
|
+
{
|
|
580
|
+
"condition": "daemon fails to start within 10 seconds",
|
|
581
|
+
"action": "check ~/.ftm-browse/ logs, report binary or Bun issue"
|
|
582
|
+
},
|
|
583
|
+
{
|
|
584
|
+
"condition": "dev server not running when navigating to localhost",
|
|
585
|
+
"action": "report timeout error with the URL attempted"
|
|
586
|
+
},
|
|
587
|
+
{
|
|
588
|
+
"condition": "stale ref after navigation",
|
|
589
|
+
"action": "re-run snapshot -i before retrying click/fill"
|
|
590
|
+
}
|
|
591
|
+
],
|
|
592
|
+
"capabilities": [
|
|
593
|
+
{
|
|
594
|
+
"type": "cli",
|
|
595
|
+
"name": "$HOME/.claude/skills/ftm-browse/bin/ftm-browse",
|
|
596
|
+
"required": true,
|
|
597
|
+
"description": "headless Chromium control CLI"
|
|
598
|
+
}
|
|
599
|
+
],
|
|
600
|
+
"event_payloads": {
|
|
601
|
+
"task_completed": [
|
|
602
|
+
{
|
|
603
|
+
"field": "skill",
|
|
604
|
+
"type": "string",
|
|
605
|
+
"description": "\"ftm-browse\""
|
|
606
|
+
},
|
|
607
|
+
{
|
|
608
|
+
"field": "workflow",
|
|
609
|
+
"type": "string",
|
|
610
|
+
"description": "description of the visual verification or interaction performed"
|
|
611
|
+
},
|
|
612
|
+
{
|
|
613
|
+
"field": "screenshots",
|
|
614
|
+
"type": "string[]",
|
|
615
|
+
"description": "absolute paths to screenshots taken"
|
|
616
|
+
},
|
|
617
|
+
{
|
|
618
|
+
"field": "duration_ms",
|
|
619
|
+
"type": "number",
|
|
620
|
+
"description": "total workflow duration"
|
|
621
|
+
}
|
|
622
|
+
]
|
|
623
|
+
},
|
|
624
|
+
"references": [],
|
|
625
|
+
"has_evals": false,
|
|
626
|
+
"warnings": [],
|
|
627
|
+
"size_bytes": 17411,
|
|
628
|
+
"enabled": true
|
|
629
|
+
},
|
|
630
|
+
{
|
|
631
|
+
"name": "ftm-capture",
|
|
632
|
+
"description": "Extract reusable routines, playbooks, and reference docs from the current session's work. Reads session context (blackboard, daily log, tool history), asks clarifying questions about generalizability, then writes to all three ftm knowledge layers. Use when user says \"capture this\", \"save this as a routine\", \"make a playbook from this\", \"ftm capture\", \"codify this\", \"turn this into a routine\", \"extract the pattern\", \"save what we did\", \"learn from this\", \"remember how to do this\", \"don't make me explain this again\".",
|
|
633
|
+
"trigger_file": "ftm-capture.yml",
|
|
634
|
+
"skill_directory": "ftm-capture/",
|
|
635
|
+
"events_emits": [
|
|
636
|
+
"capture_complete",
|
|
637
|
+
"experience_recorded",
|
|
638
|
+
"known_issue_recorded"
|
|
639
|
+
],
|
|
640
|
+
"events_listens": [
|
|
641
|
+
"task_completed",
|
|
642
|
+
"pattern_discovered"
|
|
643
|
+
],
|
|
644
|
+
"blackboard_reads": [],
|
|
645
|
+
"blackboard_writes": [],
|
|
646
|
+
"requirements": [
|
|
647
|
+
{
|
|
648
|
+
"type": "reference",
|
|
649
|
+
"name": "~/.claude/ftm-state/blackboard/context.json",
|
|
650
|
+
"required": true,
|
|
651
|
+
"description": "current task and recent decisions for pattern extraction"
|
|
652
|
+
},
|
|
653
|
+
{
|
|
654
|
+
"type": "reference",
|
|
655
|
+
"name": "~/.claude/eng-buddy/daily/{today}.md",
|
|
656
|
+
"required": false,
|
|
657
|
+
"description": "daily log for completed items and tool calls"
|
|
658
|
+
},
|
|
659
|
+
{
|
|
660
|
+
"type": "reference",
|
|
661
|
+
"name": "~/.claude/ftm-state/blackboard/experiences/index.json",
|
|
662
|
+
"required": true,
|
|
663
|
+
"description": "today's session experiences"
|
|
664
|
+
},
|
|
665
|
+
{
|
|
666
|
+
"type": "reference",
|
|
667
|
+
"name": "~/.ftm/routines/",
|
|
668
|
+
"required": false,
|
|
669
|
+
"description": "check for existing routines before creating new one"
|
|
670
|
+
},
|
|
671
|
+
{
|
|
672
|
+
"type": "reference",
|
|
673
|
+
"name": "~/.claude/eng-buddy/playbooks/",
|
|
674
|
+
"required": false,
|
|
675
|
+
"description": "check for existing playbooks before creating"
|
|
676
|
+
},
|
|
677
|
+
{
|
|
678
|
+
"type": "reference",
|
|
679
|
+
"name": "~/Documents/Code/panda/docs/playbooks/",
|
|
680
|
+
"required": false,
|
|
681
|
+
"description": "check for existing reference docs before creating"
|
|
682
|
+
}
|
|
683
|
+
],
|
|
684
|
+
"risk": {
|
|
685
|
+
"level": "low_write",
|
|
686
|
+
"scope": "writes YAML routine to ~/.ftm/routines/, JSON playbook to ~/.claude/eng-buddy/playbooks/, and Markdown reference doc to ~/Documents/Code/panda/docs/playbooks/; writes experience to blackboard; does not modify project source code",
|
|
687
|
+
"rollback": "delete the three written artifact files; remove experience entry from blackboard experiences/"
|
|
688
|
+
},
|
|
689
|
+
"approval_gates": [
|
|
690
|
+
{
|
|
691
|
+
"trigger": "existing artifact found for this workflow name",
|
|
692
|
+
"action": "show existing vs new content, ask user to confirm update or create new version"
|
|
693
|
+
},
|
|
694
|
+
{
|
|
695
|
+
"trigger": "Step 3 clarifying questions answered",
|
|
696
|
+
"action": "proceed to write all three artifacts automatically (no additional gate)"
|
|
697
|
+
}
|
|
698
|
+
],
|
|
699
|
+
"complexity_routing": {
|
|
700
|
+
"micro": "auto",
|
|
701
|
+
"small": "auto",
|
|
702
|
+
"medium": "auto",
|
|
703
|
+
"large": "auto",
|
|
704
|
+
"xl": "auto"
|
|
705
|
+
},
|
|
706
|
+
"fallbacks": [
|
|
707
|
+
{
|
|
708
|
+
"condition": "blackboard context.json missing",
|
|
709
|
+
"action": "ask user directly about the workflow to capture instead of reading from blackboard"
|
|
710
|
+
},
|
|
711
|
+
{
|
|
712
|
+
"condition": "daily log missing or empty",
|
|
713
|
+
"action": "skip daily log extraction, rely on conversation context and blackboard experiences"
|
|
714
|
+
},
|
|
715
|
+
{
|
|
716
|
+
"condition": "~/.ftm/routines/ directory doesn't exist",
|
|
717
|
+
"action": "create directory before writing routine"
|
|
718
|
+
},
|
|
719
|
+
{
|
|
720
|
+
"condition": "docs/playbooks/ directory doesn't exist",
|
|
721
|
+
"action": "create directory before writing reference doc"
|
|
722
|
+
},
|
|
723
|
+
{
|
|
724
|
+
"condition": "existing artifact found but cannot be parsed",
|
|
725
|
+
"action": "treat as missing, create fresh artifact"
|
|
726
|
+
}
|
|
727
|
+
],
|
|
728
|
+
"capabilities": [],
|
|
729
|
+
"event_payloads": {
|
|
730
|
+
"capture_complete": [
|
|
731
|
+
{
|
|
732
|
+
"field": "skill",
|
|
733
|
+
"type": "string",
|
|
734
|
+
"description": "\"ftm-capture\""
|
|
735
|
+
},
|
|
736
|
+
{
|
|
737
|
+
"field": "workflow_name",
|
|
738
|
+
"type": "string",
|
|
739
|
+
"description": "kebab-case name of captured workflow"
|
|
740
|
+
},
|
|
741
|
+
{
|
|
742
|
+
"field": "routine_path",
|
|
743
|
+
"type": "string",
|
|
744
|
+
"description": "absolute path to written routine YAML"
|
|
745
|
+
},
|
|
746
|
+
{
|
|
747
|
+
"field": "playbook_path",
|
|
748
|
+
"type": "string",
|
|
749
|
+
"description": "absolute path to written playbook JSON"
|
|
750
|
+
},
|
|
751
|
+
{
|
|
752
|
+
"field": "reference_path",
|
|
753
|
+
"type": "string",
|
|
754
|
+
"description": "absolute path to written reference doc"
|
|
755
|
+
},
|
|
756
|
+
{
|
|
757
|
+
"field": "phases_count",
|
|
758
|
+
"type": "number",
|
|
759
|
+
"description": "number of workflow phases captured"
|
|
760
|
+
},
|
|
761
|
+
{
|
|
762
|
+
"field": "steps_count",
|
|
763
|
+
"type": "number",
|
|
764
|
+
"description": "total steps across all phases"
|
|
765
|
+
},
|
|
766
|
+
{
|
|
767
|
+
"field": "known_issues_count",
|
|
768
|
+
"type": "number",
|
|
769
|
+
"description": "API gotchas encoded"
|
|
770
|
+
}
|
|
771
|
+
],
|
|
772
|
+
"experience_recorded": [
|
|
773
|
+
{
|
|
774
|
+
"field": "skill",
|
|
775
|
+
"type": "string",
|
|
776
|
+
"description": "\"ftm-capture\""
|
|
777
|
+
},
|
|
778
|
+
{
|
|
779
|
+
"field": "experience_path",
|
|
780
|
+
"type": "string",
|
|
781
|
+
"description": "path to written experience file"
|
|
782
|
+
},
|
|
783
|
+
{
|
|
784
|
+
"field": "workflow_name",
|
|
785
|
+
"type": "string",
|
|
786
|
+
"description": "name of captured workflow"
|
|
787
|
+
}
|
|
788
|
+
],
|
|
789
|
+
"known_issue_recorded": [
|
|
790
|
+
{
|
|
791
|
+
"field": "skill",
|
|
792
|
+
"type": "string",
|
|
793
|
+
"description": "\"ftm-capture\""
|
|
794
|
+
},
|
|
795
|
+
{
|
|
796
|
+
"field": "workflow_name",
|
|
797
|
+
"type": "string",
|
|
798
|
+
"description": "workflow this issue belongs to"
|
|
799
|
+
},
|
|
800
|
+
{
|
|
801
|
+
"field": "issue",
|
|
802
|
+
"type": "string",
|
|
803
|
+
"description": "issue name"
|
|
804
|
+
},
|
|
805
|
+
{
|
|
806
|
+
"field": "fix",
|
|
807
|
+
"type": "string",
|
|
808
|
+
"description": "remediation approach encoded"
|
|
809
|
+
}
|
|
810
|
+
]
|
|
811
|
+
},
|
|
812
|
+
"references": [],
|
|
813
|
+
"has_evals": false,
|
|
814
|
+
"warnings": [],
|
|
815
|
+
"size_bytes": 15166,
|
|
816
|
+
"enabled": true
|
|
817
|
+
},
|
|
818
|
+
{
|
|
819
|
+
"name": "ftm-codex-gate",
|
|
820
|
+
"description": "Codex CLI integration gate for adversarial code validation. Invokes codex exec --yolo --ephemeral with gpt-5.4 to form test scenarios, review code quality, fix failures, and enforce STYLE.md patterns. Use when ftm-executor needs Codex validation at wave boundaries or task completion, or when user says \"codex gate\", \"run codex\", \"validate with codex\". Not for direct user interaction — primarily auto-invoked by ftm-executor.",
|
|
821
|
+
"trigger_file": "ftm-codex-gate.yml",
|
|
822
|
+
"skill_directory": "ftm-codex-gate/",
|
|
823
|
+
"events_emits": [
|
|
824
|
+
"review_complete",
|
|
825
|
+
"issue_found",
|
|
826
|
+
"task_completed"
|
|
827
|
+
],
|
|
828
|
+
"events_listens": [
|
|
829
|
+
"code_committed"
|
|
830
|
+
],
|
|
831
|
+
"blackboard_reads": [
|
|
832
|
+
"~/.claude/ftm-state/blackboard/context.json",
|
|
833
|
+
"~/.claude/ftm-state/blackboard/experiences/index.json",
|
|
834
|
+
"~/.claude/ftm-state/blackboard/patterns.json"
|
|
835
|
+
],
|
|
836
|
+
"blackboard_writes": [
|
|
837
|
+
"~/.claude/ftm-state/blackboard/context.json",
|
|
838
|
+
"~/.claude/ftm-state/blackboard/experiences/YYYY-MM-DD_task-slug.json",
|
|
839
|
+
"~/.claude/ftm-state/blackboard/experiences/index.json"
|
|
840
|
+
],
|
|
841
|
+
"requirements": [
|
|
842
|
+
{
|
|
843
|
+
"type": "tool",
|
|
844
|
+
"name": "codex",
|
|
845
|
+
"required": true,
|
|
846
|
+
"description": "OpenAI Codex CLI for adversarial validation"
|
|
847
|
+
},
|
|
848
|
+
{
|
|
849
|
+
"type": "reference",
|
|
850
|
+
"name": "{project_root}/INTENT.md",
|
|
851
|
+
"required": false,
|
|
852
|
+
"description": "root intent documentation for conflict detection"
|
|
853
|
+
},
|
|
854
|
+
{
|
|
855
|
+
"type": "reference",
|
|
856
|
+
"name": "{project_root}/STYLE.md",
|
|
857
|
+
"required": false,
|
|
858
|
+
"description": "code style standards for quality enforcement"
|
|
859
|
+
},
|
|
860
|
+
{
|
|
861
|
+
"type": "reference",
|
|
862
|
+
"name": "~/.claude/ftm-state/blackboard/context.json",
|
|
863
|
+
"required": false,
|
|
864
|
+
"description": "session state"
|
|
865
|
+
},
|
|
866
|
+
{
|
|
867
|
+
"type": "reference",
|
|
868
|
+
"name": "~/.claude/ftm-state/blackboard/experiences/index.json",
|
|
869
|
+
"required": false,
|
|
870
|
+
"description": "prior validation patterns"
|
|
871
|
+
}
|
|
872
|
+
],
|
|
873
|
+
"risk": {
|
|
874
|
+
"level": "medium_write",
|
|
875
|
+
"scope": "Codex modifies source files and commits fixes directly in the project working directory (--yolo mode); writes entries to DEBUG.md; writes structured output to /tmp/codex-result-*.md",
|
|
876
|
+
"rollback": "git revert codex fix commits; delete /tmp/codex-result-*.md cleanup is automatic"
|
|
877
|
+
},
|
|
878
|
+
"approval_gates": [
|
|
879
|
+
{
|
|
880
|
+
"trigger": "codex gate returns PASS_WITH_FIXES and INTENT.md conflict detected",
|
|
881
|
+
"action": "auto-invoke ftm-council for arbitration before accepting or reverting the fix"
|
|
882
|
+
},
|
|
883
|
+
{
|
|
884
|
+
"trigger": "codex gate returns FAIL after 2 fix attempts",
|
|
885
|
+
"action": "report remaining issues to ftm-executor caller, wait for direction"
|
|
886
|
+
},
|
|
887
|
+
{
|
|
888
|
+
"trigger": "codex CLI not found",
|
|
889
|
+
"action": "return FAIL immediately with install instructions, do not proceed"
|
|
890
|
+
}
|
|
891
|
+
],
|
|
892
|
+
"complexity_routing": {
|
|
893
|
+
"micro": "auto",
|
|
894
|
+
"small": "auto",
|
|
895
|
+
"medium": "auto",
|
|
896
|
+
"large": "auto",
|
|
897
|
+
"xl": "auto"
|
|
898
|
+
},
|
|
899
|
+
"fallbacks": [
|
|
900
|
+
{
|
|
901
|
+
"condition": "codex CLI not installed",
|
|
902
|
+
"action": "return FAIL with \"Codex CLI not found. Install with: npm install -g @openai/codex\""
|
|
903
|
+
},
|
|
904
|
+
{
|
|
905
|
+
"condition": "codex times out after 600s",
|
|
906
|
+
"action": "read partial output if available, return PARTIAL results with note; if no output, return FAIL"
|
|
907
|
+
},
|
|
908
|
+
{
|
|
909
|
+
"condition": "output file empty or missing",
|
|
910
|
+
"action": "return FAIL with \"Codex output not found — may have crashed\""
|
|
911
|
+
},
|
|
912
|
+
{
|
|
913
|
+
"condition": "INTENT.md missing at project root",
|
|
914
|
+
"action": "note in prompt to Codex and continue without INTENT validation"
|
|
915
|
+
},
|
|
916
|
+
{
|
|
917
|
+
"condition": "STYLE.md missing",
|
|
918
|
+
"action": "note in prompt to Codex and continue without style enforcement"
|
|
919
|
+
}
|
|
920
|
+
],
|
|
921
|
+
"capabilities": [
|
|
922
|
+
{
|
|
923
|
+
"type": "cli",
|
|
924
|
+
"name": "codex",
|
|
925
|
+
"required": true,
|
|
926
|
+
"description": "OpenAI Codex CLI (npm install -g @openai/codex)"
|
|
927
|
+
},
|
|
928
|
+
{
|
|
929
|
+
"type": "env",
|
|
930
|
+
"name": "OPENAI_API_KEY",
|
|
931
|
+
"required": true,
|
|
932
|
+
"description": "authentication for Codex CLI execution"
|
|
933
|
+
}
|
|
934
|
+
],
|
|
935
|
+
"event_payloads": {
|
|
936
|
+
"review_complete": [
|
|
937
|
+
{
|
|
938
|
+
"field": "skill",
|
|
939
|
+
"type": "string",
|
|
940
|
+
"description": "\"ftm-codex-gate\""
|
|
941
|
+
},
|
|
942
|
+
{
|
|
943
|
+
"field": "mode",
|
|
944
|
+
"type": "string",
|
|
945
|
+
"description": "\"wave\" | \"single-task\""
|
|
946
|
+
},
|
|
947
|
+
{
|
|
948
|
+
"field": "status",
|
|
949
|
+
"type": "string",
|
|
950
|
+
"description": "\"PASS\" | \"PASS_WITH_FIXES\" | \"FAIL\""
|
|
951
|
+
},
|
|
952
|
+
{
|
|
953
|
+
"field": "tests_formed",
|
|
954
|
+
"type": "number",
|
|
955
|
+
"description": "adversarial test scenarios generated"
|
|
956
|
+
},
|
|
957
|
+
{
|
|
958
|
+
"field": "tests_passed",
|
|
959
|
+
"type": "number",
|
|
960
|
+
"description": "test scenarios that passed"
|
|
961
|
+
},
|
|
962
|
+
{
|
|
963
|
+
"field": "fixes_applied",
|
|
964
|
+
"type": "number",
|
|
965
|
+
"description": "fixes committed by Codex"
|
|
966
|
+
},
|
|
967
|
+
{
|
|
968
|
+
"field": "quality_issues",
|
|
969
|
+
"type": "number",
|
|
970
|
+
"description": "style/quality violations found"
|
|
971
|
+
},
|
|
972
|
+
{
|
|
973
|
+
"field": "intent_conflicts",
|
|
974
|
+
"type": "number",
|
|
975
|
+
"description": "INTENT.md conflicts detected"
|
|
976
|
+
}
|
|
977
|
+
],
|
|
978
|
+
"issue_found": [
|
|
979
|
+
{
|
|
980
|
+
"field": "skill",
|
|
981
|
+
"type": "string",
|
|
982
|
+
"description": "\"ftm-codex-gate\""
|
|
983
|
+
},
|
|
984
|
+
{
|
|
985
|
+
"field": "file_path",
|
|
986
|
+
"type": "string",
|
|
987
|
+
"description": "file where issue was found"
|
|
988
|
+
},
|
|
989
|
+
{
|
|
990
|
+
"field": "description",
|
|
991
|
+
"type": "string",
|
|
992
|
+
"description": "issue description"
|
|
993
|
+
},
|
|
994
|
+
{
|
|
995
|
+
"field": "type",
|
|
996
|
+
"type": "string",
|
|
997
|
+
"description": "\"test_failure\" | \"quality_violation\" | \"intent_conflict\""
|
|
998
|
+
}
|
|
999
|
+
],
|
|
1000
|
+
"task_completed": [
|
|
1001
|
+
{
|
|
1002
|
+
"field": "skill",
|
|
1003
|
+
"type": "string",
|
|
1004
|
+
"description": "\"ftm-codex-gate\""
|
|
1005
|
+
},
|
|
1006
|
+
{
|
|
1007
|
+
"field": "status",
|
|
1008
|
+
"type": "string",
|
|
1009
|
+
"description": "\"PASS\" | \"PASS_WITH_FIXES\" | \"FAIL\""
|
|
1010
|
+
},
|
|
1011
|
+
{
|
|
1012
|
+
"field": "output_file",
|
|
1013
|
+
"type": "string",
|
|
1014
|
+
"description": "path to Codex result file"
|
|
1015
|
+
}
|
|
1016
|
+
]
|
|
1017
|
+
},
|
|
1018
|
+
"references": [],
|
|
1019
|
+
"has_evals": false,
|
|
1020
|
+
"warnings": [],
|
|
1021
|
+
"size_bytes": 13872,
|
|
1022
|
+
"enabled": true
|
|
1023
|
+
},
|
|
1024
|
+
{
|
|
1025
|
+
"name": "ftm-config",
|
|
1026
|
+
"description": "Configure ftm skill settings including model profiles, execution preferences, and defaults. Use when user says \"ftm config\", \"ftm settings\", \"set ftm profile\", \"ftm model\", or wants to change how ftm skills behave.",
|
|
1027
|
+
"trigger_file": "ftm-config.yml",
|
|
1028
|
+
"skill_directory": "ftm-config/",
|
|
1029
|
+
"events_emits": [
|
|
1030
|
+
"task_completed"
|
|
1031
|
+
],
|
|
1032
|
+
"events_listens": [],
|
|
1033
|
+
"blackboard_reads": [],
|
|
1034
|
+
"blackboard_writes": [],
|
|
1035
|
+
"requirements": [
|
|
1036
|
+
{
|
|
1037
|
+
"type": "config",
|
|
1038
|
+
"name": "~/.claude/ftm-config.yml",
|
|
1039
|
+
"required": false,
|
|
1040
|
+
"description": "main config file (created with defaults if missing)"
|
|
1041
|
+
}
|
|
1042
|
+
],
|
|
1043
|
+
"risk": {
|
|
1044
|
+
"level": "low_write",
|
|
1045
|
+
"scope": "reads and writes ~/.claude/ftm-config.yml only; backs up malformed config to ftm-config.yml.bak before overwriting; no project files touched",
|
|
1046
|
+
"rollback": "restore from ~/.claude/ftm-config.yml.bak or delete the file to reset to defaults on next invocation"
|
|
1047
|
+
},
|
|
1048
|
+
"approval_gates": [
|
|
1049
|
+
{
|
|
1050
|
+
"trigger": "reset command issued",
|
|
1051
|
+
"action": "show current config and ask \"Proceed?\" before restoring defaults"
|
|
1052
|
+
},
|
|
1053
|
+
{
|
|
1054
|
+
"trigger": "invalid model name or profile name provided",
|
|
1055
|
+
"action": "reject with clear error showing valid options, do not write"
|
|
1056
|
+
}
|
|
1057
|
+
],
|
|
1058
|
+
"complexity_routing": {
|
|
1059
|
+
"micro": "auto",
|
|
1060
|
+
"small": "auto",
|
|
1061
|
+
"medium": "auto",
|
|
1062
|
+
"large": "auto",
|
|
1063
|
+
"xl": "auto"
|
|
1064
|
+
},
|
|
1065
|
+
"fallbacks": [
|
|
1066
|
+
{
|
|
1067
|
+
"condition": "ftm-config.yml missing",
|
|
1068
|
+
"action": "create file with default balanced profile and all defaults"
|
|
1069
|
+
},
|
|
1070
|
+
{
|
|
1071
|
+
"condition": "ftm-config.yml malformed YAML",
|
|
1072
|
+
"action": "back up as ftm-config.yml.bak, create fresh default config"
|
|
1073
|
+
},
|
|
1074
|
+
{
|
|
1075
|
+
"condition": "invalid model or profile value provided",
|
|
1076
|
+
"action": "reject and show valid options without writing"
|
|
1077
|
+
}
|
|
1078
|
+
],
|
|
1079
|
+
"capabilities": [],
|
|
1080
|
+
"event_payloads": {
|
|
1081
|
+
"task_completed": [
|
|
1082
|
+
{
|
|
1083
|
+
"field": "skill",
|
|
1084
|
+
"type": "string",
|
|
1085
|
+
"description": "\"ftm-config\""
|
|
1086
|
+
},
|
|
1087
|
+
{
|
|
1088
|
+
"field": "action",
|
|
1089
|
+
"type": "string",
|
|
1090
|
+
"description": "\"display\" | \"set_profile\" | \"set_value\" | \"reset\" | \"show_profiles\" | \"show_skills\""
|
|
1091
|
+
}
|
|
1092
|
+
]
|
|
1093
|
+
},
|
|
1094
|
+
"references": [],
|
|
1095
|
+
"has_evals": false,
|
|
1096
|
+
"warnings": [],
|
|
1097
|
+
"size_bytes": 12151,
|
|
1098
|
+
"enabled": true
|
|
1099
|
+
},
|
|
1100
|
+
{
|
|
1101
|
+
"name": "ftm-council",
|
|
1102
|
+
"description": "Multi-AI deliberation council that sends problems to Claude, Codex, and Gemini as equal peers, then loops through rounds of debate until 2-of-3 agree on a decision. Use when the user wants a second (and third) opinion, says \"council this\", \"get other opinions\", \"what would other AIs think\", \"debate this\", \"multi-model\", \"ftm-council\", or wants to cross-check a decision, architecture choice, debugging approach, or any problem where diverse AI perspectives would reduce blind spots. Especially valuable for debugging hard problems, architecture decisions, code review, and any situation where confirmation bias from a single model is a risk. Even if the user just says \"I'm not sure about this approach\" or \"sanity check this\", consider invoking the council.",
|
|
1103
|
+
"trigger_file": "ftm-council.yml",
|
|
1104
|
+
"skill_directory": "ftm-council/",
|
|
1105
|
+
"events_emits": [
|
|
1106
|
+
"review_complete",
|
|
1107
|
+
"task_completed"
|
|
1108
|
+
],
|
|
1109
|
+
"events_listens": [],
|
|
1110
|
+
"blackboard_reads": [
|
|
1111
|
+
"~/.claude/ftm-state/blackboard/context.json",
|
|
1112
|
+
"~/.claude/ftm-state/blackboard/experiences/index.json",
|
|
1113
|
+
"~/.claude/ftm-state/blackboard/patterns.json"
|
|
1114
|
+
],
|
|
1115
|
+
"blackboard_writes": [
|
|
1116
|
+
"~/.claude/ftm-state/blackboard/context.json",
|
|
1117
|
+
"~/.claude/ftm-state/blackboard/experiences/YYYY-MM-DD_task-slug.json",
|
|
1118
|
+
"~/.claude/ftm-state/blackboard/experiences/index.json"
|
|
1119
|
+
],
|
|
1120
|
+
"requirements": [
|
|
1121
|
+
{
|
|
1122
|
+
"type": "tool",
|
|
1123
|
+
"name": "codex",
|
|
1124
|
+
"required": true,
|
|
1125
|
+
"description": "Codex CLI for independent peer investigation"
|
|
1126
|
+
},
|
|
1127
|
+
{
|
|
1128
|
+
"type": "tool",
|
|
1129
|
+
"name": "gemini",
|
|
1130
|
+
"required": true,
|
|
1131
|
+
"description": "Gemini CLI for independent peer investigation"
|
|
1132
|
+
},
|
|
1133
|
+
{
|
|
1134
|
+
"type": "reference",
|
|
1135
|
+
"name": "references/protocols/PREREQUISITES.md",
|
|
1136
|
+
"required": true,
|
|
1137
|
+
"description": "availability check, fallback logic, timeout config"
|
|
1138
|
+
},
|
|
1139
|
+
{
|
|
1140
|
+
"type": "reference",
|
|
1141
|
+
"name": "references/protocols/STEP-0-FRAMING.md",
|
|
1142
|
+
"required": true,
|
|
1143
|
+
"description": "problem framing format"
|
|
1144
|
+
},
|
|
1145
|
+
{
|
|
1146
|
+
"type": "reference",
|
|
1147
|
+
"name": "references/prompts/CLAUDE-INVESTIGATION.md",
|
|
1148
|
+
"required": true,
|
|
1149
|
+
"description": "Claude investigation prompt template"
|
|
1150
|
+
},
|
|
1151
|
+
{
|
|
1152
|
+
"type": "reference",
|
|
1153
|
+
"name": "references/prompts/CODEX-INVESTIGATION.md",
|
|
1154
|
+
"required": true,
|
|
1155
|
+
"description": "Codex investigation prompt template"
|
|
1156
|
+
},
|
|
1157
|
+
{
|
|
1158
|
+
"type": "reference",
|
|
1159
|
+
"name": "references/prompts/GEMINI-INVESTIGATION.md",
|
|
1160
|
+
"required": true,
|
|
1161
|
+
"description": "Gemini investigation prompt template"
|
|
1162
|
+
},
|
|
1163
|
+
{
|
|
1164
|
+
"type": "reference",
|
|
1165
|
+
"name": "references/prompts/REBUTTAL-TEMPLATE.md",
|
|
1166
|
+
"required": true,
|
|
1167
|
+
"description": "rebuttal round prompt template"
|
|
1168
|
+
},
|
|
1169
|
+
{
|
|
1170
|
+
"type": "reference",
|
|
1171
|
+
"name": "~/.claude/ftm-state/blackboard/context.json",
|
|
1172
|
+
"required": false,
|
|
1173
|
+
"description": "session state"
|
|
1174
|
+
}
|
|
1175
|
+
],
|
|
1176
|
+
"risk": {
|
|
1177
|
+
"level": "read_only",
|
|
1178
|
+
"scope": "reads codebase for independent investigation; does not modify source files; writes blackboard experience after verdict",
|
|
1179
|
+
"rollback": "no source mutations; blackboard write can be reverted by editing JSON files"
|
|
1180
|
+
},
|
|
1181
|
+
"approval_gates": [
|
|
1182
|
+
{
|
|
1183
|
+
"trigger": "council prompt framed in Step 0",
|
|
1184
|
+
"action": "show framed prompt to user and wait for confirmation before dispatching to council"
|
|
1185
|
+
},
|
|
1186
|
+
{
|
|
1187
|
+
"trigger": "2-of-3 majority reached",
|
|
1188
|
+
"action": "present verdict summary to user and ask if they want to proceed or dig into dissent"
|
|
1189
|
+
},
|
|
1190
|
+
{
|
|
1191
|
+
"trigger": "auto-invocation by ftm-executor (INTENT.md conflict)",
|
|
1192
|
+
"action": "skip user framing confirmation, run immediately and return structured COUNCIL VERDICT to caller"
|
|
1193
|
+
}
|
|
1194
|
+
],
|
|
1195
|
+
"complexity_routing": {
|
|
1196
|
+
"micro": "auto",
|
|
1197
|
+
"small": "auto",
|
|
1198
|
+
"medium": "auto",
|
|
1199
|
+
"large": "auto",
|
|
1200
|
+
"xl": "auto"
|
|
1201
|
+
},
|
|
1202
|
+
"fallbacks": [
|
|
1203
|
+
{
|
|
1204
|
+
"condition": "codex CLI not found",
|
|
1205
|
+
"action": "report missing dependency with install instructions and stop (do not run degraded council)"
|
|
1206
|
+
},
|
|
1207
|
+
{
|
|
1208
|
+
"condition": "gemini CLI not found",
|
|
1209
|
+
"action": "report missing dependency with install instructions and stop"
|
|
1210
|
+
},
|
|
1211
|
+
{
|
|
1212
|
+
"condition": "no majority after 5 rounds",
|
|
1213
|
+
"action": "synthesize final positions, highlight core tension, present 2-3 concrete options for user decision"
|
|
1214
|
+
},
|
|
1215
|
+
{
|
|
1216
|
+
"condition": "model times out during a round",
|
|
1217
|
+
"action": "note timeout for that model, continue round with remaining models' responses"
|
|
1218
|
+
}
|
|
1219
|
+
],
|
|
1220
|
+
"capabilities": [
|
|
1221
|
+
{
|
|
1222
|
+
"type": "cli",
|
|
1223
|
+
"name": "codex",
|
|
1224
|
+
"required": true,
|
|
1225
|
+
"description": "OpenAI Codex CLI peer reviewer"
|
|
1226
|
+
},
|
|
1227
|
+
{
|
|
1228
|
+
"type": "cli",
|
|
1229
|
+
"name": "gemini",
|
|
1230
|
+
"required": true,
|
|
1231
|
+
"description": "Google Gemini CLI peer reviewer"
|
|
1232
|
+
},
|
|
1233
|
+
{
|
|
1234
|
+
"type": "env",
|
|
1235
|
+
"name": "OPENAI_API_KEY",
|
|
1236
|
+
"required": true,
|
|
1237
|
+
"description": "for Codex CLI authentication"
|
|
1238
|
+
},
|
|
1239
|
+
{
|
|
1240
|
+
"type": "env",
|
|
1241
|
+
"name": "GEMINI_API_KEY",
|
|
1242
|
+
"required": true,
|
|
1243
|
+
"description": "for Gemini CLI authentication"
|
|
1244
|
+
}
|
|
1245
|
+
],
|
|
1246
|
+
"event_payloads": {
|
|
1247
|
+
"review_complete": [
|
|
1248
|
+
{
|
|
1249
|
+
"field": "skill",
|
|
1250
|
+
"type": "string",
|
|
1251
|
+
"description": "\"ftm-council\""
|
|
1252
|
+
},
|
|
1253
|
+
{
|
|
1254
|
+
"field": "verdict",
|
|
1255
|
+
"type": "string",
|
|
1256
|
+
"description": "\"update_intent\" | \"revert_fix\" | \"option_a\" | \"option_b\" | custom decision"
|
|
1257
|
+
},
|
|
1258
|
+
{
|
|
1259
|
+
"field": "round",
|
|
1260
|
+
"type": "number",
|
|
1261
|
+
"description": "round in which majority was reached (1-5, or 5+ for synthesis)"
|
|
1262
|
+
},
|
|
1263
|
+
{
|
|
1264
|
+
"field": "agreed_by",
|
|
1265
|
+
"type": "string[]",
|
|
1266
|
+
"description": "which models agreed on the verdict"
|
|
1267
|
+
},
|
|
1268
|
+
{
|
|
1269
|
+
"field": "reasoning",
|
|
1270
|
+
"type": "string",
|
|
1271
|
+
"description": "why the majority won"
|
|
1272
|
+
}
|
|
1273
|
+
],
|
|
1274
|
+
"task_completed": [
|
|
1275
|
+
{
|
|
1276
|
+
"field": "skill",
|
|
1277
|
+
"type": "string",
|
|
1278
|
+
"description": "\"ftm-council\""
|
|
1279
|
+
},
|
|
1280
|
+
{
|
|
1281
|
+
"field": "decision_domain",
|
|
1282
|
+
"type": "string",
|
|
1283
|
+
"description": "topic the council deliberated on"
|
|
1284
|
+
},
|
|
1285
|
+
{
|
|
1286
|
+
"field": "verdict",
|
|
1287
|
+
"type": "string",
|
|
1288
|
+
"description": "final decision"
|
|
1289
|
+
},
|
|
1290
|
+
{
|
|
1291
|
+
"field": "round",
|
|
1292
|
+
"type": "number",
|
|
1293
|
+
"description": "rounds taken to reach verdict"
|
|
1294
|
+
},
|
|
1295
|
+
{
|
|
1296
|
+
"field": "duration_ms",
|
|
1297
|
+
"type": "number",
|
|
1298
|
+
"description": "total deliberation time"
|
|
1299
|
+
}
|
|
1300
|
+
]
|
|
1301
|
+
},
|
|
1302
|
+
"references": [],
|
|
1303
|
+
"has_evals": false,
|
|
1304
|
+
"warnings": [],
|
|
1305
|
+
"size_bytes": 10950,
|
|
1306
|
+
"enabled": true
|
|
1307
|
+
},
|
|
1308
|
+
{
|
|
1309
|
+
"name": "ftm-dashboard",
|
|
1310
|
+
"description": "Session and weekly analytics dashboard for the FTM skill ecosystem. Reads events.log and blackboard state to show skills invoked, plans presented, approval rates, experiences recorded, and patterns promoted. Use when user says \"dashboard\", \"analytics\", \"stats\", \"ftm-dashboard\", \"show session stats\", or \"how's the system doing\".",
|
|
1311
|
+
"trigger_file": "ftm-dashboard.yml",
|
|
1312
|
+
"skill_directory": "ftm-dashboard/",
|
|
1313
|
+
"events_emits": [],
|
|
1314
|
+
"events_listens": [
|
|
1315
|
+
"task_completed"
|
|
1316
|
+
],
|
|
1317
|
+
"blackboard_reads": [],
|
|
1318
|
+
"blackboard_writes": [],
|
|
1319
|
+
"requirements": [
|
|
1320
|
+
{
|
|
1321
|
+
"type": "reference",
|
|
1322
|
+
"name": "~/.claude/ftm-state/events.log",
|
|
1323
|
+
"required": false,
|
|
1324
|
+
"description": "JSONL event log for skill invocation tracking"
|
|
1325
|
+
},
|
|
1326
|
+
{
|
|
1327
|
+
"type": "reference",
|
|
1328
|
+
"name": "~/.claude/ftm-state/blackboard/context.json",
|
|
1329
|
+
"required": true,
|
|
1330
|
+
"description": "current session metadata"
|
|
1331
|
+
},
|
|
1332
|
+
{
|
|
1333
|
+
"type": "reference",
|
|
1334
|
+
"name": "~/.claude/ftm-state/blackboard/experiences/index.json",
|
|
1335
|
+
"required": false,
|
|
1336
|
+
"description": "experience inventory and counts"
|
|
1337
|
+
},
|
|
1338
|
+
{
|
|
1339
|
+
"type": "reference",
|
|
1340
|
+
"name": "~/.claude/ftm-state/blackboard/patterns.json",
|
|
1341
|
+
"required": false,
|
|
1342
|
+
"description": "pattern health for weekly stats"
|
|
1343
|
+
},
|
|
1344
|
+
{
|
|
1345
|
+
"type": "reference",
|
|
1346
|
+
"name": "~/.ftm/playbooks/",
|
|
1347
|
+
"required": false,
|
|
1348
|
+
"description": "playbook use counts and stats"
|
|
1349
|
+
}
|
|
1350
|
+
],
|
|
1351
|
+
"risk": {
|
|
1352
|
+
"level": "read_only",
|
|
1353
|
+
"scope": "reads event log and blackboard state only; does not modify any files",
|
|
1354
|
+
"rollback": "no mutations to reverse"
|
|
1355
|
+
},
|
|
1356
|
+
"approval_gates": [],
|
|
1357
|
+
"complexity_routing": {
|
|
1358
|
+
"micro": "auto",
|
|
1359
|
+
"small": "auto",
|
|
1360
|
+
"medium": "auto",
|
|
1361
|
+
"large": "auto",
|
|
1362
|
+
"xl": "auto"
|
|
1363
|
+
},
|
|
1364
|
+
"fallbacks": [
|
|
1365
|
+
{
|
|
1366
|
+
"condition": "events.log missing or empty",
|
|
1367
|
+
"action": "show \"No session events recorded yet\" for relevant sections"
|
|
1368
|
+
},
|
|
1369
|
+
{
|
|
1370
|
+
"condition": "blackboard context.json missing",
|
|
1371
|
+
"action": "show \"No session data available\" and suggest using FTM skills first"
|
|
1372
|
+
},
|
|
1373
|
+
{
|
|
1374
|
+
"condition": "experiences/index.json missing",
|
|
1375
|
+
"action": "skip experience stats sections"
|
|
1376
|
+
},
|
|
1377
|
+
{
|
|
1378
|
+
"condition": "playbooks directory missing",
|
|
1379
|
+
"action": "show 0 for all playbook stats"
|
|
1380
|
+
}
|
|
1381
|
+
],
|
|
1382
|
+
"capabilities": [],
|
|
1383
|
+
"event_payloads": {
|
|
1384
|
+
"(none)": []
|
|
1385
|
+
},
|
|
1386
|
+
"references": [],
|
|
1387
|
+
"has_evals": false,
|
|
1388
|
+
"warnings": [],
|
|
1389
|
+
"size_bytes": 5165,
|
|
1390
|
+
"enabled": true
|
|
1391
|
+
},
|
|
1392
|
+
{
|
|
1393
|
+
"name": "ftm-debug",
|
|
1394
|
+
"description": "Deep multi-vector debugging war room that launches parallel agent teams to instrument, research, reproduce, hypothesize, solve, and verify tricky bugs. Use when a bug is stubborn, multi-turn debugging hasn't worked, the user says \"debug this deeply\", \"war room this\", \"I can't figure out why\", \"this is driving me crazy\", \"launch the debug team\", or any situation where standard debugging is insufficient. Also triggers on \"/ftm-debug\". Covers any codebase — frontend, backend, CLI tools, native apps, build systems, anything. Do NOT use for simple one-step fixes — this is the heavy artillery for problems that resist normal debugging.",
|
|
1395
|
+
"trigger_file": "ftm-debug.yml",
|
|
1396
|
+
"skill_directory": "ftm-debug/",
|
|
1397
|
+
"events_emits": [
|
|
1398
|
+
"bug_fixed",
|
|
1399
|
+
"issue_found",
|
|
1400
|
+
"test_passed",
|
|
1401
|
+
"test_failed",
|
|
1402
|
+
"error_encountered",
|
|
1403
|
+
"task_completed"
|
|
1404
|
+
],
|
|
1405
|
+
"events_listens": [
|
|
1406
|
+
"test_failed",
|
|
1407
|
+
"error_encountered"
|
|
1408
|
+
],
|
|
1409
|
+
"blackboard_reads": [
|
|
1410
|
+
"~/.claude/ftm-state/blackboard/context.json",
|
|
1411
|
+
"~/.claude/ftm-state/blackboard/experiences/index.json",
|
|
1412
|
+
"~/.claude/ftm-state/blackboard/patterns.json"
|
|
1413
|
+
],
|
|
1414
|
+
"blackboard_writes": [
|
|
1415
|
+
"~/.claude/ftm-state/blackboard/context.json",
|
|
1416
|
+
"~/.claude/ftm-state/blackboard/experiences/YYYY-MM-DD_task-slug.json"
|
|
1417
|
+
],
|
|
1418
|
+
"requirements": [
|
|
1419
|
+
{
|
|
1420
|
+
"type": "config",
|
|
1421
|
+
"name": "~/.claude/ftm-config.yml",
|
|
1422
|
+
"required": false,
|
|
1423
|
+
"description": "model profiles for investigation agents"
|
|
1424
|
+
},
|
|
1425
|
+
{
|
|
1426
|
+
"type": "reference",
|
|
1427
|
+
"name": "references/protocols/BLACKBOARD.md",
|
|
1428
|
+
"required": true,
|
|
1429
|
+
"description": "blackboard read/write protocol"
|
|
1430
|
+
},
|
|
1431
|
+
{
|
|
1432
|
+
"type": "reference",
|
|
1433
|
+
"name": "references/protocols/EDGE-CASES.md",
|
|
1434
|
+
"required": true,
|
|
1435
|
+
"description": "anti-patterns and fallback handling"
|
|
1436
|
+
},
|
|
1437
|
+
{
|
|
1438
|
+
"type": "reference",
|
|
1439
|
+
"name": "references/phases/PHASE-0-INTAKE.md",
|
|
1440
|
+
"required": true,
|
|
1441
|
+
"description": "intake steps and Explore agent prompt"
|
|
1442
|
+
},
|
|
1443
|
+
{
|
|
1444
|
+
"type": "reference",
|
|
1445
|
+
"name": "references/phases/PHASE-1-TRIAGE.md",
|
|
1446
|
+
"required": true,
|
|
1447
|
+
"description": "agent selection guide and worktree strategy"
|
|
1448
|
+
},
|
|
1449
|
+
{
|
|
1450
|
+
"type": "reference",
|
|
1451
|
+
"name": "references/phases/PHASE-2-WAR-ROOM-AGENTS.md",
|
|
1452
|
+
"required": true,
|
|
1453
|
+
"description": "all four agent prompts"
|
|
1454
|
+
},
|
|
1455
|
+
{
|
|
1456
|
+
"type": "reference",
|
|
1457
|
+
"name": "references/phases/PHASE-3-TO-6-EXECUTION.md",
|
|
1458
|
+
"required": true,
|
|
1459
|
+
"description": "synthesis, solver, reviewer prompts"
|
|
1460
|
+
},
|
|
1461
|
+
{
|
|
1462
|
+
"type": "tool",
|
|
1463
|
+
"name": "git",
|
|
1464
|
+
"required": true,
|
|
1465
|
+
"description": "worktree creation, diff inspection, commit history"
|
|
1466
|
+
},
|
|
1467
|
+
{
|
|
1468
|
+
"type": "reference",
|
|
1469
|
+
"name": "~/.claude/ftm-state/blackboard/context.json",
|
|
1470
|
+
"required": false,
|
|
1471
|
+
"description": "session state"
|
|
1472
|
+
},
|
|
1473
|
+
{
|
|
1474
|
+
"type": "reference",
|
|
1475
|
+
"name": "~/.claude/ftm-state/blackboard/experiences/index.json",
|
|
1476
|
+
"required": false,
|
|
1477
|
+
"description": "past bug fixes and known issues"
|
|
1478
|
+
},
|
|
1479
|
+
{
|
|
1480
|
+
"type": "reference",
|
|
1481
|
+
"name": "~/.claude/ftm-state/blackboard/patterns.json",
|
|
1482
|
+
"required": false,
|
|
1483
|
+
"description": "recurring failure patterns"
|
|
1484
|
+
}
|
|
1485
|
+
],
|
|
1486
|
+
"risk": {
|
|
1487
|
+
"level": "medium_write",
|
|
1488
|
+
"scope": "creates git worktrees for investigation and fix branches; modifies source files in Solver agent worktree; merges fix after Reviewer approval",
|
|
1489
|
+
"rollback": "git worktree remove + git branch -D for debug/* worktrees; all fix changes isolated until user confirms merge"
|
|
1490
|
+
},
|
|
1491
|
+
"approval_gates": [
|
|
1492
|
+
{
|
|
1493
|
+
"trigger": "investigation plan formulated in Phase 0",
|
|
1494
|
+
"action": "present plan to user and proceed unless user objects"
|
|
1495
|
+
},
|
|
1496
|
+
{
|
|
1497
|
+
"trigger": "Solver produces fix",
|
|
1498
|
+
"action": "Reviewer agent must independently verify before presenting to user (hard gate — cannot skip)"
|
|
1499
|
+
},
|
|
1500
|
+
{
|
|
1501
|
+
"trigger": "Reviewer APPROVED",
|
|
1502
|
+
"action": "present root cause + changes + evidence to user, wait for user confirmation before merging"
|
|
1503
|
+
},
|
|
1504
|
+
{
|
|
1505
|
+
"trigger": "Solver NEEDS REWORK after 3 attempts",
|
|
1506
|
+
"action": "escalate to user with full context, wait for direction"
|
|
1507
|
+
}
|
|
1508
|
+
],
|
|
1509
|
+
"complexity_routing": {
|
|
1510
|
+
"micro": "auto",
|
|
1511
|
+
"small": "auto",
|
|
1512
|
+
"medium": "plan_first",
|
|
1513
|
+
"large": "plan_first",
|
|
1514
|
+
"xl": "always_ask"
|
|
1515
|
+
},
|
|
1516
|
+
"fallbacks": [
|
|
1517
|
+
{
|
|
1518
|
+
"condition": "Instrumenter agent fails or produces no useful output",
|
|
1519
|
+
"action": "skip instrumentation worktree, proceed with remaining agents"
|
|
1520
|
+
},
|
|
1521
|
+
{
|
|
1522
|
+
"condition": "Reproducer cannot create a minimal failing test",
|
|
1523
|
+
"action": "note as \"reproduction failed\", proceed with hypothesis-only approach"
|
|
1524
|
+
},
|
|
1525
|
+
{
|
|
1526
|
+
"condition": "Researcher finds no relevant issues or docs",
|
|
1527
|
+
"action": "proceed with instrumentation and hypothesis findings only"
|
|
1528
|
+
},
|
|
1529
|
+
{
|
|
1530
|
+
"condition": "fix still failing after 3 Solver iterations",
|
|
1531
|
+
"action": "escalate to user with all hypotheses tested and evidence gathered"
|
|
1532
|
+
},
|
|
1533
|
+
{
|
|
1534
|
+
"condition": "project has no test suite",
|
|
1535
|
+
"action": "Reviewer uses build check + diff review + live runtime verification instead of test runner"
|
|
1536
|
+
}
|
|
1537
|
+
],
|
|
1538
|
+
"capabilities": [
|
|
1539
|
+
{
|
|
1540
|
+
"type": "cli",
|
|
1541
|
+
"name": "git",
|
|
1542
|
+
"required": true,
|
|
1543
|
+
"description": "worktree isolation for investigation agents"
|
|
1544
|
+
},
|
|
1545
|
+
{
|
|
1546
|
+
"type": "mcp",
|
|
1547
|
+
"name": "sequential-thinking",
|
|
1548
|
+
"required": false,
|
|
1549
|
+
"description": "complex multi-hypothesis analysis"
|
|
1550
|
+
},
|
|
1551
|
+
{
|
|
1552
|
+
"type": "mcp",
|
|
1553
|
+
"name": "playwright",
|
|
1554
|
+
"required": false,
|
|
1555
|
+
"description": "visual bug verification in Reviewer phase"
|
|
1556
|
+
},
|
|
1557
|
+
{
|
|
1558
|
+
"type": "mcp",
|
|
1559
|
+
"name": "WebSearch",
|
|
1560
|
+
"required": false,
|
|
1561
|
+
"description": "Researcher agent for GitHub issues and Stack Overflow"
|
|
1562
|
+
},
|
|
1563
|
+
{
|
|
1564
|
+
"type": "mcp",
|
|
1565
|
+
"name": "WebFetch",
|
|
1566
|
+
"required": false,
|
|
1567
|
+
"description": "Researcher agent for docs and changelogs"
|
|
1568
|
+
}
|
|
1569
|
+
],
|
|
1570
|
+
"event_payloads": {
|
|
1571
|
+
"bug_fixed": [
|
|
1572
|
+
{
|
|
1573
|
+
"field": "skill",
|
|
1574
|
+
"type": "string",
|
|
1575
|
+
"description": "\"ftm-debug\""
|
|
1576
|
+
},
|
|
1577
|
+
{
|
|
1578
|
+
"field": "root_cause",
|
|
1579
|
+
"type": "string",
|
|
1580
|
+
"description": "one-sentence root cause description"
|
|
1581
|
+
},
|
|
1582
|
+
{
|
|
1583
|
+
"field": "fix_approach",
|
|
1584
|
+
"type": "string",
|
|
1585
|
+
"description": "description of the fix applied"
|
|
1586
|
+
},
|
|
1587
|
+
{
|
|
1588
|
+
"field": "worktree",
|
|
1589
|
+
"type": "string",
|
|
1590
|
+
"description": "path to fix worktree"
|
|
1591
|
+
},
|
|
1592
|
+
{
|
|
1593
|
+
"field": "iterations",
|
|
1594
|
+
"type": "number",
|
|
1595
|
+
"description": "number of solver-reviewer cycles needed"
|
|
1596
|
+
},
|
|
1597
|
+
{
|
|
1598
|
+
"field": "duration_ms",
|
|
1599
|
+
"type": "number",
|
|
1600
|
+
"description": "total war room duration"
|
|
1601
|
+
}
|
|
1602
|
+
],
|
|
1603
|
+
"issue_found": [
|
|
1604
|
+
{
|
|
1605
|
+
"field": "skill",
|
|
1606
|
+
"type": "string",
|
|
1607
|
+
"description": "\"ftm-debug\""
|
|
1608
|
+
},
|
|
1609
|
+
{
|
|
1610
|
+
"field": "phase",
|
|
1611
|
+
"type": "string",
|
|
1612
|
+
"description": "\"phase1\" | \"phase2\""
|
|
1613
|
+
},
|
|
1614
|
+
{
|
|
1615
|
+
"field": "agent",
|
|
1616
|
+
"type": "string",
|
|
1617
|
+
"description": "\"instrumenter\" | \"researcher\" | \"reproducer\" | \"hypothesizer\""
|
|
1618
|
+
},
|
|
1619
|
+
{
|
|
1620
|
+
"field": "finding",
|
|
1621
|
+
"type": "string",
|
|
1622
|
+
"description": "description of the specific issue found"
|
|
1623
|
+
},
|
|
1624
|
+
{
|
|
1625
|
+
"field": "confidence",
|
|
1626
|
+
"type": "string",
|
|
1627
|
+
"description": "high | medium | low"
|
|
1628
|
+
}
|
|
1629
|
+
],
|
|
1630
|
+
"test_passed": [
|
|
1631
|
+
{
|
|
1632
|
+
"field": "skill",
|
|
1633
|
+
"type": "string",
|
|
1634
|
+
"description": "\"ftm-debug\""
|
|
1635
|
+
},
|
|
1636
|
+
{
|
|
1637
|
+
"field": "scope",
|
|
1638
|
+
"type": "string",
|
|
1639
|
+
"description": "\"reproduction\" | \"full_suite\""
|
|
1640
|
+
},
|
|
1641
|
+
{
|
|
1642
|
+
"field": "worktree",
|
|
1643
|
+
"type": "string",
|
|
1644
|
+
"description": "worktree path where tests ran"
|
|
1645
|
+
}
|
|
1646
|
+
],
|
|
1647
|
+
"test_failed": [
|
|
1648
|
+
{
|
|
1649
|
+
"field": "skill",
|
|
1650
|
+
"type": "string",
|
|
1651
|
+
"description": "\"ftm-debug\""
|
|
1652
|
+
},
|
|
1653
|
+
{
|
|
1654
|
+
"field": "scope",
|
|
1655
|
+
"type": "string",
|
|
1656
|
+
"description": "\"reproduction\" | \"full_suite\""
|
|
1657
|
+
},
|
|
1658
|
+
{
|
|
1659
|
+
"field": "worktree",
|
|
1660
|
+
"type": "string",
|
|
1661
|
+
"description": "worktree path"
|
|
1662
|
+
},
|
|
1663
|
+
{
|
|
1664
|
+
"field": "error_summary",
|
|
1665
|
+
"type": "string",
|
|
1666
|
+
"description": "brief failure description"
|
|
1667
|
+
}
|
|
1668
|
+
],
|
|
1669
|
+
"error_encountered": [
|
|
1670
|
+
{
|
|
1671
|
+
"field": "skill",
|
|
1672
|
+
"type": "string",
|
|
1673
|
+
"description": "\"ftm-debug\""
|
|
1674
|
+
},
|
|
1675
|
+
{
|
|
1676
|
+
"field": "phase",
|
|
1677
|
+
"type": "string",
|
|
1678
|
+
"description": "war room phase where error occurred"
|
|
1679
|
+
},
|
|
1680
|
+
{
|
|
1681
|
+
"field": "error",
|
|
1682
|
+
"type": "string",
|
|
1683
|
+
"description": "error description"
|
|
1684
|
+
}
|
|
1685
|
+
],
|
|
1686
|
+
"task_completed": [
|
|
1687
|
+
{
|
|
1688
|
+
"field": "skill",
|
|
1689
|
+
"type": "string",
|
|
1690
|
+
"description": "\"ftm-debug\""
|
|
1691
|
+
},
|
|
1692
|
+
{
|
|
1693
|
+
"field": "outcome",
|
|
1694
|
+
"type": "string",
|
|
1695
|
+
"description": "\"fixed\" | \"escalated\" | \"unresolved\""
|
|
1696
|
+
},
|
|
1697
|
+
{
|
|
1698
|
+
"field": "root_cause",
|
|
1699
|
+
"type": "string",
|
|
1700
|
+
"description": "root cause if found"
|
|
1701
|
+
},
|
|
1702
|
+
{
|
|
1703
|
+
"field": "duration_ms",
|
|
1704
|
+
"type": "number",
|
|
1705
|
+
"description": "total session duration"
|
|
1706
|
+
}
|
|
1707
|
+
]
|
|
1708
|
+
},
|
|
1709
|
+
"references": [],
|
|
1710
|
+
"has_evals": false,
|
|
1711
|
+
"warnings": [],
|
|
1712
|
+
"size_bytes": 12629,
|
|
1713
|
+
"enabled": true
|
|
1714
|
+
},
|
|
1715
|
+
{
|
|
1716
|
+
"name": "ftm-diagram",
|
|
1717
|
+
"description": "Manages the hierarchical ARCHITECTURE.mmd mermaid diagram layer — root module-to-module relationship graph (subway map) and per-module DIAGRAM.mmd function-to-function graphs (street maps). Use when creating or updating architecture diagrams, bootstrapping a new project's diagram layer, or when user says \"update diagram\", \"show architecture\", \"ftm-diagram\", \"visualize relationships\". Auto-invoked by ftm-executor after every commit to keep diagrams in sync with code changes.",
|
|
1718
|
+
"trigger_file": "ftm-diagram.yml",
|
|
1719
|
+
"skill_directory": "ftm-diagram/",
|
|
1720
|
+
"events_emits": [
|
|
1721
|
+
"documentation_updated",
|
|
1722
|
+
"task_completed"
|
|
1723
|
+
],
|
|
1724
|
+
"events_listens": [
|
|
1725
|
+
"code_committed"
|
|
1726
|
+
],
|
|
1727
|
+
"blackboard_reads": [],
|
|
1728
|
+
"blackboard_writes": [],
|
|
1729
|
+
"requirements": [
|
|
1730
|
+
{
|
|
1731
|
+
"type": "reference",
|
|
1732
|
+
"name": ".ftm-map/map.db",
|
|
1733
|
+
"required": false,
|
|
1734
|
+
"description": "SQLite knowledge graph for accurate diagram generation (graph-powered mode)"
|
|
1735
|
+
},
|
|
1736
|
+
{
|
|
1737
|
+
"type": "tool",
|
|
1738
|
+
"name": "ftm-map/scripts/.venv/bin/python3",
|
|
1739
|
+
"required": false,
|
|
1740
|
+
"description": "Python runtime for graph-powered views.py"
|
|
1741
|
+
},
|
|
1742
|
+
{
|
|
1743
|
+
"type": "reference",
|
|
1744
|
+
"name": "package.json",
|
|
1745
|
+
"required": false,
|
|
1746
|
+
"description": "project structure detection for bootstrap"
|
|
1747
|
+
},
|
|
1748
|
+
{
|
|
1749
|
+
"type": "reference",
|
|
1750
|
+
"name": "tsconfig.json",
|
|
1751
|
+
"required": false,
|
|
1752
|
+
"description": "TypeScript project structure detection"
|
|
1753
|
+
}
|
|
1754
|
+
],
|
|
1755
|
+
"risk": {
|
|
1756
|
+
"level": "low_write",
|
|
1757
|
+
"scope": "writes .mmd diagram files to project directories; only creates or modifies ARCHITECTURE.mmd and per-module DIAGRAM.mmd files; does not touch source code",
|
|
1758
|
+
"rollback": "git checkout on modified .mmd files; delete newly created .mmd files"
|
|
1759
|
+
},
|
|
1760
|
+
"approval_gates": [
|
|
1761
|
+
{
|
|
1762
|
+
"trigger": "bootstrap mode on large codebase (50+ modules)",
|
|
1763
|
+
"action": "report what was found and what will be created before writing, proceed unless user objects"
|
|
1764
|
+
}
|
|
1765
|
+
],
|
|
1766
|
+
"complexity_routing": {
|
|
1767
|
+
"micro": "auto",
|
|
1768
|
+
"small": "auto",
|
|
1769
|
+
"medium": "auto",
|
|
1770
|
+
"large": "auto",
|
|
1771
|
+
"xl": "auto"
|
|
1772
|
+
},
|
|
1773
|
+
"fallbacks": [
|
|
1774
|
+
{
|
|
1775
|
+
"condition": ".ftm-map/map.db not found",
|
|
1776
|
+
"action": "fall back to standard import-grep analysis for diagram generation"
|
|
1777
|
+
},
|
|
1778
|
+
{
|
|
1779
|
+
"condition": "Python venv not set up",
|
|
1780
|
+
"action": "fall back to standard analysis, log \"Graph-powered mode unavailable — run ftm-map to enable\""
|
|
1781
|
+
},
|
|
1782
|
+
{
|
|
1783
|
+
"condition": "no src/ or identifiable source root",
|
|
1784
|
+
"action": "ask user for source root before bootstrapping"
|
|
1785
|
+
}
|
|
1786
|
+
],
|
|
1787
|
+
"capabilities": [
|
|
1788
|
+
{
|
|
1789
|
+
"type": "cli",
|
|
1790
|
+
"name": "ftm-map/scripts/.venv/bin/python3",
|
|
1791
|
+
"required": false,
|
|
1792
|
+
"description": "graph-powered diagram generation"
|
|
1793
|
+
},
|
|
1794
|
+
{
|
|
1795
|
+
"type": "mcp",
|
|
1796
|
+
"name": "git",
|
|
1797
|
+
"required": false,
|
|
1798
|
+
"description": "detect changed files for incremental updates"
|
|
1799
|
+
}
|
|
1800
|
+
],
|
|
1801
|
+
"event_payloads": {
|
|
1802
|
+
"documentation_updated": [
|
|
1803
|
+
{
|
|
1804
|
+
"field": "skill",
|
|
1805
|
+
"type": "string",
|
|
1806
|
+
"description": "\"ftm-diagram\""
|
|
1807
|
+
},
|
|
1808
|
+
{
|
|
1809
|
+
"field": "files_written",
|
|
1810
|
+
"type": "string[]",
|
|
1811
|
+
"description": "absolute paths to .mmd files created or modified"
|
|
1812
|
+
},
|
|
1813
|
+
{
|
|
1814
|
+
"field": "modules_added",
|
|
1815
|
+
"type": "number",
|
|
1816
|
+
"description": "new module nodes added to ARCHITECTURE.mmd"
|
|
1817
|
+
},
|
|
1818
|
+
{
|
|
1819
|
+
"field": "functions_added",
|
|
1820
|
+
"type": "number",
|
|
1821
|
+
"description": "new function nodes added across module DIAGRAMs"
|
|
1822
|
+
},
|
|
1823
|
+
{
|
|
1824
|
+
"field": "edges_added",
|
|
1825
|
+
"type": "number",
|
|
1826
|
+
"description": "new dependency edges added"
|
|
1827
|
+
}
|
|
1828
|
+
],
|
|
1829
|
+
"task_completed": [
|
|
1830
|
+
{
|
|
1831
|
+
"field": "skill",
|
|
1832
|
+
"type": "string",
|
|
1833
|
+
"description": "\"ftm-diagram\""
|
|
1834
|
+
},
|
|
1835
|
+
{
|
|
1836
|
+
"field": "mode",
|
|
1837
|
+
"type": "string",
|
|
1838
|
+
"description": "\"bootstrap\" | \"incremental\""
|
|
1839
|
+
},
|
|
1840
|
+
{
|
|
1841
|
+
"field": "files_count",
|
|
1842
|
+
"type": "number",
|
|
1843
|
+
"description": "total .mmd files written"
|
|
1844
|
+
},
|
|
1845
|
+
{
|
|
1846
|
+
"field": "duration_ms",
|
|
1847
|
+
"type": "number",
|
|
1848
|
+
"description": "total diagram sync duration"
|
|
1849
|
+
}
|
|
1850
|
+
]
|
|
1851
|
+
},
|
|
1852
|
+
"references": [],
|
|
1853
|
+
"has_evals": false,
|
|
1854
|
+
"warnings": [],
|
|
1855
|
+
"size_bytes": 10424,
|
|
1856
|
+
"enabled": true
|
|
1857
|
+
},
|
|
1858
|
+
{
|
|
1859
|
+
"name": "ftm-executor",
|
|
1860
|
+
"description": "Autonomous plan execution engine. Takes any plan document and executes it end-to-end with a dynamically assembled agent team — analyzing tasks, creating purpose-built agents, dispatching them in parallel worktrees, and running each through a commit-review-fix loop until complete. Use this skill whenever the user wants to execute a plan, run a plan doc, launch an agent team on tasks, or says things like \"execute this plan\", \"run this\", \"launch agents on this doc\", \"take this plan and go\", or points to a plan file and wants it implemented autonomously. Even if they just paste a plan path and say \"go\" — this is the skill.",
|
|
1861
|
+
"trigger_file": "ftm-executor.yml",
|
|
1862
|
+
"skill_directory": "ftm-executor/",
|
|
1863
|
+
"events_emits": [
|
|
1864
|
+
"task_received",
|
|
1865
|
+
"plan_generated",
|
|
1866
|
+
"plan_approved",
|
|
1867
|
+
"code_changed",
|
|
1868
|
+
"code_committed",
|
|
1869
|
+
"test_passed",
|
|
1870
|
+
"test_failed",
|
|
1871
|
+
"task_completed",
|
|
1872
|
+
"error_encountered"
|
|
1873
|
+
],
|
|
1874
|
+
"events_listens": [
|
|
1875
|
+
"plan_approved"
|
|
1876
|
+
],
|
|
1877
|
+
"blackboard_reads": [],
|
|
1878
|
+
"blackboard_writes": [],
|
|
1879
|
+
"requirements": [
|
|
1880
|
+
{
|
|
1881
|
+
"type": "tool",
|
|
1882
|
+
"name": "git",
|
|
1883
|
+
"required": true,
|
|
1884
|
+
"description": "worktree creation, branch management, commit operations"
|
|
1885
|
+
},
|
|
1886
|
+
{
|
|
1887
|
+
"type": "config",
|
|
1888
|
+
"name": "~/.claude/ftm-config.yml",
|
|
1889
|
+
"required": false,
|
|
1890
|
+
"description": "model profiles, max_parallel_agents, auto_audit, progress_tracking"
|
|
1891
|
+
},
|
|
1892
|
+
{
|
|
1893
|
+
"type": "reference",
|
|
1894
|
+
"name": "~/.claude/plans/",
|
|
1895
|
+
"required": false,
|
|
1896
|
+
"description": "plan documents for execution"
|
|
1897
|
+
},
|
|
1898
|
+
{
|
|
1899
|
+
"type": "tool",
|
|
1900
|
+
"name": "node",
|
|
1901
|
+
"required": false,
|
|
1902
|
+
"description": "project setup commands in worktrees"
|
|
1903
|
+
},
|
|
1904
|
+
{
|
|
1905
|
+
"type": "reference",
|
|
1906
|
+
"name": "~/.claude/skills/ftm-executor/references/STYLE-TEMPLATE.md",
|
|
1907
|
+
"required": false,
|
|
1908
|
+
"description": "STYLE.md bootstrap template"
|
|
1909
|
+
}
|
|
1910
|
+
],
|
|
1911
|
+
"risk": {
|
|
1912
|
+
"level": "high_write",
|
|
1913
|
+
"scope": "creates git worktrees and branches, modifies source files across multiple tasks, runs tests and builds, optionally pushes branches or creates PRs",
|
|
1914
|
+
"rollback": "git worktree remove + git branch -D for each worktree; all changes isolated to plan-exec/* branches until explicitly merged"
|
|
1915
|
+
},
|
|
1916
|
+
"approval_gates": [
|
|
1917
|
+
{
|
|
1918
|
+
"trigger": "no plan document provided",
|
|
1919
|
+
"action": "generate plan and wait for explicit user approval before any code is written"
|
|
1920
|
+
},
|
|
1921
|
+
{
|
|
1922
|
+
"trigger": "plan_checker returns FAIL",
|
|
1923
|
+
"action": "present blockers and ask user to fix or override before proceeding"
|
|
1924
|
+
},
|
|
1925
|
+
{
|
|
1926
|
+
"trigger": "plan_checker returns WARN",
|
|
1927
|
+
"action": "show warnings to user, proceed unless they object"
|
|
1928
|
+
},
|
|
1929
|
+
{
|
|
1930
|
+
"trigger": "wave complete and all agents done",
|
|
1931
|
+
"action": "auto-invoke ftm-codex-gate (no user gate needed for this step)"
|
|
1932
|
+
},
|
|
1933
|
+
{
|
|
1934
|
+
"trigger": "final phase 6 verification passes",
|
|
1935
|
+
"action": "present 4 branch finishing options and wait for explicit user choice"
|
|
1936
|
+
},
|
|
1937
|
+
{
|
|
1938
|
+
"trigger": "codex gate FAIL after 2 fix attempts",
|
|
1939
|
+
"action": "report to user and wait for input before continuing"
|
|
1940
|
+
}
|
|
1941
|
+
],
|
|
1942
|
+
"complexity_routing": {
|
|
1943
|
+
"micro": "auto",
|
|
1944
|
+
"small": "auto",
|
|
1945
|
+
"medium": "plan_first",
|
|
1946
|
+
"large": "plan_first",
|
|
1947
|
+
"xl": "always_ask"
|
|
1948
|
+
},
|
|
1949
|
+
"fallbacks": [
|
|
1950
|
+
{
|
|
1951
|
+
"condition": "ftm-browse not installed at $HOME/.claude/skills/ftm-browse/bin/ftm-browse",
|
|
1952
|
+
"action": "skip visual smoke test checks, log \"Visual smoke test skipped — ftm-browse not installed\""
|
|
1953
|
+
},
|
|
1954
|
+
{
|
|
1955
|
+
"condition": "ftm-retro skill not available",
|
|
1956
|
+
"action": "skip retrospective phase, note in output and proceed to branch finishing"
|
|
1957
|
+
},
|
|
1958
|
+
{
|
|
1959
|
+
"condition": "codex CLI not found",
|
|
1960
|
+
"action": "skip codex gate, log \"Codex gate skipped — codex not installed\", proceed to next wave"
|
|
1961
|
+
},
|
|
1962
|
+
{
|
|
1963
|
+
"condition": "no package.json in project",
|
|
1964
|
+
"action": "skip npm install in worktree setup; skip knip-based audit layers"
|
|
1965
|
+
},
|
|
1966
|
+
{
|
|
1967
|
+
"condition": "project has no test suite",
|
|
1968
|
+
"action": "skip test verification gates, rely on diff review and build checks"
|
|
1969
|
+
},
|
|
1970
|
+
{
|
|
1971
|
+
"condition": "agent fails or gets stuck",
|
|
1972
|
+
"action": "read agent output, fix directly or respawn with more context"
|
|
1973
|
+
}
|
|
1974
|
+
],
|
|
1975
|
+
"capabilities": [
|
|
1976
|
+
{
|
|
1977
|
+
"type": "cli",
|
|
1978
|
+
"name": "git",
|
|
1979
|
+
"required": true,
|
|
1980
|
+
"description": "worktree management and version control"
|
|
1981
|
+
},
|
|
1982
|
+
{
|
|
1983
|
+
"type": "cli",
|
|
1984
|
+
"name": "node",
|
|
1985
|
+
"required": false,
|
|
1986
|
+
"description": "project dependency installation"
|
|
1987
|
+
},
|
|
1988
|
+
{
|
|
1989
|
+
"type": "mcp",
|
|
1990
|
+
"name": "sequential-thinking",
|
|
1991
|
+
"required": false,
|
|
1992
|
+
"description": "complex dependency analysis and plan validation"
|
|
1993
|
+
}
|
|
1994
|
+
],
|
|
1995
|
+
"event_payloads": {
|
|
1996
|
+
"task_received": [
|
|
1997
|
+
{
|
|
1998
|
+
"field": "skill",
|
|
1999
|
+
"type": "string",
|
|
2000
|
+
"description": "\"ftm-executor\""
|
|
2001
|
+
},
|
|
2002
|
+
{
|
|
2003
|
+
"field": "task_description",
|
|
2004
|
+
"type": "string",
|
|
2005
|
+
"description": "description of the task being queued"
|
|
2006
|
+
},
|
|
2007
|
+
{
|
|
2008
|
+
"field": "plan_path",
|
|
2009
|
+
"type": "string",
|
|
2010
|
+
"description": "absolute path to plan document"
|
|
2011
|
+
}
|
|
2012
|
+
],
|
|
2013
|
+
"plan_generated": [
|
|
2014
|
+
{
|
|
2015
|
+
"field": "skill",
|
|
2016
|
+
"type": "string",
|
|
2017
|
+
"description": "\"ftm-executor\""
|
|
2018
|
+
},
|
|
2019
|
+
{
|
|
2020
|
+
"field": "plan_path",
|
|
2021
|
+
"type": "string",
|
|
2022
|
+
"description": "absolute path to saved plan file"
|
|
2023
|
+
},
|
|
2024
|
+
{
|
|
2025
|
+
"field": "task_count",
|
|
2026
|
+
"type": "number",
|
|
2027
|
+
"description": "total tasks in the plan"
|
|
2028
|
+
},
|
|
2029
|
+
{
|
|
2030
|
+
"field": "wave_count",
|
|
2031
|
+
"type": "number",
|
|
2032
|
+
"description": "number of parallel execution waves"
|
|
2033
|
+
}
|
|
2034
|
+
],
|
|
2035
|
+
"plan_approved": [
|
|
2036
|
+
{
|
|
2037
|
+
"field": "skill",
|
|
2038
|
+
"type": "string",
|
|
2039
|
+
"description": "\"ftm-executor\""
|
|
2040
|
+
},
|
|
2041
|
+
{
|
|
2042
|
+
"field": "plan_path",
|
|
2043
|
+
"type": "string",
|
|
2044
|
+
"description": "absolute path to approved plan"
|
|
2045
|
+
},
|
|
2046
|
+
{
|
|
2047
|
+
"field": "approved_steps",
|
|
2048
|
+
"type": "number[]",
|
|
2049
|
+
"description": "step numbers approved for execution"
|
|
2050
|
+
}
|
|
2051
|
+
],
|
|
2052
|
+
"code_changed": [
|
|
2053
|
+
{
|
|
2054
|
+
"field": "skill",
|
|
2055
|
+
"type": "string",
|
|
2056
|
+
"description": "\"ftm-executor\""
|
|
2057
|
+
},
|
|
2058
|
+
{
|
|
2059
|
+
"field": "worktree",
|
|
2060
|
+
"type": "string",
|
|
2061
|
+
"description": "path to the worktree where files changed"
|
|
2062
|
+
},
|
|
2063
|
+
{
|
|
2064
|
+
"field": "files",
|
|
2065
|
+
"type": "string[]",
|
|
2066
|
+
"description": "list of modified file paths"
|
|
2067
|
+
},
|
|
2068
|
+
{
|
|
2069
|
+
"field": "agent",
|
|
2070
|
+
"type": "string",
|
|
2071
|
+
"description": "agent type that made the changes"
|
|
2072
|
+
}
|
|
2073
|
+
],
|
|
2074
|
+
"code_committed": [
|
|
2075
|
+
{
|
|
2076
|
+
"field": "skill",
|
|
2077
|
+
"type": "string",
|
|
2078
|
+
"description": "\"ftm-executor\""
|
|
2079
|
+
},
|
|
2080
|
+
{
|
|
2081
|
+
"field": "worktree",
|
|
2082
|
+
"type": "string",
|
|
2083
|
+
"description": "path to worktree"
|
|
2084
|
+
},
|
|
2085
|
+
{
|
|
2086
|
+
"field": "commit_hash",
|
|
2087
|
+
"type": "string",
|
|
2088
|
+
"description": "short commit hash"
|
|
2089
|
+
},
|
|
2090
|
+
{
|
|
2091
|
+
"field": "message",
|
|
2092
|
+
"type": "string",
|
|
2093
|
+
"description": "commit message"
|
|
2094
|
+
},
|
|
2095
|
+
{
|
|
2096
|
+
"field": "task_number",
|
|
2097
|
+
"type": "number",
|
|
2098
|
+
"description": "plan task number this commit belongs to"
|
|
2099
|
+
}
|
|
2100
|
+
],
|
|
2101
|
+
"test_passed": [
|
|
2102
|
+
{
|
|
2103
|
+
"field": "skill",
|
|
2104
|
+
"type": "string",
|
|
2105
|
+
"description": "\"ftm-executor\""
|
|
2106
|
+
},
|
|
2107
|
+
{
|
|
2108
|
+
"field": "scope",
|
|
2109
|
+
"type": "string",
|
|
2110
|
+
"description": "\"task\" | \"full_suite\""
|
|
2111
|
+
},
|
|
2112
|
+
{
|
|
2113
|
+
"field": "worktree",
|
|
2114
|
+
"type": "string",
|
|
2115
|
+
"description": "worktree path"
|
|
2116
|
+
}
|
|
2117
|
+
],
|
|
2118
|
+
"test_failed": [
|
|
2119
|
+
{
|
|
2120
|
+
"field": "skill",
|
|
2121
|
+
"type": "string",
|
|
2122
|
+
"description": "\"ftm-executor\""
|
|
2123
|
+
},
|
|
2124
|
+
{
|
|
2125
|
+
"field": "scope",
|
|
2126
|
+
"type": "string",
|
|
2127
|
+
"description": "\"task\" | \"full_suite\""
|
|
2128
|
+
},
|
|
2129
|
+
{
|
|
2130
|
+
"field": "worktree",
|
|
2131
|
+
"type": "string",
|
|
2132
|
+
"description": "worktree path"
|
|
2133
|
+
},
|
|
2134
|
+
{
|
|
2135
|
+
"field": "error_summary",
|
|
2136
|
+
"type": "string",
|
|
2137
|
+
"description": "brief description of failure"
|
|
2138
|
+
}
|
|
2139
|
+
],
|
|
2140
|
+
"task_completed": [
|
|
2141
|
+
{
|
|
2142
|
+
"field": "skill",
|
|
2143
|
+
"type": "string",
|
|
2144
|
+
"description": "\"ftm-executor\""
|
|
2145
|
+
},
|
|
2146
|
+
{
|
|
2147
|
+
"field": "task_number",
|
|
2148
|
+
"type": "number",
|
|
2149
|
+
"description": "completed task number"
|
|
2150
|
+
},
|
|
2151
|
+
{
|
|
2152
|
+
"field": "audit_result",
|
|
2153
|
+
"type": "string",
|
|
2154
|
+
"description": "\"pass\" | \"pass_with_fixes\" | \"fail\" | \"skipped\""
|
|
2155
|
+
},
|
|
2156
|
+
{
|
|
2157
|
+
"field": "auto_fixed_count",
|
|
2158
|
+
"type": "number",
|
|
2159
|
+
"description": "issues auto-remediated by ftm-audit"
|
|
2160
|
+
},
|
|
2161
|
+
{
|
|
2162
|
+
"field": "duration_ms",
|
|
2163
|
+
"type": "number",
|
|
2164
|
+
"description": "task execution time"
|
|
2165
|
+
}
|
|
2166
|
+
],
|
|
2167
|
+
"error_encountered": [
|
|
2168
|
+
{
|
|
2169
|
+
"field": "skill",
|
|
2170
|
+
"type": "string",
|
|
2171
|
+
"description": "\"ftm-executor\""
|
|
2172
|
+
},
|
|
2173
|
+
{
|
|
2174
|
+
"field": "phase",
|
|
2175
|
+
"type": "string",
|
|
2176
|
+
"description": "execution phase where error occurred"
|
|
2177
|
+
},
|
|
2178
|
+
{
|
|
2179
|
+
"field": "error",
|
|
2180
|
+
"type": "string",
|
|
2181
|
+
"description": "error description"
|
|
2182
|
+
}
|
|
2183
|
+
]
|
|
2184
|
+
},
|
|
2185
|
+
"references": [
|
|
2186
|
+
"STYLE-TEMPLATE.md"
|
|
2187
|
+
],
|
|
2188
|
+
"has_evals": false,
|
|
2189
|
+
"warnings": [],
|
|
2190
|
+
"size_bytes": 36395,
|
|
2191
|
+
"enabled": true
|
|
2192
|
+
},
|
|
2193
|
+
{
|
|
2194
|
+
"name": "ftm-git",
|
|
2195
|
+
"description": "Secret scanning and credential safety gate for git operations. Prevents API keys, tokens, passwords, and other secrets from ever being committed or pushed to remote repositories. Scans staged files, working tree, and git history for hardcoded credentials using regex pattern matching, then auto-remediates by extracting secrets to gitignored .env files and replacing hardcoded values with env var references. Use when user says \"scan for secrets\", \"check for keys\", \"audit credentials\", \"ftm-git\", \"secret scan\", \"remove api keys\", \"check before push\", or any time git commit/push operations are about to happen. Also auto-invoked by ftm-executor and ftm-mind before any commit or push operation. Even if the user just says \"commit this\" or \"push to remote\", this skill MUST run first. Do NOT use for general git workflow operations like branching or merging — that's git-workflow territory. This skill is specifically the security gate.",
|
|
2196
|
+
"trigger_file": "ftm-git.yml",
|
|
2197
|
+
"skill_directory": "ftm-git/",
|
|
2198
|
+
"events_emits": [
|
|
2199
|
+
"secrets_found",
|
|
2200
|
+
"secrets_clear",
|
|
2201
|
+
"secrets_remediated",
|
|
2202
|
+
"task_completed"
|
|
2203
|
+
],
|
|
2204
|
+
"events_listens": [
|
|
2205
|
+
"code_changed",
|
|
2206
|
+
"code_committed"
|
|
2207
|
+
],
|
|
2208
|
+
"blackboard_reads": [
|
|
2209
|
+
"~/.claude/ftm-state/blackboard/context.json",
|
|
2210
|
+
"~/.claude/ftm-state/blackboard/experiences/index.json",
|
|
2211
|
+
"~/.claude/ftm-state/blackboard/patterns.json"
|
|
2212
|
+
],
|
|
2213
|
+
"blackboard_writes": [
|
|
2214
|
+
"~/.claude/ftm-state/blackboard/context.json"
|
|
2215
|
+
],
|
|
2216
|
+
"requirements": [
|
|
2217
|
+
{
|
|
2218
|
+
"type": "tool",
|
|
2219
|
+
"name": "git",
|
|
2220
|
+
"required": true,
|
|
2221
|
+
"description": "staged file inspection, commit history scanning"
|
|
2222
|
+
},
|
|
2223
|
+
{
|
|
2224
|
+
"type": "reference",
|
|
2225
|
+
"name": "references/patterns/SECRET-PATTERNS.md",
|
|
2226
|
+
"required": true,
|
|
2227
|
+
"description": "Tier 1/2 patterns, severity table, ignore list"
|
|
2228
|
+
},
|
|
2229
|
+
{
|
|
2230
|
+
"type": "reference",
|
|
2231
|
+
"name": "references/protocols/REMEDIATION.md",
|
|
2232
|
+
"required": true,
|
|
2233
|
+
"description": "remediation protocol, env var patterns, report formats"
|
|
2234
|
+
},
|
|
2235
|
+
{
|
|
2236
|
+
"type": "reference",
|
|
2237
|
+
"name": "~/.claude/skills/ftm-git/scripts/pre-commit-secrets.sh",
|
|
2238
|
+
"required": true,
|
|
2239
|
+
"description": "pre-commit hook script for installation"
|
|
2240
|
+
},
|
|
2241
|
+
{
|
|
2242
|
+
"type": "reference",
|
|
2243
|
+
"name": "~/.claude/skills/ftm-git/hooks/post-commit-experience.sh",
|
|
2244
|
+
"required": false,
|
|
2245
|
+
"description": "post-commit experience recorder hook"
|
|
2246
|
+
}
|
|
2247
|
+
],
|
|
2248
|
+
"risk": {
|
|
2249
|
+
"level": "medium_write",
|
|
2250
|
+
"scope": "modifies source files to replace hardcoded secrets with env var references; creates/updates .env and .env.example files; installs git hooks in .git/hooks/; re-stages files after remediation",
|
|
2251
|
+
"rollback": "git checkout on refactored source files; manually remove added .env and .gitignore entries; remove hook from .git/hooks/pre-commit"
|
|
2252
|
+
},
|
|
2253
|
+
"approval_gates": [
|
|
2254
|
+
{
|
|
2255
|
+
"trigger": "CRITICAL or HIGH severity secret found",
|
|
2256
|
+
"action": "BLOCK commit/push immediately, announce \"BLOCKED — N secret(s) found\", then attempt auto-remediation"
|
|
2257
|
+
},
|
|
2258
|
+
{
|
|
2259
|
+
"trigger": "auto-remediation proposed for a finding",
|
|
2260
|
+
"action": "show proposed change (file, variable name, env var name) before applying"
|
|
2261
|
+
},
|
|
2262
|
+
{
|
|
2263
|
+
"trigger": "re-scan after remediation still finds secrets",
|
|
2264
|
+
"action": "report remaining findings to user, do not proceed with commit"
|
|
2265
|
+
}
|
|
2266
|
+
],
|
|
2267
|
+
"complexity_routing": {
|
|
2268
|
+
"micro": "auto",
|
|
2269
|
+
"small": "auto",
|
|
2270
|
+
"medium": "auto",
|
|
2271
|
+
"large": "auto",
|
|
2272
|
+
"xl": "auto"
|
|
2273
|
+
},
|
|
2274
|
+
"fallbacks": [
|
|
2275
|
+
{
|
|
2276
|
+
"condition": ".env file does not exist",
|
|
2277
|
+
"action": "create .env and .env.example and add .env to .gitignore before extracting secrets"
|
|
2278
|
+
},
|
|
2279
|
+
{
|
|
2280
|
+
"condition": ".gitignore does not exist",
|
|
2281
|
+
"action": "create .gitignore with .env entry before remediation"
|
|
2282
|
+
},
|
|
2283
|
+
{
|
|
2284
|
+
"condition": "language detection fails for env var pattern",
|
|
2285
|
+
"action": "extract secret to .env but flag source file refactoring as MANUAL_INTERVENTION_NEEDED"
|
|
2286
|
+
},
|
|
2287
|
+
{
|
|
2288
|
+
"condition": "pre-commit hook already exists",
|
|
2289
|
+
"action": "append ftm-git scan to existing hook rather than overwriting"
|
|
2290
|
+
}
|
|
2291
|
+
],
|
|
2292
|
+
"capabilities": [
|
|
2293
|
+
{
|
|
2294
|
+
"type": "cli",
|
|
2295
|
+
"name": "git",
|
|
2296
|
+
"required": true,
|
|
2297
|
+
"description": "staged file listing, diff inspection, commit history traversal"
|
|
2298
|
+
}
|
|
2299
|
+
],
|
|
2300
|
+
"event_payloads": {
|
|
2301
|
+
"secrets_found": [
|
|
2302
|
+
{
|
|
2303
|
+
"field": "skill",
|
|
2304
|
+
"type": "string",
|
|
2305
|
+
"description": "\"ftm-git\""
|
|
2306
|
+
},
|
|
2307
|
+
{
|
|
2308
|
+
"field": "findings_count",
|
|
2309
|
+
"type": "number",
|
|
2310
|
+
"description": "total secrets detected"
|
|
2311
|
+
},
|
|
2312
|
+
{
|
|
2313
|
+
"field": "critical_count",
|
|
2314
|
+
"type": "number",
|
|
2315
|
+
"description": "CRITICAL severity findings"
|
|
2316
|
+
},
|
|
2317
|
+
{
|
|
2318
|
+
"field": "high_count",
|
|
2319
|
+
"type": "number",
|
|
2320
|
+
"description": "HIGH severity findings"
|
|
2321
|
+
},
|
|
2322
|
+
{
|
|
2323
|
+
"field": "files_affected",
|
|
2324
|
+
"type": "string[]",
|
|
2325
|
+
"description": "files containing secrets"
|
|
2326
|
+
},
|
|
2327
|
+
{
|
|
2328
|
+
"field": "blocked",
|
|
2329
|
+
"type": "boolean",
|
|
2330
|
+
"description": "whether commit/push was halted"
|
|
2331
|
+
}
|
|
2332
|
+
],
|
|
2333
|
+
"secrets_clear": [
|
|
2334
|
+
{
|
|
2335
|
+
"field": "skill",
|
|
2336
|
+
"type": "string",
|
|
2337
|
+
"description": "\"ftm-git\""
|
|
2338
|
+
},
|
|
2339
|
+
{
|
|
2340
|
+
"field": "files_scanned",
|
|
2341
|
+
"type": "number",
|
|
2342
|
+
"description": "total files checked"
|
|
2343
|
+
},
|
|
2344
|
+
{
|
|
2345
|
+
"field": "scope",
|
|
2346
|
+
"type": "string",
|
|
2347
|
+
"description": "\"staged\" | \"working_tree\" | \"history\" | \"pre-push\""
|
|
2348
|
+
}
|
|
2349
|
+
],
|
|
2350
|
+
"secrets_remediated": [
|
|
2351
|
+
{
|
|
2352
|
+
"field": "skill",
|
|
2353
|
+
"type": "string",
|
|
2354
|
+
"description": "\"ftm-git\""
|
|
2355
|
+
},
|
|
2356
|
+
{
|
|
2357
|
+
"field": "findings_remediated",
|
|
2358
|
+
"type": "number",
|
|
2359
|
+
"description": "secrets successfully extracted"
|
|
2360
|
+
},
|
|
2361
|
+
{
|
|
2362
|
+
"field": "env_vars_added",
|
|
2363
|
+
"type": "string[]",
|
|
2364
|
+
"description": "environment variable names created"
|
|
2365
|
+
},
|
|
2366
|
+
{
|
|
2367
|
+
"field": "files_refactored",
|
|
2368
|
+
"type": "string[]",
|
|
2369
|
+
"description": "source files updated to use env vars"
|
|
2370
|
+
},
|
|
2371
|
+
{
|
|
2372
|
+
"field": "manual_needed",
|
|
2373
|
+
"type": "number",
|
|
2374
|
+
"description": "findings requiring manual intervention"
|
|
2375
|
+
}
|
|
2376
|
+
],
|
|
2377
|
+
"task_completed": [
|
|
2378
|
+
{
|
|
2379
|
+
"field": "skill",
|
|
2380
|
+
"type": "string",
|
|
2381
|
+
"description": "\"ftm-git\""
|
|
2382
|
+
},
|
|
2383
|
+
{
|
|
2384
|
+
"field": "outcome",
|
|
2385
|
+
"type": "string",
|
|
2386
|
+
"description": "\"clear\" | \"remediated\" | \"blocked\""
|
|
2387
|
+
},
|
|
2388
|
+
{
|
|
2389
|
+
"field": "files_scanned",
|
|
2390
|
+
"type": "number",
|
|
2391
|
+
"description": "total files scanned"
|
|
2392
|
+
},
|
|
2393
|
+
{
|
|
2394
|
+
"field": "duration_ms",
|
|
2395
|
+
"type": "number",
|
|
2396
|
+
"description": "total scan and remediation time"
|
|
2397
|
+
}
|
|
2398
|
+
]
|
|
2399
|
+
},
|
|
2400
|
+
"references": [],
|
|
2401
|
+
"has_evals": true,
|
|
2402
|
+
"warnings": [],
|
|
2403
|
+
"size_bytes": 13806,
|
|
2404
|
+
"enabled": true
|
|
2405
|
+
},
|
|
2406
|
+
{
|
|
2407
|
+
"name": "ftm-intent",
|
|
2408
|
+
"description": "Manages the hierarchical INTENT.md documentation layer — root index with architecture decisions and module map, plus per-module INTENT.md files with function-level entries (does/why/relationships/decisions). Use when creating or updating intent documentation, bootstrapping a new project's intent layer, or when user says \"update intent\", \"document intent\", \"ftm-intent\", \"what does this function do\". Auto-invoked by ftm-executor after every commit to keep intent documentation in sync with code changes.",
|
|
2409
|
+
"trigger_file": "ftm-intent.yml",
|
|
2410
|
+
"skill_directory": "ftm-intent/",
|
|
2411
|
+
"events_emits": [
|
|
2412
|
+
"documentation_updated",
|
|
2413
|
+
"task_completed"
|
|
2414
|
+
],
|
|
2415
|
+
"events_listens": [
|
|
2416
|
+
"code_committed"
|
|
2417
|
+
],
|
|
2418
|
+
"blackboard_reads": [],
|
|
2419
|
+
"blackboard_writes": [],
|
|
2420
|
+
"requirements": [
|
|
2421
|
+
{
|
|
2422
|
+
"type": "reference",
|
|
2423
|
+
"name": ".ftm-map/map.db",
|
|
2424
|
+
"required": false,
|
|
2425
|
+
"description": "SQLite knowledge graph for accurate intent generation (graph-powered mode)"
|
|
2426
|
+
},
|
|
2427
|
+
{
|
|
2428
|
+
"type": "tool",
|
|
2429
|
+
"name": "ftm-map/scripts/.venv/bin/python3",
|
|
2430
|
+
"required": false,
|
|
2431
|
+
"description": "Python runtime for graph-powered views.py"
|
|
2432
|
+
},
|
|
2433
|
+
{
|
|
2434
|
+
"type": "reference",
|
|
2435
|
+
"name": "package.json",
|
|
2436
|
+
"required": false,
|
|
2437
|
+
"description": "project vision and structure detection for bootstrap"
|
|
2438
|
+
}
|
|
2439
|
+
],
|
|
2440
|
+
"risk": {
|
|
2441
|
+
"level": "low_write",
|
|
2442
|
+
"scope": "writes INTENT.md files in project directories; only creates or modifies INTENT.md documentation files; does not touch source code files",
|
|
2443
|
+
"rollback": "git checkout on modified INTENT.md files; delete newly created INTENT.md files"
|
|
2444
|
+
},
|
|
2445
|
+
"approval_gates": [
|
|
2446
|
+
{
|
|
2447
|
+
"trigger": "bootstrap mode — about to create multiple INTENT.md files",
|
|
2448
|
+
"action": "report count of files to be created and modules to be documented, proceed unless user objects"
|
|
2449
|
+
}
|
|
2450
|
+
],
|
|
2451
|
+
"complexity_routing": {
|
|
2452
|
+
"micro": "auto",
|
|
2453
|
+
"small": "auto",
|
|
2454
|
+
"medium": "auto",
|
|
2455
|
+
"large": "auto",
|
|
2456
|
+
"xl": "auto"
|
|
2457
|
+
},
|
|
2458
|
+
"fallbacks": [
|
|
2459
|
+
{
|
|
2460
|
+
"condition": ".ftm-map/map.db not found",
|
|
2461
|
+
"action": "fall back to standard Glob/Grep analysis for function discovery"
|
|
2462
|
+
},
|
|
2463
|
+
{
|
|
2464
|
+
"condition": "Python venv not set up",
|
|
2465
|
+
"action": "fall back to standard analysis, log \"Graph-powered mode unavailable — run ftm-map to enable\""
|
|
2466
|
+
},
|
|
2467
|
+
{
|
|
2468
|
+
"condition": "no README or package.json for Vision section",
|
|
2469
|
+
"action": "infer project vision from directory structure and module names"
|
|
2470
|
+
}
|
|
2471
|
+
],
|
|
2472
|
+
"capabilities": [
|
|
2473
|
+
{
|
|
2474
|
+
"type": "cli",
|
|
2475
|
+
"name": "ftm-map/scripts/.venv/bin/python3",
|
|
2476
|
+
"required": false,
|
|
2477
|
+
"description": "graph-powered intent generation"
|
|
2478
|
+
},
|
|
2479
|
+
{
|
|
2480
|
+
"type": "mcp",
|
|
2481
|
+
"name": "git",
|
|
2482
|
+
"required": false,
|
|
2483
|
+
"description": "detect changed files for incremental sync"
|
|
2484
|
+
}
|
|
2485
|
+
],
|
|
2486
|
+
"event_payloads": {
|
|
2487
|
+
"documentation_updated": [
|
|
2488
|
+
{
|
|
2489
|
+
"field": "skill",
|
|
2490
|
+
"type": "string",
|
|
2491
|
+
"description": "\"ftm-intent\""
|
|
2492
|
+
},
|
|
2493
|
+
{
|
|
2494
|
+
"field": "files_written",
|
|
2495
|
+
"type": "string[]",
|
|
2496
|
+
"description": "absolute paths to INTENT.md files created or modified"
|
|
2497
|
+
},
|
|
2498
|
+
{
|
|
2499
|
+
"field": "functions_added",
|
|
2500
|
+
"type": "number",
|
|
2501
|
+
"description": "new function entries documented"
|
|
2502
|
+
},
|
|
2503
|
+
{
|
|
2504
|
+
"field": "functions_updated",
|
|
2505
|
+
"type": "number",
|
|
2506
|
+
"description": "existing entries updated"
|
|
2507
|
+
},
|
|
2508
|
+
{
|
|
2509
|
+
"field": "functions_removed",
|
|
2510
|
+
"type": "number",
|
|
2511
|
+
"description": "stale entries removed"
|
|
2512
|
+
}
|
|
2513
|
+
],
|
|
2514
|
+
"task_completed": [
|
|
2515
|
+
{
|
|
2516
|
+
"field": "skill",
|
|
2517
|
+
"type": "string",
|
|
2518
|
+
"description": "\"ftm-intent\""
|
|
2519
|
+
},
|
|
2520
|
+
{
|
|
2521
|
+
"field": "mode",
|
|
2522
|
+
"type": "string",
|
|
2523
|
+
"description": "\"bootstrap\" | \"incremental\""
|
|
2524
|
+
},
|
|
2525
|
+
{
|
|
2526
|
+
"field": "files_count",
|
|
2527
|
+
"type": "number",
|
|
2528
|
+
"description": "total INTENT.md files written"
|
|
2529
|
+
},
|
|
2530
|
+
{
|
|
2531
|
+
"field": "duration_ms",
|
|
2532
|
+
"type": "number",
|
|
2533
|
+
"description": "total documentation sync duration"
|
|
2534
|
+
}
|
|
2535
|
+
]
|
|
2536
|
+
},
|
|
2537
|
+
"references": [],
|
|
2538
|
+
"has_evals": false,
|
|
2539
|
+
"warnings": [],
|
|
2540
|
+
"size_bytes": 11817,
|
|
2541
|
+
"enabled": true
|
|
2542
|
+
},
|
|
2543
|
+
{
|
|
2544
|
+
"name": "ftm-map",
|
|
2545
|
+
"description": "Persistent code knowledge graph powered by tree-sitter and SQLite with FTS5 full-text search. Builds structural dependency graphs for blast radius analysis, dependency chains, and keyword search. Use when user asks \"what breaks if I change X\", \"blast radius\", \"what depends on\", \"where do we handle\", \"map codebase\", \"index project\", \"what calls\", \"dependency chain\", \"ftm-map\".",
|
|
2546
|
+
"trigger_file": "ftm-map.yml",
|
|
2547
|
+
"skill_directory": "ftm-map/",
|
|
2548
|
+
"events_emits": [
|
|
2549
|
+
"map_updated",
|
|
2550
|
+
"task_completed"
|
|
2551
|
+
],
|
|
2552
|
+
"events_listens": [
|
|
2553
|
+
"code_committed",
|
|
2554
|
+
"task_received"
|
|
2555
|
+
],
|
|
2556
|
+
"blackboard_reads": [],
|
|
2557
|
+
"blackboard_writes": [],
|
|
2558
|
+
"requirements": [
|
|
2559
|
+
{
|
|
2560
|
+
"type": "tool",
|
|
2561
|
+
"name": "ftm-map/scripts/.venv/bin/python3",
|
|
2562
|
+
"required": true,
|
|
2563
|
+
"description": "Python with tree-sitter and SQLite bindings"
|
|
2564
|
+
},
|
|
2565
|
+
{
|
|
2566
|
+
"type": "tool",
|
|
2567
|
+
"name": "ftm-map/scripts/setup.sh",
|
|
2568
|
+
"required": true,
|
|
2569
|
+
"description": "virtualenv and dependency installer"
|
|
2570
|
+
},
|
|
2571
|
+
{
|
|
2572
|
+
"type": "tool",
|
|
2573
|
+
"name": "ftm-map/scripts/index.py",
|
|
2574
|
+
"required": true,
|
|
2575
|
+
"description": "bootstrap and incremental indexer"
|
|
2576
|
+
},
|
|
2577
|
+
{
|
|
2578
|
+
"type": "tool",
|
|
2579
|
+
"name": "ftm-map/scripts/query.py",
|
|
2580
|
+
"required": true,
|
|
2581
|
+
"description": "blast radius, dependency, and FTS5 search queries"
|
|
2582
|
+
},
|
|
2583
|
+
{
|
|
2584
|
+
"type": "tool",
|
|
2585
|
+
"name": "ftm-map/scripts/views.py",
|
|
2586
|
+
"required": true,
|
|
2587
|
+
"description": "INTENT.md and .mmd diagram generation from graph"
|
|
2588
|
+
},
|
|
2589
|
+
{
|
|
2590
|
+
"type": "tool",
|
|
2591
|
+
"name": "git",
|
|
2592
|
+
"required": false,
|
|
2593
|
+
"description": "changed file detection for incremental mode"
|
|
2594
|
+
},
|
|
2595
|
+
{
|
|
2596
|
+
"type": "config",
|
|
2597
|
+
"name": "~/.claude/ftm-config.yml",
|
|
2598
|
+
"required": false,
|
|
2599
|
+
"description": "model profile and skills.ftm-map.enabled flag"
|
|
2600
|
+
}
|
|
2601
|
+
],
|
|
2602
|
+
"risk": {
|
|
2603
|
+
"level": "low_write",
|
|
2604
|
+
"scope": "writes and updates .ftm-map/map.db SQLite database; does not modify any project source files; also writes blackboard experience entry",
|
|
2605
|
+
"rollback": "delete .ftm-map/map.db to reset to unindexed state; re-run bootstrap to rebuild"
|
|
2606
|
+
},
|
|
2607
|
+
"approval_gates": [
|
|
2608
|
+
{
|
|
2609
|
+
"trigger": "bootstrap requested on very large codebase (1000+ files)",
|
|
2610
|
+
"action": "report estimated file count before running, proceed unless user objects"
|
|
2611
|
+
}
|
|
2612
|
+
],
|
|
2613
|
+
"complexity_routing": {
|
|
2614
|
+
"micro": "auto",
|
|
2615
|
+
"small": "auto",
|
|
2616
|
+
"medium": "auto",
|
|
2617
|
+
"large": "auto",
|
|
2618
|
+
"xl": "auto"
|
|
2619
|
+
},
|
|
2620
|
+
"fallbacks": [
|
|
2621
|
+
{
|
|
2622
|
+
"condition": ".venv does not exist",
|
|
2623
|
+
"action": "run setup.sh first to create it before proceeding"
|
|
2624
|
+
},
|
|
2625
|
+
{
|
|
2626
|
+
"condition": "tree-sitter binary missing",
|
|
2627
|
+
"action": "run setup.sh to install dependencies"
|
|
2628
|
+
},
|
|
2629
|
+
{
|
|
2630
|
+
"condition": ".ftm-map/map.db missing when query requested",
|
|
2631
|
+
"action": "explain graph not indexed, offer to run bootstrap"
|
|
2632
|
+
},
|
|
2633
|
+
{
|
|
2634
|
+
"condition": "git not available for incremental changed-file detection",
|
|
2635
|
+
"action": "fall back to indexing all modified files detected from disk timestamps"
|
|
2636
|
+
}
|
|
2637
|
+
],
|
|
2638
|
+
"capabilities": [
|
|
2639
|
+
{
|
|
2640
|
+
"type": "cli",
|
|
2641
|
+
"name": "ftm-map/scripts/.venv/bin/python3",
|
|
2642
|
+
"required": true,
|
|
2643
|
+
"description": "tree-sitter parsing and SQLite operations"
|
|
2644
|
+
},
|
|
2645
|
+
{
|
|
2646
|
+
"type": "cli",
|
|
2647
|
+
"name": "git",
|
|
2648
|
+
"required": false,
|
|
2649
|
+
"description": "changed file detection for incremental indexing"
|
|
2650
|
+
}
|
|
2651
|
+
],
|
|
2652
|
+
"event_payloads": {
|
|
2653
|
+
"map_updated": [
|
|
2654
|
+
{
|
|
2655
|
+
"field": "skill",
|
|
2656
|
+
"type": "string",
|
|
2657
|
+
"description": "\"ftm-map\""
|
|
2658
|
+
},
|
|
2659
|
+
{
|
|
2660
|
+
"field": "project_path",
|
|
2661
|
+
"type": "string",
|
|
2662
|
+
"description": "absolute path to indexed project"
|
|
2663
|
+
},
|
|
2664
|
+
{
|
|
2665
|
+
"field": "symbols_count",
|
|
2666
|
+
"type": "number",
|
|
2667
|
+
"description": "total symbols in the graph"
|
|
2668
|
+
},
|
|
2669
|
+
{
|
|
2670
|
+
"field": "edges_count",
|
|
2671
|
+
"type": "number",
|
|
2672
|
+
"description": "total dependency edges"
|
|
2673
|
+
},
|
|
2674
|
+
{
|
|
2675
|
+
"field": "files_parsed",
|
|
2676
|
+
"type": "number",
|
|
2677
|
+
"description": "files processed in this operation"
|
|
2678
|
+
},
|
|
2679
|
+
{
|
|
2680
|
+
"field": "duration_ms",
|
|
2681
|
+
"type": "number",
|
|
2682
|
+
"description": "indexing duration"
|
|
2683
|
+
},
|
|
2684
|
+
{
|
|
2685
|
+
"field": "mode",
|
|
2686
|
+
"type": "string",
|
|
2687
|
+
"description": "\"bootstrap\" | \"incremental\""
|
|
2688
|
+
}
|
|
2689
|
+
],
|
|
2690
|
+
"task_completed": [
|
|
2691
|
+
{
|
|
2692
|
+
"field": "skill",
|
|
2693
|
+
"type": "string",
|
|
2694
|
+
"description": "\"ftm-map\""
|
|
2695
|
+
},
|
|
2696
|
+
{
|
|
2697
|
+
"field": "operation",
|
|
2698
|
+
"type": "string",
|
|
2699
|
+
"description": "\"bootstrap\" | \"incremental\" | \"query\""
|
|
2700
|
+
},
|
|
2701
|
+
{
|
|
2702
|
+
"field": "duration_ms",
|
|
2703
|
+
"type": "number",
|
|
2704
|
+
"description": "total operation duration"
|
|
2705
|
+
}
|
|
2706
|
+
]
|
|
2707
|
+
},
|
|
2708
|
+
"references": [],
|
|
2709
|
+
"has_evals": false,
|
|
2710
|
+
"warnings": [],
|
|
2711
|
+
"size_bytes": 11126,
|
|
2712
|
+
"enabled": true
|
|
2713
|
+
},
|
|
2714
|
+
{
|
|
2715
|
+
"name": "ftm-mind",
|
|
2716
|
+
"description": "Unified OODA cognitive loop for the ftm system. Use for freeform `/ftm` or `/ftm-mind` requests, vague asks, mixed-tool workflows, Jira/ticket-driven work, or any request that should be understood before routing. Also handles explicit ftm skill invocations by honoring the requested skill while still doing a fast orientation pass for context, prerequisites, and approval gates. Triggers on open-ended requests like \"help me think through this\", bug reports, plan execution asks, Jira URLs, \"make this better\", mixed MCP asks like \"check my calendar and draft a Slack message\", and direct skill invocations like \"/ftm-debug ...\" or \"/ftm-brainstorm ...\". Do NOT use only when another ftm skill is already actively handling the task and no re-orientation is needed.",
|
|
2717
|
+
"trigger_file": "ftm-mind.yml",
|
|
2718
|
+
"skill_directory": "ftm-mind/",
|
|
2719
|
+
"events_emits": [],
|
|
2720
|
+
"events_listens": [],
|
|
2721
|
+
"blackboard_reads": [],
|
|
2722
|
+
"blackboard_writes": [],
|
|
2723
|
+
"requirements": [
|
|
2724
|
+
{
|
|
2725
|
+
"type": "tool",
|
|
2726
|
+
"name": "git",
|
|
2727
|
+
"required": true,
|
|
2728
|
+
"description": "codebase state inspection (git status, git log)"
|
|
2729
|
+
},
|
|
2730
|
+
{
|
|
2731
|
+
"type": "config",
|
|
2732
|
+
"name": "~/.claude/ftm-config.yml",
|
|
2733
|
+
"required": false,
|
|
2734
|
+
"description": "approval_mode, execution preferences"
|
|
2735
|
+
},
|
|
2736
|
+
{
|
|
2737
|
+
"type": "reference",
|
|
2738
|
+
"name": "~/.claude/skills/ftm-mind/references/mcp-inventory.md",
|
|
2739
|
+
"required": true,
|
|
2740
|
+
"description": "MCP capability routing table"
|
|
2741
|
+
},
|
|
2742
|
+
{
|
|
2743
|
+
"type": "reference",
|
|
2744
|
+
"name": "~/.claude/ftm-state/blackboard/context.json",
|
|
2745
|
+
"required": false,
|
|
2746
|
+
"description": "session state and preferences"
|
|
2747
|
+
},
|
|
2748
|
+
{
|
|
2749
|
+
"type": "reference",
|
|
2750
|
+
"name": "~/.claude/ftm-state/blackboard/experiences/index.json",
|
|
2751
|
+
"required": false,
|
|
2752
|
+
"description": "experience retrieval index"
|
|
2753
|
+
},
|
|
2754
|
+
{
|
|
2755
|
+
"type": "reference",
|
|
2756
|
+
"name": "~/.claude/ftm-state/blackboard/patterns.json",
|
|
2757
|
+
"required": false,
|
|
2758
|
+
"description": "promoted patterns for orientation"
|
|
2759
|
+
}
|
|
2760
|
+
],
|
|
2761
|
+
"risk": {
|
|
2762
|
+
"level": "low_write",
|
|
2763
|
+
"scope": "writes blackboard context and experience files; local code edits only on micro/small direct tasks; routes to other skills for larger work",
|
|
2764
|
+
"rollback": "blackboard writes can be reverted by editing JSON files; no destructive mutations performed directly"
|
|
2765
|
+
},
|
|
2766
|
+
"approval_gates": [
|
|
2767
|
+
{
|
|
2768
|
+
"trigger": "task_size >= medium AND involves external systems",
|
|
2769
|
+
"action": "present numbered plan and wait for explicit user approval"
|
|
2770
|
+
},
|
|
2771
|
+
{
|
|
2772
|
+
"trigger": "any external mutation (Okta, Freshservice, Jira, Slack, email, calendar, S3, deploys, git push)",
|
|
2773
|
+
"action": "present phase-level approval request before executing each mutation"
|
|
2774
|
+
},
|
|
2775
|
+
{
|
|
2776
|
+
"trigger": "task_size == small AND approval_mode == always_ask",
|
|
2777
|
+
"action": "show pre-flight summary before proceeding"
|
|
2778
|
+
}
|
|
2779
|
+
],
|
|
2780
|
+
"complexity_routing": {
|
|
2781
|
+
"micro": "auto",
|
|
2782
|
+
"small": "auto (pre-flight summary if plan_first)",
|
|
2783
|
+
"medium": "plan_first",
|
|
2784
|
+
"large": "plan_first",
|
|
2785
|
+
"xl": "always_ask"
|
|
2786
|
+
},
|
|
2787
|
+
"fallbacks": [
|
|
2788
|
+
{
|
|
2789
|
+
"condition": "blackboard context.json missing or malformed",
|
|
2790
|
+
"action": "treat as empty state, proceed at full capability using live observation"
|
|
2791
|
+
},
|
|
2792
|
+
{
|
|
2793
|
+
"condition": "experiences/index.json empty or no matching entries",
|
|
2794
|
+
"action": "skip experience retrieval, lean on current repo state and direct inspection"
|
|
2795
|
+
},
|
|
2796
|
+
{
|
|
2797
|
+
"condition": "patterns.json missing",
|
|
2798
|
+
"action": "skip pattern application, rely on direct analysis"
|
|
2799
|
+
},
|
|
2800
|
+
{
|
|
2801
|
+
"condition": "ftm-config.yml missing",
|
|
2802
|
+
"action": "default to plan_first approval_mode and balanced model profile"
|
|
2803
|
+
},
|
|
2804
|
+
{
|
|
2805
|
+
"condition": "mcp-inventory.md missing",
|
|
2806
|
+
"action": "rely on built-in MCP routing heuristics from skill body"
|
|
2807
|
+
},
|
|
2808
|
+
{
|
|
2809
|
+
"condition": "requested ftm skill unavailable",
|
|
2810
|
+
"action": "notify user and attempt direct handling or alternate routing"
|
|
2811
|
+
}
|
|
2812
|
+
],
|
|
2813
|
+
"capabilities": [
|
|
2814
|
+
{
|
|
2815
|
+
"type": "mcp",
|
|
2816
|
+
"name": "git",
|
|
2817
|
+
"required": false,
|
|
2818
|
+
"description": "codebase state, diffs, history, commits"
|
|
2819
|
+
},
|
|
2820
|
+
{
|
|
2821
|
+
"type": "mcp",
|
|
2822
|
+
"name": "mcp-atlassian-personal",
|
|
2823
|
+
"required": false,
|
|
2824
|
+
"description": "Jira/Confluence reads for ticket-driven work"
|
|
2825
|
+
},
|
|
2826
|
+
{
|
|
2827
|
+
"type": "mcp",
|
|
2828
|
+
"name": "slack",
|
|
2829
|
+
"required": false,
|
|
2830
|
+
"description": "Slack context reads, draft messages"
|
|
2831
|
+
},
|
|
2832
|
+
{
|
|
2833
|
+
"type": "mcp",
|
|
2834
|
+
"name": "gmail",
|
|
2835
|
+
"required": false,
|
|
2836
|
+
"description": "email reads, drafts"
|
|
2837
|
+
},
|
|
2838
|
+
{
|
|
2839
|
+
"type": "mcp",
|
|
2840
|
+
"name": "google-calendar",
|
|
2841
|
+
"required": false,
|
|
2842
|
+
"description": "calendar inspection for scheduling requests"
|
|
2843
|
+
},
|
|
2844
|
+
{
|
|
2845
|
+
"type": "mcp",
|
|
2846
|
+
"name": "freshservice-mcp",
|
|
2847
|
+
"required": false,
|
|
2848
|
+
"description": "IT ticketing reads"
|
|
2849
|
+
},
|
|
2850
|
+
{
|
|
2851
|
+
"type": "mcp",
|
|
2852
|
+
"name": "sequential-thinking",
|
|
2853
|
+
"required": false,
|
|
2854
|
+
"description": "multi-step reflective reasoning"
|
|
2855
|
+
},
|
|
2856
|
+
{
|
|
2857
|
+
"type": "mcp",
|
|
2858
|
+
"name": "playwright",
|
|
2859
|
+
"required": false,
|
|
2860
|
+
"description": "browser automation for visual tasks"
|
|
2861
|
+
},
|
|
2862
|
+
{
|
|
2863
|
+
"type": "mcp",
|
|
2864
|
+
"name": "glean_default",
|
|
2865
|
+
"required": false,
|
|
2866
|
+
"description": "internal company knowledge search"
|
|
2867
|
+
},
|
|
2868
|
+
{
|
|
2869
|
+
"type": "mcp",
|
|
2870
|
+
"name": "context7",
|
|
2871
|
+
"required": false,
|
|
2872
|
+
"description": "external library documentation"
|
|
2873
|
+
}
|
|
2874
|
+
],
|
|
2875
|
+
"event_payloads": {
|
|
2876
|
+
"task_completed": [
|
|
2877
|
+
{
|
|
2878
|
+
"field": "skill",
|
|
2879
|
+
"type": "string",
|
|
2880
|
+
"description": "\"ftm-mind\""
|
|
2881
|
+
},
|
|
2882
|
+
{
|
|
2883
|
+
"field": "task_type",
|
|
2884
|
+
"type": "string",
|
|
2885
|
+
"description": "detected task type (feature, bug, refactor, investigation, etc.)"
|
|
2886
|
+
},
|
|
2887
|
+
{
|
|
2888
|
+
"field": "task_size",
|
|
2889
|
+
"type": "string",
|
|
2890
|
+
"description": "micro | small | medium | large"
|
|
2891
|
+
},
|
|
2892
|
+
{
|
|
2893
|
+
"field": "route",
|
|
2894
|
+
"type": "string",
|
|
2895
|
+
"description": "direct | skill name routed to"
|
|
2896
|
+
},
|
|
2897
|
+
{
|
|
2898
|
+
"field": "duration_ms",
|
|
2899
|
+
"type": "number",
|
|
2900
|
+
"description": "time from observe to act completion"
|
|
2901
|
+
},
|
|
2902
|
+
{
|
|
2903
|
+
"field": "blackboard_updated",
|
|
2904
|
+
"type": "boolean",
|
|
2905
|
+
"description": "whether context.json and experience were written"
|
|
2906
|
+
}
|
|
2907
|
+
]
|
|
2908
|
+
},
|
|
2909
|
+
"references": [
|
|
2910
|
+
"blackboard-schema.md",
|
|
2911
|
+
"complexity-guide.md",
|
|
2912
|
+
"event-registry.md",
|
|
2913
|
+
"mcp-inventory.md",
|
|
2914
|
+
"reflexion-protocol.md",
|
|
2915
|
+
"routing-scenarios.md"
|
|
2916
|
+
],
|
|
2917
|
+
"has_evals": true,
|
|
2918
|
+
"warnings": [],
|
|
2919
|
+
"size_bytes": 49471,
|
|
2920
|
+
"enabled": true
|
|
2921
|
+
},
|
|
2922
|
+
{
|
|
2923
|
+
"name": "ftm-pause",
|
|
2924
|
+
"description": "Save the current ftm skill session state so work can be resumed in a new conversation. Use when user says \"pause\", \"save state\", \"I need to stop\", \"continue later\", \"ftm pause\", \"save progress\", or is about to end a session mid-workflow. Works with any ftm skill (brainstorm, executor, debug, council, audit).",
|
|
2925
|
+
"trigger_file": "ftm-pause.yml",
|
|
2926
|
+
"skill_directory": "ftm-pause/",
|
|
2927
|
+
"events_emits": [
|
|
2928
|
+
"session_paused",
|
|
2929
|
+
"task_completed"
|
|
2930
|
+
],
|
|
2931
|
+
"events_listens": [],
|
|
2932
|
+
"blackboard_reads": [],
|
|
2933
|
+
"blackboard_writes": [],
|
|
2934
|
+
"requirements": [
|
|
2935
|
+
{
|
|
2936
|
+
"type": "reference",
|
|
2937
|
+
"name": "~/.claude/ftm-state/STATE.md",
|
|
2938
|
+
"required": false,
|
|
2939
|
+
"description": "existing state file to overwrite"
|
|
2940
|
+
},
|
|
2941
|
+
{
|
|
2942
|
+
"type": "reference",
|
|
2943
|
+
"name": "~/.claude/ftm-pause/references/protocols/SKILL-RESTORE-PROTOCOLS.md",
|
|
2944
|
+
"required": true,
|
|
2945
|
+
"description": "per-skill capture field specifications"
|
|
2946
|
+
},
|
|
2947
|
+
{
|
|
2948
|
+
"type": "reference",
|
|
2949
|
+
"name": "~/.claude/ftm-pause/references/protocols/VALIDATION.md",
|
|
2950
|
+
"required": true,
|
|
2951
|
+
"description": "pre-write and post-write validation checklist"
|
|
2952
|
+
},
|
|
2953
|
+
{
|
|
2954
|
+
"type": "tool",
|
|
2955
|
+
"name": "git",
|
|
2956
|
+
"required": false,
|
|
2957
|
+
"description": "git branch and commit hash capture for state file"
|
|
2958
|
+
}
|
|
2959
|
+
],
|
|
2960
|
+
"risk": {
|
|
2961
|
+
"level": "low_write",
|
|
2962
|
+
"scope": "writes ~/.claude/ftm-state/STATE.md only; does not modify project source files or blackboard experiences; overwrites existing STATE.md without backup",
|
|
2963
|
+
"rollback": "no project mutations; prior STATE.md is overwritten (not backed up) by design"
|
|
2964
|
+
},
|
|
2965
|
+
"approval_gates": [
|
|
2966
|
+
{
|
|
2967
|
+
"trigger": "multiple skills active and unclear which to pause",
|
|
2968
|
+
"action": "ask user which skill state to save before writing"
|
|
2969
|
+
}
|
|
2970
|
+
],
|
|
2971
|
+
"complexity_routing": {
|
|
2972
|
+
"micro": "auto",
|
|
2973
|
+
"small": "auto",
|
|
2974
|
+
"medium": "auto",
|
|
2975
|
+
"large": "auto",
|
|
2976
|
+
"xl": "auto"
|
|
2977
|
+
},
|
|
2978
|
+
"fallbacks": [
|
|
2979
|
+
{
|
|
2980
|
+
"condition": "~/.claude/ftm-state/ directory doesn't exist",
|
|
2981
|
+
"action": "create directory before writing STATE.md"
|
|
2982
|
+
},
|
|
2983
|
+
{
|
|
2984
|
+
"condition": "no ftm skill detected as active",
|
|
2985
|
+
"action": "report \"No active ftm session detected\" and list which skills this applies to"
|
|
2986
|
+
},
|
|
2987
|
+
{
|
|
2988
|
+
"condition": "git not available",
|
|
2989
|
+
"action": "omit git_branch and git_commit fields from state file frontmatter"
|
|
2990
|
+
},
|
|
2991
|
+
{
|
|
2992
|
+
"condition": "artifact files referenced in state don't exist on disk",
|
|
2993
|
+
"action": "note as \"path recorded but file not found\" in Artifacts section"
|
|
2994
|
+
}
|
|
2995
|
+
],
|
|
2996
|
+
"capabilities": [
|
|
2997
|
+
{
|
|
2998
|
+
"type": "cli",
|
|
2999
|
+
"name": "git",
|
|
3000
|
+
"required": false,
|
|
3001
|
+
"description": "branch name and commit hash for state file metadata"
|
|
3002
|
+
}
|
|
3003
|
+
],
|
|
3004
|
+
"event_payloads": {
|
|
3005
|
+
"session_paused": [
|
|
3006
|
+
{
|
|
3007
|
+
"field": "skill",
|
|
3008
|
+
"type": "string",
|
|
3009
|
+
"description": "\"ftm-pause\""
|
|
3010
|
+
},
|
|
3011
|
+
{
|
|
3012
|
+
"field": "saved_skill",
|
|
3013
|
+
"type": "string",
|
|
3014
|
+
"description": "the ftm skill whose state was saved"
|
|
3015
|
+
},
|
|
3016
|
+
{
|
|
3017
|
+
"field": "phase",
|
|
3018
|
+
"type": "string",
|
|
3019
|
+
"description": "phase at which the session was paused"
|
|
3020
|
+
},
|
|
3021
|
+
{
|
|
3022
|
+
"field": "state_file",
|
|
3023
|
+
"type": "string",
|
|
3024
|
+
"description": "absolute path to written STATE.md"
|
|
3025
|
+
},
|
|
3026
|
+
{
|
|
3027
|
+
"field": "artifacts_count",
|
|
3028
|
+
"type": "number",
|
|
3029
|
+
"description": "number of artifact paths recorded"
|
|
3030
|
+
}
|
|
3031
|
+
],
|
|
3032
|
+
"task_completed": [
|
|
3033
|
+
{
|
|
3034
|
+
"field": "skill",
|
|
3035
|
+
"type": "string",
|
|
3036
|
+
"description": "\"ftm-pause\""
|
|
3037
|
+
},
|
|
3038
|
+
{
|
|
3039
|
+
"field": "saved_skill",
|
|
3040
|
+
"type": "string",
|
|
3041
|
+
"description": "the ftm skill whose state was saved"
|
|
3042
|
+
},
|
|
3043
|
+
{
|
|
3044
|
+
"field": "state_file",
|
|
3045
|
+
"type": "string",
|
|
3046
|
+
"description": "absolute path to STATE.md"
|
|
3047
|
+
}
|
|
3048
|
+
]
|
|
3049
|
+
},
|
|
3050
|
+
"references": [],
|
|
3051
|
+
"has_evals": false,
|
|
3052
|
+
"warnings": [],
|
|
3053
|
+
"size_bytes": 8104,
|
|
3054
|
+
"enabled": true
|
|
3055
|
+
},
|
|
3056
|
+
{
|
|
3057
|
+
"name": "ftm-researcher",
|
|
3058
|
+
"description": "Deep parallel research engine with 7 domain-specialized finder agents, adversarial review via ftm-council, adaptive wave-based search, structured reconciliation with disagreement maps, credibility scoring, and conversational iteration. Use when the user wants thorough research on any topic — \"research X\", \"find out about Y\", \"what's the state of the art on Z\", \"compare approaches to W\", \"deep dive into X\", \"look into Y\". Also invoked by ftm-brainstorm for its research sprints. Triggers on \"research\", \"investigate\", \"deep dive\", \"state of the art\", \"compare\", \"find examples of\", \"what's out there for\", \"how do others handle\", \"find me evidence\", \"look into\". For idea exploration and brainstorming, use ftm-brainstorm instead (which calls ftm-researcher internally for research).",
|
|
3059
|
+
"trigger_file": "ftm-researcher.yml",
|
|
3060
|
+
"skill_directory": "ftm-researcher/",
|
|
3061
|
+
"events_emits": [
|
|
3062
|
+
"research_complete",
|
|
3063
|
+
"task_completed"
|
|
3064
|
+
],
|
|
3065
|
+
"events_listens": [
|
|
3066
|
+
"task_received"
|
|
3067
|
+
],
|
|
3068
|
+
"blackboard_reads": [],
|
|
3069
|
+
"blackboard_writes": [],
|
|
3070
|
+
"requirements": [
|
|
3071
|
+
{
|
|
3072
|
+
"type": "config",
|
|
3073
|
+
"name": "~/.claude/ftm-config.yml",
|
|
3074
|
+
"required": false,
|
|
3075
|
+
"description": "planning and review model profiles, per_skill_overrides.ftm-researcher agent cap"
|
|
3076
|
+
},
|
|
3077
|
+
{
|
|
3078
|
+
"type": "reference",
|
|
3079
|
+
"name": "ftm-researcher/references/agent-prompts.md",
|
|
3080
|
+
"required": true,
|
|
3081
|
+
"description": "7 finder agent prompts and orchestrator decomposition protocol"
|
|
3082
|
+
},
|
|
3083
|
+
{
|
|
3084
|
+
"type": "reference",
|
|
3085
|
+
"name": "ftm-researcher/references/synthesis-pipeline.md",
|
|
3086
|
+
"required": true,
|
|
3087
|
+
"description": "5-phase synthesis pipeline"
|
|
3088
|
+
},
|
|
3089
|
+
{
|
|
3090
|
+
"type": "reference",
|
|
3091
|
+
"name": "ftm-researcher/references/adaptive-search.md",
|
|
3092
|
+
"required": false,
|
|
3093
|
+
"description": "wave 2 adaptive refinement (deep mode only)"
|
|
3094
|
+
},
|
|
3095
|
+
{
|
|
3096
|
+
"type": "reference",
|
|
3097
|
+
"name": "ftm-researcher/references/output-format.md",
|
|
3098
|
+
"required": true,
|
|
3099
|
+
"description": "JSON schema and markdown template"
|
|
3100
|
+
},
|
|
3101
|
+
{
|
|
3102
|
+
"type": "reference",
|
|
3103
|
+
"name": "ftm-researcher/references/council-integration.md",
|
|
3104
|
+
"required": false,
|
|
3105
|
+
"description": "ftm-council interface (deep mode only)"
|
|
3106
|
+
},
|
|
3107
|
+
{
|
|
3108
|
+
"type": "reference",
|
|
3109
|
+
"name": "~/.claude/ftm-blackboard/context.json",
|
|
3110
|
+
"required": false,
|
|
3111
|
+
"description": "session state"
|
|
3112
|
+
},
|
|
3113
|
+
{
|
|
3114
|
+
"type": "reference",
|
|
3115
|
+
"name": "~/.claude/ftm-blackboard/patterns.json",
|
|
3116
|
+
"required": false,
|
|
3117
|
+
"description": "recurring research patterns"
|
|
3118
|
+
}
|
|
3119
|
+
],
|
|
3120
|
+
"risk": {
|
|
3121
|
+
"level": "read_only",
|
|
3122
|
+
"scope": "reads web sources and local codebase via agents; writes blackboard experience entry; writes structured JSON artifact; does not modify project source files",
|
|
3123
|
+
"rollback": "no project mutations; blackboard write can be reverted by editing JSON files"
|
|
3124
|
+
},
|
|
3125
|
+
"approval_gates": [
|
|
3126
|
+
{
|
|
3127
|
+
"trigger": "research complete and user says \"done\" / \"thanks\"",
|
|
3128
|
+
"action": "finalize, write blackboard, emit events"
|
|
3129
|
+
},
|
|
3130
|
+
{
|
|
3131
|
+
"trigger": "deep mode and ftm-council invoked",
|
|
3132
|
+
"action": "council runs automatically on top claims (no user gate needed for this step)"
|
|
3133
|
+
}
|
|
3134
|
+
],
|
|
3135
|
+
"complexity_routing": {
|
|
3136
|
+
"micro": "auto",
|
|
3137
|
+
"small": "auto",
|
|
3138
|
+
"medium": "auto",
|
|
3139
|
+
"large": "auto",
|
|
3140
|
+
"xl": "auto"
|
|
3141
|
+
},
|
|
3142
|
+
"fallbacks": [
|
|
3143
|
+
{
|
|
3144
|
+
"condition": "ftm-council not available (deep mode)",
|
|
3145
|
+
"action": "use 2 fallback challenger agents (Devil's Advocate + Edge Case Hunter) instead"
|
|
3146
|
+
},
|
|
3147
|
+
{
|
|
3148
|
+
"condition": "agent cap exceeded",
|
|
3149
|
+
"action": "queue excess agents and dispatch after current wave completes"
|
|
3150
|
+
},
|
|
3151
|
+
{
|
|
3152
|
+
"condition": "research agent returns no findings",
|
|
3153
|
+
"action": "broaden query and retry; if still empty, report \"No prior art found — this may be novel\""
|
|
3154
|
+
},
|
|
3155
|
+
{
|
|
3156
|
+
"condition": "blackboard missing",
|
|
3157
|
+
"action": "proceed without experience-informed shortcuts"
|
|
3158
|
+
}
|
|
3159
|
+
],
|
|
3160
|
+
"capabilities": [
|
|
3161
|
+
{
|
|
3162
|
+
"type": "mcp",
|
|
3163
|
+
"name": "WebSearch",
|
|
3164
|
+
"required": false,
|
|
3165
|
+
"description": "finder agents for web, GitHub, and competitive research"
|
|
3166
|
+
},
|
|
3167
|
+
{
|
|
3168
|
+
"type": "mcp",
|
|
3169
|
+
"name": "WebFetch",
|
|
3170
|
+
"required": false,
|
|
3171
|
+
"description": "fetching specific URLs found during research"
|
|
3172
|
+
},
|
|
3173
|
+
{
|
|
3174
|
+
"type": "mcp",
|
|
3175
|
+
"name": "sequential-thinking",
|
|
3176
|
+
"required": false,
|
|
3177
|
+
"description": "complex synthesis and reconciliation"
|
|
3178
|
+
}
|
|
3179
|
+
],
|
|
3180
|
+
"event_payloads": {
|
|
3181
|
+
"research_complete": [
|
|
3182
|
+
{
|
|
3183
|
+
"field": "skill",
|
|
3184
|
+
"type": "string",
|
|
3185
|
+
"description": "\"ftm-researcher\""
|
|
3186
|
+
},
|
|
3187
|
+
{
|
|
3188
|
+
"field": "query",
|
|
3189
|
+
"type": "string",
|
|
3190
|
+
"description": "original research question"
|
|
3191
|
+
},
|
|
3192
|
+
{
|
|
3193
|
+
"field": "mode",
|
|
3194
|
+
"type": "string",
|
|
3195
|
+
"description": "\"quick\" | \"standard\" | \"deep\""
|
|
3196
|
+
},
|
|
3197
|
+
{
|
|
3198
|
+
"field": "findings_count",
|
|
3199
|
+
"type": "number",
|
|
3200
|
+
"description": "total normalized findings"
|
|
3201
|
+
},
|
|
3202
|
+
{
|
|
3203
|
+
"field": "consensus_count",
|
|
3204
|
+
"type": "number",
|
|
3205
|
+
"description": "findings with 3+ agent agreement"
|
|
3206
|
+
},
|
|
3207
|
+
{
|
|
3208
|
+
"field": "contested_count",
|
|
3209
|
+
"type": "number",
|
|
3210
|
+
"description": "findings with council disagreement"
|
|
3211
|
+
},
|
|
3212
|
+
{
|
|
3213
|
+
"field": "unique_count",
|
|
3214
|
+
"type": "number",
|
|
3215
|
+
"description": "single-agent findings"
|
|
3216
|
+
},
|
|
3217
|
+
{
|
|
3218
|
+
"field": "sources_count",
|
|
3219
|
+
"type": "number",
|
|
3220
|
+
"description": "total sources cited"
|
|
3221
|
+
},
|
|
3222
|
+
{
|
|
3223
|
+
"field": "council_used",
|
|
3224
|
+
"type": "boolean",
|
|
3225
|
+
"description": "whether ftm-council was invoked"
|
|
3226
|
+
},
|
|
3227
|
+
{
|
|
3228
|
+
"field": "duration_ms",
|
|
3229
|
+
"type": "number",
|
|
3230
|
+
"description": "total research duration"
|
|
3231
|
+
}
|
|
3232
|
+
],
|
|
3233
|
+
"task_completed": [
|
|
3234
|
+
{
|
|
3235
|
+
"field": "skill",
|
|
3236
|
+
"type": "string",
|
|
3237
|
+
"description": "\"ftm-researcher\""
|
|
3238
|
+
},
|
|
3239
|
+
{
|
|
3240
|
+
"field": "task_title",
|
|
3241
|
+
"type": "string",
|
|
3242
|
+
"description": "research topic title"
|
|
3243
|
+
},
|
|
3244
|
+
{
|
|
3245
|
+
"field": "duration_ms",
|
|
3246
|
+
"type": "number",
|
|
3247
|
+
"description": "total session duration including iterations"
|
|
3248
|
+
}
|
|
3249
|
+
]
|
|
3250
|
+
},
|
|
3251
|
+
"references": [
|
|
3252
|
+
"adaptive-search.md",
|
|
3253
|
+
"agent-prompts.md",
|
|
3254
|
+
"council-integration.md",
|
|
3255
|
+
"output-format.md",
|
|
3256
|
+
"synthesis-pipeline.md"
|
|
3257
|
+
],
|
|
3258
|
+
"has_evals": true,
|
|
3259
|
+
"warnings": [],
|
|
3260
|
+
"size_bytes": 13941,
|
|
3261
|
+
"enabled": true
|
|
3262
|
+
},
|
|
3263
|
+
{
|
|
3264
|
+
"name": "ftm-resume",
|
|
3265
|
+
"description": "Resume a previously paused ftm skill session from saved state. Use when user says \"resume\", \"continue where we left off\", \"ftm resume\", \"pick up\", or starts a new conversation wanting to continue previous ftm work.",
|
|
3266
|
+
"trigger_file": "ftm-resume.yml",
|
|
3267
|
+
"skill_directory": "ftm-resume/",
|
|
3268
|
+
"events_emits": [
|
|
3269
|
+
"session_resumed",
|
|
3270
|
+
"task_completed"
|
|
3271
|
+
],
|
|
3272
|
+
"events_listens": [],
|
|
3273
|
+
"blackboard_reads": [],
|
|
3274
|
+
"blackboard_writes": [],
|
|
3275
|
+
"requirements": [
|
|
3276
|
+
{
|
|
3277
|
+
"type": "reference",
|
|
3278
|
+
"name": "~/.claude/ftm-state/STATE.md",
|
|
3279
|
+
"required": true,
|
|
3280
|
+
"description": "saved session state file from ftm-pause"
|
|
3281
|
+
},
|
|
3282
|
+
{
|
|
3283
|
+
"type": "reference",
|
|
3284
|
+
"name": "../ftm-pause/references/protocols/SKILL-RESTORE-PROTOCOLS.md",
|
|
3285
|
+
"required": true,
|
|
3286
|
+
"description": "per-skill state field restoration instructions"
|
|
3287
|
+
},
|
|
3288
|
+
{
|
|
3289
|
+
"type": "reference",
|
|
3290
|
+
"name": "../ftm-pause/references/protocols/VALIDATION.md",
|
|
3291
|
+
"required": true,
|
|
3292
|
+
"description": "validation protocol for state file integrity"
|
|
3293
|
+
},
|
|
3294
|
+
{
|
|
3295
|
+
"type": "reference",
|
|
3296
|
+
"name": "~/.claude/ftm-state/archive/",
|
|
3297
|
+
"required": false,
|
|
3298
|
+
"description": "archived prior state files"
|
|
3299
|
+
},
|
|
3300
|
+
{
|
|
3301
|
+
"type": "tool",
|
|
3302
|
+
"name": "git",
|
|
3303
|
+
"required": false,
|
|
3304
|
+
"description": "checking git state drift since session was paused"
|
|
3305
|
+
}
|
|
3306
|
+
],
|
|
3307
|
+
"risk": {
|
|
3308
|
+
"level": "low_write",
|
|
3309
|
+
"scope": "archives STATE.md by moving it to ~/.claude/ftm-state/archive/; invokes the target ftm skill with restored context; does not modify project source files",
|
|
3310
|
+
"rollback": "copy archived STATE.md back from archive if restoration was incorrect"
|
|
3311
|
+
},
|
|
3312
|
+
"approval_gates": [
|
|
3313
|
+
{
|
|
3314
|
+
"trigger": "validation finds warnings (git drift, stale state, missing artifacts)",
|
|
3315
|
+
"action": "present consolidated validation summary and require user acknowledgment before proceeding"
|
|
3316
|
+
},
|
|
3317
|
+
{
|
|
3318
|
+
"trigger": "validation finds block-level failure",
|
|
3319
|
+
"action": "stop and report failure; do not invoke target skill"
|
|
3320
|
+
},
|
|
3321
|
+
{
|
|
3322
|
+
"trigger": "user provides new context along with \"yes\"",
|
|
3323
|
+
"action": "capture as post-pause update and inject into skill invocation"
|
|
3324
|
+
}
|
|
3325
|
+
],
|
|
3326
|
+
"complexity_routing": {
|
|
3327
|
+
"micro": "auto",
|
|
3328
|
+
"small": "auto",
|
|
3329
|
+
"medium": "auto",
|
|
3330
|
+
"large": "auto",
|
|
3331
|
+
"xl": "auto"
|
|
3332
|
+
},
|
|
3333
|
+
"fallbacks": [
|
|
3334
|
+
{
|
|
3335
|
+
"condition": "STATE.md not found",
|
|
3336
|
+
"action": "report \"No saved ftm session found\" with instructions for saving sessions"
|
|
3337
|
+
},
|
|
3338
|
+
{
|
|
3339
|
+
"condition": "STATE.md frontmatter missing required fields",
|
|
3340
|
+
"action": "report validation failure with specific missing fields"
|
|
3341
|
+
},
|
|
3342
|
+
{
|
|
3343
|
+
"condition": "multiple STATE.md files (STATE.md + STATE-*.md)",
|
|
3344
|
+
"action": "ask user which to resume, list each with skill type and timestamp"
|
|
3345
|
+
},
|
|
3346
|
+
{
|
|
3347
|
+
"condition": "state is >7 days old",
|
|
3348
|
+
"action": "flag as potentially stale with warning, require user acknowledgment"
|
|
3349
|
+
}
|
|
3350
|
+
],
|
|
3351
|
+
"capabilities": [
|
|
3352
|
+
{
|
|
3353
|
+
"type": "cli",
|
|
3354
|
+
"name": "git",
|
|
3355
|
+
"required": false,
|
|
3356
|
+
"description": "branch and commit state validation"
|
|
3357
|
+
}
|
|
3358
|
+
],
|
|
3359
|
+
"event_payloads": {
|
|
3360
|
+
"session_resumed": [
|
|
3361
|
+
{
|
|
3362
|
+
"field": "skill",
|
|
3363
|
+
"type": "string",
|
|
3364
|
+
"description": "\"ftm-resume\""
|
|
3365
|
+
},
|
|
3366
|
+
{
|
|
3367
|
+
"field": "resumed_skill",
|
|
3368
|
+
"type": "string",
|
|
3369
|
+
"description": "the ftm skill that was re-invoked"
|
|
3370
|
+
},
|
|
3371
|
+
{
|
|
3372
|
+
"field": "phase",
|
|
3373
|
+
"type": "string",
|
|
3374
|
+
"description": "phase the session is resuming at"
|
|
3375
|
+
},
|
|
3376
|
+
{
|
|
3377
|
+
"field": "state_age_hours",
|
|
3378
|
+
"type": "number",
|
|
3379
|
+
"description": "how long ago the session was paused"
|
|
3380
|
+
},
|
|
3381
|
+
{
|
|
3382
|
+
"field": "post_pause_update",
|
|
3383
|
+
"type": "boolean",
|
|
3384
|
+
"description": "whether user provided new context"
|
|
3385
|
+
}
|
|
3386
|
+
],
|
|
3387
|
+
"task_completed": [
|
|
3388
|
+
{
|
|
3389
|
+
"field": "skill",
|
|
3390
|
+
"type": "string",
|
|
3391
|
+
"description": "\"ftm-resume\""
|
|
3392
|
+
},
|
|
3393
|
+
{
|
|
3394
|
+
"field": "resumed_skill",
|
|
3395
|
+
"type": "string",
|
|
3396
|
+
"description": "the ftm skill re-invoked"
|
|
3397
|
+
},
|
|
3398
|
+
{
|
|
3399
|
+
"field": "state_file_archived",
|
|
3400
|
+
"type": "string",
|
|
3401
|
+
"description": "path where STATE.md was archived"
|
|
3402
|
+
}
|
|
3403
|
+
]
|
|
3404
|
+
},
|
|
3405
|
+
"references": [],
|
|
3406
|
+
"has_evals": false,
|
|
3407
|
+
"warnings": [],
|
|
3408
|
+
"size_bytes": 9319,
|
|
3409
|
+
"enabled": true
|
|
3410
|
+
},
|
|
3411
|
+
{
|
|
3412
|
+
"name": "ftm-retro",
|
|
3413
|
+
"description": "Post-execution self-assessment skill. Automatically triggered after ftm-executor completes a plan. Scores execution across 5 dimensions, identifies what went well and what was slow, writes structured report with improvement suggestions. Use when user says \"retro\", \"retrospective\", \"how did that go\", \"execution review\", \"self-assessment\", \"ftm retro\".",
|
|
3414
|
+
"trigger_file": "ftm-retro.yml",
|
|
3415
|
+
"skill_directory": "ftm-retro/",
|
|
3416
|
+
"events_emits": [
|
|
3417
|
+
"experience_recorded",
|
|
3418
|
+
"pattern_discovered",
|
|
3419
|
+
"task_completed"
|
|
3420
|
+
],
|
|
3421
|
+
"events_listens": [
|
|
3422
|
+
"task_completed",
|
|
3423
|
+
"error_encountered",
|
|
3424
|
+
"bug_fixed"
|
|
3425
|
+
],
|
|
3426
|
+
"blackboard_reads": [],
|
|
3427
|
+
"blackboard_writes": [
|
|
3428
|
+
"~/.claude/ftm-state/blackboard/context.json",
|
|
3429
|
+
"~/.claude/ftm-state/blackboard/experiences/YYYY-MM-DD_task-slug.json"
|
|
3430
|
+
],
|
|
3431
|
+
"requirements": [
|
|
3432
|
+
{
|
|
3433
|
+
"type": "reference",
|
|
3434
|
+
"name": "PROGRESS.md",
|
|
3435
|
+
"required": false,
|
|
3436
|
+
"description": "executor progress log for auto-triggered mode"
|
|
3437
|
+
},
|
|
3438
|
+
{
|
|
3439
|
+
"type": "reference",
|
|
3440
|
+
"name": "~/.claude/ftm-retros/",
|
|
3441
|
+
"required": false,
|
|
3442
|
+
"description": "prior retro files for pattern analysis"
|
|
3443
|
+
},
|
|
3444
|
+
{
|
|
3445
|
+
"type": "reference",
|
|
3446
|
+
"name": "references/protocols/SCORING-RUBRICS.md",
|
|
3447
|
+
"required": true,
|
|
3448
|
+
"description": "scoring scale breakpoints and evidence requirements"
|
|
3449
|
+
},
|
|
3450
|
+
{
|
|
3451
|
+
"type": "reference",
|
|
3452
|
+
"name": "references/templates/REPORT-FORMAT.md",
|
|
3453
|
+
"required": true,
|
|
3454
|
+
"description": "retro report output template"
|
|
3455
|
+
},
|
|
3456
|
+
{
|
|
3457
|
+
"type": "reference",
|
|
3458
|
+
"name": "~/.claude/ftm-state/blackboard/experiences/index.json",
|
|
3459
|
+
"required": false,
|
|
3460
|
+
"description": "experience inventory for micro-reflection mode"
|
|
3461
|
+
},
|
|
3462
|
+
{
|
|
3463
|
+
"type": "reference",
|
|
3464
|
+
"name": "~/.claude/ftm-state/blackboard/patterns.json",
|
|
3465
|
+
"required": false,
|
|
3466
|
+
"description": "pattern registry for promotion and decay"
|
|
3467
|
+
}
|
|
3468
|
+
],
|
|
3469
|
+
"risk": {
|
|
3470
|
+
"level": "low_write",
|
|
3471
|
+
"scope": "writes retro report to ~/.claude/ftm-retros/; writes experience files to blackboard; promotes patterns to patterns.json; does not modify project source files",
|
|
3472
|
+
"rollback": "delete retro report file; remove experience entry from blackboard"
|
|
3473
|
+
},
|
|
3474
|
+
"approval_gates": [
|
|
3475
|
+
{
|
|
3476
|
+
"trigger": "pattern promotion triggered (3+ matching experiences)",
|
|
3477
|
+
"action": "auto-promote to patterns.json without user gate (learning system behavior)"
|
|
3478
|
+
}
|
|
3479
|
+
],
|
|
3480
|
+
"complexity_routing": {
|
|
3481
|
+
"micro": "auto",
|
|
3482
|
+
"small": "auto",
|
|
3483
|
+
"medium": "auto",
|
|
3484
|
+
"large": "auto",
|
|
3485
|
+
"xl": "auto"
|
|
3486
|
+
},
|
|
3487
|
+
"fallbacks": [
|
|
3488
|
+
{
|
|
3489
|
+
"condition": "PROGRESS.md not found and manual mode",
|
|
3490
|
+
"action": "check ~/.claude/ftm-retros/ for most recent .md file; ask user which execution to review if multiple found"
|
|
3491
|
+
},
|
|
3492
|
+
{
|
|
3493
|
+
"condition": "execution context not provided by ftm-executor",
|
|
3494
|
+
"action": "reconstruct from PROGRESS.md or ask user for context"
|
|
3495
|
+
},
|
|
3496
|
+
{
|
|
3497
|
+
"condition": "scoring rubric file missing",
|
|
3498
|
+
"action": "apply built-in scoring heuristics from skill body"
|
|
3499
|
+
},
|
|
3500
|
+
{
|
|
3501
|
+
"condition": "experiences/index.json has fewer than 10 entries",
|
|
3502
|
+
"action": "cold-start mode — record every task, set all confidence to low"
|
|
3503
|
+
}
|
|
3504
|
+
],
|
|
3505
|
+
"capabilities": [],
|
|
3506
|
+
"event_payloads": {
|
|
3507
|
+
"experience_recorded": [
|
|
3508
|
+
{
|
|
3509
|
+
"field": "skill",
|
|
3510
|
+
"type": "string",
|
|
3511
|
+
"description": "\"ftm-retro\""
|
|
3512
|
+
},
|
|
3513
|
+
{
|
|
3514
|
+
"field": "experience_path",
|
|
3515
|
+
"type": "string",
|
|
3516
|
+
"description": "path to written experience file"
|
|
3517
|
+
},
|
|
3518
|
+
{
|
|
3519
|
+
"field": "task_type",
|
|
3520
|
+
"type": "string",
|
|
3521
|
+
"description": "type of task recorded"
|
|
3522
|
+
},
|
|
3523
|
+
{
|
|
3524
|
+
"field": "outcome",
|
|
3525
|
+
"type": "string",
|
|
3526
|
+
"description": "success | partial | failure"
|
|
3527
|
+
},
|
|
3528
|
+
{
|
|
3529
|
+
"field": "confidence",
|
|
3530
|
+
"type": "string",
|
|
3531
|
+
"description": "low | medium | high"
|
|
3532
|
+
}
|
|
3533
|
+
],
|
|
3534
|
+
"pattern_discovered": [
|
|
3535
|
+
{
|
|
3536
|
+
"field": "skill",
|
|
3537
|
+
"type": "string",
|
|
3538
|
+
"description": "\"ftm-retro\""
|
|
3539
|
+
},
|
|
3540
|
+
{
|
|
3541
|
+
"field": "pattern_name",
|
|
3542
|
+
"type": "string",
|
|
3543
|
+
"description": "name of the promoted pattern"
|
|
3544
|
+
},
|
|
3545
|
+
{
|
|
3546
|
+
"field": "category",
|
|
3547
|
+
"type": "string",
|
|
3548
|
+
"description": "codebase_insights | execution_patterns | user_behavior | recurring_issues"
|
|
3549
|
+
},
|
|
3550
|
+
{
|
|
3551
|
+
"field": "occurrence_count",
|
|
3552
|
+
"type": "number",
|
|
3553
|
+
"description": "number of experiences that triggered promotion"
|
|
3554
|
+
},
|
|
3555
|
+
{
|
|
3556
|
+
"field": "confidence",
|
|
3557
|
+
"type": "string",
|
|
3558
|
+
"description": "low | medium | high"
|
|
3559
|
+
}
|
|
3560
|
+
],
|
|
3561
|
+
"task_completed": [
|
|
3562
|
+
{
|
|
3563
|
+
"field": "skill",
|
|
3564
|
+
"type": "string",
|
|
3565
|
+
"description": "\"ftm-retro\""
|
|
3566
|
+
},
|
|
3567
|
+
{
|
|
3568
|
+
"field": "report_path",
|
|
3569
|
+
"type": "string",
|
|
3570
|
+
"description": "absolute path to saved retro report"
|
|
3571
|
+
},
|
|
3572
|
+
{
|
|
3573
|
+
"field": "overall_score",
|
|
3574
|
+
"type": "number",
|
|
3575
|
+
"description": "total score out of 50"
|
|
3576
|
+
},
|
|
3577
|
+
{
|
|
3578
|
+
"field": "top_issue",
|
|
3579
|
+
"type": "string",
|
|
3580
|
+
"description": "most impactful bottleneck identified"
|
|
3581
|
+
},
|
|
3582
|
+
{
|
|
3583
|
+
"field": "patterns_promoted",
|
|
3584
|
+
"type": "number",
|
|
3585
|
+
"description": "new patterns added to patterns.json"
|
|
3586
|
+
}
|
|
3587
|
+
]
|
|
3588
|
+
},
|
|
3589
|
+
"references": [],
|
|
3590
|
+
"has_evals": false,
|
|
3591
|
+
"warnings": [],
|
|
3592
|
+
"size_bytes": 10871,
|
|
3593
|
+
"enabled": true
|
|
3594
|
+
},
|
|
3595
|
+
{
|
|
3596
|
+
"name": "ftm-routine",
|
|
3597
|
+
"description": "Execute named, recurring multi-step workflows from YAML definitions. Use when user says \"routine\", \"run routine\", \"ftm-routine\", \"morning triage\", or names a known routine.",
|
|
3598
|
+
"trigger_file": "ftm-routine.yml",
|
|
3599
|
+
"skill_directory": "ftm-routine/",
|
|
3600
|
+
"events_emits": [],
|
|
3601
|
+
"events_listens": [],
|
|
3602
|
+
"blackboard_reads": [],
|
|
3603
|
+
"blackboard_writes": [],
|
|
3604
|
+
"requirements": [
|
|
3605
|
+
{
|
|
3606
|
+
"type": "reference",
|
|
3607
|
+
"name": "~/.ftm/routines/",
|
|
3608
|
+
"required": true,
|
|
3609
|
+
"description": "YAML routine definitions directory"
|
|
3610
|
+
},
|
|
3611
|
+
{
|
|
3612
|
+
"type": "config",
|
|
3613
|
+
"name": "~/.claude/ftm-config.yml",
|
|
3614
|
+
"required": false,
|
|
3615
|
+
"description": "model preferences for skill-type steps"
|
|
3616
|
+
}
|
|
3617
|
+
],
|
|
3618
|
+
"risk": {
|
|
3619
|
+
"level": "medium_write",
|
|
3620
|
+
"scope": "executes MCP tool calls, skill invocations, and bash commands as defined by the routine; external-facing mutations depend entirely on routine definition; approval gates in the routine control which steps require user confirmation",
|
|
3621
|
+
"rollback": "depends on individual routine steps; steps with approval: approve gate let user review before execution; MCP writes (Jira, Slack, email) may not be reversible"
|
|
3622
|
+
},
|
|
3623
|
+
"approval_gates": [
|
|
3624
|
+
{
|
|
3625
|
+
"trigger": "routine step with approval: approve",
|
|
3626
|
+
"action": "show plan for that step and wait for \"go\" before executing"
|
|
3627
|
+
},
|
|
3628
|
+
{
|
|
3629
|
+
"trigger": "routine step with approval: review",
|
|
3630
|
+
"action": "execute step, show results, wait for \"continue\" or \"stop\""
|
|
3631
|
+
},
|
|
3632
|
+
{
|
|
3633
|
+
"trigger": "routine step with approval: none",
|
|
3634
|
+
"action": "execute automatically and show results"
|
|
3635
|
+
}
|
|
3636
|
+
],
|
|
3637
|
+
"complexity_routing": {
|
|
3638
|
+
"micro": "auto",
|
|
3639
|
+
"small": "auto",
|
|
3640
|
+
"medium": "plan_first (show full routine plan first)",
|
|
3641
|
+
"large": "plan_first",
|
|
3642
|
+
"xl": "always_ask"
|
|
3643
|
+
},
|
|
3644
|
+
"fallbacks": [
|
|
3645
|
+
{
|
|
3646
|
+
"condition": "routine YAML file not found",
|
|
3647
|
+
"action": "show \"Routine not found\" with list of available routines from ~/.ftm/routines/"
|
|
3648
|
+
},
|
|
3649
|
+
{
|
|
3650
|
+
"condition": "MCP tool referenced in routine not available",
|
|
3651
|
+
"action": "report unavailable tool, ask user whether to skip that step or abort"
|
|
3652
|
+
},
|
|
3653
|
+
{
|
|
3654
|
+
"condition": "skill referenced in routine not available",
|
|
3655
|
+
"action": "report unavailable skill, ask user whether to skip or abort"
|
|
3656
|
+
},
|
|
3657
|
+
{
|
|
3658
|
+
"condition": "bash command in step fails with non-zero exit",
|
|
3659
|
+
"action": "report failure output, ask user whether to continue or abort"
|
|
3660
|
+
}
|
|
3661
|
+
],
|
|
3662
|
+
"capabilities": [],
|
|
3663
|
+
"event_payloads": {
|
|
3664
|
+
"(none)": []
|
|
3665
|
+
},
|
|
3666
|
+
"references": [],
|
|
3667
|
+
"has_evals": false,
|
|
3668
|
+
"warnings": [],
|
|
3669
|
+
"size_bytes": 5982,
|
|
3670
|
+
"enabled": true
|
|
3671
|
+
},
|
|
3672
|
+
{
|
|
3673
|
+
"name": "ftm-upgrade",
|
|
3674
|
+
"description": "Self-upgrade mechanism for ftm skills ecosystem. Checks GitHub Releases for new versions, caches results for 60min, shows changelog, and copies updated files. Use when user says \"upgrade\", \"update skills\", \"new version\", \"check for updates\", \"ftm upgrade\".",
|
|
3675
|
+
"trigger_file": "ftm-upgrade.yml",
|
|
3676
|
+
"skill_directory": "ftm-upgrade/",
|
|
3677
|
+
"events_emits": [
|
|
3678
|
+
"task_completed"
|
|
3679
|
+
],
|
|
3680
|
+
"events_listens": [],
|
|
3681
|
+
"blackboard_reads": [],
|
|
3682
|
+
"blackboard_writes": [],
|
|
3683
|
+
"requirements": [
|
|
3684
|
+
{
|
|
3685
|
+
"type": "tool",
|
|
3686
|
+
"name": "gh",
|
|
3687
|
+
"required": true,
|
|
3688
|
+
"description": "GitHub CLI for querying releases from kkudumu/ftm-brain"
|
|
3689
|
+
},
|
|
3690
|
+
{
|
|
3691
|
+
"type": "reference",
|
|
3692
|
+
"name": "~/.claude/skills/ftm-upgrade/scripts/check-version.sh",
|
|
3693
|
+
"required": true,
|
|
3694
|
+
"description": "version check and cache script"
|
|
3695
|
+
},
|
|
3696
|
+
{
|
|
3697
|
+
"type": "reference",
|
|
3698
|
+
"name": "~/.claude/skills/ftm-upgrade/scripts/upgrade.sh",
|
|
3699
|
+
"required": true,
|
|
3700
|
+
"description": "download and install latest release script"
|
|
3701
|
+
},
|
|
3702
|
+
{
|
|
3703
|
+
"type": "reference",
|
|
3704
|
+
"name": "~/.claude/skills/ftm-version.txt",
|
|
3705
|
+
"required": false,
|
|
3706
|
+
"description": "locally installed version number"
|
|
3707
|
+
}
|
|
3708
|
+
],
|
|
3709
|
+
"risk": {
|
|
3710
|
+
"level": "high_write",
|
|
3711
|
+
"scope": "downloads and overwrites skill files in ~/.claude/skills/ on upgrade; changes affect all ftm skill behavior going forward; irreversible without restoring previous version from backup or git",
|
|
3712
|
+
"rollback": "restore from ~/.claude/skills/ backup if one was made before upgrade; or reinstall specific version by downloading an older release tarball"
|
|
3713
|
+
},
|
|
3714
|
+
"approval_gates": [
|
|
3715
|
+
{
|
|
3716
|
+
"trigger": "UPGRADE_AVAILABLE detected",
|
|
3717
|
+
"action": "show current and latest version with changelog URL, wait for explicit \"yes\" confirmation before running upgrade.sh"
|
|
3718
|
+
},
|
|
3719
|
+
{
|
|
3720
|
+
"trigger": "version check during preamble (passive notice pattern)",
|
|
3721
|
+
"action": "show one-line notice only, do NOT ask for confirmation or interrupt workflow"
|
|
3722
|
+
}
|
|
3723
|
+
],
|
|
3724
|
+
"complexity_routing": {
|
|
3725
|
+
"micro": "auto",
|
|
3726
|
+
"small": "auto",
|
|
3727
|
+
"medium": "auto",
|
|
3728
|
+
"large": "auto",
|
|
3729
|
+
"xl": "auto"
|
|
3730
|
+
},
|
|
3731
|
+
"fallbacks": [
|
|
3732
|
+
{
|
|
3733
|
+
"condition": "gh not installed",
|
|
3734
|
+
"action": "report \"GitHub CLI not installed\" with brew install gh instructions"
|
|
3735
|
+
},
|
|
3736
|
+
{
|
|
3737
|
+
"condition": "no internet connection",
|
|
3738
|
+
"action": "report \"Cannot reach GitHub. Check internet connection.\""
|
|
3739
|
+
},
|
|
3740
|
+
{
|
|
3741
|
+
"condition": "kkudumu/ftm-brain repo not found",
|
|
3742
|
+
"action": "report repo not found, suggest verifying access"
|
|
3743
|
+
},
|
|
3744
|
+
{
|
|
3745
|
+
"condition": "no releases found",
|
|
3746
|
+
"action": "report \"No releases found yet. Check back later.\""
|
|
3747
|
+
},
|
|
3748
|
+
{
|
|
3749
|
+
"condition": "upgrade.sh exits non-zero",
|
|
3750
|
+
"action": "report failure output, suggest running script manually"
|
|
3751
|
+
}
|
|
3752
|
+
],
|
|
3753
|
+
"capabilities": [
|
|
3754
|
+
{
|
|
3755
|
+
"type": "cli",
|
|
3756
|
+
"name": "gh",
|
|
3757
|
+
"required": true,
|
|
3758
|
+
"description": "GitHub CLI for release queries and download"
|
|
3759
|
+
},
|
|
3760
|
+
{
|
|
3761
|
+
"type": "cli",
|
|
3762
|
+
"name": "bash",
|
|
3763
|
+
"required": true,
|
|
3764
|
+
"description": "for running check-version.sh and upgrade.sh"
|
|
3765
|
+
}
|
|
3766
|
+
],
|
|
3767
|
+
"event_payloads": {
|
|
3768
|
+
"task_completed": [
|
|
3769
|
+
{
|
|
3770
|
+
"field": "skill",
|
|
3771
|
+
"type": "string",
|
|
3772
|
+
"description": "\"ftm-upgrade\""
|
|
3773
|
+
},
|
|
3774
|
+
{
|
|
3775
|
+
"field": "action",
|
|
3776
|
+
"type": "string",
|
|
3777
|
+
"description": "\"check\" | \"upgrade\" | \"already_up_to_date\""
|
|
3778
|
+
},
|
|
3779
|
+
{
|
|
3780
|
+
"field": "status",
|
|
3781
|
+
"type": "string",
|
|
3782
|
+
"description": "\"success\" | \"failed\" | \"up_to_date\" | \"check_failed\""
|
|
3783
|
+
}
|
|
3784
|
+
]
|
|
3785
|
+
},
|
|
3786
|
+
"references": [],
|
|
3787
|
+
"has_evals": false,
|
|
3788
|
+
"warnings": [],
|
|
3789
|
+
"size_bytes": 7482,
|
|
3790
|
+
"enabled": true
|
|
3791
|
+
}
|
|
3792
|
+
],
|
|
3793
|
+
"warnings": []
|
|
3794
|
+
}
|