@bookedsolid/reagent 0.11.1 → 0.12.1
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 +122 -2
- package/dist/cli/commands/init/gateway-config.d.ts +10 -0
- package/dist/cli/commands/init/gateway-config.d.ts.map +1 -1
- package/dist/cli/commands/init/gateway-config.js +52 -0
- package/dist/cli/commands/init/gateway-config.js.map +1 -1
- package/dist/cli/commands/init/index.d.ts.map +1 -1
- package/dist/cli/commands/init/index.js +5 -1
- package/dist/cli/commands/init/index.js.map +1 -1
- package/dist/cli/commands/upgrade.d.ts +2 -0
- package/dist/cli/commands/upgrade.d.ts.map +1 -0
- package/dist/cli/commands/upgrade.js +102 -0
- package/dist/cli/commands/upgrade.js.map +1 -0
- package/dist/cli/index.js +7 -0
- package/dist/cli/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -48,8 +48,8 @@ Point your AI assistant's MCP configuration at the gateway:
|
|
|
48
48
|
{
|
|
49
49
|
"mcpServers": {
|
|
50
50
|
"reagent": {
|
|
51
|
-
"command": "
|
|
52
|
-
"args": ["serve"]
|
|
51
|
+
"command": "npx",
|
|
52
|
+
"args": ["-y", "@bookedsolid/reagent", "serve"]
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
55
|
}
|
|
@@ -78,12 +78,124 @@ npx @bookedsolid/reagent init --discord # configure Discord notifications
|
|
|
78
78
|
npx @bookedsolid/reagent init --dry-run
|
|
79
79
|
```
|
|
80
80
|
|
|
81
|
+
## Installing Reagent in Your Project
|
|
82
|
+
|
|
83
|
+
This section documents the end-to-end setup for a new project — including the nuances of MCP transport, token passing, and env var expansion that aren't obvious from first principles.
|
|
84
|
+
|
|
85
|
+
### Step 1 — Run `reagent init`
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
cd /path/to/your-project
|
|
89
|
+
npx @bookedsolid/reagent init --profile bst-internal
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
This installs hooks, policy, agent team, gateway config template, and Claude settings. It also writes a managed block into `CLAUDE.md` with agent behavioral rules.
|
|
93
|
+
|
|
94
|
+
To pick up an updated hook suite after a reagent version bump:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
npx @bookedsolid/reagent upgrade
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
`upgrade` re-syncs hooks that are already installed and bumps `installed_by` in `policy.yaml`. It never adds new hooks without consent.
|
|
101
|
+
|
|
102
|
+
### Step 2 — Configure `.mcp.json`
|
|
103
|
+
|
|
104
|
+
**Use stdio transport — not HTTP.** Claude Code's HTTP MCP transport requires OAuth 2.1, which the reagent server does not implement. The stdio transport is what works:
|
|
105
|
+
|
|
106
|
+
```json
|
|
107
|
+
{
|
|
108
|
+
"mcpServers": {
|
|
109
|
+
"reagent": {
|
|
110
|
+
"command": "npx",
|
|
111
|
+
"args": ["-y", "@bookedsolid/reagent", "serve"]
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
> **Why `npx` instead of `reagent`?** Using the bare `reagent` command requires a global install. `npx` works from any project, always uses the registry version, and avoids "command not found" errors on machines where reagent isn't globally installed.
|
|
118
|
+
|
|
119
|
+
> **Env vars in `.mcp.json`:** Claude Code does **not** expand `${VAR}` syntax in `.mcp.json` env values — the literal string `${MY_TOKEN}` is passed to the process, not the value. If reagent needs tokens to pass to downstream MCP servers (e.g., Discord bots), use the gateway proxy pattern instead (see Step 3). The gateway **does** expand `${VAR}` from the shell environment at startup.
|
|
120
|
+
|
|
121
|
+
If you need to pass env vars to `reagent serve` itself (e.g., tokens used by native tools like `discord_notify`), set them in your shell environment rather than in `.mcp.json`:
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
# In your shell profile or .env (never committed):
|
|
125
|
+
export BOOKED_DISCORD_BOT_TOKEN="..."
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Step 3 — Configure downstream MCP servers (gateway proxy)
|
|
129
|
+
|
|
130
|
+
If your project uses other MCP servers that need secrets (API keys, bot tokens, etc.), proxy them through reagent's gateway rather than adding them directly to `.mcp.json`. This is the **only** way to pass env vars reliably from Claude Code.
|
|
131
|
+
|
|
132
|
+
Edit `.reagent/gateway.yaml`:
|
|
133
|
+
|
|
134
|
+
```yaml
|
|
135
|
+
version: '1'
|
|
136
|
+
|
|
137
|
+
servers:
|
|
138
|
+
discord-ops:
|
|
139
|
+
command: npx
|
|
140
|
+
args: ['-y', 'discord-ops@latest']
|
|
141
|
+
env:
|
|
142
|
+
BOOKED_DISCORD_BOT_TOKEN: '${BOOKED_DISCORD_BOT_TOKEN}'
|
|
143
|
+
CLARITY_DISCORD_BOT_TOKEN: '${CLARITY_DISCORD_BOT_TOKEN}'
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
The `${VAR}` syntax here is resolved by reagent from `process.env` at gateway startup — it works because reagent inherits the shell environment from Claude Code's process. The spawned child MCP server receives the resolved values.
|
|
147
|
+
|
|
148
|
+
Do **not** add the same server to both `gateway.yaml` and `.mcp.json` directly — `reagent init` warns about this. Direct `.mcp.json` entries with `${VAR}` env values will pass the literal string, not the token.
|
|
149
|
+
|
|
150
|
+
### Step 4 — Commit the config files
|
|
151
|
+
|
|
152
|
+
`reagent init` generates files in two categories:
|
|
153
|
+
|
|
154
|
+
| File | Commit? |
|
|
155
|
+
| ---------------------------- | --------------------------------------------------- |
|
|
156
|
+
| `.reagent/policy.yaml` | Yes — defines autonomy level for the team |
|
|
157
|
+
| `.reagent/gateway.yaml` | Yes — documents which MCP servers this project uses |
|
|
158
|
+
| `.claude/settings.json` | Yes — permission gates for Claude Code |
|
|
159
|
+
| `.claude/hooks/` | Yes — safety and quality hooks |
|
|
160
|
+
| `.claude/agents/` | Yes — agent team definitions |
|
|
161
|
+
| `CLAUDE.md` (managed block) | Yes — behavioral rules for AI agents |
|
|
162
|
+
| `.reagent/tasks.jsonl` | No — gitignored, local task store |
|
|
163
|
+
| `.reagent/audit/` | No — gitignored, local audit log |
|
|
164
|
+
| `.reagent/review-cache.json` | No — gitignored, local review cache |
|
|
165
|
+
|
|
166
|
+
### Upgrading an existing install
|
|
167
|
+
|
|
168
|
+
When a new version of reagent ships with updated hooks or agents:
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
npx @bookedsolid/reagent upgrade
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
This re-syncs all hooks in `.claude/hooks/` and `.husky/` that were installed by a previous `reagent init`. It will not add hooks that weren't installed originally.
|
|
175
|
+
|
|
176
|
+
### How `reagent serve` runs in Claude Code
|
|
177
|
+
|
|
178
|
+
When Claude Code reads `.mcp.json`, it spawns `npx -y @bookedsolid/reagent serve` as a child process. The MCP protocol runs over stdio between Claude Code and the reagent process. Reagent then spawns its own child processes for each entry in `gateway.yaml`, also over stdio.
|
|
179
|
+
|
|
180
|
+
The resulting process tree:
|
|
181
|
+
|
|
182
|
+
```
|
|
183
|
+
Claude Code
|
|
184
|
+
└── reagent serve (stdio MCP to Claude Code)
|
|
185
|
+
└── discord-ops (stdio MCP, proxied through reagent)
|
|
186
|
+
└── other-server (stdio MCP, proxied through reagent)
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
All tool calls from Claude Code go through reagent's middleware chain before reaching downstream servers.
|
|
190
|
+
|
|
81
191
|
## Commands
|
|
82
192
|
|
|
83
193
|
| Command | Description |
|
|
84
194
|
| ------------------------------- | ------------------------------------------------- |
|
|
85
195
|
| `reagent serve` | Start the MCP gateway server (stdio transport) |
|
|
196
|
+
| `reagent serve` | Start the MCP gateway server (stdio transport) |
|
|
86
197
|
| `reagent init` | Install reagent config into the current directory |
|
|
198
|
+
| `reagent upgrade` | Re-sync hooks and bump installed_by in policy |
|
|
87
199
|
| `reagent catalyze` | Analyze project stack and generate gap report |
|
|
88
200
|
| `reagent check` | Verify what reagent components are installed |
|
|
89
201
|
| `reagent freeze --reason "..."` | Create `.reagent/HALT` — suspends all tool calls |
|
|
@@ -107,6 +219,14 @@ npx @bookedsolid/reagent init --dry-run
|
|
|
107
219
|
| `--releases-channel <id>` | Discord channel for release events | — |
|
|
108
220
|
| `--dev-channel <id>` | Discord channel for dev activity | — |
|
|
109
221
|
|
|
222
|
+
### `reagent upgrade` Options
|
|
223
|
+
|
|
224
|
+
| Flag | Description | Default |
|
|
225
|
+
| ----------- | -------------------------------------------- | ------- |
|
|
226
|
+
| `--dry-run` | Preview what would be updated without writes | — |
|
|
227
|
+
|
|
228
|
+
Re-syncs hooks in `.claude/hooks/` and `.husky/` that were installed by a previous `reagent init`. Updates `installed_by` in `.reagent/policy.yaml`. Never adds hooks that weren't originally installed.
|
|
229
|
+
|
|
110
230
|
### `reagent catalyze` Options
|
|
111
231
|
|
|
112
232
|
| Flag | Description | Default |
|
|
@@ -1,3 +1,13 @@
|
|
|
1
1
|
import type { InstallResult } from './types.js';
|
|
2
2
|
export declare function installGatewayConfig(targetDir: string, dryRun: boolean): InstallResult[];
|
|
3
|
+
/**
|
|
4
|
+
* Check for duplicate MCP server entries between .mcp.json and gateway.yaml.
|
|
5
|
+
*
|
|
6
|
+
* When reagent proxies servers via gateway.yaml, having the same server also
|
|
7
|
+
* listed as a direct entry in .mcp.json causes duplicate tool registration,
|
|
8
|
+
* auth failures (Claude Code does not expand ${VAR} env syntax), and user
|
|
9
|
+
* confusion. This function prints a warning if any duplicates are found.
|
|
10
|
+
* It does not modify any files.
|
|
11
|
+
*/
|
|
12
|
+
export declare function checkMcpDuplicates(targetDir: string): void;
|
|
3
13
|
//# sourceMappingURL=gateway-config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway-config.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/gateway-config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"gateway-config.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/gateway-config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,aAAa,EAAE,CAiDxF;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CA6C1D"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
+
import { parse as parseYaml } from 'yaml';
|
|
3
4
|
import { getPkgVersion } from '../../utils.js';
|
|
4
5
|
export function installGatewayConfig(targetDir, dryRun) {
|
|
5
6
|
const PKG_VERSION = getPkgVersion();
|
|
@@ -48,4 +49,55 @@ servers: {}
|
|
|
48
49
|
}
|
|
49
50
|
return [{ file: '.reagent/gateway.yaml', status: 'installed' }];
|
|
50
51
|
}
|
|
52
|
+
/**
|
|
53
|
+
* Check for duplicate MCP server entries between .mcp.json and gateway.yaml.
|
|
54
|
+
*
|
|
55
|
+
* When reagent proxies servers via gateway.yaml, having the same server also
|
|
56
|
+
* listed as a direct entry in .mcp.json causes duplicate tool registration,
|
|
57
|
+
* auth failures (Claude Code does not expand ${VAR} env syntax), and user
|
|
58
|
+
* confusion. This function prints a warning if any duplicates are found.
|
|
59
|
+
* It does not modify any files.
|
|
60
|
+
*/
|
|
61
|
+
export function checkMcpDuplicates(targetDir) {
|
|
62
|
+
const mcpJsonPath = path.join(targetDir, '.mcp.json');
|
|
63
|
+
const gatewayPath = path.join(targetDir, '.reagent', 'gateway.yaml');
|
|
64
|
+
if (!fs.existsSync(mcpJsonPath) || !fs.existsSync(gatewayPath)) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
// Parse .mcp.json
|
|
68
|
+
let mcpServers = {};
|
|
69
|
+
try {
|
|
70
|
+
const raw = fs.readFileSync(mcpJsonPath, 'utf8');
|
|
71
|
+
const parsed = JSON.parse(raw);
|
|
72
|
+
mcpServers = parsed.mcpServers ?? {};
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// Unparseable .mcp.json — skip silently
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
// Parse gateway.yaml
|
|
79
|
+
let gatewayServers = {};
|
|
80
|
+
try {
|
|
81
|
+
const raw = fs.readFileSync(gatewayPath, 'utf8');
|
|
82
|
+
const parsed = parseYaml(raw);
|
|
83
|
+
gatewayServers = parsed.servers ?? {};
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// Unparseable gateway.yaml — skip silently
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const gatewayKeys = new Set(Object.keys(gatewayServers));
|
|
90
|
+
const duplicates = Object.keys(mcpServers).filter((key) => gatewayKeys.has(key));
|
|
91
|
+
if (duplicates.length === 0) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
console.log('');
|
|
95
|
+
console.log('Warning: .mcp.json has direct entries that are also in gateway.yaml:');
|
|
96
|
+
for (const name of duplicates) {
|
|
97
|
+
console.log(` - ${name} (will be proxied through reagent — remove the direct entry)`);
|
|
98
|
+
}
|
|
99
|
+
console.log('');
|
|
100
|
+
console.log('Direct entries with ${VAR} env syntax will not work in Claude Code.');
|
|
101
|
+
console.log('Remove duplicates from .mcp.json to avoid tool duplication and auth failures.');
|
|
102
|
+
}
|
|
51
103
|
//# sourceMappingURL=gateway-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway-config.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/gateway-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAG/C,MAAM,UAAU,oBAAoB,CAAC,SAAiB,EAAE,MAAe;IACrE,MAAM,WAAW,GAAG,aAAa,EAAE,CAAC;IACpC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACpD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IAE1D,kDAAkD;IAClD,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,gEAAgE,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgC9F,CAAC;QACE,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;AAClE,CAAC"}
|
|
1
|
+
{"version":3,"file":"gateway-config.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/gateway-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/index.ts"],"names":[],"mappings":"AAkBA,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/index.ts"],"names":[],"mappings":"AAkBA,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAiK5C"}
|
|
@@ -7,7 +7,7 @@ import { installHuskyHook } from './husky-hooks.js';
|
|
|
7
7
|
import { installClaudeHooks } from './claude-hooks.js';
|
|
8
8
|
import { installClaudeMd } from './claude-md.js';
|
|
9
9
|
import { installPolicy } from './policy.js';
|
|
10
|
-
import { installGatewayConfig } from './gateway-config.js';
|
|
10
|
+
import { installGatewayConfig, checkMcpDuplicates } from './gateway-config.js';
|
|
11
11
|
import { installAgents } from './agents.js';
|
|
12
12
|
import { installClaudeCommands } from './commands.js';
|
|
13
13
|
import { installPm } from './pm.js';
|
|
@@ -115,6 +115,10 @@ export function runInit(args) {
|
|
|
115
115
|
results.push(...installPolicy(targetDir, profileName, profile, dryRun));
|
|
116
116
|
// Step 9: Gateway config
|
|
117
117
|
results.push(...installGatewayConfig(targetDir, dryRun));
|
|
118
|
+
// Step 9a: Warn about duplicate MCP server entries (skip in dry-run — files may not exist)
|
|
119
|
+
if (!dryRun) {
|
|
120
|
+
checkMcpDuplicates(targetDir);
|
|
121
|
+
}
|
|
118
122
|
// Step 10: Agent team
|
|
119
123
|
results.push(...installAgents(targetDir, dryRun));
|
|
120
124
|
// Step 11: Claude commands
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhE,MAAM,UAAU,OAAO,CAAC,IAAc;IACpC,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,mBAAmB,CAAC;IACxE,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,aAAa,EAAE,CAAC;IAEpC,OAAO,CAAC,GAAG,CAAC,2BAA2B,WAAW,OAAO,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,cAAc,WAAW,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,cAAc,SAAS,EAAE,CAAC,CAAC;IACvC,IAAI,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,+BAA+B;IAC/B,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9C,OAAO,CAAC,KAAK,CACX,0BAA0B,WAAW,sDAAsD,CAC5F,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACpD,MAAM,YAAY,GAAG,gBAAgB,EAAE,CAAC;IACxC,MAAM,aAAa,GAAG,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAEzD,qEAAqE;IACrE,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,OAAO,GAAoB,EAAE,CAAC;QACpC,MAAM,aAAa,GAAG,cAAc,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QAEvC,iBAAiB;QACjB,IAAI,aAAa,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,iBAAiB,WAAW,yCAAyC,CAAC,CAAC;YACnF,KAAK,MAAM,IAAI,IAAI,aAAa,CAAC,cAAc,EAAE,CAAC;gBAChD,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YACtE,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAED,8BAA8B;QAC9B,IAAI,aAAa,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,2BAA2B,WAAW,IAAI,CAAC,CAAC;YACxD,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,eAAe,EAAE,CAAC;gBAClD,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC;YAC9B,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAED,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACrC,OAAO;IACT,CAAC;IAED,8DAA8D;IAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,WAAW,OAAO,CAAC,CAAC;IACrE,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACpD,OAAO,CAAC,KAAK,CAAC,0BAA0B,WAAW,6BAA6B,CAAC,CAAC;QAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,MAAM,aAAa,GAAG,EAAE;aACrB,WAAW,CAAC,WAAW,CAAC;aACxB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;aAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QACtC,OAAO,CAAC,KAAK,CAAC,sBAAsB,WAAW,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,KAAK,CAAC,4BAA4B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtE,OAAO,CAAC,KAAK,CAAC,4BAA4B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,OAAO,GAAkB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IAEhF,MAAM,OAAO,GAAoB,EAAE,CAAC;IAEpC,0FAA0F;IAC1F,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,6BAA6B;IAC7B,IAAI,OAAO,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,GAAG,uBAAuB,CAAC,SAAS,EAAE,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC;IACxF,CAAC;IAED,uBAAuB;IACvB,IAAI,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,SAAS,EAAE,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,wBAAwB;IACxB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,SAAS,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;IACtF,CAAC;IACD,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,SAAS,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;IACtF,CAAC;IACD,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;IAClF,CAAC;IAED,uBAAuB;IACvB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACxB,6EAA6E;QAC7E,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,EAAE,cAAc,IAAI,UAAU,CAAC;QACtE,OAAO,CAAC,yBAAyB,CAAC,GAAG,cAAc,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,SAAS,EAAE,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACvF,CAAC;IAED,oBAAoB;IACpB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,iBAAiB;IACjB,OAAO,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IAExE,yBAAyB;IACzB,OAAO,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IAEzD,2FAA2F;IAC3F,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAChC,CAAC;IAED,sBAAsB;IACtB,OAAO,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IAElD,2BAA2B;IAC3B,OAAO,CAAC,IAAI,CAAC,GAAG,qBAAqB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IAE1D,8BAA8B;IAC9B,OAAO,CAAC,IAAI,CACV,GAAG,SAAS,CACV,SAAS,EACT,OAAO,CAAC,EAEK,EACb,MAAM,CACP,CACF,CAAC;IAEF,2DAA2D;IAC3D,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,WAAW,GAAG,OAAO,OAAO,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9F,OAAO,CAAC,IAAI,CACV,GAAG,aAAa,CAAC;YACf,SAAS;YACT,WAAW;YACX,MAAM;SACP,CAAC,CACH,CAAC;IACJ,CAAC;IAED,6DAA6D;IAC7D,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,YAAY,CACnB,OAAwB,EACxB,MAAe,EACf,sBAA+B;IAE/B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IAE1D,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC1B,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACxB,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACzB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QACzC,IAAI,sBAAsB,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CACT,iKAAiK,CAClK,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/upgrade.ts"],"names":[],"mappings":"AAaA,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA0E/C"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { PKG_ROOT, getPkgVersion } from '../utils.js';
|
|
4
|
+
import { installHuskyHook } from './init/husky-hooks.js';
|
|
5
|
+
// All hook names managed by reagent, mapped to their source file names
|
|
6
|
+
const HOOK_MAP = [
|
|
7
|
+
{ hookName: 'commit-msg', srcFileName: 'commit-msg.sh' },
|
|
8
|
+
{ hookName: 'pre-commit', srcFileName: 'pre-commit.sh' },
|
|
9
|
+
{ hookName: 'pre-push', srcFileName: 'pre-push.sh' },
|
|
10
|
+
];
|
|
11
|
+
export function runUpgrade(args) {
|
|
12
|
+
const targetDir = process.cwd();
|
|
13
|
+
const dryRun = args.includes('--dry-run');
|
|
14
|
+
const PKG_VERSION = getPkgVersion();
|
|
15
|
+
console.log(`\n@bookedsolid/reagent v${PKG_VERSION} upgrade`);
|
|
16
|
+
console.log(` Target: ${targetDir}`);
|
|
17
|
+
if (dryRun)
|
|
18
|
+
console.log(` Mode: dry-run (no changes written)`);
|
|
19
|
+
console.log('');
|
|
20
|
+
const results = [];
|
|
21
|
+
// Step 1: Re-sync husky hooks present in the project's .husky/ directory.
|
|
22
|
+
// We only overwrite hooks that reagent manages AND that already exist in the
|
|
23
|
+
// project — we never add new hooks that the user didn't opt into via init.
|
|
24
|
+
const huskyDir = path.join(targetDir, '.husky');
|
|
25
|
+
const huskyDirExists = fs.existsSync(huskyDir);
|
|
26
|
+
if (!huskyDirExists) {
|
|
27
|
+
console.log('No .husky/ directory found. Run `reagent init` first to install hooks for this project.');
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
for (const { hookName, srcFileName } of HOOK_MAP) {
|
|
31
|
+
const huskyHookPath = path.join(huskyDir, hookName);
|
|
32
|
+
const srcFile = path.join(PKG_ROOT, 'husky', srcFileName);
|
|
33
|
+
// Skip hooks the project has not installed (respect user's init choices)
|
|
34
|
+
if (!fs.existsSync(huskyHookPath)) {
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
// Verify the source exists in the package (guard against partial installs)
|
|
38
|
+
if (!fs.existsSync(srcFile)) {
|
|
39
|
+
results.push({ file: `.husky/${hookName}`, status: 'warn' });
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
const hookResults = installHuskyHook(targetDir, hookName, srcFileName, dryRun);
|
|
43
|
+
results.push(...hookResults);
|
|
44
|
+
}
|
|
45
|
+
// Step 2: Update installed_by in .reagent/policy.yaml to reflect current version.
|
|
46
|
+
// Only touches the installed_by line — all other user config is preserved.
|
|
47
|
+
const policyPath = path.join(targetDir, '.reagent', 'policy.yaml');
|
|
48
|
+
if (!fs.existsSync(policyPath)) {
|
|
49
|
+
results.push({ file: '.reagent/policy.yaml', status: 'warn' });
|
|
50
|
+
console.warn(' Warning: .reagent/policy.yaml not found. Run `reagent init` to create it.');
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
const policyContent = fs.readFileSync(policyPath, 'utf8');
|
|
54
|
+
const updatedContent = policyContent.replace(/^installed_by:\s*['"]?reagent@[^'">\n]+['"]?/m, `installed_by: 'reagent@${PKG_VERSION}'`);
|
|
55
|
+
if (updatedContent === policyContent) {
|
|
56
|
+
// Line didn't match the expected pattern — still show as skipped, don't corrupt the file
|
|
57
|
+
results.push({ file: '.reagent/policy.yaml', status: 'skipped' });
|
|
58
|
+
}
|
|
59
|
+
else if (!dryRun) {
|
|
60
|
+
fs.writeFileSync(policyPath, updatedContent, 'utf8');
|
|
61
|
+
results.push({ file: '.reagent/policy.yaml (installed_by updated)', status: 'updated' });
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
// dry-run: report what would change
|
|
65
|
+
results.push({
|
|
66
|
+
file: '.reagent/policy.yaml (installed_by would be updated)',
|
|
67
|
+
status: 'updated',
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
printSummary(results, dryRun);
|
|
72
|
+
}
|
|
73
|
+
function printSummary(results, dryRun) {
|
|
74
|
+
console.log('');
|
|
75
|
+
const installed = results.filter((r) => r.status === 'installed');
|
|
76
|
+
const updated = results.filter((r) => r.status === 'updated');
|
|
77
|
+
const skipped = results.filter((r) => r.status === 'skipped');
|
|
78
|
+
const warned = results.filter((r) => r.status === 'warn');
|
|
79
|
+
if (installed.length) {
|
|
80
|
+
console.log('Installed:');
|
|
81
|
+
installed.forEach((r) => console.log(` + ${r.file}`));
|
|
82
|
+
}
|
|
83
|
+
if (updated.length) {
|
|
84
|
+
console.log('Updated:');
|
|
85
|
+
updated.forEach((r) => console.log(` ~ ${r.file}`));
|
|
86
|
+
}
|
|
87
|
+
if (skipped.length) {
|
|
88
|
+
console.log('Already up-to-date:');
|
|
89
|
+
skipped.forEach((r) => console.log(` = ${r.file}`));
|
|
90
|
+
}
|
|
91
|
+
if (warned.length) {
|
|
92
|
+
console.log('Warnings:');
|
|
93
|
+
warned.forEach((r) => console.log(` ! ${r.file}`));
|
|
94
|
+
}
|
|
95
|
+
if (!dryRun) {
|
|
96
|
+
console.log('\nreagent upgrade complete');
|
|
97
|
+
console.log('\nCommit the updated hooks to keep the team in sync:');
|
|
98
|
+
console.log(' git add .husky/ .reagent/policy.yaml && git commit -m "chore: upgrade reagent hooks"');
|
|
99
|
+
console.log('');
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=upgrade.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../../src/cli/commands/upgrade.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
@@ -8,6 +8,7 @@ import { runServe } from './commands/serve.js';
|
|
|
8
8
|
import { runCache } from './commands/cache.js';
|
|
9
9
|
import { runCatalyze } from './commands/catalyze/index.js';
|
|
10
10
|
import { runDaemon } from './commands/daemon/index.js';
|
|
11
|
+
import { runUpgrade } from './commands/upgrade.js';
|
|
11
12
|
const [, , cmd, ...rest] = process.argv;
|
|
12
13
|
if (!cmd || cmd === 'help' || cmd === '--help' || cmd === '-h') {
|
|
13
14
|
printHelp();
|
|
@@ -38,6 +39,9 @@ switch (cmd) {
|
|
|
38
39
|
case 'daemon':
|
|
39
40
|
runDaemon(rest);
|
|
40
41
|
break;
|
|
42
|
+
case 'upgrade':
|
|
43
|
+
runUpgrade(rest);
|
|
44
|
+
break;
|
|
41
45
|
default:
|
|
42
46
|
console.error(`\nUnknown command: ${cmd}`);
|
|
43
47
|
printHelp();
|
|
@@ -60,6 +64,7 @@ Commands:
|
|
|
60
64
|
serve Start the MCP gateway server (stdio transport)
|
|
61
65
|
daemon Manage the persistent HTTP/SSE multi-project daemon
|
|
62
66
|
cache Manage review cache (check, set, clear)
|
|
67
|
+
upgrade Re-sync installed hooks and update policy.yaml version stamp
|
|
63
68
|
help Show this help
|
|
64
69
|
|
|
65
70
|
Options for init:
|
|
@@ -106,6 +111,8 @@ Examples:
|
|
|
106
111
|
npx @bookedsolid/reagent daemon status
|
|
107
112
|
npx @bookedsolid/reagent daemon stop
|
|
108
113
|
npx @bookedsolid/reagent daemon restart
|
|
114
|
+
npx @bookedsolid/reagent upgrade
|
|
115
|
+
npx @bookedsolid/reagent upgrade --dry-run
|
|
109
116
|
`);
|
|
110
117
|
}
|
|
111
118
|
//# sourceMappingURL=index.js.map
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,MAAM,CAAC,EAAE,AAAD,EAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;AAExC,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;IAC/D,SAAS,EAAE,CAAC;IACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,QAAQ,GAAG,EAAE,CAAC;IACZ,KAAK,MAAM;QACT,OAAO,CAAC,IAAI,CAAC,CAAC;QACd,MAAM;IACR,KAAK,OAAO;QACV,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,MAAM;IACR,KAAK,QAAQ;QACX,SAAS,CAAC,IAAI,CAAC,CAAC;QAChB,MAAM;IACR,KAAK,UAAU;QACb,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM;IACR,KAAK,OAAO;QACV,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;QACrB,MAAM;IACR,KAAK,OAAO;QACV,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,MAAM;IACR,KAAK,UAAU;QACb,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM;IACR,KAAK,QAAQ;QACX,SAAS,CAAC,IAAI,CAAC,CAAC;QAChB,MAAM;IACR,KAAK,SAAS;QACZ,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,MAAM;IACR;QACE,OAAO,CAAC,KAAK,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAC;QAC3C,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC;AAED,SAAS,SAAS;IAChB,MAAM,WAAW,GAAG,aAAa,EAAE,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC;wBACU,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+DlC,CAAC,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bookedsolid/reagent",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.1",
|
|
4
4
|
"description": "Zero-trust MCP gateway — policy enforcement, secret redaction, and audit logging for AI-assisted projects",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Booked Solid Technology <oss@bookedsolid.tech> (https://bookedsolid.tech)",
|