feed-the-machine 1.6.1 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (272) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +262 -170
  3. package/bin/__pycache__/tasks_db.cpython-314.pyc +0 -0
  4. package/bin/brain.py +1340 -0
  5. package/bin/convert_claude_skills_to_codex.py +490 -0
  6. package/bin/generate-manifest.mjs +463 -463
  7. package/bin/harden_codex_skills.py +141 -0
  8. package/bin/install.mjs +491 -491
  9. package/bin/migrate-eng-buddy-data.py +875 -0
  10. package/bin/playbook_engine/__init__.py +1 -0
  11. package/bin/playbook_engine/conftest.py +8 -0
  12. package/bin/playbook_engine/extractor.py +33 -0
  13. package/bin/playbook_engine/manager.py +102 -0
  14. package/bin/playbook_engine/models.py +84 -0
  15. package/bin/playbook_engine/registry.py +35 -0
  16. package/bin/playbook_engine/test_extractor.py +72 -0
  17. package/bin/playbook_engine/test_integration.py +129 -0
  18. package/bin/playbook_engine/test_manager.py +85 -0
  19. package/bin/playbook_engine/test_models.py +166 -0
  20. package/bin/playbook_engine/test_registry.py +67 -0
  21. package/bin/playbook_engine/test_tracer.py +86 -0
  22. package/bin/playbook_engine/tracer.py +93 -0
  23. package/bin/tasks_db.py +456 -0
  24. package/docs/HOOKS.md +243 -243
  25. package/docs/INBOX.md +233 -233
  26. package/ftm/SKILL.md +125 -122
  27. package/ftm-audit/SKILL.md +673 -623
  28. package/ftm-audit/references/protocols/PROJECT-PATTERNS.md +91 -91
  29. package/ftm-audit/references/protocols/RUNTIME-WIRING.md +66 -66
  30. package/ftm-audit/references/protocols/WIRING-CONTRACTS.md +135 -135
  31. package/ftm-audit/references/strategies/AUTO-FIX-STRATEGIES.md +69 -69
  32. package/ftm-audit/references/templates/REPORT-FORMAT.md +96 -96
  33. package/ftm-audit/scripts/run-knip.sh +23 -23
  34. package/ftm-audit.yml +2 -2
  35. package/ftm-brainstorm/SKILL.md +1003 -498
  36. package/ftm-brainstorm/evals/evals.json +180 -100
  37. package/ftm-brainstorm/evals/promptfoo.yaml +109 -109
  38. package/ftm-brainstorm/references/agent-prompts.md +552 -224
  39. package/ftm-brainstorm/references/plan-template.md +209 -121
  40. package/ftm-brainstorm.yml +2 -2
  41. package/ftm-browse/SKILL.md +454 -454
  42. package/ftm-browse/daemon/browser-manager.ts +206 -206
  43. package/ftm-browse/daemon/bun.lock +30 -30
  44. package/ftm-browse/daemon/cli.ts +347 -347
  45. package/ftm-browse/daemon/commands.ts +410 -410
  46. package/ftm-browse/daemon/main.ts +357 -357
  47. package/ftm-browse/daemon/package.json +17 -17
  48. package/ftm-browse/daemon/server.ts +189 -189
  49. package/ftm-browse/daemon/snapshot.ts +519 -519
  50. package/ftm-browse/daemon/tsconfig.json +22 -22
  51. package/ftm-browse.yml +4 -4
  52. package/ftm-capture/SKILL.md +370 -370
  53. package/ftm-capture.yml +4 -4
  54. package/ftm-codex-gate/SKILL.md +361 -361
  55. package/ftm-codex-gate.yml +2 -2
  56. package/ftm-config/SKILL.md +422 -345
  57. package/ftm-config.default.yml +125 -82
  58. package/ftm-config.yml +44 -2
  59. package/ftm-council/SKILL.md +416 -416
  60. package/ftm-council/references/prompts/CLAUDE-INVESTIGATION.md +60 -60
  61. package/ftm-council/references/prompts/CODEX-INVESTIGATION.md +58 -58
  62. package/ftm-council/references/prompts/GEMINI-INVESTIGATION.md +58 -58
  63. package/ftm-council/references/prompts/REBUTTAL-TEMPLATE.md +57 -57
  64. package/ftm-council/references/protocols/PREREQUISITES.md +47 -47
  65. package/ftm-council/references/protocols/STEP-0-FRAMING.md +46 -46
  66. package/ftm-council-chat.yml +2 -0
  67. package/ftm-council.yml +2 -2
  68. package/ftm-dashboard/SKILL.md +163 -163
  69. package/ftm-dashboard.yml +4 -4
  70. package/ftm-debug/SKILL.md +1037 -1037
  71. package/ftm-debug/references/phases/PHASE-0-INTAKE.md +58 -58
  72. package/ftm-debug/references/phases/PHASE-1-TRIAGE.md +46 -46
  73. package/ftm-debug/references/phases/PHASE-2-WAR-ROOM-AGENTS.md +279 -279
  74. package/ftm-debug/references/phases/PHASE-3-TO-6-EXECUTION.md +436 -436
  75. package/ftm-debug/references/protocols/BLACKBOARD.md +86 -86
  76. package/ftm-debug/references/protocols/EDGE-CASES.md +103 -103
  77. package/ftm-debug.yml +2 -2
  78. package/ftm-diagram/SKILL.md +277 -277
  79. package/ftm-diagram.yml +2 -2
  80. package/ftm-executor/SKILL.md +777 -777
  81. package/ftm-executor/references/STYLE-TEMPLATE.md +73 -73
  82. package/ftm-executor/references/phases/PHASE-0-VERIFICATION.md +62 -62
  83. package/ftm-executor/references/phases/PHASE-2-AGENT-ASSEMBLY.md +34 -34
  84. package/ftm-executor/references/phases/PHASE-3-WORKTREES.md +38 -38
  85. package/ftm-executor/references/phases/PHASE-4-5-AUDIT.md +81 -72
  86. package/ftm-executor/references/phases/PHASE-4-DISPATCH.md +66 -66
  87. package/ftm-executor/references/phases/PHASE-5-5-CODEX-GATE.md +73 -73
  88. package/ftm-executor/references/protocols/DOCUMENTATION-BOOTSTRAP.md +36 -36
  89. package/ftm-executor/references/protocols/MODEL-PROFILE.md +59 -59
  90. package/ftm-executor/references/protocols/PROGRESS-TRACKING.md +66 -66
  91. package/ftm-executor/runtime/ftm-runtime.mjs +252 -252
  92. package/ftm-executor/runtime/package.json +8 -8
  93. package/ftm-executor.yml +2 -2
  94. package/ftm-git/SKILL.md +441 -441
  95. package/ftm-git/evals/evals.json +26 -26
  96. package/ftm-git/evals/promptfoo.yaml +75 -75
  97. package/ftm-git/hooks/post-commit-experience.sh +92 -92
  98. package/ftm-git/references/patterns/SECRET-PATTERNS.md +104 -104
  99. package/ftm-git/references/protocols/REMEDIATION.md +139 -139
  100. package/ftm-git/scripts/pre-commit-secrets.sh +110 -110
  101. package/ftm-git.yml +2 -2
  102. package/ftm-inbox/backend/__pycache__/main.cpython-314.pyc +0 -0
  103. package/ftm-inbox/backend/adapters/_retry.py +64 -64
  104. package/ftm-inbox/backend/adapters/base.py +230 -230
  105. package/ftm-inbox/backend/adapters/freshservice.py +104 -104
  106. package/ftm-inbox/backend/adapters/gmail.py +125 -125
  107. package/ftm-inbox/backend/adapters/jira.py +136 -136
  108. package/ftm-inbox/backend/adapters/registry.py +192 -192
  109. package/ftm-inbox/backend/adapters/slack.py +110 -110
  110. package/ftm-inbox/backend/db/connection.py +54 -54
  111. package/ftm-inbox/backend/db/schema.py +78 -78
  112. package/ftm-inbox/backend/executor/__init__.py +7 -7
  113. package/ftm-inbox/backend/executor/engine.py +149 -149
  114. package/ftm-inbox/backend/executor/step_runner.py +98 -98
  115. package/ftm-inbox/backend/main.py +103 -103
  116. package/ftm-inbox/backend/models/__init__.py +1 -1
  117. package/ftm-inbox/backend/models/unified_task.py +36 -36
  118. package/ftm-inbox/backend/planner/__init__.py +6 -6
  119. package/ftm-inbox/backend/planner/__pycache__/__init__.cpython-314.pyc +0 -0
  120. package/ftm-inbox/backend/planner/__pycache__/generator.cpython-314.pyc +0 -0
  121. package/ftm-inbox/backend/planner/__pycache__/schema.cpython-314.pyc +0 -0
  122. package/ftm-inbox/backend/planner/generator.py +127 -127
  123. package/ftm-inbox/backend/planner/schema.py +34 -34
  124. package/ftm-inbox/backend/requirements.txt +5 -5
  125. package/ftm-inbox/backend/routes/__pycache__/plan.cpython-314.pyc +0 -0
  126. package/ftm-inbox/backend/routes/execute.py +186 -186
  127. package/ftm-inbox/backend/routes/health.py +52 -52
  128. package/ftm-inbox/backend/routes/inbox.py +68 -68
  129. package/ftm-inbox/backend/routes/plan.py +271 -271
  130. package/ftm-inbox/bin/launchagent.mjs +91 -91
  131. package/ftm-inbox/bin/setup.mjs +188 -188
  132. package/ftm-inbox/bin/start.sh +10 -10
  133. package/ftm-inbox/bin/status.sh +17 -17
  134. package/ftm-inbox/bin/stop.sh +8 -8
  135. package/ftm-inbox/config.example.yml +55 -55
  136. package/ftm-inbox/package-lock.json +2898 -2898
  137. package/ftm-inbox/package.json +26 -26
  138. package/ftm-inbox/postcss.config.js +6 -6
  139. package/ftm-inbox/src/app.css +199 -199
  140. package/ftm-inbox/src/app.html +18 -18
  141. package/ftm-inbox/src/lib/api.ts +166 -166
  142. package/ftm-inbox/src/lib/components/ExecutionLog.svelte +81 -81
  143. package/ftm-inbox/src/lib/components/InboxFeed.svelte +143 -143
  144. package/ftm-inbox/src/lib/components/PlanStep.svelte +271 -271
  145. package/ftm-inbox/src/lib/components/PlanView.svelte +206 -206
  146. package/ftm-inbox/src/lib/components/StreamPanel.svelte +99 -99
  147. package/ftm-inbox/src/lib/components/TaskCard.svelte +190 -190
  148. package/ftm-inbox/src/lib/components/ui/EmptyState.svelte +63 -63
  149. package/ftm-inbox/src/lib/components/ui/KawaiiCard.svelte +86 -86
  150. package/ftm-inbox/src/lib/components/ui/PillButton.svelte +106 -106
  151. package/ftm-inbox/src/lib/components/ui/StatusBadge.svelte +67 -67
  152. package/ftm-inbox/src/lib/components/ui/StreamDrawer.svelte +149 -149
  153. package/ftm-inbox/src/lib/components/ui/ThemeToggle.svelte +80 -80
  154. package/ftm-inbox/src/lib/theme.ts +47 -47
  155. package/ftm-inbox/src/routes/+layout.svelte +76 -76
  156. package/ftm-inbox/src/routes/+page.svelte +401 -401
  157. package/ftm-inbox/svelte.config.js +12 -12
  158. package/ftm-inbox/tailwind.config.ts +63 -63
  159. package/ftm-inbox/tsconfig.json +13 -13
  160. package/ftm-inbox/vite.config.ts +6 -6
  161. package/ftm-intent/SKILL.md +241 -241
  162. package/ftm-intent.yml +2 -2
  163. package/ftm-manifest.json +3794 -3794
  164. package/ftm-map/SKILL.md +291 -291
  165. package/ftm-map/scripts/db.py +712 -712
  166. package/ftm-map/scripts/index.py +415 -415
  167. package/ftm-map/scripts/parser.py +224 -224
  168. package/ftm-map/scripts/queries/go-tags.scm +20 -20
  169. package/ftm-map/scripts/queries/javascript-tags.scm +35 -35
  170. package/ftm-map/scripts/queries/python-tags.scm +31 -31
  171. package/ftm-map/scripts/queries/ruby-tags.scm +19 -19
  172. package/ftm-map/scripts/queries/rust-tags.scm +37 -37
  173. package/ftm-map/scripts/queries/typescript-tags.scm +41 -41
  174. package/ftm-map/scripts/query.py +301 -301
  175. package/ftm-map/scripts/ranker.py +377 -377
  176. package/ftm-map/scripts/requirements.txt +5 -5
  177. package/ftm-map/scripts/setup-hooks.sh +27 -27
  178. package/ftm-map/scripts/setup.sh +56 -56
  179. package/ftm-map/scripts/test_db.py +364 -364
  180. package/ftm-map/scripts/test_parser.py +174 -174
  181. package/ftm-map/scripts/test_query.py +183 -183
  182. package/ftm-map/scripts/test_ranker.py +199 -199
  183. package/ftm-map/scripts/views.py +591 -591
  184. package/ftm-map.yml +2 -2
  185. package/ftm-mind/SKILL.md +201 -1943
  186. package/ftm-mind/evals/promptfoo.yaml +142 -142
  187. package/ftm-mind/references/blackboard-protocol.md +110 -0
  188. package/ftm-mind/references/blackboard-schema.md +328 -328
  189. package/ftm-mind/references/complexity-guide.md +110 -110
  190. package/ftm-mind/references/complexity-sizing.md +138 -0
  191. package/ftm-mind/references/decide-act-protocol.md +172 -0
  192. package/ftm-mind/references/direct-execution.md +51 -0
  193. package/ftm-mind/references/environment-discovery.md +77 -0
  194. package/ftm-mind/references/event-registry.md +319 -319
  195. package/ftm-mind/references/mcp-inventory.md +300 -296
  196. package/ftm-mind/references/ops-routing.md +47 -0
  197. package/ftm-mind/references/orient-protocol.md +234 -0
  198. package/ftm-mind/references/personality.md +40 -0
  199. package/ftm-mind/references/protocols/COMPLEXITY-SIZING.md +72 -72
  200. package/ftm-mind/references/protocols/MCP-HEURISTICS.md +32 -32
  201. package/ftm-mind/references/protocols/PLAN-APPROVAL.md +80 -80
  202. package/ftm-mind/references/reflexion-protocol.md +249 -249
  203. package/ftm-mind/references/routing/SCENARIOS.md +22 -22
  204. package/ftm-mind/references/routing-scenarios.md +35 -35
  205. package/ftm-mind.yml +2 -2
  206. package/ftm-ops.yml +4 -0
  207. package/ftm-pause/SKILL.md +395 -395
  208. package/ftm-pause/references/protocols/SKILL-RESTORE-PROTOCOLS.md +186 -186
  209. package/ftm-pause/references/protocols/VALIDATION.md +80 -80
  210. package/ftm-pause.yml +2 -2
  211. package/ftm-researcher/SKILL.md +275 -275
  212. package/ftm-researcher/evals/agent-diversity.yaml +17 -17
  213. package/ftm-researcher/evals/synthesis-quality.yaml +12 -12
  214. package/ftm-researcher/evals/trigger-accuracy.yaml +39 -39
  215. package/ftm-researcher/references/adaptive-search.md +116 -116
  216. package/ftm-researcher/references/agent-prompts.md +193 -193
  217. package/ftm-researcher/references/council-integration.md +193 -193
  218. package/ftm-researcher/references/output-format.md +203 -203
  219. package/ftm-researcher/references/synthesis-pipeline.md +165 -165
  220. package/ftm-researcher/scripts/score_credibility.py +234 -234
  221. package/ftm-researcher/scripts/validate_research.py +92 -92
  222. package/ftm-researcher.yml +2 -2
  223. package/ftm-resume/SKILL.md +518 -518
  224. package/ftm-resume/references/protocols/VALIDATION.md +172 -172
  225. package/ftm-resume.yml +2 -2
  226. package/ftm-retro/SKILL.md +380 -380
  227. package/ftm-retro/references/protocols/SCORING-RUBRICS.md +89 -89
  228. package/ftm-retro/references/templates/REPORT-FORMAT.md +109 -109
  229. package/ftm-retro.yml +2 -2
  230. package/ftm-routine/SKILL.md +170 -170
  231. package/ftm-routine.yml +4 -4
  232. package/ftm-state/blackboard/capabilities.json +5 -5
  233. package/ftm-state/blackboard/capabilities.schema.json +27 -27
  234. package/ftm-state/blackboard/context.json +37 -23
  235. package/ftm-state/blackboard/experiences/doom-statusline-fix.json +26 -0
  236. package/ftm-state/blackboard/experiences/hackathon-pages-site.json +26 -0
  237. package/ftm-state/blackboard/experiences/hindsight-sso-kickoff.json +42 -0
  238. package/ftm-state/blackboard/experiences/index.json +58 -9
  239. package/ftm-state/blackboard/experiences/learning-ragnarok-api-access.json +23 -0
  240. package/ftm-state/blackboard/experiences/nordlayer-members-auto-assign.json +26 -0
  241. package/ftm-state/blackboard/experiences/saml2aws-stale-session-fix.json +41 -0
  242. package/ftm-state/blackboard/patterns.json +6 -6
  243. package/ftm-state/schemas/context.schema.json +130 -130
  244. package/ftm-state/schemas/experience-index.schema.json +77 -77
  245. package/ftm-state/schemas/experience.schema.json +78 -78
  246. package/ftm-state/schemas/patterns.schema.json +44 -44
  247. package/ftm-upgrade/SKILL.md +194 -194
  248. package/ftm-upgrade/scripts/check-version.sh +76 -76
  249. package/ftm-upgrade/scripts/upgrade.sh +143 -143
  250. package/ftm-upgrade.yml +2 -2
  251. package/ftm-verify.yml +2 -2
  252. package/ftm.yml +2 -2
  253. package/hooks/ftm-auto-log.sh +137 -0
  254. package/hooks/ftm-blackboard-enforcer.sh +93 -93
  255. package/hooks/ftm-discovery-reminder.sh +90 -90
  256. package/hooks/ftm-drafts-gate.sh +61 -61
  257. package/hooks/ftm-event-logger.mjs +107 -107
  258. package/hooks/ftm-install-hooks.sh +240 -0
  259. package/hooks/ftm-learning-capture.sh +117 -0
  260. package/hooks/ftm-map-autodetect.sh +79 -79
  261. package/hooks/ftm-pending-sync-check.sh +22 -22
  262. package/hooks/ftm-plan-gate.sh +92 -92
  263. package/hooks/ftm-post-commit-trigger.sh +57 -57
  264. package/hooks/ftm-post-compaction.sh +138 -0
  265. package/hooks/ftm-pre-compaction.sh +147 -0
  266. package/hooks/ftm-session-end.sh +52 -0
  267. package/hooks/ftm-session-snapshot.sh +213 -0
  268. package/hooks/ftm-task-loader.sh +100 -0
  269. package/hooks/settings-template.json +91 -81
  270. package/install.sh +363 -363
  271. package/package.json +84 -84
  272. package/uninstall.sh +25 -25
package/docs/INBOX.md CHANGED
@@ -1,233 +1,233 @@
1
- # ftm-inbox
2
-
3
- ftm-inbox is an optional background service that polls your work tools (Jira, Freshservice, Slack, Gmail) and surfaces actionable items directly inside the FTM Operator Cockpit dashboard. It runs locally on your machine and never sends data to external services.
4
-
5
- ## What It Does
6
-
7
- Without ftm-inbox, the Operator Cockpit is a static interface. With it:
8
-
9
- - Jira issues assigned to you appear as inbox items
10
- - Freshservice tickets awaiting your response are surfaced
11
- - Slack DMs and mentions are queued for triage
12
- - Gmail threads that match configurable filters are included
13
-
14
- Each item is stored in a local SQLite database. The FTM skills (`/ftm-mind`, `/ftm-executor`) can read from this inbox to generate plans and take action on your behalf.
15
-
16
- ## Installation
17
-
18
- ```bash
19
- npx feed-the-machine --with-inbox
20
- ```
21
-
22
- This will:
23
-
24
- 1. Install core FTM skills (same as `npx feed-the-machine`)
25
- 2. Copy `ftm-inbox/` to `~/.claude/ftm-inbox/`
26
- 3. Run `npm install` for Node dependencies
27
- 4. Run `pip3 install -r requirements.txt` for Python dependencies
28
- 5. Launch the interactive setup wizard
29
- 6. Optionally install a macOS LaunchAgent for auto-start on login
30
-
31
- The core `npx feed-the-machine` install (without `--with-inbox`) is completely unchanged.
32
-
33
- ### Requirements
34
-
35
- - Node.js 18+
36
- - Python 3.9+
37
- - `pip3` in PATH
38
-
39
- ## Configuration
40
-
41
- The setup wizard writes credentials to `~/.claude/ftm-inbox/config.yml`. This directory is outside any git repository and should never be committed.
42
-
43
- ### config.yml reference
44
-
45
- ```yaml
46
- server:
47
- port: 8042 # Port for the local API (default: 8042)
48
-
49
- adapters:
50
- jira:
51
- enabled: true
52
- base_url: "https://yourorg.atlassian.net"
53
- email: "you@example.com"
54
- api_token: "your-jira-api-token"
55
- poll_interval_seconds: 60
56
-
57
- freshservice:
58
- enabled: true
59
- domain: "yourorg.freshservice.com"
60
- api_key: "your-freshservice-api-key"
61
- poll_interval_seconds: 120
62
-
63
- slack:
64
- enabled: true
65
- bot_token: "xoxb-your-slack-bot-token"
66
- poll_interval_seconds: 30
67
-
68
- gmail:
69
- enabled: false
70
- credentials_path: "~/credentials.json"
71
- poll_interval_seconds: 120
72
-
73
- database:
74
- path: "~/.claude/ftm-inbox/inbox.db"
75
-
76
- logging:
77
- level: "INFO"
78
- path: "~/.claude/ftm-inbox/logs"
79
- ```
80
-
81
- To re-run the wizard after initial setup:
82
-
83
- ```bash
84
- node ~/.claude/ftm-inbox/bin/setup.mjs
85
- ```
86
-
87
- To edit manually:
88
-
89
- ```bash
90
- $EDITOR ~/.claude/ftm-inbox/config.yml
91
- ```
92
-
93
- ## Starting and Stopping
94
-
95
- ```bash
96
- # Start the service
97
- ~/.claude/ftm-inbox/bin/start.sh
98
-
99
- # Stop the service
100
- ~/.claude/ftm-inbox/bin/stop.sh
101
-
102
- # Check status and last poll times
103
- ~/.claude/ftm-inbox/bin/status.sh
104
- ```
105
-
106
- The port can be overridden at runtime:
107
-
108
- ```bash
109
- FTM_INBOX_PORT=9000 ~/.claude/ftm-inbox/bin/start.sh
110
- ```
111
-
112
- ## Auto-start on Login (macOS)
113
-
114
- To generate and load a LaunchAgent that starts ftm-inbox on login:
115
-
116
- ```bash
117
- node ~/.claude/ftm-inbox/bin/launchagent.mjs
118
- ```
119
-
120
- This creates `~/Library/LaunchAgents/com.ftm.inbox.plist` and loads it immediately. Logs are written to `~/.claude/ftm-inbox/logs/`.
121
-
122
- To remove the LaunchAgent:
123
-
124
- ```bash
125
- launchctl unload ~/Library/LaunchAgents/com.ftm.inbox.plist
126
- rm ~/Library/LaunchAgents/com.ftm.inbox.plist
127
- ```
128
-
129
- ## Architecture
130
-
131
- ```
132
- External Services ftm-inbox FTM Skills
133
- ────────────────── ───────────────────────── ──────────────────
134
- Jira REST API ──────► Jira Adapter (poller) ─┐
135
- Freshservice API ──────► Freshservice Adapter ─┤► SQLite DB ──► FastAPI ──► /ftm-mind
136
- Slack API ──────► Slack Adapter ─┤ inbox.db 8042 /ftm-executor
137
- Gmail API ──────► Gmail Adapter ─┘
138
-
139
-
140
- Svelte Dashboard
141
- (Operator Cockpit)
142
- ```
143
-
144
- - **Adapters** poll their respective APIs on configurable intervals and write normalized `InboxItem` records to SQLite
145
- - **FastAPI backend** (`backend/main.py`) exposes a REST API at `http://localhost:8042`
146
- - **Svelte dashboard** reads from the API and renders the Operator Cockpit UI
147
- - **FTM skills** use the API to read inbox items and generate or execute plans
148
-
149
- ## Adding a Custom Poller
150
-
151
- 1. Create a new file in `ftm-inbox/backend/adapters/`:
152
-
153
- ```python
154
- # ftm-inbox/backend/adapters/my_service.py
155
- from .base import BaseAdapter, InboxItem
156
- from typing import List
157
-
158
- class MyServiceAdapter(BaseAdapter):
159
- name = "my_service"
160
-
161
- async def fetch(self) -> List[InboxItem]:
162
- # Hit your API, return a list of InboxItem objects
163
- items = []
164
- # ... your logic here ...
165
- return items
166
- ```
167
-
168
- 2. Add credentials to `~/.claude/ftm-inbox/config.yml`:
169
-
170
- ```yaml
171
- adapters:
172
- my_service:
173
- enabled: true
174
- api_key: "your-key"
175
- poll_interval_seconds: 60
176
- ```
177
-
178
- 3. Register it in `ftm-inbox/backend/adapters/__init__.py`:
179
-
180
- ```python
181
- from .my_service import MyServiceAdapter
182
- ADAPTERS = [..., MyServiceAdapter]
183
- ```
184
-
185
- 4. Restart the service: `~/.claude/ftm-inbox/bin/stop.sh && ~/.claude/ftm-inbox/bin/start.sh`
186
-
187
- ## Troubleshooting
188
-
189
- ### Service won't start
190
-
191
- Check that Python 3 and uvicorn are installed:
192
- ```bash
193
- python3 --version
194
- python3 -c "import uvicorn; print(uvicorn.__version__)"
195
- ```
196
-
197
- If uvicorn is missing:
198
- ```bash
199
- pip3 install -r ~/.claude/ftm-inbox/requirements.txt
200
- ```
201
-
202
- ### No items appearing in the dashboard
203
-
204
- 1. Check the service is running: `~/.claude/ftm-inbox/bin/status.sh`
205
- 2. Check logs: `tail -f ~/.claude/ftm-inbox/logs/*.log`
206
- 3. Verify credentials in `~/.claude/ftm-inbox/config.yml`
207
- 4. Confirm the adapter is set to `enabled: true`
208
-
209
- ### Port conflict
210
-
211
- If port 8042 is already in use:
212
- ```bash
213
- FTM_INBOX_PORT=9042 ~/.claude/ftm-inbox/bin/start.sh
214
- ```
215
-
216
- Update `config.yml` to match so the dashboard connects to the right port.
217
-
218
- ### Jira authentication errors
219
-
220
- Jira Cloud requires an API token, not your password. Generate one at:
221
- `https://id.atlassian.com/manage-profile/security/api-tokens`
222
-
223
- ### Freshservice 403 errors
224
-
225
- Ensure the API key belongs to an agent with at least Viewer permissions on the relevant groups.
226
-
227
- ### Re-running setup
228
-
229
- ```bash
230
- node ~/.claude/ftm-inbox/bin/setup.mjs
231
- ```
232
-
233
- This overwrites `~/.claude/ftm-inbox/config.yml` but does not touch the database.
1
+ # ftm-inbox
2
+
3
+ ftm-inbox is an optional background service that polls your work tools (Jira, Freshservice, Slack, Gmail) and surfaces actionable items directly inside the FTM Operator Cockpit dashboard. It runs locally on your machine and never sends data to external services.
4
+
5
+ ## What It Does
6
+
7
+ Without ftm-inbox, the Operator Cockpit is a static interface. With it:
8
+
9
+ - Jira issues assigned to you appear as inbox items
10
+ - Freshservice tickets awaiting your response are surfaced
11
+ - Slack DMs and mentions are queued for triage
12
+ - Gmail threads that match configurable filters are included
13
+
14
+ Each item is stored in a local SQLite database. The FTM skills (`/ftm-mind`, `/ftm-executor`) can read from this inbox to generate plans and take action on your behalf.
15
+
16
+ ## Installation
17
+
18
+ ```bash
19
+ npx feed-the-machine --with-inbox
20
+ ```
21
+
22
+ This will:
23
+
24
+ 1. Install core FTM skills (same as `npx feed-the-machine`)
25
+ 2. Copy `ftm-inbox/` to `~/.claude/ftm-inbox/`
26
+ 3. Run `npm install` for Node dependencies
27
+ 4. Run `pip3 install -r requirements.txt` for Python dependencies
28
+ 5. Launch the interactive setup wizard
29
+ 6. Optionally install a macOS LaunchAgent for auto-start on login
30
+
31
+ The core `npx feed-the-machine` install (without `--with-inbox`) is completely unchanged.
32
+
33
+ ### Requirements
34
+
35
+ - Node.js 18+
36
+ - Python 3.9+
37
+ - `pip3` in PATH
38
+
39
+ ## Configuration
40
+
41
+ The setup wizard writes credentials to `~/.claude/ftm-inbox/config.yml`. This directory is outside any git repository and should never be committed.
42
+
43
+ ### config.yml reference
44
+
45
+ ```yaml
46
+ server:
47
+ port: 8042 # Port for the local API (default: 8042)
48
+
49
+ adapters:
50
+ jira:
51
+ enabled: true
52
+ base_url: "https://yourorg.atlassian.net"
53
+ email: "you@example.com"
54
+ api_token: "your-jira-api-token"
55
+ poll_interval_seconds: 60
56
+
57
+ freshservice:
58
+ enabled: true
59
+ domain: "yourorg.freshservice.com"
60
+ api_key: "your-freshservice-api-key"
61
+ poll_interval_seconds: 120
62
+
63
+ slack:
64
+ enabled: true
65
+ bot_token: "xoxb-your-slack-bot-token"
66
+ poll_interval_seconds: 30
67
+
68
+ gmail:
69
+ enabled: false
70
+ credentials_path: "~/credentials.json"
71
+ poll_interval_seconds: 120
72
+
73
+ database:
74
+ path: "~/.claude/ftm-inbox/inbox.db"
75
+
76
+ logging:
77
+ level: "INFO"
78
+ path: "~/.claude/ftm-inbox/logs"
79
+ ```
80
+
81
+ To re-run the wizard after initial setup:
82
+
83
+ ```bash
84
+ node ~/.claude/ftm-inbox/bin/setup.mjs
85
+ ```
86
+
87
+ To edit manually:
88
+
89
+ ```bash
90
+ $EDITOR ~/.claude/ftm-inbox/config.yml
91
+ ```
92
+
93
+ ## Starting and Stopping
94
+
95
+ ```bash
96
+ # Start the service
97
+ ~/.claude/ftm-inbox/bin/start.sh
98
+
99
+ # Stop the service
100
+ ~/.claude/ftm-inbox/bin/stop.sh
101
+
102
+ # Check status and last poll times
103
+ ~/.claude/ftm-inbox/bin/status.sh
104
+ ```
105
+
106
+ The port can be overridden at runtime:
107
+
108
+ ```bash
109
+ FTM_INBOX_PORT=9000 ~/.claude/ftm-inbox/bin/start.sh
110
+ ```
111
+
112
+ ## Auto-start on Login (macOS)
113
+
114
+ To generate and load a LaunchAgent that starts ftm-inbox on login:
115
+
116
+ ```bash
117
+ node ~/.claude/ftm-inbox/bin/launchagent.mjs
118
+ ```
119
+
120
+ This creates `~/Library/LaunchAgents/com.ftm.inbox.plist` and loads it immediately. Logs are written to `~/.claude/ftm-inbox/logs/`.
121
+
122
+ To remove the LaunchAgent:
123
+
124
+ ```bash
125
+ launchctl unload ~/Library/LaunchAgents/com.ftm.inbox.plist
126
+ rm ~/Library/LaunchAgents/com.ftm.inbox.plist
127
+ ```
128
+
129
+ ## Architecture
130
+
131
+ ```
132
+ External Services ftm-inbox FTM Skills
133
+ ────────────────── ───────────────────────── ──────────────────
134
+ Jira REST API ──────► Jira Adapter (poller) ─┐
135
+ Freshservice API ──────► Freshservice Adapter ─┤► SQLite DB ──► FastAPI ──► /ftm-mind
136
+ Slack API ──────► Slack Adapter ─┤ inbox.db 8042 /ftm-executor
137
+ Gmail API ──────► Gmail Adapter ─┘
138
+
139
+
140
+ Svelte Dashboard
141
+ (Operator Cockpit)
142
+ ```
143
+
144
+ - **Adapters** poll their respective APIs on configurable intervals and write normalized `InboxItem` records to SQLite
145
+ - **FastAPI backend** (`backend/main.py`) exposes a REST API at `http://localhost:8042`
146
+ - **Svelte dashboard** reads from the API and renders the Operator Cockpit UI
147
+ - **FTM skills** use the API to read inbox items and generate or execute plans
148
+
149
+ ## Adding a Custom Poller
150
+
151
+ 1. Create a new file in `ftm-inbox/backend/adapters/`:
152
+
153
+ ```python
154
+ # ftm-inbox/backend/adapters/my_service.py
155
+ from .base import BaseAdapter, InboxItem
156
+ from typing import List
157
+
158
+ class MyServiceAdapter(BaseAdapter):
159
+ name = "my_service"
160
+
161
+ async def fetch(self) -> List[InboxItem]:
162
+ # Hit your API, return a list of InboxItem objects
163
+ items = []
164
+ # ... your logic here ...
165
+ return items
166
+ ```
167
+
168
+ 2. Add credentials to `~/.claude/ftm-inbox/config.yml`:
169
+
170
+ ```yaml
171
+ adapters:
172
+ my_service:
173
+ enabled: true
174
+ api_key: "your-key"
175
+ poll_interval_seconds: 60
176
+ ```
177
+
178
+ 3. Register it in `ftm-inbox/backend/adapters/__init__.py`:
179
+
180
+ ```python
181
+ from .my_service import MyServiceAdapter
182
+ ADAPTERS = [..., MyServiceAdapter]
183
+ ```
184
+
185
+ 4. Restart the service: `~/.claude/ftm-inbox/bin/stop.sh && ~/.claude/ftm-inbox/bin/start.sh`
186
+
187
+ ## Troubleshooting
188
+
189
+ ### Service won't start
190
+
191
+ Check that Python 3 and uvicorn are installed:
192
+ ```bash
193
+ python3 --version
194
+ python3 -c "import uvicorn; print(uvicorn.__version__)"
195
+ ```
196
+
197
+ If uvicorn is missing:
198
+ ```bash
199
+ pip3 install -r ~/.claude/ftm-inbox/requirements.txt
200
+ ```
201
+
202
+ ### No items appearing in the dashboard
203
+
204
+ 1. Check the service is running: `~/.claude/ftm-inbox/bin/status.sh`
205
+ 2. Check logs: `tail -f ~/.claude/ftm-inbox/logs/*.log`
206
+ 3. Verify credentials in `~/.claude/ftm-inbox/config.yml`
207
+ 4. Confirm the adapter is set to `enabled: true`
208
+
209
+ ### Port conflict
210
+
211
+ If port 8042 is already in use:
212
+ ```bash
213
+ FTM_INBOX_PORT=9042 ~/.claude/ftm-inbox/bin/start.sh
214
+ ```
215
+
216
+ Update `config.yml` to match so the dashboard connects to the right port.
217
+
218
+ ### Jira authentication errors
219
+
220
+ Jira Cloud requires an API token, not your password. Generate one at:
221
+ `https://id.atlassian.com/manage-profile/security/api-tokens`
222
+
223
+ ### Freshservice 403 errors
224
+
225
+ Ensure the API key belongs to an agent with at least Viewer permissions on the relevant groups.
226
+
227
+ ### Re-running setup
228
+
229
+ ```bash
230
+ node ~/.claude/ftm-inbox/bin/setup.mjs
231
+ ```
232
+
233
+ This overwrites `~/.claude/ftm-inbox/config.yml` but does not touch the database.