feed-the-machine 1.5.0 → 1.6.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/LICENSE +21 -21
- package/README.md +170 -170
- package/bin/generate-manifest.mjs +463 -463
- package/bin/install.mjs +491 -491
- package/docs/HOOKS.md +243 -243
- package/docs/INBOX.md +233 -233
- package/ftm/SKILL.md +122 -122
- package/ftm-audit/SKILL.md +623 -541
- package/ftm-audit/references/protocols/PROJECT-PATTERNS.md +91 -91
- package/ftm-audit/references/protocols/RUNTIME-WIRING.md +66 -66
- package/ftm-audit/references/protocols/WIRING-CONTRACTS.md +135 -135
- package/ftm-audit/references/strategies/AUTO-FIX-STRATEGIES.md +69 -69
- package/ftm-audit/references/templates/REPORT-FORMAT.md +96 -96
- package/ftm-audit/scripts/run-knip.sh +23 -23
- package/ftm-audit.yml +2 -2
- package/ftm-brainstorm/SKILL.md +498 -498
- package/ftm-brainstorm/evals/evals.json +100 -100
- package/ftm-brainstorm/evals/promptfoo.yaml +109 -109
- package/ftm-brainstorm/references/agent-prompts.md +224 -224
- package/ftm-brainstorm/references/plan-template.md +121 -121
- package/ftm-brainstorm.yml +2 -2
- package/ftm-browse/SKILL.md +454 -454
- package/ftm-browse/daemon/browser-manager.ts +206 -206
- package/ftm-browse/daemon/bun.lock +30 -30
- package/ftm-browse/daemon/cli.ts +347 -347
- package/ftm-browse/daemon/commands.ts +410 -410
- package/ftm-browse/daemon/main.ts +357 -357
- package/ftm-browse/daemon/package.json +17 -17
- package/ftm-browse/daemon/server.ts +189 -189
- package/ftm-browse/daemon/snapshot.ts +519 -519
- package/ftm-browse/daemon/tsconfig.json +22 -22
- package/ftm-browse.yml +4 -4
- package/ftm-capture/SKILL.md +370 -370
- package/ftm-capture.yml +4 -4
- package/ftm-codex-gate/SKILL.md +361 -361
- package/ftm-codex-gate.yml +2 -2
- package/ftm-config/SKILL.md +345 -345
- package/ftm-config.default.yml +82 -80
- package/ftm-config.yml +2 -2
- package/ftm-council/SKILL.md +416 -416
- package/ftm-council/references/prompts/CLAUDE-INVESTIGATION.md +60 -60
- package/ftm-council/references/prompts/CODEX-INVESTIGATION.md +58 -58
- package/ftm-council/references/prompts/GEMINI-INVESTIGATION.md +58 -58
- package/ftm-council/references/prompts/REBUTTAL-TEMPLATE.md +57 -57
- package/ftm-council/references/protocols/PREREQUISITES.md +47 -47
- package/ftm-council/references/protocols/STEP-0-FRAMING.md +46 -46
- package/ftm-council.yml +2 -2
- package/ftm-dashboard/SKILL.md +163 -163
- package/ftm-dashboard.yml +4 -4
- package/ftm-debug/SKILL.md +1037 -1037
- package/ftm-debug/references/phases/PHASE-0-INTAKE.md +58 -58
- package/ftm-debug/references/phases/PHASE-1-TRIAGE.md +46 -46
- package/ftm-debug/references/phases/PHASE-2-WAR-ROOM-AGENTS.md +279 -279
- package/ftm-debug/references/phases/PHASE-3-TO-6-EXECUTION.md +436 -436
- package/ftm-debug/references/protocols/BLACKBOARD.md +86 -86
- package/ftm-debug/references/protocols/EDGE-CASES.md +103 -103
- package/ftm-debug.yml +2 -2
- package/ftm-diagram/SKILL.md +277 -277
- package/ftm-diagram.yml +2 -2
- package/ftm-executor/SKILL.md +777 -767
- package/ftm-executor/references/STYLE-TEMPLATE.md +73 -73
- package/ftm-executor/references/phases/PHASE-0-VERIFICATION.md +62 -62
- package/ftm-executor/references/phases/PHASE-2-AGENT-ASSEMBLY.md +34 -34
- package/ftm-executor/references/phases/PHASE-3-WORKTREES.md +38 -38
- package/ftm-executor/references/phases/PHASE-4-5-AUDIT.md +72 -72
- package/ftm-executor/references/phases/PHASE-4-DISPATCH.md +66 -66
- package/ftm-executor/references/phases/PHASE-5-5-CODEX-GATE.md +73 -73
- package/ftm-executor/references/protocols/DOCUMENTATION-BOOTSTRAP.md +36 -36
- package/ftm-executor/references/protocols/MODEL-PROFILE.md +59 -44
- package/ftm-executor/references/protocols/PROGRESS-TRACKING.md +66 -66
- package/ftm-executor/runtime/ftm-runtime.mjs +252 -252
- package/ftm-executor/runtime/package.json +8 -8
- package/ftm-executor.yml +2 -2
- package/ftm-git/SKILL.md +441 -441
- package/ftm-git/evals/evals.json +26 -26
- package/ftm-git/evals/promptfoo.yaml +75 -75
- package/ftm-git/hooks/post-commit-experience.sh +92 -92
- package/ftm-git/references/patterns/SECRET-PATTERNS.md +104 -104
- package/ftm-git/references/protocols/REMEDIATION.md +139 -139
- package/ftm-git/scripts/pre-commit-secrets.sh +110 -110
- package/ftm-git.yml +2 -2
- package/ftm-inbox/backend/adapters/_retry.py +64 -64
- package/ftm-inbox/backend/adapters/base.py +230 -230
- package/ftm-inbox/backend/adapters/freshservice.py +104 -104
- package/ftm-inbox/backend/adapters/gmail.py +125 -125
- package/ftm-inbox/backend/adapters/jira.py +136 -136
- package/ftm-inbox/backend/adapters/registry.py +192 -192
- package/ftm-inbox/backend/adapters/slack.py +110 -110
- package/ftm-inbox/backend/db/connection.py +54 -54
- package/ftm-inbox/backend/db/schema.py +78 -78
- package/ftm-inbox/backend/executor/__init__.py +7 -7
- package/ftm-inbox/backend/executor/engine.py +149 -149
- package/ftm-inbox/backend/executor/step_runner.py +98 -98
- package/ftm-inbox/backend/main.py +103 -103
- package/ftm-inbox/backend/models/__init__.py +1 -1
- package/ftm-inbox/backend/models/unified_task.py +36 -36
- package/ftm-inbox/backend/planner/__init__.py +6 -6
- package/ftm-inbox/backend/planner/generator.py +127 -127
- package/ftm-inbox/backend/planner/schema.py +34 -34
- package/ftm-inbox/backend/requirements.txt +5 -5
- package/ftm-inbox/backend/routes/execute.py +186 -186
- package/ftm-inbox/backend/routes/health.py +52 -52
- package/ftm-inbox/backend/routes/inbox.py +68 -68
- package/ftm-inbox/backend/routes/plan.py +271 -271
- package/ftm-inbox/bin/launchagent.mjs +91 -91
- package/ftm-inbox/bin/setup.mjs +188 -188
- package/ftm-inbox/bin/start.sh +10 -10
- package/ftm-inbox/bin/status.sh +17 -17
- package/ftm-inbox/bin/stop.sh +8 -8
- package/ftm-inbox/config.example.yml +55 -55
- package/ftm-inbox/package-lock.json +2898 -2898
- package/ftm-inbox/package.json +26 -26
- package/ftm-inbox/postcss.config.js +6 -6
- package/ftm-inbox/src/app.css +199 -199
- package/ftm-inbox/src/app.html +18 -18
- package/ftm-inbox/src/lib/api.ts +166 -166
- package/ftm-inbox/src/lib/components/ExecutionLog.svelte +81 -81
- package/ftm-inbox/src/lib/components/InboxFeed.svelte +143 -143
- package/ftm-inbox/src/lib/components/PlanStep.svelte +271 -271
- package/ftm-inbox/src/lib/components/PlanView.svelte +206 -206
- package/ftm-inbox/src/lib/components/StreamPanel.svelte +99 -99
- package/ftm-inbox/src/lib/components/TaskCard.svelte +190 -190
- package/ftm-inbox/src/lib/components/ui/EmptyState.svelte +63 -63
- package/ftm-inbox/src/lib/components/ui/KawaiiCard.svelte +86 -86
- package/ftm-inbox/src/lib/components/ui/PillButton.svelte +106 -106
- package/ftm-inbox/src/lib/components/ui/StatusBadge.svelte +67 -67
- package/ftm-inbox/src/lib/components/ui/StreamDrawer.svelte +149 -149
- package/ftm-inbox/src/lib/components/ui/ThemeToggle.svelte +80 -80
- package/ftm-inbox/src/lib/theme.ts +47 -47
- package/ftm-inbox/src/routes/+layout.svelte +76 -76
- package/ftm-inbox/src/routes/+page.svelte +401 -401
- package/ftm-inbox/svelte.config.js +12 -12
- package/ftm-inbox/tailwind.config.ts +63 -63
- package/ftm-inbox/tsconfig.json +13 -13
- package/ftm-inbox/vite.config.ts +6 -6
- package/ftm-intent/SKILL.md +241 -241
- package/ftm-intent.yml +2 -2
- package/ftm-manifest.json +3794 -3794
- package/ftm-map/SKILL.md +291 -291
- package/ftm-map/scripts/db.py +712 -712
- package/ftm-map/scripts/index.py +415 -415
- package/ftm-map/scripts/parser.py +224 -224
- package/ftm-map/scripts/queries/go-tags.scm +20 -20
- package/ftm-map/scripts/queries/javascript-tags.scm +35 -35
- package/ftm-map/scripts/queries/python-tags.scm +31 -31
- package/ftm-map/scripts/queries/ruby-tags.scm +19 -19
- package/ftm-map/scripts/queries/rust-tags.scm +37 -37
- package/ftm-map/scripts/queries/typescript-tags.scm +41 -41
- package/ftm-map/scripts/query.py +301 -301
- package/ftm-map/scripts/ranker.py +377 -377
- package/ftm-map/scripts/requirements.txt +5 -5
- package/ftm-map/scripts/setup-hooks.sh +27 -27
- package/ftm-map/scripts/setup.sh +56 -56
- package/ftm-map/scripts/test_db.py +364 -364
- package/ftm-map/scripts/test_parser.py +174 -174
- package/ftm-map/scripts/test_query.py +183 -183
- package/ftm-map/scripts/test_ranker.py +199 -199
- package/ftm-map/scripts/views.py +591 -591
- package/ftm-map.yml +2 -2
- package/ftm-mind/SKILL.md +1943 -1943
- package/ftm-mind/evals/promptfoo.yaml +142 -142
- package/ftm-mind/references/blackboard-schema.md +328 -328
- package/ftm-mind/references/complexity-guide.md +110 -110
- package/ftm-mind/references/event-registry.md +319 -319
- package/ftm-mind/references/mcp-inventory.md +296 -296
- package/ftm-mind/references/protocols/COMPLEXITY-SIZING.md +72 -72
- package/ftm-mind/references/protocols/MCP-HEURISTICS.md +32 -32
- package/ftm-mind/references/protocols/PLAN-APPROVAL.md +80 -80
- package/ftm-mind/references/reflexion-protocol.md +249 -249
- package/ftm-mind/references/routing/SCENARIOS.md +22 -22
- package/ftm-mind/references/routing-scenarios.md +35 -35
- package/ftm-mind.yml +2 -2
- package/ftm-pause/SKILL.md +395 -395
- package/ftm-pause/references/protocols/SKILL-RESTORE-PROTOCOLS.md +186 -186
- package/ftm-pause/references/protocols/VALIDATION.md +80 -80
- package/ftm-pause.yml +2 -2
- package/ftm-researcher/SKILL.md +275 -275
- package/ftm-researcher/evals/agent-diversity.yaml +17 -17
- package/ftm-researcher/evals/synthesis-quality.yaml +12 -12
- package/ftm-researcher/evals/trigger-accuracy.yaml +39 -39
- package/ftm-researcher/references/adaptive-search.md +116 -116
- package/ftm-researcher/references/agent-prompts.md +193 -193
- package/ftm-researcher/references/council-integration.md +193 -193
- package/ftm-researcher/references/output-format.md +203 -203
- package/ftm-researcher/references/synthesis-pipeline.md +165 -165
- package/ftm-researcher/scripts/score_credibility.py +234 -234
- package/ftm-researcher/scripts/validate_research.py +92 -92
- package/ftm-researcher.yml +2 -2
- package/ftm-resume/SKILL.md +518 -518
- package/ftm-resume/references/protocols/VALIDATION.md +172 -172
- package/ftm-resume.yml +2 -2
- package/ftm-retro/SKILL.md +380 -380
- package/ftm-retro/references/protocols/SCORING-RUBRICS.md +89 -89
- package/ftm-retro/references/templates/REPORT-FORMAT.md +109 -109
- package/ftm-retro.yml +2 -2
- package/ftm-routine/SKILL.md +170 -170
- package/ftm-routine.yml +4 -4
- package/ftm-state/blackboard/capabilities.json +5 -5
- package/ftm-state/blackboard/capabilities.schema.json +27 -27
- package/ftm-state/blackboard/context.json +23 -23
- package/ftm-state/blackboard/experiences/index.json +9 -9
- package/ftm-state/blackboard/patterns.json +6 -6
- package/ftm-state/schemas/context.schema.json +130 -130
- package/ftm-state/schemas/experience-index.schema.json +77 -77
- package/ftm-state/schemas/experience.schema.json +78 -78
- package/ftm-state/schemas/patterns.schema.json +44 -44
- package/ftm-upgrade/SKILL.md +194 -194
- package/ftm-upgrade/scripts/check-version.sh +76 -76
- package/ftm-upgrade/scripts/upgrade.sh +143 -143
- package/ftm-upgrade.yml +2 -2
- package/ftm-verify.yml +2 -2
- package/ftm.yml +2 -2
- package/hooks/ftm-blackboard-enforcer.sh +93 -93
- package/hooks/ftm-discovery-reminder.sh +90 -90
- package/hooks/ftm-drafts-gate.sh +61 -61
- package/hooks/ftm-event-logger.mjs +107 -107
- package/hooks/ftm-map-autodetect.sh +79 -79
- package/hooks/ftm-pending-sync-check.sh +22 -22
- package/hooks/ftm-plan-gate.sh +92 -92
- package/hooks/ftm-post-commit-trigger.sh +57 -57
- package/hooks/settings-template.json +81 -81
- package/install.sh +363 -363
- package/package.json +84 -84
- 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.
|