@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 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. Compiles to a
5
- standalone executable via Deno.
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
- ~/.fit/basecamp/ # Scheduler home (central config)
13
- ├── scheduler.json # Task definitions
14
- ├── state.json # Task run state
15
- └── logs/ # Scheduler logs
16
-
17
- ~/Documents/Personal/ # Default personal knowledge base
18
- ├── CLAUDE.md # Claude Code instructions for this KB
19
- ├── knowledge/ # The knowledge graph (Obsidian-compatible)
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/ # Claude Code skill files (auto-discovered)
25
- └── drafts/ # Email 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
- The scheduler is the only real code — a single JavaScript file. Everything else
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
- ## Install from Package
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 easiest way to install is from the pre-built macOS installer package:
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
- 1. Double-click `basecamp-1.0.0-arm64.pkg` (or `basecamp-1.0.0-x86_64.pkg`)
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 the `basecamp` binary in `/usr/local/bin/`, initializes
48
- `~/Documents/Personal/` as the default knowledge base, and installs a
49
- LaunchAgent so the scheduler runs automatically on login.
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 `/usr/local/share/basecamp/uninstall.sh`.
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
- # Configure your identity
60
- vi ~/Documents/Personal/USER.md
70
+ # Run the scheduler in dev mode
71
+ just daemon
61
72
 
62
- # Start the daemon
63
- npx fit-basecamp --install-launchd
73
+ # Or initialize a new KB
74
+ just init ~/Documents/Personal
64
75
 
65
- # Open your KB interactively
66
- cd ~/Documents/Personal && claude
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 standalone executable (current architecture)
75
- npm run build # or: deno task build
85
+ # Build scheduler + launcher binaries
86
+ just build
87
+
88
+ # Build + assemble Basecamp.app
89
+ just build-app
76
90
 
77
- # Build executable + macOS installer package (.pkg)
78
- npm run build:pkg # or: deno task build:pkg
91
+ # Build + assemble + .pkg installer
92
+ just pkg
79
93
 
80
- # Build for both arm64 and x86_64 + packages
81
- npm run build:all # or: deno task build:all
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-aarch64-apple-darwin # arm64 binary
89
- ├── basecamp-x86_64-apple-darwin # x86_64 binary
90
- ├── basecamp-1.0.0-arm64.pkg # arm64 installer package
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
- npx fit-basecamp --init ~/Documents/Team
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 `node basecamp.js` or `npx fit-basecamp` instead
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 (for Apple Mail/Calendar sync and launchd)
224
- - Node.js >= 18 (for running from source) or the standalone binary
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.2.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:pkg": "deno run --allow-all build.js --pkg",
22
- "build:all": "deno run --allow-all build.js --all",
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": {