feed-the-machine 1.6.0 → 1.7.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.
Files changed (269) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +170 -170
  3. package/bin/brain.py +1340 -0
  4. package/bin/convert_claude_skills_to_codex.py +490 -0
  5. package/bin/generate-manifest.mjs +463 -463
  6. package/bin/harden_codex_skills.py +141 -0
  7. package/bin/install.mjs +491 -491
  8. package/bin/migrate-eng-buddy-data.py +875 -0
  9. package/bin/playbook_engine/__init__.py +1 -0
  10. package/bin/playbook_engine/conftest.py +8 -0
  11. package/bin/playbook_engine/extractor.py +33 -0
  12. package/bin/playbook_engine/manager.py +102 -0
  13. package/bin/playbook_engine/models.py +84 -0
  14. package/bin/playbook_engine/registry.py +35 -0
  15. package/bin/playbook_engine/test_extractor.py +72 -0
  16. package/bin/playbook_engine/test_integration.py +129 -0
  17. package/bin/playbook_engine/test_manager.py +85 -0
  18. package/bin/playbook_engine/test_models.py +166 -0
  19. package/bin/playbook_engine/test_registry.py +67 -0
  20. package/bin/playbook_engine/test_tracer.py +86 -0
  21. package/bin/playbook_engine/tracer.py +93 -0
  22. package/bin/tasks_db.py +456 -0
  23. package/docs/HOOKS.md +243 -243
  24. package/docs/INBOX.md +233 -233
  25. package/ftm/SKILL.md +125 -122
  26. package/ftm-audit/SKILL.md +623 -623
  27. package/ftm-audit/references/protocols/PROJECT-PATTERNS.md +91 -91
  28. package/ftm-audit/references/protocols/RUNTIME-WIRING.md +66 -66
  29. package/ftm-audit/references/protocols/WIRING-CONTRACTS.md +135 -135
  30. package/ftm-audit/references/strategies/AUTO-FIX-STRATEGIES.md +69 -69
  31. package/ftm-audit/references/templates/REPORT-FORMAT.md +96 -96
  32. package/ftm-audit/scripts/run-knip.sh +23 -23
  33. package/ftm-audit.yml +2 -2
  34. package/ftm-brainstorm/SKILL.md +1003 -498
  35. package/ftm-brainstorm/evals/evals.json +180 -100
  36. package/ftm-brainstorm/evals/promptfoo.yaml +109 -109
  37. package/ftm-brainstorm/references/agent-prompts.md +552 -224
  38. package/ftm-brainstorm/references/plan-template.md +209 -121
  39. package/ftm-brainstorm.yml +2 -2
  40. package/ftm-browse/SKILL.md +454 -454
  41. package/ftm-browse/daemon/browser-manager.ts +206 -206
  42. package/ftm-browse/daemon/bun.lock +30 -30
  43. package/ftm-browse/daemon/cli.ts +347 -347
  44. package/ftm-browse/daemon/commands.ts +410 -410
  45. package/ftm-browse/daemon/main.ts +357 -357
  46. package/ftm-browse/daemon/package.json +17 -17
  47. package/ftm-browse/daemon/server.ts +189 -189
  48. package/ftm-browse/daemon/snapshot.ts +519 -519
  49. package/ftm-browse/daemon/tsconfig.json +22 -22
  50. package/ftm-browse.yml +4 -4
  51. package/ftm-capture/SKILL.md +370 -370
  52. package/ftm-capture.yml +4 -4
  53. package/ftm-codex-gate/SKILL.md +361 -361
  54. package/ftm-codex-gate.yml +2 -2
  55. package/ftm-config/SKILL.md +422 -345
  56. package/ftm-config.default.yml +125 -82
  57. package/ftm-config.yml +44 -2
  58. package/ftm-council/SKILL.md +416 -416
  59. package/ftm-council/references/prompts/CLAUDE-INVESTIGATION.md +60 -60
  60. package/ftm-council/references/prompts/CODEX-INVESTIGATION.md +58 -58
  61. package/ftm-council/references/prompts/GEMINI-INVESTIGATION.md +58 -58
  62. package/ftm-council/references/prompts/REBUTTAL-TEMPLATE.md +57 -57
  63. package/ftm-council/references/protocols/PREREQUISITES.md +47 -47
  64. package/ftm-council/references/protocols/STEP-0-FRAMING.md +46 -46
  65. package/ftm-council.yml +2 -2
  66. package/ftm-dashboard/SKILL.md +163 -163
  67. package/ftm-dashboard.yml +4 -4
  68. package/ftm-debug/SKILL.md +1037 -1037
  69. package/ftm-debug/references/phases/PHASE-0-INTAKE.md +58 -58
  70. package/ftm-debug/references/phases/PHASE-1-TRIAGE.md +46 -46
  71. package/ftm-debug/references/phases/PHASE-2-WAR-ROOM-AGENTS.md +279 -279
  72. package/ftm-debug/references/phases/PHASE-3-TO-6-EXECUTION.md +436 -436
  73. package/ftm-debug/references/protocols/BLACKBOARD.md +86 -86
  74. package/ftm-debug/references/protocols/EDGE-CASES.md +103 -103
  75. package/ftm-debug.yml +2 -2
  76. package/ftm-diagram/SKILL.md +277 -277
  77. package/ftm-diagram.yml +2 -2
  78. package/ftm-executor/SKILL.md +777 -777
  79. package/ftm-executor/references/STYLE-TEMPLATE.md +73 -73
  80. package/ftm-executor/references/phases/PHASE-0-VERIFICATION.md +62 -62
  81. package/ftm-executor/references/phases/PHASE-2-AGENT-ASSEMBLY.md +34 -34
  82. package/ftm-executor/references/phases/PHASE-3-WORKTREES.md +38 -38
  83. package/ftm-executor/references/phases/PHASE-4-5-AUDIT.md +72 -72
  84. package/ftm-executor/references/phases/PHASE-4-DISPATCH.md +66 -66
  85. package/ftm-executor/references/phases/PHASE-5-5-CODEX-GATE.md +73 -73
  86. package/ftm-executor/references/protocols/DOCUMENTATION-BOOTSTRAP.md +36 -36
  87. package/ftm-executor/references/protocols/MODEL-PROFILE.md +59 -59
  88. package/ftm-executor/references/protocols/PROGRESS-TRACKING.md +66 -66
  89. package/ftm-executor/runtime/ftm-runtime.mjs +252 -252
  90. package/ftm-executor/runtime/package.json +8 -8
  91. package/ftm-executor.yml +2 -2
  92. package/ftm-git/SKILL.md +441 -441
  93. package/ftm-git/evals/evals.json +26 -26
  94. package/ftm-git/evals/promptfoo.yaml +75 -75
  95. package/ftm-git/hooks/post-commit-experience.sh +92 -92
  96. package/ftm-git/references/patterns/SECRET-PATTERNS.md +104 -104
  97. package/ftm-git/references/protocols/REMEDIATION.md +139 -139
  98. package/ftm-git/scripts/pre-commit-secrets.sh +110 -110
  99. package/ftm-git.yml +2 -2
  100. package/ftm-inbox/backend/__pycache__/main.cpython-314.pyc +0 -0
  101. package/ftm-inbox/backend/adapters/_retry.py +64 -64
  102. package/ftm-inbox/backend/adapters/base.py +230 -230
  103. package/ftm-inbox/backend/adapters/freshservice.py +104 -104
  104. package/ftm-inbox/backend/adapters/gmail.py +125 -125
  105. package/ftm-inbox/backend/adapters/jira.py +136 -136
  106. package/ftm-inbox/backend/adapters/registry.py +192 -192
  107. package/ftm-inbox/backend/adapters/slack.py +110 -110
  108. package/ftm-inbox/backend/db/connection.py +54 -54
  109. package/ftm-inbox/backend/db/schema.py +78 -78
  110. package/ftm-inbox/backend/executor/__init__.py +7 -7
  111. package/ftm-inbox/backend/executor/engine.py +149 -149
  112. package/ftm-inbox/backend/executor/step_runner.py +98 -98
  113. package/ftm-inbox/backend/main.py +103 -103
  114. package/ftm-inbox/backend/models/__init__.py +1 -1
  115. package/ftm-inbox/backend/models/unified_task.py +36 -36
  116. package/ftm-inbox/backend/planner/__init__.py +6 -6
  117. package/ftm-inbox/backend/planner/__pycache__/__init__.cpython-314.pyc +0 -0
  118. package/ftm-inbox/backend/planner/__pycache__/generator.cpython-314.pyc +0 -0
  119. package/ftm-inbox/backend/planner/__pycache__/schema.cpython-314.pyc +0 -0
  120. package/ftm-inbox/backend/planner/generator.py +127 -127
  121. package/ftm-inbox/backend/planner/schema.py +34 -34
  122. package/ftm-inbox/backend/requirements.txt +5 -5
  123. package/ftm-inbox/backend/routes/__pycache__/plan.cpython-314.pyc +0 -0
  124. package/ftm-inbox/backend/routes/execute.py +186 -186
  125. package/ftm-inbox/backend/routes/health.py +52 -52
  126. package/ftm-inbox/backend/routes/inbox.py +68 -68
  127. package/ftm-inbox/backend/routes/plan.py +271 -271
  128. package/ftm-inbox/bin/launchagent.mjs +91 -91
  129. package/ftm-inbox/bin/setup.mjs +188 -188
  130. package/ftm-inbox/bin/start.sh +10 -10
  131. package/ftm-inbox/bin/status.sh +17 -17
  132. package/ftm-inbox/bin/stop.sh +8 -8
  133. package/ftm-inbox/config.example.yml +55 -55
  134. package/ftm-inbox/package-lock.json +2898 -2898
  135. package/ftm-inbox/package.json +26 -26
  136. package/ftm-inbox/postcss.config.js +6 -6
  137. package/ftm-inbox/src/app.css +199 -199
  138. package/ftm-inbox/src/app.html +18 -18
  139. package/ftm-inbox/src/lib/api.ts +166 -166
  140. package/ftm-inbox/src/lib/components/ExecutionLog.svelte +81 -81
  141. package/ftm-inbox/src/lib/components/InboxFeed.svelte +143 -143
  142. package/ftm-inbox/src/lib/components/PlanStep.svelte +271 -271
  143. package/ftm-inbox/src/lib/components/PlanView.svelte +206 -206
  144. package/ftm-inbox/src/lib/components/StreamPanel.svelte +99 -99
  145. package/ftm-inbox/src/lib/components/TaskCard.svelte +190 -190
  146. package/ftm-inbox/src/lib/components/ui/EmptyState.svelte +63 -63
  147. package/ftm-inbox/src/lib/components/ui/KawaiiCard.svelte +86 -86
  148. package/ftm-inbox/src/lib/components/ui/PillButton.svelte +106 -106
  149. package/ftm-inbox/src/lib/components/ui/StatusBadge.svelte +67 -67
  150. package/ftm-inbox/src/lib/components/ui/StreamDrawer.svelte +149 -149
  151. package/ftm-inbox/src/lib/components/ui/ThemeToggle.svelte +80 -80
  152. package/ftm-inbox/src/lib/theme.ts +47 -47
  153. package/ftm-inbox/src/routes/+layout.svelte +76 -76
  154. package/ftm-inbox/src/routes/+page.svelte +401 -401
  155. package/ftm-inbox/svelte.config.js +12 -12
  156. package/ftm-inbox/tailwind.config.ts +63 -63
  157. package/ftm-inbox/tsconfig.json +13 -13
  158. package/ftm-inbox/vite.config.ts +6 -6
  159. package/ftm-intent/SKILL.md +241 -241
  160. package/ftm-intent.yml +2 -2
  161. package/ftm-manifest.json +3794 -3794
  162. package/ftm-map/SKILL.md +291 -291
  163. package/ftm-map/scripts/db.py +712 -712
  164. package/ftm-map/scripts/index.py +415 -415
  165. package/ftm-map/scripts/parser.py +224 -224
  166. package/ftm-map/scripts/queries/go-tags.scm +20 -20
  167. package/ftm-map/scripts/queries/javascript-tags.scm +35 -35
  168. package/ftm-map/scripts/queries/python-tags.scm +31 -31
  169. package/ftm-map/scripts/queries/ruby-tags.scm +19 -19
  170. package/ftm-map/scripts/queries/rust-tags.scm +37 -37
  171. package/ftm-map/scripts/queries/typescript-tags.scm +41 -41
  172. package/ftm-map/scripts/query.py +301 -301
  173. package/ftm-map/scripts/ranker.py +377 -377
  174. package/ftm-map/scripts/requirements.txt +5 -5
  175. package/ftm-map/scripts/setup-hooks.sh +27 -27
  176. package/ftm-map/scripts/setup.sh +56 -56
  177. package/ftm-map/scripts/test_db.py +364 -364
  178. package/ftm-map/scripts/test_parser.py +174 -174
  179. package/ftm-map/scripts/test_query.py +183 -183
  180. package/ftm-map/scripts/test_ranker.py +199 -199
  181. package/ftm-map/scripts/views.py +591 -591
  182. package/ftm-map.yml +2 -2
  183. package/ftm-mind/SKILL.md +201 -1943
  184. package/ftm-mind/evals/promptfoo.yaml +142 -142
  185. package/ftm-mind/references/blackboard-protocol.md +110 -0
  186. package/ftm-mind/references/blackboard-schema.md +328 -328
  187. package/ftm-mind/references/complexity-guide.md +110 -110
  188. package/ftm-mind/references/complexity-sizing.md +138 -0
  189. package/ftm-mind/references/decide-act-protocol.md +172 -0
  190. package/ftm-mind/references/direct-execution.md +51 -0
  191. package/ftm-mind/references/environment-discovery.md +77 -0
  192. package/ftm-mind/references/event-registry.md +319 -319
  193. package/ftm-mind/references/mcp-inventory.md +300 -296
  194. package/ftm-mind/references/ops-routing.md +47 -0
  195. package/ftm-mind/references/orient-protocol.md +234 -0
  196. package/ftm-mind/references/personality.md +40 -0
  197. package/ftm-mind/references/protocols/COMPLEXITY-SIZING.md +72 -72
  198. package/ftm-mind/references/protocols/MCP-HEURISTICS.md +32 -32
  199. package/ftm-mind/references/protocols/PLAN-APPROVAL.md +80 -80
  200. package/ftm-mind/references/reflexion-protocol.md +249 -249
  201. package/ftm-mind/references/routing/SCENARIOS.md +22 -22
  202. package/ftm-mind/references/routing-scenarios.md +35 -35
  203. package/ftm-mind.yml +2 -2
  204. package/ftm-ops.yml +4 -0
  205. package/ftm-pause/SKILL.md +395 -395
  206. package/ftm-pause/references/protocols/SKILL-RESTORE-PROTOCOLS.md +186 -186
  207. package/ftm-pause/references/protocols/VALIDATION.md +80 -80
  208. package/ftm-pause.yml +2 -2
  209. package/ftm-researcher/SKILL.md +275 -275
  210. package/ftm-researcher/evals/agent-diversity.yaml +17 -17
  211. package/ftm-researcher/evals/synthesis-quality.yaml +12 -12
  212. package/ftm-researcher/evals/trigger-accuracy.yaml +39 -39
  213. package/ftm-researcher/references/adaptive-search.md +116 -116
  214. package/ftm-researcher/references/agent-prompts.md +193 -193
  215. package/ftm-researcher/references/council-integration.md +193 -193
  216. package/ftm-researcher/references/output-format.md +203 -203
  217. package/ftm-researcher/references/synthesis-pipeline.md +165 -165
  218. package/ftm-researcher/scripts/score_credibility.py +234 -234
  219. package/ftm-researcher/scripts/validate_research.py +92 -92
  220. package/ftm-researcher.yml +2 -2
  221. package/ftm-resume/SKILL.md +518 -518
  222. package/ftm-resume/references/protocols/VALIDATION.md +172 -172
  223. package/ftm-resume.yml +2 -2
  224. package/ftm-retro/SKILL.md +380 -380
  225. package/ftm-retro/references/protocols/SCORING-RUBRICS.md +89 -89
  226. package/ftm-retro/references/templates/REPORT-FORMAT.md +109 -109
  227. package/ftm-retro.yml +2 -2
  228. package/ftm-routine/SKILL.md +170 -170
  229. package/ftm-routine.yml +4 -4
  230. package/ftm-state/blackboard/capabilities.json +5 -5
  231. package/ftm-state/blackboard/capabilities.schema.json +27 -27
  232. package/ftm-state/blackboard/context.json +37 -23
  233. package/ftm-state/blackboard/experiences/doom-statusline-fix.json +26 -0
  234. package/ftm-state/blackboard/experiences/hackathon-pages-site.json +26 -0
  235. package/ftm-state/blackboard/experiences/hindsight-sso-kickoff.json +42 -0
  236. package/ftm-state/blackboard/experiences/index.json +58 -9
  237. package/ftm-state/blackboard/experiences/learning-ragnarok-api-access.json +23 -0
  238. package/ftm-state/blackboard/experiences/nordlayer-members-auto-assign.json +26 -0
  239. package/ftm-state/blackboard/experiences/saml2aws-stale-session-fix.json +41 -0
  240. package/ftm-state/blackboard/patterns.json +6 -6
  241. package/ftm-state/schemas/context.schema.json +130 -130
  242. package/ftm-state/schemas/experience-index.schema.json +77 -77
  243. package/ftm-state/schemas/experience.schema.json +78 -78
  244. package/ftm-state/schemas/patterns.schema.json +44 -44
  245. package/ftm-upgrade/SKILL.md +194 -194
  246. package/ftm-upgrade/scripts/check-version.sh +76 -76
  247. package/ftm-upgrade/scripts/upgrade.sh +143 -143
  248. package/ftm-upgrade.yml +2 -2
  249. package/ftm-verify.yml +2 -2
  250. package/ftm.yml +2 -2
  251. package/hooks/ftm-auto-log.sh +137 -0
  252. package/hooks/ftm-blackboard-enforcer.sh +93 -93
  253. package/hooks/ftm-discovery-reminder.sh +90 -90
  254. package/hooks/ftm-drafts-gate.sh +61 -61
  255. package/hooks/ftm-event-logger.mjs +107 -107
  256. package/hooks/ftm-install-hooks.sh +240 -0
  257. package/hooks/ftm-learning-capture.sh +117 -0
  258. package/hooks/ftm-map-autodetect.sh +79 -79
  259. package/hooks/ftm-pending-sync-check.sh +22 -22
  260. package/hooks/ftm-plan-gate.sh +92 -92
  261. package/hooks/ftm-post-commit-trigger.sh +57 -57
  262. package/hooks/ftm-post-compaction.sh +138 -0
  263. package/hooks/ftm-pre-compaction.sh +147 -0
  264. package/hooks/ftm-session-end.sh +52 -0
  265. package/hooks/ftm-session-snapshot.sh +213 -0
  266. package/hooks/settings-template.json +81 -81
  267. package/install.sh +363 -363
  268. package/package.json +84 -84
  269. 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.