@forwardimpact/basecamp 0.3.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +70 -85
- package/config/scheduler.json +13 -17
- package/package.json +11 -13
- package/src/basecamp.js +742 -0
- package/template/.claude/agents/chief-of-staff.md +99 -0
- package/template/.claude/agents/concierge.md +76 -0
- package/template/.claude/agents/librarian.md +61 -0
- package/template/.claude/agents/postman.md +73 -0
- package/template/.claude/settings.json +49 -0
- package/template/.claude/skills/draft-emails/SKILL.md +32 -3
- package/template/.claude/skills/draft-emails/scripts/scan-emails.sh +3 -2
- package/template/.claude/skills/extract-entities/SKILL.md +0 -1
- package/template/.claude/skills/extract-entities/references/TEMPLATES.md +1 -0
- package/template/.claude/skills/process-hyprnote/SKILL.md +335 -0
- package/template/.claude/skills/sync-apple-calendar/SKILL.md +6 -3
- package/template/.claude/skills/sync-apple-calendar/scripts/sync.py +13 -4
- package/template/.claude/skills/sync-apple-mail/SKILL.md +17 -5
- package/template/.claude/skills/sync-apple-mail/references/SCHEMA.md +32 -5
- package/template/.claude/skills/sync-apple-mail/scripts/sync.py +134 -27
- package/template/CLAUDE.md +81 -14
- package/template/knowledge/Briefings/.gitkeep +0 -0
- package/basecamp.js +0 -660
- package/build.js +0 -122
package/README.md
CHANGED
|
@@ -1,97 +1,111 @@
|
|
|
1
1
|
# @forwardimpact/basecamp
|
|
2
2
|
|
|
3
3
|
A personal knowledge system that runs as scheduled Claude Code tasks. No server,
|
|
4
|
-
no database — just plain files, markdown, and the `claude` CLI.
|
|
5
|
-
|
|
4
|
+
no database — just plain files, markdown, and the `claude` CLI. Packaged as a
|
|
5
|
+
native macOS app bundle (`Basecamp.app`) with TCC-compliant process management.
|
|
6
6
|
|
|
7
7
|
Part of the [Forward Impact](https://www.forwardimpact.team) monorepo.
|
|
8
8
|
|
|
9
9
|
## Architecture
|
|
10
10
|
|
|
11
11
|
```
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
├──
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
├──
|
|
12
|
+
Basecamp.app/ # macOS app bundle
|
|
13
|
+
└── Contents/
|
|
14
|
+
├── Info.plist # Bundle metadata (LSUIElement)
|
|
15
|
+
├── MacOS/
|
|
16
|
+
│ ├── Basecamp # Swift launcher (TCC responsible)
|
|
17
|
+
│ └── fit-basecamp # Deno scheduler (child process)
|
|
18
|
+
└── Resources/
|
|
19
|
+
├── config/scheduler.json # Default config
|
|
20
|
+
└── template/ # KB template
|
|
21
|
+
|
|
22
|
+
~/.fit/basecamp/ # Scheduler home (user config)
|
|
23
|
+
├── scheduler.json # Task definitions
|
|
24
|
+
├── state.json # Task run state
|
|
25
|
+
├── basecamp.sock # IPC socket
|
|
26
|
+
└── logs/ # Scheduler logs
|
|
27
|
+
|
|
28
|
+
~/Documents/Personal/ # Default personal knowledge base
|
|
29
|
+
├── CLAUDE.md # Claude Code instructions for this KB
|
|
30
|
+
├── knowledge/ # The knowledge graph
|
|
20
31
|
│ ├── People/
|
|
21
32
|
│ ├── Organizations/
|
|
22
33
|
│ ├── Projects/
|
|
23
34
|
│ └── Topics/
|
|
24
|
-
├── .claude/skills/
|
|
25
|
-
└── drafts/
|
|
26
|
-
|
|
27
|
-
~/Documents/Team/ # Example knowledge base for team work
|
|
28
|
-
├── CLAUDE.md
|
|
29
|
-
├── knowledge/
|
|
30
|
-
├── .claude/skills/
|
|
31
|
-
└── ...
|
|
35
|
+
├── .claude/skills/ # Claude Code skill files
|
|
36
|
+
└── drafts/ # Email drafts
|
|
32
37
|
```
|
|
33
38
|
|
|
34
|
-
|
|
35
|
-
is markdown, JSON, and skill files. Knowledge bases are self-contained
|
|
36
|
-
directories that can live anywhere on disk. Synced data and processing state
|
|
37
|
-
live in `~/.cache/fit/basecamp/`, keeping KB directories clean — only the parsed
|
|
38
|
-
knowledge graph, notes, documents, and drafts belong in the KB.
|
|
39
|
+
### Process Tree
|
|
39
40
|
|
|
40
|
-
|
|
41
|
+
```
|
|
42
|
+
Basecamp (Swift launcher, CFBundleExecutable, TCC responsible)
|
|
43
|
+
├── fit-basecamp --daemon (Deno scheduler, spawned via posix_spawn)
|
|
44
|
+
│ └── claude --print ... (spawned via posix_spawn FFI)
|
|
45
|
+
└── [status menu UI] (AppKit menu bar, in-process)
|
|
46
|
+
```
|
|
41
47
|
|
|
42
|
-
The
|
|
48
|
+
The Swift launcher is the main executable and TCC responsible process. It spawns
|
|
49
|
+
the Deno scheduler via `posix_spawn` so child processes inherit TCC attributes.
|
|
50
|
+
Users grant Calendar, Contacts, and other permissions once to Basecamp.app.
|
|
43
51
|
|
|
44
|
-
|
|
52
|
+
## Install from Package
|
|
53
|
+
|
|
54
|
+
1. Double-click `fit-basecamp-<version>.pkg`
|
|
45
55
|
2. Follow the installer prompts
|
|
46
56
|
|
|
47
|
-
The installer places
|
|
48
|
-
`~/Documents/Personal/` as the default knowledge base
|
|
49
|
-
|
|
57
|
+
The installer places `Basecamp.app` in `/Applications/` and initializes
|
|
58
|
+
`~/Documents/Personal/` as the default knowledge base.
|
|
59
|
+
|
|
60
|
+
After installing, open Basecamp from `/Applications/`. It runs as a menu bar app
|
|
61
|
+
— use "Quit Basecamp" from the status menu to stop it.
|
|
50
62
|
|
|
51
|
-
To uninstall, run
|
|
63
|
+
To uninstall, run `just uninstall` from the source tree.
|
|
52
64
|
|
|
53
65
|
## Install from Source
|
|
54
66
|
|
|
55
67
|
```bash
|
|
56
|
-
cd
|
|
57
|
-
|
|
68
|
+
cd products/basecamp
|
|
69
|
+
|
|
70
|
+
# Run the scheduler in dev mode
|
|
71
|
+
just daemon
|
|
72
|
+
|
|
73
|
+
# Or initialize a new KB
|
|
74
|
+
just init ~/Documents/Personal
|
|
58
75
|
|
|
59
76
|
# Configure your identity
|
|
60
77
|
vi ~/Documents/Personal/USER.md
|
|
61
|
-
|
|
62
|
-
# Open your KB interactively
|
|
63
|
-
cd ~/Documents/Personal && claude
|
|
64
78
|
```
|
|
65
79
|
|
|
66
80
|
## Building
|
|
67
81
|
|
|
68
|
-
Requires [Deno](https://deno.com) >= 2.x.
|
|
82
|
+
Requires [Deno](https://deno.com) >= 2.x and Xcode Command Line Tools.
|
|
69
83
|
|
|
70
84
|
```bash
|
|
71
|
-
# Build
|
|
72
|
-
|
|
85
|
+
# Build scheduler + launcher binaries
|
|
86
|
+
just build
|
|
73
87
|
|
|
74
|
-
# Build
|
|
75
|
-
|
|
88
|
+
# Build + assemble Basecamp.app
|
|
89
|
+
just build-app
|
|
76
90
|
|
|
77
|
-
# Build
|
|
78
|
-
|
|
91
|
+
# Build + assemble + .pkg installer
|
|
92
|
+
just pkg
|
|
93
|
+
|
|
94
|
+
# Or via npm:
|
|
95
|
+
npm run build # binaries only
|
|
96
|
+
npm run build:app # + Basecamp.app
|
|
97
|
+
npm run build:pkg # + .pkg installer
|
|
79
98
|
```
|
|
80
99
|
|
|
81
100
|
Output goes to `dist/`:
|
|
82
101
|
|
|
83
102
|
```
|
|
84
103
|
dist/
|
|
85
|
-
├── basecamp
|
|
86
|
-
├──
|
|
87
|
-
|
|
88
|
-
└── basecamp-1.0.0-x86_64.pkg # x86_64 installer package
|
|
104
|
+
├── fit-basecamp # Deno scheduler binary
|
|
105
|
+
├── Basecamp # Swift launcher binary
|
|
106
|
+
└── Basecamp.app/ # Assembled app bundle
|
|
89
107
|
```
|
|
90
108
|
|
|
91
|
-
The compiled binary is fully self-contained — it embeds the `template/`
|
|
92
|
-
directory (CLAUDE.md, skills) so `basecamp --init <path>` works without any
|
|
93
|
-
source files present.
|
|
94
|
-
|
|
95
109
|
## Multiple Knowledge Bases
|
|
96
110
|
|
|
97
111
|
The scheduler can run tasks across multiple knowledge bases. Each KB is an
|
|
@@ -101,7 +115,7 @@ independent directory with its own CLAUDE.md, skills, and knowledge graph.
|
|
|
101
115
|
|
|
102
116
|
```bash
|
|
103
117
|
# Initialize a new knowledge base
|
|
104
|
-
|
|
118
|
+
deno run --allow-all src/basecamp.js --init ~/Documents/Team
|
|
105
119
|
|
|
106
120
|
# Edit the scheduler config to register it
|
|
107
121
|
vi ~/.fit/basecamp/scheduler.json
|
|
@@ -118,7 +132,6 @@ vi ~/.fit/basecamp/scheduler.json
|
|
|
118
132
|
"kb": "~/Documents/Personal",
|
|
119
133
|
"schedule": { "type": "interval", "minutes": 5 },
|
|
120
134
|
"enabled": true,
|
|
121
|
-
"agent": null,
|
|
122
135
|
"skill": "sync-apple-mail",
|
|
123
136
|
"prompt": "Sync Apple Mail."
|
|
124
137
|
},
|
|
@@ -126,7 +139,6 @@ vi ~/.fit/basecamp/scheduler.json
|
|
|
126
139
|
"kb": "~/Documents/Team",
|
|
127
140
|
"schedule": { "type": "interval", "minutes": 10 },
|
|
128
141
|
"enabled": true,
|
|
129
|
-
"agent": null,
|
|
130
142
|
"skill": "sync-apple-calendar",
|
|
131
143
|
"prompt": "Sync Apple Calendar."
|
|
132
144
|
}
|
|
@@ -153,23 +165,6 @@ vi ~/.fit/basecamp/scheduler.json
|
|
|
153
165
|
{ "type": "once", "runAt": "2025-02-12T10:00:00Z" }
|
|
154
166
|
```
|
|
155
167
|
|
|
156
|
-
## Agents
|
|
157
|
-
|
|
158
|
-
Set the `agent` field on a task to use a specific Claude sub-agent. The value is
|
|
159
|
-
passed as `--agent <name>` to the `claude` CLI.
|
|
160
|
-
|
|
161
|
-
```json
|
|
162
|
-
{
|
|
163
|
-
"sync-personal-mail": {
|
|
164
|
-
"kb": "~/Documents/Personal",
|
|
165
|
-
"agent": "basecamp-sync",
|
|
166
|
-
"schedule": { "type": "interval", "minutes": 5 },
|
|
167
|
-
"skill": "sync-apple-mail",
|
|
168
|
-
"prompt": "Sync Apple Mail."
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
```
|
|
172
|
-
|
|
173
168
|
## CLI Reference
|
|
174
169
|
|
|
175
170
|
```
|
|
@@ -178,22 +173,12 @@ fit-basecamp --daemon Run continuously (poll every 60s)
|
|
|
178
173
|
fit-basecamp --run <task> Run a specific task immediately
|
|
179
174
|
fit-basecamp --init <path> Initialize a new knowledge base
|
|
180
175
|
fit-basecamp --status Show knowledge bases and task status
|
|
176
|
+
fit-basecamp --validate Validate agents and skills exist
|
|
181
177
|
fit-basecamp --help Show this help
|
|
182
178
|
```
|
|
183
179
|
|
|
184
|
-
When running from source, use `
|
|
185
|
-
of `fit-basecamp`.
|
|
186
|
-
|
|
187
|
-
## How It Works
|
|
188
|
-
|
|
189
|
-
1. The scheduler reads `~/.fit/basecamp/scheduler.json` for task configs
|
|
190
|
-
2. For each due task, it invokes the `claude` CLI with `--print` mode
|
|
191
|
-
3. If a skill is set, its name is included in the prompt (Claude auto-discovers
|
|
192
|
-
the SKILL.md file)
|
|
193
|
-
4. The claude CLI runs with `cwd` set to the target KB directory
|
|
194
|
-
5. Claude reads the KB's `CLAUDE.md` for context, executes the task, and writes
|
|
195
|
-
results
|
|
196
|
-
6. State (last run times, status) is tracked in `~/.fit/basecamp/state.json`
|
|
180
|
+
When running from source, use `deno run --allow-all src/basecamp.js` or
|
|
181
|
+
`just run` instead of `fit-basecamp`.
|
|
197
182
|
|
|
198
183
|
## Skills
|
|
199
184
|
|
|
@@ -215,8 +200,8 @@ ships with these skills:
|
|
|
215
200
|
## Requirements
|
|
216
201
|
|
|
217
202
|
- Claude CLI (`claude`) installed and authenticated
|
|
218
|
-
- macOS (
|
|
219
|
-
-
|
|
203
|
+
- macOS 13+ (Ventura or later)
|
|
204
|
+
- Xcode Command Line Tools (for building the Swift launcher)
|
|
220
205
|
- Deno >= 2.x (for building the standalone binary)
|
|
221
206
|
|
|
222
207
|
## License
|
package/config/scheduler.json
CHANGED
|
@@ -1,28 +1,24 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
3
|
-
"
|
|
2
|
+
"agents": {
|
|
3
|
+
"postman": {
|
|
4
4
|
"kb": "~/Documents/Personal",
|
|
5
5
|
"schedule": { "type": "interval", "minutes": 5 },
|
|
6
|
-
"enabled": true
|
|
7
|
-
"agent": null,
|
|
8
|
-
"skill": "sync-apple-mail",
|
|
9
|
-
"prompt": "Sync Apple Mail. Only process new threads since last sync."
|
|
6
|
+
"enabled": true
|
|
10
7
|
},
|
|
11
|
-
"
|
|
8
|
+
"concierge": {
|
|
12
9
|
"kb": "~/Documents/Personal",
|
|
13
|
-
"schedule": { "type": "interval", "minutes":
|
|
14
|
-
"enabled": true
|
|
15
|
-
"agent": null,
|
|
16
|
-
"skill": "sync-apple-calendar",
|
|
17
|
-
"prompt": "Sync Apple Calendar events. Export events from the past 14 days and next 14 days."
|
|
10
|
+
"schedule": { "type": "interval", "minutes": 10 },
|
|
11
|
+
"enabled": true
|
|
18
12
|
},
|
|
19
|
-
"
|
|
13
|
+
"librarian": {
|
|
20
14
|
"kb": "~/Documents/Personal",
|
|
21
15
|
"schedule": { "type": "interval", "minutes": 15 },
|
|
22
|
-
"enabled": true
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
"
|
|
16
|
+
"enabled": true
|
|
17
|
+
},
|
|
18
|
+
"chief-of-staff": {
|
|
19
|
+
"kb": "~/Documents/Personal",
|
|
20
|
+
"schedule": { "type": "cron", "expression": "0 7,18 * * *" },
|
|
21
|
+
"enabled": true
|
|
26
22
|
}
|
|
27
23
|
}
|
|
28
24
|
}
|
package/package.json
CHANGED
|
@@ -1,30 +1,28 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forwardimpact/basecamp",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Claude Code-native personal knowledge system with
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"description": "Claude Code-native personal knowledge system with autonomous agents",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
8
8
|
"url": "https://github.com/forwardimpact/monorepo",
|
|
9
|
-
"directory": "
|
|
9
|
+
"directory": "products/basecamp"
|
|
10
10
|
},
|
|
11
11
|
"homepage": "https://www.forwardimpact.team/basecamp",
|
|
12
12
|
"type": "module",
|
|
13
|
-
"main": "basecamp.js",
|
|
13
|
+
"main": "src/basecamp.js",
|
|
14
14
|
"bin": {
|
|
15
|
-
"fit-basecamp": "./basecamp.js"
|
|
15
|
+
"fit-basecamp": "./src/basecamp.js"
|
|
16
16
|
},
|
|
17
17
|
"scripts": {
|
|
18
|
-
"start": "node basecamp.js",
|
|
19
|
-
"status": "node basecamp.js --status",
|
|
20
|
-
"build": "deno run --allow-all build.js",
|
|
21
|
-
"build:
|
|
22
|
-
"build:
|
|
23
|
-
"init": "./scripts/init.sh"
|
|
18
|
+
"start": "node src/basecamp.js",
|
|
19
|
+
"status": "node src/basecamp.js --status",
|
|
20
|
+
"build": "deno run --allow-all pkg/build.js",
|
|
21
|
+
"build:app": "deno run --allow-all pkg/build.js --app",
|
|
22
|
+
"build:pkg": "deno run --allow-all pkg/build.js --pkg"
|
|
24
23
|
},
|
|
25
24
|
"files": [
|
|
26
|
-
"basecamp.js",
|
|
27
|
-
"build.js",
|
|
25
|
+
"src/basecamp.js",
|
|
28
26
|
"config/",
|
|
29
27
|
"template/"
|
|
30
28
|
],
|