@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 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. 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
- cd apps/basecamp
57
- ./scripts/init.sh
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 standalone executable (current architecture)
72
- npm run build # or: deno task build
85
+ # Build scheduler + launcher binaries
86
+ just build
73
87
 
74
- # Build executable + macOS installer package (.pkg)
75
- npm run build:pkg # or: deno task build:pkg
88
+ # Build + assemble Basecamp.app
89
+ just build-app
76
90
 
77
- # Build for both arm64 and x86_64 + packages
78
- npm run build:all # or: deno task build:all
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-aarch64-apple-darwin # arm64 binary
86
- ├── basecamp-x86_64-apple-darwin # x86_64 binary
87
- ├── basecamp-1.0.0-arm64.pkg # arm64 installer package
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
- npx fit-basecamp --init ~/Documents/Team
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 `node basecamp.js` or `npx fit-basecamp` instead
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 (for Apple Mail/Calendar sync)
219
- - 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)
220
205
  - Deno >= 2.x (for building the standalone binary)
221
206
 
222
207
  ## License
@@ -1,28 +1,24 @@
1
1
  {
2
- "tasks": {
3
- "sync-apple-mail": {
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
- "sync-apple-calendar": {
8
+ "concierge": {
12
9
  "kb": "~/Documents/Personal",
13
- "schedule": { "type": "interval", "minutes": 5 },
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
- "extract-entities": {
13
+ "librarian": {
20
14
  "kb": "~/Documents/Personal",
21
15
  "schedule": { "type": "interval", "minutes": 15 },
22
- "enabled": true,
23
- "agent": null,
24
- "skill": "extract-entities",
25
- "prompt": "Process any new synced data (emails and calendar events) into knowledge graph notes."
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.3.0",
4
- "description": "Claude Code-native personal knowledge system with scheduled tasks",
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": "apps/basecamp"
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:pkg": "deno run --allow-all build.js --pkg",
22
- "build:all": "deno run --allow-all build.js --all",
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
  ],