@forwardimpact/basecamp 0.2.0 → 1.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 +69 -89
- package/package.json +9 -14
- package/{basecamp.js → src/basecamp.js} +153 -204
- 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 +60 -14
- package/build.js +0 -122
- package/scripts/build-pkg.sh +0 -115
- package/scripts/compile.sh +0 -25
- package/scripts/install.sh +0 -108
- package/scripts/pkg-resources/conclusion.html +0 -62
- package/scripts/pkg-resources/welcome.html +0 -64
- package/scripts/postinstall +0 -84
- package/scripts/uninstall.sh +0 -73
package/README.md
CHANGED
|
@@ -1,100 +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
68
|
cd apps/basecamp
|
|
57
|
-
./scripts/install.sh
|
|
58
69
|
|
|
59
|
-
#
|
|
60
|
-
|
|
70
|
+
# Run the scheduler in dev mode
|
|
71
|
+
just daemon
|
|
61
72
|
|
|
62
|
-
#
|
|
63
|
-
|
|
73
|
+
# Or initialize a new KB
|
|
74
|
+
just init ~/Documents/Personal
|
|
64
75
|
|
|
65
|
-
#
|
|
66
|
-
|
|
76
|
+
# Configure your identity
|
|
77
|
+
vi ~/Documents/Personal/USER.md
|
|
67
78
|
```
|
|
68
79
|
|
|
69
80
|
## Building
|
|
70
81
|
|
|
71
|
-
Requires [Deno](https://deno.com) >= 2.x.
|
|
82
|
+
Requires [Deno](https://deno.com) >= 2.x and Xcode Command Line Tools.
|
|
72
83
|
|
|
73
84
|
```bash
|
|
74
|
-
# Build
|
|
75
|
-
|
|
85
|
+
# Build scheduler + launcher binaries
|
|
86
|
+
just build
|
|
87
|
+
|
|
88
|
+
# Build + assemble Basecamp.app
|
|
89
|
+
just build-app
|
|
76
90
|
|
|
77
|
-
# Build
|
|
78
|
-
|
|
91
|
+
# Build + assemble + .pkg installer
|
|
92
|
+
just pkg
|
|
79
93
|
|
|
80
|
-
#
|
|
81
|
-
npm run build
|
|
94
|
+
# Or via npm:
|
|
95
|
+
npm run build # binaries only
|
|
96
|
+
npm run build:app # + Basecamp.app
|
|
97
|
+
npm run build:pkg # + .pkg installer
|
|
82
98
|
```
|
|
83
99
|
|
|
84
100
|
Output goes to `dist/`:
|
|
85
101
|
|
|
86
102
|
```
|
|
87
103
|
dist/
|
|
88
|
-
├── basecamp
|
|
89
|
-
├──
|
|
90
|
-
|
|
91
|
-
└── 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
|
|
92
107
|
```
|
|
93
108
|
|
|
94
|
-
The compiled binary is fully self-contained — it embeds the `template/`
|
|
95
|
-
directory (CLAUDE.md, skills) so `basecamp --init <path>` works without any
|
|
96
|
-
source files present.
|
|
97
|
-
|
|
98
109
|
## Multiple Knowledge Bases
|
|
99
110
|
|
|
100
111
|
The scheduler can run tasks across multiple knowledge bases. Each KB is an
|
|
@@ -104,7 +115,7 @@ independent directory with its own CLAUDE.md, skills, and knowledge graph.
|
|
|
104
115
|
|
|
105
116
|
```bash
|
|
106
117
|
# Initialize a new knowledge base
|
|
107
|
-
|
|
118
|
+
deno run --allow-all src/basecamp.js --init ~/Documents/Team
|
|
108
119
|
|
|
109
120
|
# Edit the scheduler config to register it
|
|
110
121
|
vi ~/.fit/basecamp/scheduler.json
|
|
@@ -121,7 +132,6 @@ vi ~/.fit/basecamp/scheduler.json
|
|
|
121
132
|
"kb": "~/Documents/Personal",
|
|
122
133
|
"schedule": { "type": "interval", "minutes": 5 },
|
|
123
134
|
"enabled": true,
|
|
124
|
-
"agent": null,
|
|
125
135
|
"skill": "sync-apple-mail",
|
|
126
136
|
"prompt": "Sync Apple Mail."
|
|
127
137
|
},
|
|
@@ -129,7 +139,6 @@ vi ~/.fit/basecamp/scheduler.json
|
|
|
129
139
|
"kb": "~/Documents/Team",
|
|
130
140
|
"schedule": { "type": "interval", "minutes": 10 },
|
|
131
141
|
"enabled": true,
|
|
132
|
-
"agent": null,
|
|
133
142
|
"skill": "sync-apple-calendar",
|
|
134
143
|
"prompt": "Sync Apple Calendar."
|
|
135
144
|
}
|
|
@@ -156,23 +165,6 @@ vi ~/.fit/basecamp/scheduler.json
|
|
|
156
165
|
{ "type": "once", "runAt": "2025-02-12T10:00:00Z" }
|
|
157
166
|
```
|
|
158
167
|
|
|
159
|
-
## Agents
|
|
160
|
-
|
|
161
|
-
Set the `agent` field on a task to use a specific Claude sub-agent. The value is
|
|
162
|
-
passed as `--agent <name>` to the `claude` CLI.
|
|
163
|
-
|
|
164
|
-
```json
|
|
165
|
-
{
|
|
166
|
-
"sync-personal-mail": {
|
|
167
|
-
"kb": "~/Documents/Personal",
|
|
168
|
-
"agent": "basecamp-sync",
|
|
169
|
-
"schedule": { "type": "interval", "minutes": 5 },
|
|
170
|
-
"skill": "sync-apple-mail",
|
|
171
|
-
"prompt": "Sync Apple Mail."
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
```
|
|
175
|
-
|
|
176
168
|
## CLI Reference
|
|
177
169
|
|
|
178
170
|
```
|
|
@@ -180,25 +172,13 @@ fit-basecamp Run due tasks once and exit
|
|
|
180
172
|
fit-basecamp --daemon Run continuously (poll every 60s)
|
|
181
173
|
fit-basecamp --run <task> Run a specific task immediately
|
|
182
174
|
fit-basecamp --init <path> Initialize a new knowledge base
|
|
183
|
-
fit-basecamp --install-launchd Install macOS LaunchAgent for auto-start
|
|
184
|
-
fit-basecamp --uninstall-launchd Remove macOS LaunchAgent
|
|
185
175
|
fit-basecamp --status Show knowledge bases and task status
|
|
176
|
+
fit-basecamp --validate Validate agents and skills exist
|
|
186
177
|
fit-basecamp --help Show this help
|
|
187
178
|
```
|
|
188
179
|
|
|
189
|
-
When running from source, use `
|
|
190
|
-
of `fit-basecamp`.
|
|
191
|
-
|
|
192
|
-
## How It Works
|
|
193
|
-
|
|
194
|
-
1. The scheduler reads `~/.fit/basecamp/scheduler.json` for task configs
|
|
195
|
-
2. For each due task, it invokes the `claude` CLI with `--print` mode
|
|
196
|
-
3. If a skill is set, its name is included in the prompt (Claude auto-discovers
|
|
197
|
-
the SKILL.md file)
|
|
198
|
-
4. The claude CLI runs with `cwd` set to the target KB directory
|
|
199
|
-
5. Claude reads the KB's `CLAUDE.md` for context, executes the task, and writes
|
|
200
|
-
results
|
|
201
|
-
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`.
|
|
202
182
|
|
|
203
183
|
## Skills
|
|
204
184
|
|
|
@@ -220,8 +200,8 @@ ships with these skills:
|
|
|
220
200
|
## Requirements
|
|
221
201
|
|
|
222
202
|
- Claude CLI (`claude`) installed and authenticated
|
|
223
|
-
- macOS (
|
|
224
|
-
-
|
|
203
|
+
- macOS 13+ (Ventura or later)
|
|
204
|
+
- Xcode Command Line Tools (for building the Swift launcher)
|
|
225
205
|
- Deno >= 2.x (for building the standalone binary)
|
|
226
206
|
|
|
227
207
|
## License
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forwardimpact/basecamp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "Claude Code-native personal knowledge system with scheduled tasks",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -10,25 +10,20 @@
|
|
|
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
|
-
"install:basecamp": "./scripts/install.sh",
|
|
24
|
-
"scheduler:install": "node basecamp.js --install-launchd",
|
|
25
|
-
"scheduler:uninstall": "node basecamp.js --uninstall-launchd"
|
|
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"
|
|
26
23
|
},
|
|
27
24
|
"files": [
|
|
28
|
-
"basecamp.js",
|
|
29
|
-
"build.js",
|
|
25
|
+
"src/basecamp.js",
|
|
30
26
|
"config/",
|
|
31
|
-
"scripts/",
|
|
32
27
|
"template/"
|
|
33
28
|
],
|
|
34
29
|
"engines": {
|