holistic 0.2.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/CHANGELOG.md +13 -0
- package/CONTRIBUTING.md +121 -0
- package/LICENSE +21 -0
- package/README.md +329 -0
- package/bin/holistic +17 -0
- package/bin/holistic.cmd +23 -0
- package/bin/holistic.js +59 -0
- package/dist/__tests__/mcp-notification.test.d.ts +5 -0
- package/dist/__tests__/mcp-notification.test.d.ts.map +1 -0
- package/dist/__tests__/mcp-notification.test.js +255 -0
- package/dist/__tests__/mcp-notification.test.js.map +1 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +637 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/docs.d.ts +3 -0
- package/dist/core/docs.d.ts.map +1 -0
- package/dist/core/docs.js +602 -0
- package/dist/core/docs.js.map +1 -0
- package/dist/core/git-hooks.d.ts +17 -0
- package/dist/core/git-hooks.d.ts.map +1 -0
- package/dist/core/git-hooks.js +144 -0
- package/dist/core/git-hooks.js.map +1 -0
- package/dist/core/git.d.ts +12 -0
- package/dist/core/git.d.ts.map +1 -0
- package/dist/core/git.js +121 -0
- package/dist/core/git.js.map +1 -0
- package/dist/core/lock.d.ts +2 -0
- package/dist/core/lock.d.ts.map +1 -0
- package/dist/core/lock.js +40 -0
- package/dist/core/lock.js.map +1 -0
- package/dist/core/redact.d.ts +3 -0
- package/dist/core/redact.d.ts.map +1 -0
- package/dist/core/redact.js +13 -0
- package/dist/core/redact.js.map +1 -0
- package/dist/core/setup.d.ts +35 -0
- package/dist/core/setup.d.ts.map +1 -0
- package/dist/core/setup.js +654 -0
- package/dist/core/setup.js.map +1 -0
- package/dist/core/splash.d.ts +9 -0
- package/dist/core/splash.d.ts.map +1 -0
- package/dist/core/splash.js +35 -0
- package/dist/core/splash.js.map +1 -0
- package/dist/core/state.d.ts +42 -0
- package/dist/core/state.d.ts.map +1 -0
- package/dist/core/state.js +744 -0
- package/dist/core/state.js.map +1 -0
- package/dist/core/sync.d.ts +12 -0
- package/dist/core/sync.d.ts.map +1 -0
- package/dist/core/sync.js +106 -0
- package/dist/core/sync.js.map +1 -0
- package/dist/core/types.d.ts +210 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/daemon.d.ts +7 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +242 -0
- package/dist/daemon.js.map +1 -0
- package/dist/mcp-server.d.ts +11 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +266 -0
- package/dist/mcp-server.js.map +1 -0
- package/docs/handoff-walkthrough.md +119 -0
- package/docs/structured-metadata.md +341 -0
- package/package.json +67 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.2.0 - 2026-03-21
|
|
4
|
+
|
|
5
|
+
First public npm-ready release of Holistic.
|
|
6
|
+
|
|
7
|
+
- Added a one-step `holistic bootstrap` flow for repo setup plus optional local machine integration.
|
|
8
|
+
- Added thin MCP server support with `holistic serve`.
|
|
9
|
+
- Added `holistic status` and `holistic diff`.
|
|
10
|
+
- Added portable hook installation plus self-healing Holistic-managed hook refresh.
|
|
11
|
+
- Added hidden-ref portable state sync via `refs/holistic/state` to avoid GitHub branch noise.
|
|
12
|
+
- Added managed `.gitattributes` generation for portable Holistic files.
|
|
13
|
+
- Added packaging and install smoke validation for clean-repo bootstrap.
|
package/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# Contributing to Holistic
|
|
2
|
+
|
|
3
|
+
Holistic is trying to solve a very specific pain: project work gets fragmented across agents, apps, devices, and half-finished sessions. Contributions are most helpful when they make handoffs clearer, memory more durable, or regressions harder to repeat.
|
|
4
|
+
|
|
5
|
+
## What we care about
|
|
6
|
+
|
|
7
|
+
- preserving project context across agent switches
|
|
8
|
+
- reducing repeated regressions
|
|
9
|
+
- making setup simple enough that people will actually use it
|
|
10
|
+
- keeping the repo-first model portable across tools and devices
|
|
11
|
+
- making long-term project history useful, not noisy
|
|
12
|
+
|
|
13
|
+
## Local development
|
|
14
|
+
|
|
15
|
+
Requirements:
|
|
16
|
+
|
|
17
|
+
- Node.js 24+
|
|
18
|
+
- Git
|
|
19
|
+
|
|
20
|
+
Install and verify:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npm install
|
|
24
|
+
node --version
|
|
25
|
+
npm test
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Project structure
|
|
29
|
+
|
|
30
|
+
| Path | Purpose |
|
|
31
|
+
| --- | --- |
|
|
32
|
+
| `src/cli.ts` | public CLI entrypoint |
|
|
33
|
+
| `src/daemon.ts` | passive background capture |
|
|
34
|
+
| `src/core/state.ts` | canonical state model and session lifecycle |
|
|
35
|
+
| `src/core/docs.ts` | generated repo-visible memory docs |
|
|
36
|
+
| `src/core/setup.ts` | repo init and system helper generation |
|
|
37
|
+
| `tests/run-tests.ts` | end-to-end regression harness |
|
|
38
|
+
| `.holistic-local/` | ignored local Holistic runtime for this public product repo |
|
|
39
|
+
|
|
40
|
+
## Dogfooding Holistic in this repo
|
|
41
|
+
|
|
42
|
+
This public product repo is a special case.
|
|
43
|
+
|
|
44
|
+
Holistic dogfooding here must stay local-only and untracked. The repo-level override redirects runtime state into `.holistic-local/`, `HOLISTIC.local.md`, and `AGENTS.local.md` instead of tracked public runtime files.
|
|
45
|
+
|
|
46
|
+
Recommended local setup for working on Holistic itself:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
node --experimental-strip-types src/cli.ts bootstrap --install-daemon false --configure-mcp false --install-hooks false
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Common local flows:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
node --experimental-strip-types src/cli.ts resume --agent codex
|
|
56
|
+
node --experimental-strip-types src/cli.ts checkpoint --reason "milestone"
|
|
57
|
+
node --experimental-strip-types src/cli.ts handoff
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Do not initialize tracked `.holistic/` runtime state in this repo, and do not use a visible `holistic/state` branch here for self-dogfooding.
|
|
61
|
+
|
|
62
|
+
For normal user repos, tracked `.holistic/` runtime plus the hidden portable state ref (`refs/holistic/state`) is the standard path. This product repo itself should stay public, clean, and main-only.
|
|
63
|
+
|
|
64
|
+
## Contribution guidelines
|
|
65
|
+
|
|
66
|
+
### 1. Prefer repo-first solutions
|
|
67
|
+
|
|
68
|
+
If a feature only works on one machine or in one app, it is probably not enough on its own. Holistic should degrade gracefully to repo-visible memory.
|
|
69
|
+
|
|
70
|
+
### 2. Preserve long-term memory
|
|
71
|
+
|
|
72
|
+
New features should help answer:
|
|
73
|
+
|
|
74
|
+
- what changed
|
|
75
|
+
- why it changed
|
|
76
|
+
- what impact it had
|
|
77
|
+
- what should not regress later
|
|
78
|
+
|
|
79
|
+
### 3. Avoid transcript bloat
|
|
80
|
+
|
|
81
|
+
Holistic should preserve durable, useful state. It should not turn into a raw log dump of every prompt and response.
|
|
82
|
+
|
|
83
|
+
### 4. Protect user trust
|
|
84
|
+
|
|
85
|
+
- redact secrets
|
|
86
|
+
- do not commit sensitive local state by accident
|
|
87
|
+
- make automated behavior legible and reviewable
|
|
88
|
+
|
|
89
|
+
### 5. Test behavior, not just helpers
|
|
90
|
+
|
|
91
|
+
When possible, add tests around the user-visible workflow:
|
|
92
|
+
|
|
93
|
+
- resume
|
|
94
|
+
- checkpoint
|
|
95
|
+
- handoff
|
|
96
|
+
- carryover to a new session
|
|
97
|
+
- regression preservation
|
|
98
|
+
- cross-device sync behavior
|
|
99
|
+
|
|
100
|
+
## Pull request checklist
|
|
101
|
+
|
|
102
|
+
Before opening a PR:
|
|
103
|
+
|
|
104
|
+
- run `npm test`
|
|
105
|
+
- run `npm run build`
|
|
106
|
+
- verify the README and docs still match the behavior
|
|
107
|
+
- think through whether your change improves or harms cross-agent portability
|
|
108
|
+
- call out any new risks around regression memory, secrecy, or sync
|
|
109
|
+
|
|
110
|
+
## Good areas for contributions
|
|
111
|
+
|
|
112
|
+
- stronger regression tracking
|
|
113
|
+
- better cross-device sync ergonomics
|
|
114
|
+
- richer handoff review flows
|
|
115
|
+
- app-specific integrations that still honor the repo-first contract
|
|
116
|
+
- clearer history summarization
|
|
117
|
+
- safer passive capture
|
|
118
|
+
|
|
119
|
+
## Design principle
|
|
120
|
+
|
|
121
|
+
Holistic should help the next agent act like they were there the whole time.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Lisa
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
# Holistic
|
|
2
|
+
|
|
3
|
+
```
|
|
4
|
+
██╗ ██╗ ██████╗ ██╗ ██╗███████╗████████╗██╗ ██████╗
|
|
5
|
+
██║ ██║██╔═══██╗██║ ██║██╔════╝╚══██╔══╝██║██╔════╝
|
|
6
|
+
███████║██║ ██║██║ ██║███████╗ ██║ ██║██║
|
|
7
|
+
██╔══██║██║ ██║██║ ██║╚════██║ ██║ ██║██║
|
|
8
|
+
██║ ██║╚██████╔╝███████╗██║███████║ ██║ ██║╚██████╗
|
|
9
|
+
╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝╚══════╝ ╚═╝ ╚═╝ ╚═════╝
|
|
10
|
+
|
|
11
|
+
Your repo remembers, so your next agent doesn't have to guess.
|
|
12
|
+
Shared memory for AI agents, built into your repo.
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
### One command. Every agent. Zero re-explaining.
|
|
16
|
+
|
|
17
|
+
Holistic gives your AI agents shared memory inside the repo itself. When you switch from Claude to Codex to Gemini, the next agent can see what happened last time, what not to break, and what should happen next.
|
|
18
|
+
|
|
19
|
+
## Public repo hygiene
|
|
20
|
+
|
|
21
|
+
The Holistic product repo is a special case when it dogfoods itself.
|
|
22
|
+
|
|
23
|
+
Normal user repos may commit portable Holistic runtime files and sync them through a dedicated portable git ref. This public repo should not ship a contributor's personal session history, handoff state, or live dogfooding runtime files. Self-dogfooding on this repo is redirected to ignored local files instead.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## The problem
|
|
28
|
+
|
|
29
|
+
If you use more than one AI coding assistant, the workflow usually falls apart:
|
|
30
|
+
|
|
31
|
+
- You re-explain the project every session.
|
|
32
|
+
- Bugs come back because the next agent does not know what was already fixed.
|
|
33
|
+
- Progress gets lost when context windows end.
|
|
34
|
+
- Agents undo each other because there is no durable handoff.
|
|
35
|
+
- It is hard to tell what is actually done.
|
|
36
|
+
|
|
37
|
+
Holistic fixes that by making the repo the source of truth.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## What it feels like now
|
|
42
|
+
|
|
43
|
+
Run one setup command on a machine:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
holistic bootstrap
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Then daily use is mostly:
|
|
50
|
+
|
|
51
|
+
1. Open the repo in Codex, Claude, or another supported app.
|
|
52
|
+
2. Start a fresh session.
|
|
53
|
+
3. Ask the agent to read `AGENTS.md` and `HOLISTIC.md`.
|
|
54
|
+
4. Let Holistic carry continuity through checkpoints, handoffs, and repo memory.
|
|
55
|
+
|
|
56
|
+
Most days, you do not need to run `npm start`, keep a terminal process open, or manually re-brief the agent.
|
|
57
|
+
|
|
58
|
+
`holistic bootstrap` is a machine setup command, not just a repo setup command. By default it can install local startup helpers and configure Claude Desktop MCP on that machine.
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## How it works
|
|
63
|
+
|
|
64
|
+
```text
|
|
65
|
+
holistic bootstrap
|
|
66
|
+
->
|
|
67
|
+
You open a repo in your agent app
|
|
68
|
+
->
|
|
69
|
+
The agent reads HOLISTIC.md and AGENTS.md
|
|
70
|
+
->
|
|
71
|
+
"Here's where we left off. Here's what's next. Continue as planned, tweak the plan, or start something new?"
|
|
72
|
+
->
|
|
73
|
+
Work happens
|
|
74
|
+
->
|
|
75
|
+
Holistic checkpoints and handoffs keep repo memory current
|
|
76
|
+
->
|
|
77
|
+
The next agent picks up without a long re-explanation
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Quick start
|
|
83
|
+
|
|
84
|
+
### Install
|
|
85
|
+
|
|
86
|
+
Requires Node.js 24+.
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
npm install -g holistic
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Then verify the CLI is available:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
holistic --help
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
For contributors or local source installs:
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
git clone https://github.com/lweiss01/holistic.git
|
|
102
|
+
cd holistic
|
|
103
|
+
npm install
|
|
104
|
+
npm run build
|
|
105
|
+
npm pack
|
|
106
|
+
npm install -g ./holistic-*.tgz
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
For local development without a packaged tarball:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
npm install
|
|
113
|
+
npm link
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Set up a repo
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
cd my-project
|
|
120
|
+
holistic bootstrap --remote origin
|
|
121
|
+
git add .gitattributes HOLISTIC.md AGENTS.md CLAUDE.md GEMINI.md HISTORY.md
|
|
122
|
+
git add .holistic/config.json .holistic/state.json
|
|
123
|
+
git add .holistic/context/
|
|
124
|
+
git commit -m "feat: add holistic"
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
By default, Holistic now syncs portable state through a hidden git ref (`refs/holistic/state`) to avoid GitHub branch noise.
|
|
128
|
+
|
|
129
|
+
Advanced overrides:
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
holistic bootstrap --state-ref refs/holistic/state
|
|
133
|
+
holistic bootstrap --state-branch holistic/state
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
If you want repo scaffolding without changing local desktop integrations or daemon startup on the current machine, use:
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
holistic bootstrap --install-daemon false --configure-mcp false
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
**What to commit:**
|
|
143
|
+
- `.gitattributes` - Holistic-managed line-ending rules for portable files
|
|
144
|
+
- `.holistic/config.json` - repo configuration
|
|
145
|
+
- `.holistic/state.json` - current session state
|
|
146
|
+
- `.holistic/context/` - generated docs (history, regression watch, adapters)
|
|
147
|
+
- `.holistic/sessions/` - session history files
|
|
148
|
+
|
|
149
|
+
**What NOT to commit:**
|
|
150
|
+
- `.holistic/system/*.sh` and `.holistic/system/*.ps1` - machine-local scripts with absolute paths (already in `.gitignore`)
|
|
151
|
+
|
|
152
|
+
The portable repo memory is meant to be committed and synced. Machine-local helper scripts are generated for each machine and stay local.
|
|
153
|
+
|
|
154
|
+
After that, open the repo in your agent app and use a startup prompt like:
|
|
155
|
+
|
|
156
|
+
```text
|
|
157
|
+
Before doing any other work, read AGENTS.md and HOLISTIC.md, recap the current state briefly, and ask me exactly one question: continue as planned, tweak the plan, or start something new.
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
That is enough for normal repo-first continuity.
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## Daily workflow
|
|
165
|
+
|
|
166
|
+
One-time machine setup:
|
|
167
|
+
|
|
168
|
+
- Run `holistic bootstrap`.
|
|
169
|
+
- By default it scaffolds repo files, installs hooks, sets up daemon startup, and configures supported integrations such as Claude Desktop MCP on the current machine.
|
|
170
|
+
- If you only want repo files and hooks, use `holistic bootstrap --install-daemon false --configure-mcp false`.
|
|
171
|
+
|
|
172
|
+
Normal use:
|
|
173
|
+
|
|
174
|
+
- Start a session in Codex, Claude, or another supported app.
|
|
175
|
+
- Let the agent read the repo instructions and current handoff state.
|
|
176
|
+
- Work normally.
|
|
177
|
+
- Use explicit CLI commands only when you want to inspect state manually or force a checkpoint or handoff yourself.
|
|
178
|
+
|
|
179
|
+
Useful manual commands:
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
holistic status
|
|
183
|
+
holistic checkpoint --reason "..."
|
|
184
|
+
holistic handoff
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## Regression protection
|
|
190
|
+
|
|
191
|
+
When an agent fixes something delicate, lock it in:
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
holistic checkpoint \
|
|
195
|
+
--fixed "login redirect loop" \
|
|
196
|
+
--fix-files "src/auth.ts" \
|
|
197
|
+
--fix-risk "changing redirect logic will re-introduce this"
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
Future agents will see that warning in the repo docs before they touch the risky area again.
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
## Works with multiple agent apps
|
|
205
|
+
|
|
206
|
+
Holistic is model-agnostic. It works through repo files first, and can also expose a thin MCP server where supported.
|
|
207
|
+
|
|
208
|
+
| App | Reads | Startup experience |
|
|
209
|
+
|---|---|---|
|
|
210
|
+
| Claude Desktop | `CLAUDE.md` and repo docs | automatic plus MCP support |
|
|
211
|
+
| Codex | `AGENTS.md` and repo docs | automatic |
|
|
212
|
+
| Gemini / Antigravity | `GEMINI.md` and repo docs | automatic |
|
|
213
|
+
| Other VS Code forks | `AGENTS.md` and repo docs | usually automatic |
|
|
214
|
+
| Web tools | repo docs pasted manually | manual |
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## What lives in your repo
|
|
219
|
+
|
|
220
|
+
```text
|
|
221
|
+
my-project/
|
|
222
|
+
|- HOLISTIC.md
|
|
223
|
+
|- AGENTS.md
|
|
224
|
+
|- CLAUDE.md
|
|
225
|
+
|- GEMINI.md
|
|
226
|
+
|- HISTORY.md
|
|
227
|
+
`- .holistic/
|
|
228
|
+
|- config.json
|
|
229
|
+
|- state.json
|
|
230
|
+
|- sessions/
|
|
231
|
+
`- context/
|
|
232
|
+
|- project-history.md
|
|
233
|
+
|- regression-watch.md
|
|
234
|
+
`- adapters/
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
The portable repo memory (config, state, context, sessions) is meant to be committed and synced. Machine-local helper scripts under `.holistic/system/` are generated for each machine and stay local (already in `.gitignore`).
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## Commands
|
|
242
|
+
|
|
243
|
+
| Command | What it does |
|
|
244
|
+
|---|---|
|
|
245
|
+
| `holistic init` | Base repo setup and scaffolding |
|
|
246
|
+
| `holistic bootstrap` | One-step machine setup for repo files, hooks, and by-default local daemon/MCP integration setup |
|
|
247
|
+
| `holistic start --agent <name>` | Opens a session and prints the ASCII banner plus recap |
|
|
248
|
+
| `holistic checkpoint --reason "..."` | Saves progress and context |
|
|
249
|
+
| `holistic handoff` | Ends a session with a handoff |
|
|
250
|
+
| `holistic status` | Shows the current state |
|
|
251
|
+
| `holistic diff --from <id> --to <id>` | Compares two sessions |
|
|
252
|
+
| `holistic serve` | Runs the thin MCP server and prints a startup banner to `stderr` |
|
|
253
|
+
| `holistic watch` | Foreground daemon mode for automatic checkpoints |
|
|
254
|
+
|
|
255
|
+
### Non-interactive handoff
|
|
256
|
+
|
|
257
|
+
```bash
|
|
258
|
+
holistic handoff \
|
|
259
|
+
--summary "Implemented OAuth flow and token storage" \
|
|
260
|
+
--next "Wire up the refresh token endpoint" \
|
|
261
|
+
--blocker "Need refresh token endpoint from backend team"
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## Architecture
|
|
267
|
+
|
|
268
|
+
Holistic is intentionally repo-first, not machine-first.
|
|
269
|
+
|
|
270
|
+
| Layer | Purpose | Portable? |
|
|
271
|
+
|---|---|---|
|
|
272
|
+
| Repo memory | Shared handoff, history, regression, and session state | Yes |
|
|
273
|
+
| State ref | Cross-device distribution of Holistic state via git | Yes |
|
|
274
|
+
| Local daemon | Passive capture on one machine | No |
|
|
275
|
+
|
|
276
|
+
That split is what makes Holistic work across tools and devices instead of only on one laptop.
|
|
277
|
+
|
|
278
|
+
### MCP server mode
|
|
279
|
+
|
|
280
|
+
Holistic can run as a thin MCP server for agent-native workflows:
|
|
281
|
+
|
|
282
|
+
```bash
|
|
283
|
+
holistic serve
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
In normal use, Claude Desktop can launch this automatically after `holistic bootstrap` configures the MCP entry. You usually only run it manually for debugging.
|
|
287
|
+
|
|
288
|
+
When you do run `holistic serve` manually in a terminal, Holistic prints its ASCII startup banner to `stderr` so you get visible confirmation without corrupting the MCP `stdout` transport.
|
|
289
|
+
|
|
290
|
+
```json
|
|
291
|
+
{
|
|
292
|
+
"mcpServers": {
|
|
293
|
+
"holistic": {
|
|
294
|
+
"command": "holistic",
|
|
295
|
+
"args": ["serve"],
|
|
296
|
+
"env": {
|
|
297
|
+
"HOLISTIC_REPO": "/path/to/your/project"
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
306
|
+
## Why this matters
|
|
307
|
+
|
|
308
|
+
If you are already using more than one AI coding assistant, you already have the continuity problem.
|
|
309
|
+
|
|
310
|
+
Holistic gives you:
|
|
311
|
+
|
|
312
|
+
- Less repeated explanation
|
|
313
|
+
- Fewer accidental regressions
|
|
314
|
+
- Clearer handoffs across apps and devices
|
|
315
|
+
- A durable record of what changed and why
|
|
316
|
+
- Agents that can get to work quickly
|
|
317
|
+
|
|
318
|
+
---
|
|
319
|
+
|
|
320
|
+
## Quick links
|
|
321
|
+
|
|
322
|
+
- [Walkthrough](./docs/handoff-walkthrough.md)
|
|
323
|
+
- [Changelog](./CHANGELOG.md)
|
|
324
|
+
- [Contributing](./CONTRIBUTING.md)
|
|
325
|
+
- [License](./LICENSE)
|
|
326
|
+
|
|
327
|
+
---
|
|
328
|
+
|
|
329
|
+
<p align="center"><em>Built for people who use more than one AI assistant and are tired of paying the context tax.</em></p>
|
package/bin/holistic
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env sh
|
|
2
|
+
SCRIPT_DIR="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)"
|
|
3
|
+
node --experimental-strip-types "$SCRIPT_DIR/../src/cli.ts" "$@"
|
|
4
|
+
status=$?
|
|
5
|
+
if [ "$status" -ne 0 ]; then
|
|
6
|
+
exit "$status"
|
|
7
|
+
fi
|
|
8
|
+
if [ "$1" = "handoff" ] && [ -f "$PWD/.holistic/context/pending-commit.txt" ]; then
|
|
9
|
+
message=$(head -n 1 "$PWD/.holistic/context/pending-commit.txt")
|
|
10
|
+
if [ -n "$message" ]; then
|
|
11
|
+
git add -- HOLISTIC.md AGENTS.md .holistic && git commit -m "$message"
|
|
12
|
+
if [ "$?" -eq 0 ] && [ -f "$PWD/.holistic/system/sync-state.sh" ]; then
|
|
13
|
+
/bin/sh "$PWD/.holistic/system/sync-state.sh" || true
|
|
14
|
+
node --experimental-strip-types "$SCRIPT_DIR/../src/cli.ts" internal-mark-commit --message "$message"
|
|
15
|
+
fi
|
|
16
|
+
fi
|
|
17
|
+
fi
|
package/bin/holistic.cmd
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
@echo off
|
|
2
|
+
setlocal
|
|
3
|
+
set SCRIPT_DIR=%~dp0
|
|
4
|
+
node --experimental-strip-types "%SCRIPT_DIR%..\src\cli.ts" %*
|
|
5
|
+
if errorlevel 1 exit /b %errorlevel%
|
|
6
|
+
if /I "%~1"=="handoff" (
|
|
7
|
+
set PENDING_FILE=%CD%\.holistic\context\pending-commit.txt
|
|
8
|
+
if exist "%PENDING_FILE%" (
|
|
9
|
+
set /p COMMIT_MSG=<"%PENDING_FILE%"
|
|
10
|
+
if defined COMMIT_MSG (
|
|
11
|
+
git add -- HOLISTIC.md AGENTS.md .holistic
|
|
12
|
+
if not errorlevel 1 (
|
|
13
|
+
git commit -m "%COMMIT_MSG%"
|
|
14
|
+
if not errorlevel 1 (
|
|
15
|
+
if exist "%CD%\.holistic\system\sync-state.ps1" (
|
|
16
|
+
powershell -NoProfile -ExecutionPolicy Bypass -File "%CD%\.holistic\system\sync-state.ps1"
|
|
17
|
+
)
|
|
18
|
+
node --experimental-strip-types "%SCRIPT_DIR%..\src\cli.ts" internal-mark-commit --message "%COMMIT_MSG%"
|
|
19
|
+
)
|
|
20
|
+
)
|
|
21
|
+
)
|
|
22
|
+
)
|
|
23
|
+
)
|
package/bin/holistic.js
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { spawnSync } from "node:child_process";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import fs from "node:fs";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
|
|
7
|
+
const currentFile = fileURLToPath(import.meta.url);
|
|
8
|
+
const repoRoot = path.resolve(path.dirname(currentFile), "..");
|
|
9
|
+
const cliPath = path.resolve(repoRoot, "dist/cli.js");
|
|
10
|
+
const args = process.argv.slice(2);
|
|
11
|
+
const result = spawnSync(process.execPath, [cliPath, ...args], {
|
|
12
|
+
stdio: "inherit",
|
|
13
|
+
cwd: process.cwd(),
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
if (result.status !== 0) {
|
|
17
|
+
process.exit(result.status ?? 1);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if (args[0] === "handoff") {
|
|
21
|
+
const pendingCommitPath = path.join(process.cwd(), ".holistic", "context", "pending-commit.txt");
|
|
22
|
+
if (fs.existsSync(pendingCommitPath)) {
|
|
23
|
+
const message = fs.readFileSync(pendingCommitPath, "utf8").split(/\r?\n/)[0]?.trim();
|
|
24
|
+
if (message) {
|
|
25
|
+
const addResult = spawnSync("git", ["add", "--", "HOLISTIC.md", "AGENTS.md", ".holistic"], {
|
|
26
|
+
stdio: "inherit",
|
|
27
|
+
cwd: process.cwd(),
|
|
28
|
+
});
|
|
29
|
+
if ((addResult.status ?? 1) === 0) {
|
|
30
|
+
const commitResult = spawnSync("git", ["commit", "-m", message], {
|
|
31
|
+
stdio: "inherit",
|
|
32
|
+
cwd: process.cwd(),
|
|
33
|
+
});
|
|
34
|
+
if ((commitResult.status ?? 1) === 0) {
|
|
35
|
+
const syncScript = path.join(process.cwd(), ".holistic", "system", process.platform === "win32" ? "sync-state.ps1" : "sync-state.sh");
|
|
36
|
+
if (fs.existsSync(syncScript)) {
|
|
37
|
+
if (process.platform === "win32") {
|
|
38
|
+
spawnSync("powershell", ["-NoProfile", "-ExecutionPolicy", "Bypass", "-File", syncScript], {
|
|
39
|
+
stdio: "inherit",
|
|
40
|
+
cwd: process.cwd(),
|
|
41
|
+
});
|
|
42
|
+
} else {
|
|
43
|
+
spawnSync("/bin/sh", [syncScript], {
|
|
44
|
+
stdio: "inherit",
|
|
45
|
+
cwd: process.cwd(),
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
spawnSync(process.execPath, [cliPath, "internal-mark-commit", "--message", message], {
|
|
50
|
+
stdio: "inherit",
|
|
51
|
+
cwd: process.cwd(),
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
process.exit(0);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-notification.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/mcp-notification.test.ts"],"names":[],"mappings":"AA4CA,eAAO,MAAM,KAAK;;;GAgOjB,CAAC"}
|