@bookedsolid/reagent 0.12.1 → 0.13.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 +373 -943
- package/dist/cli/commands/init/index.d.ts.map +1 -1
- package/dist/cli/commands/init/index.js +45 -35
- package/dist/cli/commands/init/index.js.map +1 -1
- package/dist/cli/commands/init/mcp-config.d.ts +11 -0
- package/dist/cli/commands/init/mcp-config.d.ts.map +1 -0
- package/dist/cli/commands/init/mcp-config.js +64 -0
- package/dist/cli/commands/init/mcp-config.js.map +1 -0
- package/dist/cli/commands/init/policy.d.ts +1 -1
- package/dist/cli/commands/init/policy.d.ts.map +1 -1
- package/dist/cli/commands/init/policy.js +5 -3
- package/dist/cli/commands/init/policy.js.map +1 -1
- package/dist/cli/index.js +2 -11
- package/dist/cli/index.js.map +1 -1
- package/hooks/_lib/common.sh +18 -0
- package/hooks/blocked-paths-enforcer.sh +17 -9
- package/hooks/settings-protection.sh +5 -3
- package/package.json +2 -9
- package/profiles/astro/hooks/astro-ssr-guard.sh +1 -0
- package/profiles/drupal/hooks/drupal-coding-standards.sh +1 -0
- package/profiles/drupal/hooks/hook-update-guard.sh +1 -0
- package/profiles/lit-wc/hooks/cem-integrity-gate.sh +1 -0
- package/profiles/lit-wc/hooks/shadow-dom-guard.sh +1 -0
- package/profiles/nextjs/hooks/server-component-drift.sh +1 -0
- package/dist/cli/commands/daemon/eject.d.ts +0 -13
- package/dist/cli/commands/daemon/eject.d.ts.map +0 -1
- package/dist/cli/commands/daemon/eject.js +0 -74
- package/dist/cli/commands/daemon/eject.js.map +0 -1
- package/dist/cli/commands/daemon/index.d.ts +0 -5
- package/dist/cli/commands/daemon/index.d.ts.map +0 -1
- package/dist/cli/commands/daemon/index.js +0 -64
- package/dist/cli/commands/daemon/index.js.map +0 -1
- package/dist/cli/commands/daemon/restart.d.ts +0 -10
- package/dist/cli/commands/daemon/restart.d.ts.map +0 -1
- package/dist/cli/commands/daemon/restart.js +0 -20
- package/dist/cli/commands/daemon/restart.js.map +0 -1
- package/dist/cli/commands/daemon/start.d.ts +0 -2
- package/dist/cli/commands/daemon/start.d.ts.map +0 -1
- package/dist/cli/commands/daemon/start.js +0 -143
- package/dist/cli/commands/daemon/start.js.map +0 -1
- package/dist/cli/commands/daemon/status.d.ts +0 -2
- package/dist/cli/commands/daemon/status.d.ts.map +0 -1
- package/dist/cli/commands/daemon/status.js +0 -90
- package/dist/cli/commands/daemon/status.js.map +0 -1
- package/dist/cli/commands/daemon/stop.d.ts +0 -2
- package/dist/cli/commands/daemon/stop.d.ts.map +0 -1
- package/dist/cli/commands/daemon/stop.js +0 -73
- package/dist/cli/commands/daemon/stop.js.map +0 -1
- package/dist/config/daemon-loader.d.ts +0 -16
- package/dist/config/daemon-loader.d.ts.map +0 -1
- package/dist/config/daemon-loader.js +0 -76
- package/dist/config/daemon-loader.js.map +0 -1
- package/dist/types/daemon.d.ts +0 -45
- package/dist/types/daemon.d.ts.map +0 -1
- package/dist/types/daemon.js +0 -2
- package/dist/types/daemon.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/index.ts"],"names":[],"mappings":"AAmBA,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAoL5C"}
|
|
@@ -8,6 +8,7 @@ import { installClaudeHooks } from './claude-hooks.js';
|
|
|
8
8
|
import { installClaudeMd } from './claude-md.js';
|
|
9
9
|
import { installPolicy } from './policy.js';
|
|
10
10
|
import { installGatewayConfig, checkMcpDuplicates } from './gateway-config.js';
|
|
11
|
+
import { installMcpJson } from './mcp-config.js';
|
|
11
12
|
import { installAgents } from './agents.js';
|
|
12
13
|
import { installClaudeCommands } from './commands.js';
|
|
13
14
|
import { installPm } from './pm.js';
|
|
@@ -21,12 +22,6 @@ export function runInit(args) {
|
|
|
21
22
|
const withGitHub = args.includes('--github');
|
|
22
23
|
const withDiscord = args.includes('--discord');
|
|
23
24
|
const PKG_VERSION = getPkgVersion();
|
|
24
|
-
console.log(`\n@bookedsolid/reagent v${PKG_VERSION} init`);
|
|
25
|
-
console.log(` Profile: ${profileName}`);
|
|
26
|
-
console.log(` Target: ${targetDir}`);
|
|
27
|
-
if (dryRun)
|
|
28
|
-
console.log(` Mode: dry-run (no changes written)`);
|
|
29
|
-
console.log('');
|
|
30
25
|
// Validate profile name format
|
|
31
26
|
if (!/^[a-z0-9][a-z0-9-]*$/.test(profileName)) {
|
|
32
27
|
console.error(`Invalid profile name: "${profileName}" (only lowercase letters, numbers, hyphens allowed)`);
|
|
@@ -35,34 +30,26 @@ export function runInit(args) {
|
|
|
35
30
|
const profilesDir = path.join(PKG_ROOT, 'profiles');
|
|
36
31
|
const techProfiles = listTechProfiles();
|
|
37
32
|
const isTechProfile = techProfiles.includes(profileName);
|
|
38
|
-
//
|
|
33
|
+
// Tech profiles layer on top of a base JSON profile.
|
|
34
|
+
// --base-profile selects which base to use; defaults to client-engagement.
|
|
35
|
+
const baseProfileName = isTechProfile
|
|
36
|
+
? parseFlag(args, '--base-profile') || 'client-engagement'
|
|
37
|
+
: profileName;
|
|
38
|
+
console.log(`\n@bookedsolid/reagent v${PKG_VERSION} init`);
|
|
39
39
|
if (isTechProfile) {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
if (profileResult.gatesInstalled.length > 0) {
|
|
45
|
-
console.log(`Tech profile "${profileName}" gates (add to your preflight script):`);
|
|
46
|
-
for (const gate of profileResult.gatesInstalled) {
|
|
47
|
-
console.log(` [${gate.on_failure}] ${gate.name}: ${gate.command}`);
|
|
48
|
-
}
|
|
49
|
-
console.log('');
|
|
50
|
-
}
|
|
51
|
-
// Announce recommended agents
|
|
52
|
-
if (profileResult.agentsInstalled.length > 0) {
|
|
53
|
-
console.log(`Recommended agents for "${profileName}":`);
|
|
54
|
-
for (const agent of profileResult.agentsInstalled) {
|
|
55
|
-
console.log(` - ${agent}`);
|
|
56
|
-
}
|
|
57
|
-
console.log('');
|
|
58
|
-
}
|
|
59
|
-
printSummary(results, dryRun, false);
|
|
60
|
-
return;
|
|
40
|
+
console.log(` Profile: ${baseProfileName} + ${profileName}`);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
console.log(` Profile: ${profileName}`);
|
|
61
44
|
}
|
|
45
|
+
console.log(` Target: ${targetDir}`);
|
|
46
|
+
if (dryRun)
|
|
47
|
+
console.log(` Mode: dry-run (no changes written)`);
|
|
48
|
+
console.log('');
|
|
62
49
|
// Load base JSON profile — validate path to prevent traversal
|
|
63
|
-
const profilePath = path.resolve(profilesDir, `${
|
|
50
|
+
const profilePath = path.resolve(profilesDir, `${baseProfileName}.json`);
|
|
64
51
|
if (!profilePath.startsWith(profilesDir + path.sep)) {
|
|
65
|
-
console.error(`Invalid profile name: "${
|
|
52
|
+
console.error(`Invalid profile name: "${baseProfileName}" (path traversal detected)`);
|
|
66
53
|
process.exit(1);
|
|
67
54
|
}
|
|
68
55
|
if (!fs.existsSync(profilePath)) {
|
|
@@ -70,7 +57,9 @@ export function runInit(args) {
|
|
|
70
57
|
.readdirSync(profilesDir)
|
|
71
58
|
.filter((f) => f.endsWith('.json'))
|
|
72
59
|
.map((f) => f.replace('.json', ''));
|
|
73
|
-
console.error(
|
|
60
|
+
console.error(isTechProfile
|
|
61
|
+
? `Base profile not found: ${baseProfileName} (override with --base-profile)`
|
|
62
|
+
: `Profile not found: ${baseProfileName}`);
|
|
74
63
|
console.error(`Available base profiles: ${availableJson.join(', ')}`);
|
|
75
64
|
console.error(`Available tech profiles: ${techProfiles.join(', ')}`);
|
|
76
65
|
process.exit(1);
|
|
@@ -112,10 +101,12 @@ export function runInit(args) {
|
|
|
112
101
|
results.push(...installClaudeMd(targetDir, profile.claudeMd, dryRun));
|
|
113
102
|
}
|
|
114
103
|
// Step 8: Policy
|
|
115
|
-
results.push(...installPolicy(targetDir, profileName, profile, dryRun));
|
|
116
|
-
// Step 9:
|
|
104
|
+
results.push(...installPolicy(targetDir, profileName, profile, dryRun, isTechProfile ? profileName : undefined));
|
|
105
|
+
// Step 9: MCP server config (.mcp.json — tells Claude Code how to connect to reagent serve)
|
|
106
|
+
results.push(...installMcpJson(targetDir, dryRun));
|
|
107
|
+
// Step 9a: Gateway config (.reagent/gateway.yaml — downstream servers proxied through reagent)
|
|
117
108
|
results.push(...installGatewayConfig(targetDir, dryRun));
|
|
118
|
-
// Step
|
|
109
|
+
// Step 9b: Warn about duplicate MCP server entries (skip in dry-run — files may not exist)
|
|
119
110
|
if (!dryRun) {
|
|
120
111
|
checkMcpDuplicates(targetDir);
|
|
121
112
|
}
|
|
@@ -139,6 +130,25 @@ export function runInit(args) {
|
|
|
139
130
|
const discordOpts = parseDiscordArgs(args);
|
|
140
131
|
results.push(...installDiscord(targetDir, discordOpts, dryRun));
|
|
141
132
|
}
|
|
133
|
+
// Step 15: Tech profile overlay (hooks, gates, agents) — runs after base init
|
|
134
|
+
if (isTechProfile) {
|
|
135
|
+
const profileResult = installProfile(profileName, targetDir, dryRun);
|
|
136
|
+
results.push(...profileResult.results);
|
|
137
|
+
if (profileResult.gatesInstalled.length > 0) {
|
|
138
|
+
console.log(`Tech profile "${profileName}" gates (add to your preflight script):`);
|
|
139
|
+
for (const gate of profileResult.gatesInstalled) {
|
|
140
|
+
console.log(` [${gate.on_failure}] ${gate.name}: ${gate.command}`);
|
|
141
|
+
}
|
|
142
|
+
console.log('');
|
|
143
|
+
}
|
|
144
|
+
if (profileResult.agentsInstalled.length > 0) {
|
|
145
|
+
console.log(`Recommended agents for "${profileName}":`);
|
|
146
|
+
for (const agent of profileResult.agentsInstalled) {
|
|
147
|
+
console.log(` - ${agent}`);
|
|
148
|
+
}
|
|
149
|
+
console.log('');
|
|
150
|
+
}
|
|
151
|
+
}
|
|
142
152
|
printSummary(results, dryRun, true);
|
|
143
153
|
}
|
|
144
154
|
function printSummary(results, dryRun, showCommitInstructions) {
|
|
@@ -167,7 +177,7 @@ function printSummary(results, dryRun, showCommitInstructions) {
|
|
|
167
177
|
console.log('\n✓ reagent init complete');
|
|
168
178
|
if (showCommitInstructions) {
|
|
169
179
|
console.log('\nCommit these files (safe to commit):');
|
|
170
|
-
console.log(' git add .cursor/rules/ .husky/ .claude/commands/ CLAUDE.md .reagent/policy.yaml .reagent/gateway.yaml && git commit -m "chore: add reagent zero-trust config"');
|
|
180
|
+
console.log(' git add .mcp.json .cursor/rules/ .husky/ .claude/commands/ CLAUDE.md .reagent/policy.yaml .reagent/gateway.yaml && git commit -m "chore: add reagent zero-trust config"');
|
|
171
181
|
console.log('');
|
|
172
182
|
console.log('Do NOT commit (gitignored — stays on your machine):');
|
|
173
183
|
console.log(' .claude/hooks/');
|
|
@@ -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,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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { InstallResult } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Write (or merge into) .mcp.json in `targetDir` with a reagent stdio entry.
|
|
4
|
+
*
|
|
5
|
+
* Idempotent:
|
|
6
|
+
* - If .mcp.json doesn't exist: creates it with the reagent entry.
|
|
7
|
+
* - If .mcp.json exists but has no `mcpServers.reagent` key: adds the entry.
|
|
8
|
+
* - If .mcp.json already has a `mcpServers.reagent` key: skips (preserves existing).
|
|
9
|
+
*/
|
|
10
|
+
export declare function installMcpJson(targetDir: string, dryRun: boolean): InstallResult[];
|
|
11
|
+
//# sourceMappingURL=mcp-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-config.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/mcp-config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAqBhD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,aAAa,EAAE,CAyClF"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* The reagent MCP server entry to write into .mcp.json.
|
|
5
|
+
*
|
|
6
|
+
* Uses stdio transport so Claude Code spawns `reagent serve` directly —
|
|
7
|
+
* no daemon required, works immediately after `reagent init`.
|
|
8
|
+
*
|
|
9
|
+
* `npx reagent serve` resolves in order:
|
|
10
|
+
* 1. ./node_modules/.bin/reagent (local install)
|
|
11
|
+
* 2. PATH reagent (global install)
|
|
12
|
+
*
|
|
13
|
+
* This means the committed .mcp.json works on any machine regardless of
|
|
14
|
+
* whether reagent was installed locally or globally.
|
|
15
|
+
*/
|
|
16
|
+
const REAGENT_MCP_ENTRY = {
|
|
17
|
+
type: 'stdio',
|
|
18
|
+
command: 'npx',
|
|
19
|
+
args: ['reagent', 'serve'],
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Write (or merge into) .mcp.json in `targetDir` with a reagent stdio entry.
|
|
23
|
+
*
|
|
24
|
+
* Idempotent:
|
|
25
|
+
* - If .mcp.json doesn't exist: creates it with the reagent entry.
|
|
26
|
+
* - If .mcp.json exists but has no `mcpServers.reagent` key: adds the entry.
|
|
27
|
+
* - If .mcp.json already has a `mcpServers.reagent` key: skips (preserves existing).
|
|
28
|
+
*/
|
|
29
|
+
export function installMcpJson(targetDir, dryRun) {
|
|
30
|
+
const mcpPath = path.join(targetDir, '.mcp.json');
|
|
31
|
+
// Case 1: file exists — check if reagent already registered
|
|
32
|
+
if (fs.existsSync(mcpPath)) {
|
|
33
|
+
let existing;
|
|
34
|
+
try {
|
|
35
|
+
existing = JSON.parse(fs.readFileSync(mcpPath, 'utf8'));
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// Unparseable .mcp.json — don't overwrite; warn and bail
|
|
39
|
+
return [{ file: '.mcp.json', status: 'warn' }];
|
|
40
|
+
}
|
|
41
|
+
if (existing.mcpServers?.reagent) {
|
|
42
|
+
// Already configured — leave it alone
|
|
43
|
+
return [{ file: '.mcp.json', status: 'skipped' }];
|
|
44
|
+
}
|
|
45
|
+
// Add reagent entry to existing file
|
|
46
|
+
existing.mcpServers = existing.mcpServers ?? {};
|
|
47
|
+
existing.mcpServers.reagent = REAGENT_MCP_ENTRY;
|
|
48
|
+
if (!dryRun) {
|
|
49
|
+
fs.writeFileSync(mcpPath, JSON.stringify(existing, null, 2) + '\n');
|
|
50
|
+
}
|
|
51
|
+
return [{ file: '.mcp.json', status: 'updated' }];
|
|
52
|
+
}
|
|
53
|
+
// Case 2: file doesn't exist — create it
|
|
54
|
+
const config = {
|
|
55
|
+
mcpServers: {
|
|
56
|
+
reagent: REAGENT_MCP_ENTRY,
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
if (!dryRun) {
|
|
60
|
+
fs.writeFileSync(mcpPath, JSON.stringify(config, null, 2) + '\n');
|
|
61
|
+
}
|
|
62
|
+
return [{ file: '.mcp.json', status: 'installed' }];
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=mcp-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/mcp-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B;;;;;;;;;;;;GAYG;AACH,MAAM,iBAAiB,GAAG;IACxB,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,KAAK;IACd,IAAI,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC;CAClB,CAAC;AAEX;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,MAAe;IAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAElD,4DAA4D;IAC5D,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,IAAI,QAAkD,CAAC;QACvD,IAAI,CAAC;YACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAErD,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,yDAAyD;YACzD,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,QAAQ,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC;YACjC,sCAAsC;YACtC,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,qCAAqC;QACrC,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC;QAChD,QAAQ,CAAC,UAAU,CAAC,OAAO,GAAG,iBAAiB,CAAC;QAEhD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,yCAAyC;IACzC,MAAM,MAAM,GAAG;QACb,UAAU,EAAE;YACV,OAAO,EAAE,iBAAiB;SAC3B;KACF,CAAC;IAEF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { InstallResult, ProfileConfig } from './types.js';
|
|
2
|
-
export declare function installPolicy(targetDir: string, profileName: string, profile: ProfileConfig, dryRun: boolean): InstallResult[];
|
|
2
|
+
export declare function installPolicy(targetDir: string, profileName: string, profile: ProfileConfig, dryRun: boolean, techProfile?: string): InstallResult[];
|
|
3
3
|
//# sourceMappingURL=policy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/policy.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE/D,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/policy.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE/D,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,OAAO,EACf,WAAW,CAAC,EAAE,MAAM,GACnB,aAAa,EAAE,CAkFjB"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { getPkgVersion } from '../../utils.js';
|
|
4
|
-
export function installPolicy(targetDir, profileName, profile, dryRun) {
|
|
4
|
+
export function installPolicy(targetDir, profileName, profile, dryRun, techProfile) {
|
|
5
5
|
const PKG_VERSION = getPkgVersion();
|
|
6
6
|
const reagentDir = path.join(targetDir, '.reagent');
|
|
7
7
|
const policyPath = path.join(reagentDir, 'policy.yaml');
|
|
@@ -16,7 +16,9 @@ export function installPolicy(targetDir, profileName, profile, dryRun) {
|
|
|
16
16
|
const coverageEnabled = profile.coverage?.enabled === true;
|
|
17
17
|
const coverageThreshold = profile.coverage?.threshold ?? 80;
|
|
18
18
|
const blockedPaths = profile.blockedPaths ?? [
|
|
19
|
-
'.reagent/',
|
|
19
|
+
'.reagent/policy.yaml',
|
|
20
|
+
'.reagent/HALT',
|
|
21
|
+
'.reagent/review-cache.json',
|
|
20
22
|
'.github/workflows/',
|
|
21
23
|
'.env',
|
|
22
24
|
'.env.*',
|
|
@@ -30,7 +32,7 @@ export function installPolicy(targetDir, profileName, profile, dryRun) {
|
|
|
30
32
|
|
|
31
33
|
version: "1"
|
|
32
34
|
profile: "${profileName}"
|
|
33
|
-
installed_by: "reagent@${PKG_VERSION}"
|
|
35
|
+
${techProfile ? `tech_profile: "${techProfile}"\n` : ''}installed_by: "reagent@${PKG_VERSION}"
|
|
34
36
|
installed_at: "${now}"
|
|
35
37
|
|
|
36
38
|
# Autonomy levels:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/policy.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,aAAa,CAC3B,SAAiB,EACjB,WAAmB,EACnB,OAAsB,EACtB,MAAe;
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/policy.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,aAAa,CAC3B,SAAiB,EACjB,WAAmB,EACnB,OAAsB,EACtB,MAAe,EACf,WAAoB;IAEpB,MAAM,WAAW,GAAG,aAAa,EAAE,CAAC;IACpC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACpD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAExD,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,KAAK,IAAI,CAAC;QAC7D,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,EAAE,cAAc,IAAI,UAAU,CAAC;QACtE,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;QAC3D,MAAM,iBAAiB,GAAG,OAAO,CAAC,QAAQ,EAAE,SAAS,IAAI,EAAE,CAAC;QAC5D,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI;YAC3C,sBAAsB;YACtB,eAAe;YACf,4BAA4B;YAC5B,oBAAoB;YACpB,MAAM;YACN,QAAQ;SACT,CAAC;QACF,MAAM,gBAAgB,GAAG,YAAY,CAAC,MAAM;YAC1C,CAAC,CAAC,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YACjE,CAAC,CAAC,KAAK,CAAC;QACV,MAAM,OAAO,GAAG,+DAA+D,WAAW;;;;;YAKlF,WAAW;EACrB,WAAW,CAAC,CAAC,CAAC,kBAAkB,WAAW,KAAK,CAAC,CAAC,CAAC,EAAE,0BAA0B,WAAW;iBAC3E,GAAG;;;;;;;;;;;;;;;;;;wBAkBI,gBAAgB;;;gBAGxB,gBAAgB;;;;;;;;;;;;aAYnB,eAAe;eACb,iBAAiB;;;;;;;;sBAQV,cAAc;CACnC,CAAC;QACE,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;AACjE,CAAC"}
|
package/dist/cli/index.js
CHANGED
|
@@ -7,7 +7,6 @@ import { runUnfreeze } from './commands/unfreeze.js';
|
|
|
7
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
|
-
import { runDaemon } from './commands/daemon/index.js';
|
|
11
10
|
import { runUpgrade } from './commands/upgrade.js';
|
|
12
11
|
const [, , cmd, ...rest] = process.argv;
|
|
13
12
|
if (!cmd || cmd === 'help' || cmd === '--help' || cmd === '-h') {
|
|
@@ -36,9 +35,6 @@ switch (cmd) {
|
|
|
36
35
|
case 'catalyze':
|
|
37
36
|
runCatalyze(rest);
|
|
38
37
|
break;
|
|
39
|
-
case 'daemon':
|
|
40
|
-
runDaemon(rest);
|
|
41
|
-
break;
|
|
42
38
|
case 'upgrade':
|
|
43
39
|
runUpgrade(rest);
|
|
44
40
|
break;
|
|
@@ -50,7 +46,7 @@ switch (cmd) {
|
|
|
50
46
|
function printHelp() {
|
|
51
47
|
const PKG_VERSION = getPkgVersion();
|
|
52
48
|
console.log(`
|
|
53
|
-
@bookedsolid/reagent v${PKG_VERSION} — zero-trust MCP
|
|
49
|
+
@bookedsolid/reagent v${PKG_VERSION} — zero-trust MCP server
|
|
54
50
|
|
|
55
51
|
Usage:
|
|
56
52
|
npx @bookedsolid/reagent <command> [options]
|
|
@@ -61,8 +57,7 @@ Commands:
|
|
|
61
57
|
check Check what reagent components are installed
|
|
62
58
|
freeze Create .reagent/HALT to suspend all agent operations
|
|
63
59
|
unfreeze Remove .reagent/HALT to resume agent operations
|
|
64
|
-
serve Start the MCP
|
|
65
|
-
daemon Manage the persistent HTTP/SSE multi-project daemon
|
|
60
|
+
serve Start the MCP server (stdio transport — called by Claude Code via .mcp.json)
|
|
66
61
|
cache Manage review cache (check, set, clear)
|
|
67
62
|
upgrade Re-sync installed hooks and update policy.yaml version stamp
|
|
68
63
|
help Show this help
|
|
@@ -107,10 +102,6 @@ Examples:
|
|
|
107
102
|
npx @bookedsolid/reagent freeze --reason "security incident"
|
|
108
103
|
npx @bookedsolid/reagent unfreeze
|
|
109
104
|
npx @bookedsolid/reagent serve
|
|
110
|
-
npx @bookedsolid/reagent daemon start
|
|
111
|
-
npx @bookedsolid/reagent daemon status
|
|
112
|
-
npx @bookedsolid/reagent daemon stop
|
|
113
|
-
npx @bookedsolid/reagent daemon restart
|
|
114
105
|
npx @bookedsolid/reagent upgrade
|
|
115
106
|
npx @bookedsolid/reagent upgrade --dry-run
|
|
116
107
|
`);
|
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,
|
|
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,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,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0DlC,CAAC,CAAC;AACH,CAAC"}
|
package/hooks/_lib/common.sh
CHANGED
|
@@ -61,6 +61,24 @@ json_output() {
|
|
|
61
61
|
fi
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
+
# Exit 0 (skip) if the project's tech_profile does not match the expected type.
|
|
65
|
+
# Usage: check_project_type "lit-wc"
|
|
66
|
+
# Reads tech_profile from .reagent/policy.yaml; if absent or mismatched, exits 0.
|
|
67
|
+
check_project_type() {
|
|
68
|
+
local expected_type="$1"
|
|
69
|
+
local root
|
|
70
|
+
root=$(reagent_root)
|
|
71
|
+
local policy="${root}/.reagent/policy.yaml"
|
|
72
|
+
if [[ ! -f "$policy" ]]; then
|
|
73
|
+
exit 0
|
|
74
|
+
fi
|
|
75
|
+
local actual_type
|
|
76
|
+
actual_type=$(grep -E '^tech_profile:' "$policy" 2>/dev/null | sed 's/^tech_profile:[[:space:]]*//' | tr -d '"' || echo "")
|
|
77
|
+
if [[ -z "$actual_type" || "$actual_type" != "$expected_type" ]]; then
|
|
78
|
+
exit 0
|
|
79
|
+
fi
|
|
80
|
+
}
|
|
81
|
+
|
|
64
82
|
# Score a diff for triage purposes
|
|
65
83
|
# Reads from stdin (expects unified diff output)
|
|
66
84
|
# Returns: "trivial" (<20 lines), "standard" (20-200), "significant" (>200)
|
|
@@ -90,28 +90,36 @@ if [[ ${#BLOCKED_PATHS[@]} -eq 0 ]]; then
|
|
|
90
90
|
exit 0
|
|
91
91
|
fi
|
|
92
92
|
|
|
93
|
-
# ── 6.
|
|
93
|
+
# ── 6. Agent-writable allowlist ───────────────────────────────────────────────
|
|
94
|
+
# These paths under .reagent/ must always be writable by agents regardless of
|
|
95
|
+
# what blocked_paths says. Blocking the whole .reagent/ directory in policy
|
|
96
|
+
# is a common default, but tasks.jsonl is the PM data store — agents must
|
|
97
|
+
# write there. Settings-protection.sh guards the sensitive files explicitly.
|
|
98
|
+
AGENT_WRITABLE=(
|
|
99
|
+
'.reagent/tasks.jsonl'
|
|
100
|
+
'.reagent/audit/'
|
|
101
|
+
)
|
|
94
102
|
|
|
95
|
-
# Convert to relative path from project root
|
|
96
103
|
normalize_path() {
|
|
97
104
|
local p="$1"
|
|
98
105
|
local root="$REAGENT_ROOT"
|
|
99
|
-
|
|
100
|
-
# Strip project root prefix if present
|
|
101
106
|
if [[ "$p" == "$root"/* ]]; then
|
|
102
107
|
p="${p#$root/}"
|
|
103
108
|
fi
|
|
104
|
-
|
|
105
|
-
# URL decode common sequences
|
|
106
109
|
p=$(printf '%s' "$p" | sed 's/%2[Ff]/\//g; s/%2[Ee]/./g; s/%20/ /g')
|
|
107
|
-
|
|
108
|
-
# Remove ./ prefix
|
|
109
110
|
p="${p#./}"
|
|
110
|
-
|
|
111
111
|
printf '%s' "$p"
|
|
112
112
|
}
|
|
113
113
|
|
|
114
114
|
NORMALIZED=$(normalize_path "$FILE_PATH")
|
|
115
|
+
|
|
116
|
+
for writable in "${AGENT_WRITABLE[@]}"; do
|
|
117
|
+
if [[ "$NORMALIZED" == "$writable" ]] || [[ "$NORMALIZED" == "$writable"* && "$writable" == */ ]]; then
|
|
118
|
+
exit 0
|
|
119
|
+
fi
|
|
120
|
+
done
|
|
121
|
+
|
|
122
|
+
# ── 7. Match against blocked_paths ───────────────────────────────────────────
|
|
115
123
|
LOWER_NORM=$(printf '%s' "$NORMALIZED" | tr '[:upper:]' '[:lower:]')
|
|
116
124
|
|
|
117
125
|
for blocked in "${BLOCKED_PATHS[@]}"; do
|
|
@@ -4,14 +4,17 @@
|
|
|
4
4
|
# Blocks modifications to critical configuration files that, if tampered with,
|
|
5
5
|
# would disable the entire hook safety layer.
|
|
6
6
|
#
|
|
7
|
-
# Protected paths:
|
|
7
|
+
# Protected paths (security controls and hook infrastructure ONLY):
|
|
8
8
|
# .claude/settings.json — hook configuration
|
|
9
9
|
# .claude/settings.local.json — local hook overrides
|
|
10
10
|
# .claude/hooks/* — hook scripts themselves
|
|
11
11
|
# .husky/* — git hook scripts
|
|
12
12
|
# .reagent/policy.yaml — autonomy/blocking policy
|
|
13
13
|
# .reagent/HALT — kill switch file
|
|
14
|
-
#
|
|
14
|
+
#
|
|
15
|
+
# NOT protected (operational files agents may legitimately write):
|
|
16
|
+
# .reagent/review-cache.json — cache file, writable by CLI and agents
|
|
17
|
+
# .reagent/tasks.jsonl — task store, managed by task MCP tools
|
|
15
18
|
#
|
|
16
19
|
# Exit codes:
|
|
17
20
|
# 0 = allow (path not protected)
|
|
@@ -79,7 +82,6 @@ PROTECTED_PATTERNS=(
|
|
|
79
82
|
'.husky/'
|
|
80
83
|
'.reagent/policy.yaml'
|
|
81
84
|
'.reagent/HALT'
|
|
82
|
-
'.reagent/review-cache.json'
|
|
83
85
|
)
|
|
84
86
|
|
|
85
87
|
for pattern in "${PROTECTED_PATTERNS[@]}"; do
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bookedsolid/reagent",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Zero-trust MCP
|
|
3
|
+
"version": "0.13.0",
|
|
4
|
+
"description": "Zero-trust MCP server — 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)",
|
|
7
7
|
"homepage": "https://github.com/bookedsolidtech/reagent#readme",
|
|
@@ -52,13 +52,6 @@
|
|
|
52
52
|
"changeset": "changeset",
|
|
53
53
|
"changeset:version": "changeset version",
|
|
54
54
|
"changeset:publish": "changeset publish",
|
|
55
|
-
"daemon:start": "mkdir -p ~/.reagent && nohup ./daemon/target/release/reagent-daemon > ~/.reagent/daemon.log 2>&1 & echo $! > ~/.reagent/daemon.pid && echo \"reagent daemon started (PID $(cat ~/.reagent/daemon.pid))\"",
|
|
56
|
-
"daemon:stop": "PID=$(cat ~/.reagent/daemon.pid 2>/dev/null); if [[ \"$PID\" =~ ^[0-9]+$ ]]; then kill -- \"$PID\" 2>/dev/null && rm -f ~/.reagent/daemon.pid && echo \"reagent daemon stopped\" || echo \"reagent daemon was not running\"; else echo \"reagent daemon was not running\"; fi",
|
|
57
|
-
"daemon:status": "[ -f ~/.reagent/daemon.pid ] && kill -0 $(cat ~/.reagent/daemon.pid) 2>/dev/null && echo \"running (PID $(cat ~/.reagent/daemon.pid))\" || echo \"not running\"",
|
|
58
|
-
"daemon:logs": "tail -f ~/.reagent/daemon.log",
|
|
59
|
-
"daemon:eject": "pkill -KILL -f reagent-daemon 2>/dev/null; rm -f ~/.reagent/daemon.pid; echo \"ejected\"",
|
|
60
|
-
"daemon:restart": "npx reagent daemon restart",
|
|
61
|
-
"daemon:build": "cargo build --release --manifest-path daemon/Cargo.toml",
|
|
62
55
|
"lint": "eslint .",
|
|
63
56
|
"format": "prettier --write .",
|
|
64
57
|
"format:check": "prettier --check .",
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `reagent daemon eject` — unconditional nuclear kill.
|
|
3
|
-
*
|
|
4
|
-
* Does not attempt graceful shutdown. Suitable as a last resort when the
|
|
5
|
-
* daemon is stuck and `reagent daemon stop` is unresponsive.
|
|
6
|
-
*
|
|
7
|
-
* Steps:
|
|
8
|
-
* 1. SIGKILL the PID recorded in ~/.reagent/daemon.pid
|
|
9
|
-
* 2. pkill -f reagent-daemon as a fallback (catches orphans not in PID file)
|
|
10
|
-
* 3. Remove ~/.reagent/daemon.pid
|
|
11
|
-
*/
|
|
12
|
-
export declare function runDaemonEject(_args: string[]): void;
|
|
13
|
-
//# sourceMappingURL=eject.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"eject.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/daemon/eject.ts"],"names":[],"mappings":"AAUA;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAoDpD"}
|