@bookedsolid/reagent 0.6.0 → 0.7.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/agents/ai-platforms/ai-agentic-systems-architect.md +6 -5
- package/agents/ai-platforms/ai-anthropic-specialist.md +6 -5
- package/agents/ai-platforms/ai-cost-optimizer.md +6 -5
- package/agents/ai-platforms/ai-deepseek-specialist.md +84 -0
- package/agents/ai-platforms/ai-elevenlabs-specialist.md +76 -0
- package/agents/ai-platforms/ai-evaluation-specialist.md +6 -5
- package/agents/ai-platforms/ai-fine-tuning-specialist.md +6 -5
- package/agents/ai-platforms/ai-gemini-specialist.md +6 -5
- package/agents/ai-platforms/ai-governance-officer.md +6 -5
- package/agents/ai-platforms/ai-grok-specialist.md +72 -0
- package/agents/ai-platforms/ai-knowledge-engineer.md +6 -5
- package/agents/ai-platforms/ai-local-llm-specialist.md +96 -0
- package/agents/ai-platforms/ai-mcp-developer.md +6 -5
- package/agents/ai-platforms/ai-multi-modal-specialist.md +6 -5
- package/agents/ai-platforms/ai-open-source-models-specialist.md +6 -5
- package/agents/ai-platforms/ai-openai-specialist.md +6 -5
- package/agents/ai-platforms/ai-platform-strategist.md +6 -5
- package/agents/ai-platforms/ai-prompt-engineer.md +6 -5
- package/agents/ai-platforms/ai-rag-architect.md +6 -5
- package/agents/ai-platforms/ai-rea.md +6 -5
- package/agents/ai-platforms/ai-research-scientist.md +6 -5
- package/agents/ai-platforms/ai-safety-reviewer.md +6 -5
- package/agents/ai-platforms/ai-security-red-teamer.md +6 -5
- package/agents/ai-platforms/ai-synthetic-data-engineer.md +6 -5
- package/agents/ai-platforms/ai-video-ai-specialist.md +104 -0
- package/agents/engineering/accessibility-engineer.md +6 -5
- package/agents/engineering/aws-architect.md +6 -5
- package/agents/engineering/backend-engineer-payments.md +5 -4
- package/agents/engineering/backend-engineering-manager.md +5 -4
- package/agents/engineering/code-reviewer.md +6 -5
- package/agents/engineering/css3-animation-purist.md +4 -3
- package/agents/engineering/cto-advisory.md +49 -0
- package/agents/engineering/data-engineer.md +6 -5
- package/agents/engineering/database-architect.md +5 -4
- package/agents/engineering/design-system-developer.md +4 -3
- package/agents/engineering/design-systems-animator.md +5 -4
- package/agents/engineering/devops-engineer.md +6 -5
- package/agents/engineering/drupal-integration-specialist.md +5 -4
- package/agents/engineering/drupal-specialist.md +6 -5
- package/agents/engineering/engineering-manager-frontend.md +5 -4
- package/agents/engineering/frontend-specialist.md +6 -5
- package/agents/engineering/infrastructure-engineer.md +5 -4
- package/agents/engineering/lit-specialist.md +6 -5
- package/agents/engineering/migration-specialist.md +6 -5
- package/agents/engineering/ml-engineer.md +5 -4
- package/agents/engineering/mobile-engineer.md +6 -5
- package/agents/engineering/nextjs-specialist.md +6 -5
- package/agents/engineering/open-source-specialist.md +6 -5
- package/agents/engineering/performance-engineer.md +6 -5
- package/agents/engineering/performance-qa-engineer.md +5 -4
- package/agents/engineering/pr-maintainer.md +6 -5
- package/agents/engineering/principal-engineer.md +6 -5
- package/agents/engineering/privacy-engineer.md +5 -4
- package/agents/engineering/qa-engineer-automation.md +77 -0
- package/agents/engineering/qa-engineer-manual.md +48 -0
- package/agents/engineering/qa-engineer.md +6 -5
- package/agents/engineering/qa-lead.md +124 -0
- package/agents/engineering/security-engineer-appsec.md +47 -0
- package/agents/engineering/security-engineer-compliance.md +47 -0
- package/agents/engineering/security-engineer.md +6 -5
- package/agents/engineering/senior-backend-engineer.md +5 -4
- package/agents/engineering/senior-database-engineer.md +5 -4
- package/agents/engineering/senior-frontend-engineer.md +5 -4
- package/agents/engineering/senior-product-manager-platform.md +5 -4
- package/agents/engineering/senior-technical-project-manager.md +5 -4
- package/agents/engineering/site-reliability-engineer-2.md +5 -4
- package/agents/engineering/solutions-architect.md +6 -5
- package/agents/engineering/sre-lead.md +5 -4
- package/agents/engineering/staff-engineer-platform.md +5 -4
- package/agents/engineering/staff-software-engineer.md +5 -4
- package/agents/engineering/storybook-specialist.md +5 -4
- package/agents/engineering/supabase-specialist.md +6 -5
- package/agents/engineering/technical-project-manager.md +5 -4
- package/agents/engineering/test-architect.md +5 -4
- package/agents/engineering/typescript-specialist.md +6 -5
- package/agents/engineering/ux-researcher.md +4 -3
- package/agents/engineering/vp-engineering.md +6 -5
- package/agents/product-owner.md +5 -0
- package/agents/reagent-orchestrator.md +5 -0
- package/dist/cli/commands/catalyze/gap-detector.d.ts +6 -0
- package/dist/cli/commands/catalyze/gap-detector.d.ts.map +1 -0
- package/dist/cli/commands/catalyze/gap-detector.js +359 -0
- package/dist/cli/commands/catalyze/gap-detector.js.map +1 -0
- package/dist/cli/commands/catalyze/index.d.ts +15 -0
- package/dist/cli/commands/catalyze/index.d.ts.map +1 -0
- package/dist/cli/commands/catalyze/index.js +149 -0
- package/dist/cli/commands/catalyze/index.js.map +1 -0
- package/dist/cli/commands/catalyze/report-generator.d.ts +17 -0
- package/dist/cli/commands/catalyze/report-generator.d.ts.map +1 -0
- package/dist/cli/commands/catalyze/report-generator.js +290 -0
- package/dist/cli/commands/catalyze/report-generator.js.map +1 -0
- package/dist/cli/commands/catalyze/stack-analyzer.d.ts +6 -0
- package/dist/cli/commands/catalyze/stack-analyzer.d.ts.map +1 -0
- package/dist/cli/commands/catalyze/stack-analyzer.js +267 -0
- package/dist/cli/commands/catalyze/stack-analyzer.js.map +1 -0
- package/dist/cli/commands/catalyze/types.d.ts +40 -0
- package/dist/cli/commands/catalyze/types.d.ts.map +1 -0
- package/dist/cli/commands/catalyze/types.js +2 -0
- package/dist/cli/commands/catalyze/types.js.map +1 -0
- package/dist/cli/commands/init/agents.d.ts.map +1 -1
- package/dist/cli/commands/init/agents.js +9 -0
- package/dist/cli/commands/init/agents.js.map +1 -1
- package/dist/cli/commands/init/claude-hooks.d.ts.map +1 -1
- package/dist/cli/commands/init/claude-hooks.js +27 -0
- package/dist/cli/commands/init/claude-hooks.js.map +1 -1
- package/dist/cli/commands/init/commands.d.ts.map +1 -1
- package/dist/cli/commands/init/commands.js +9 -0
- package/dist/cli/commands/init/commands.js.map +1 -1
- package/dist/cli/commands/init/discord.d.ts +21 -0
- package/dist/cli/commands/init/discord.d.ts.map +1 -0
- package/dist/cli/commands/init/discord.js +87 -0
- package/dist/cli/commands/init/discord.js.map +1 -0
- package/dist/cli/commands/init/index.d.ts.map +1 -1
- package/dist/cli/commands/init/index.js +61 -17
- package/dist/cli/commands/init/index.js.map +1 -1
- package/dist/cli/commands/init/profiles.d.ts +39 -0
- package/dist/cli/commands/init/profiles.d.ts.map +1 -0
- package/dist/cli/commands/init/profiles.js +132 -0
- package/dist/cli/commands/init/profiles.js.map +1 -0
- package/dist/cli/index.js +27 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/gateway/native-tools.d.ts.map +1 -1
- package/dist/gateway/native-tools.js +25 -0
- package/dist/gateway/native-tools.js.map +1 -1
- package/dist/pm/discord-notifier.d.ts +52 -0
- package/dist/pm/discord-notifier.d.ts.map +1 -0
- package/dist/pm/discord-notifier.js +122 -0
- package/dist/pm/discord-notifier.js.map +1 -0
- package/package.json +1 -1
- package/profiles/astro/README.md +44 -0
- package/profiles/astro/agents.txt +3 -0
- package/profiles/astro/gates.yaml +15 -0
- package/profiles/astro/hooks/astro-ssr-guard.sh +73 -0
- package/profiles/drupal/README.md +53 -0
- package/profiles/drupal/agents.txt +4 -0
- package/profiles/drupal/gates.yaml +15 -0
- package/profiles/drupal/hooks/drupal-coding-standards.sh +70 -0
- package/profiles/drupal/hooks/hook-update-guard.sh +65 -0
- package/profiles/lit-wc/README.md +48 -0
- package/profiles/lit-wc/agents.txt +4 -0
- package/profiles/lit-wc/gates.yaml +15 -0
- package/profiles/lit-wc/hooks/cem-integrity-gate.sh +48 -0
- package/profiles/lit-wc/hooks/shadow-dom-guard.sh +76 -0
- package/profiles/nextjs/README.md +44 -0
- package/profiles/nextjs/agents.txt +4 -0
- package/profiles/nextjs/gates.yaml +15 -0
- package/profiles/nextjs/hooks/server-component-drift.sh +73 -0
|
@@ -12,11 +12,14 @@ import { installAgents } from './agents.js';
|
|
|
12
12
|
import { installClaudeCommands } from './commands.js';
|
|
13
13
|
import { installPm } from './pm.js';
|
|
14
14
|
import { installGitHub } from './github.js';
|
|
15
|
+
import { installProfile, listTechProfiles } from './profiles.js';
|
|
16
|
+
import { installDiscord, parseDiscordArgs } from './discord.js';
|
|
15
17
|
export function runInit(args) {
|
|
16
18
|
const profileName = parseFlag(args, '--profile') || 'client-engagement';
|
|
17
19
|
const targetDir = process.cwd();
|
|
18
20
|
const dryRun = args.includes('--dry-run');
|
|
19
21
|
const withGitHub = args.includes('--github');
|
|
22
|
+
const withDiscord = args.includes('--discord');
|
|
20
23
|
const PKG_VERSION = getPkgVersion();
|
|
21
24
|
console.log(`\n@bookedsolid/reagent v${PKG_VERSION} init`);
|
|
22
25
|
console.log(` Profile: ${profileName}`);
|
|
@@ -24,28 +27,60 @@ export function runInit(args) {
|
|
|
24
27
|
if (dryRun)
|
|
25
28
|
console.log(` Mode: dry-run (no changes written)`);
|
|
26
29
|
console.log('');
|
|
27
|
-
//
|
|
30
|
+
// Validate profile name format
|
|
28
31
|
if (!/^[a-z0-9][a-z0-9-]*$/.test(profileName)) {
|
|
29
32
|
console.error(`Invalid profile name: "${profileName}" (only lowercase letters, numbers, hyphens allowed)`);
|
|
30
33
|
process.exit(1);
|
|
31
34
|
}
|
|
32
35
|
const profilesDir = path.join(PKG_ROOT, 'profiles');
|
|
36
|
+
const techProfiles = listTechProfiles();
|
|
37
|
+
const isTechProfile = techProfiles.includes(profileName);
|
|
38
|
+
// If this is a tech stack profile (directory-based), run it directly
|
|
39
|
+
if (isTechProfile) {
|
|
40
|
+
const results = [];
|
|
41
|
+
const profileResult = installProfile(profileName, targetDir, dryRun);
|
|
42
|
+
results.push(...profileResult.results);
|
|
43
|
+
// Announce gates
|
|
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;
|
|
61
|
+
}
|
|
62
|
+
// Load base JSON profile — validate path to prevent traversal
|
|
33
63
|
const profilePath = path.resolve(profilesDir, `${profileName}.json`);
|
|
34
64
|
if (!profilePath.startsWith(profilesDir + path.sep)) {
|
|
35
65
|
console.error(`Invalid profile name: "${profileName}" (path traversal detected)`);
|
|
36
66
|
process.exit(1);
|
|
37
67
|
}
|
|
38
68
|
if (!fs.existsSync(profilePath)) {
|
|
39
|
-
const
|
|
40
|
-
.readdirSync(
|
|
69
|
+
const availableJson = fs
|
|
70
|
+
.readdirSync(profilesDir)
|
|
41
71
|
.filter((f) => f.endsWith('.json'))
|
|
42
72
|
.map((f) => f.replace('.json', ''));
|
|
43
73
|
console.error(`Profile not found: ${profileName}`);
|
|
44
|
-
console.error(`Available profiles: ${
|
|
74
|
+
console.error(`Available base profiles: ${availableJson.join(', ')}`);
|
|
75
|
+
console.error(`Available tech profiles: ${techProfiles.join(', ')}`);
|
|
45
76
|
process.exit(1);
|
|
46
77
|
}
|
|
47
78
|
const profile = JSON.parse(fs.readFileSync(profilePath, 'utf8'));
|
|
48
79
|
const results = [];
|
|
80
|
+
// Ensure .claude/ base directory exists before any step tries to create subdirs within it
|
|
81
|
+
if (!dryRun) {
|
|
82
|
+
fs.mkdirSync(path.join(targetDir, '.claude'), { recursive: true });
|
|
83
|
+
}
|
|
49
84
|
// Step 1: .gitignore entries
|
|
50
85
|
if (profile.gitignoreEntries?.length) {
|
|
51
86
|
results.push(...installGitignoreEntries(targetDir, profile.gitignoreEntries, dryRun));
|
|
@@ -91,7 +126,14 @@ export function runInit(args) {
|
|
|
91
126
|
dryRun,
|
|
92
127
|
}));
|
|
93
128
|
}
|
|
94
|
-
//
|
|
129
|
+
// Step 14: Discord notifications (opt-in via --discord flag)
|
|
130
|
+
if (withDiscord) {
|
|
131
|
+
const discordOpts = parseDiscordArgs(args);
|
|
132
|
+
results.push(...installDiscord(targetDir, discordOpts, dryRun));
|
|
133
|
+
}
|
|
134
|
+
printSummary(results, dryRun, true);
|
|
135
|
+
}
|
|
136
|
+
function printSummary(results, dryRun, showCommitInstructions) {
|
|
95
137
|
console.log('');
|
|
96
138
|
const installed = results.filter((r) => r.status === 'installed');
|
|
97
139
|
const updated = results.filter((r) => r.status === 'updated');
|
|
@@ -115,18 +157,20 @@ export function runInit(args) {
|
|
|
115
157
|
}
|
|
116
158
|
if (!dryRun) {
|
|
117
159
|
console.log('\n✓ reagent init complete');
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
160
|
+
if (showCommitInstructions) {
|
|
161
|
+
console.log('\nCommit these files (safe to commit):');
|
|
162
|
+
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"');
|
|
163
|
+
console.log('');
|
|
164
|
+
console.log('Do NOT commit (gitignored — stays on your machine):');
|
|
165
|
+
console.log(' .claude/hooks/');
|
|
166
|
+
console.log(' .claude/settings.json');
|
|
167
|
+
console.log(' .claude/agents/');
|
|
168
|
+
console.log('');
|
|
169
|
+
console.log('Test kill switch:');
|
|
170
|
+
console.log(' reagent freeze --reason "testing"');
|
|
171
|
+
console.log(' reagent unfreeze');
|
|
172
|
+
console.log('');
|
|
173
|
+
}
|
|
130
174
|
}
|
|
131
175
|
}
|
|
132
176
|
//# sourceMappingURL=index.js.map
|
|
@@ -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;AAC3D,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;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { InstallResult } from './types.js';
|
|
2
|
+
export interface GateDefinition {
|
|
3
|
+
name: string;
|
|
4
|
+
command: string;
|
|
5
|
+
description: string;
|
|
6
|
+
on_failure: 'block' | 'warn';
|
|
7
|
+
}
|
|
8
|
+
export interface GatesConfig {
|
|
9
|
+
gates: GateDefinition[];
|
|
10
|
+
}
|
|
11
|
+
export interface ProfileInstallResult {
|
|
12
|
+
results: InstallResult[];
|
|
13
|
+
gatesInstalled: GateDefinition[];
|
|
14
|
+
agentsInstalled: string[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* List available tech stack profiles (directories in profiles/ that have gates.yaml or hooks/).
|
|
18
|
+
* These are distinct from the flat .json profiles used by `reagent init --profile`.
|
|
19
|
+
*/
|
|
20
|
+
export declare function listTechProfiles(): string[];
|
|
21
|
+
/**
|
|
22
|
+
* Read gates.yaml from a profile directory.
|
|
23
|
+
*/
|
|
24
|
+
export declare function readProfileGates(profileName: string): GateDefinition[];
|
|
25
|
+
/**
|
|
26
|
+
* Read agents.txt from a profile directory.
|
|
27
|
+
*/
|
|
28
|
+
export declare function readProfileAgents(profileName: string): string[];
|
|
29
|
+
/**
|
|
30
|
+
* Install a tech stack profile into a target directory.
|
|
31
|
+
*
|
|
32
|
+
* Copies hooks from profiles/<name>/hooks/ to .claude/hooks/
|
|
33
|
+
* Agents are listed in agents.txt — consumers can install them via installAgents()
|
|
34
|
+
* Gates are returned for the caller to append to preflight config
|
|
35
|
+
*
|
|
36
|
+
* Returns install results, gates config, and agent list.
|
|
37
|
+
*/
|
|
38
|
+
export declare function installProfile(profileName: string, targetDir: string, dryRun: boolean): ProfileInstallResult;
|
|
39
|
+
//# sourceMappingURL=profiles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/profiles.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,OAAO,GAAG,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,cAAc,EAAE,cAAc,EAAE,CAAC;IACjC,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AASD;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAQ3C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,EAAE,CAatE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAW/D;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,OAAO,GACd,oBAAoB,CA6EtB"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { parse as parseYaml } from 'yaml';
|
|
4
|
+
import { PKG_ROOT } from '../../utils.js';
|
|
5
|
+
/**
|
|
6
|
+
* Validate a profile name to prevent path traversal.
|
|
7
|
+
*/
|
|
8
|
+
function isValidProfileName(name) {
|
|
9
|
+
return /^[a-z0-9][a-z0-9-]*$/.test(name);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* List available tech stack profiles (directories in profiles/ that have gates.yaml or hooks/).
|
|
13
|
+
* These are distinct from the flat .json profiles used by `reagent init --profile`.
|
|
14
|
+
*/
|
|
15
|
+
export function listTechProfiles() {
|
|
16
|
+
const profilesDir = path.join(PKG_ROOT, 'profiles');
|
|
17
|
+
if (!fs.existsSync(profilesDir))
|
|
18
|
+
return [];
|
|
19
|
+
return fs
|
|
20
|
+
.readdirSync(profilesDir, { withFileTypes: true })
|
|
21
|
+
.filter((e) => e.isDirectory() && isValidProfileName(e.name))
|
|
22
|
+
.map((e) => e.name);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Read gates.yaml from a profile directory.
|
|
26
|
+
*/
|
|
27
|
+
export function readProfileGates(profileName) {
|
|
28
|
+
if (!isValidProfileName(profileName))
|
|
29
|
+
return [];
|
|
30
|
+
const gatesPath = path.join(PKG_ROOT, 'profiles', profileName, 'gates.yaml');
|
|
31
|
+
if (!fs.existsSync(gatesPath))
|
|
32
|
+
return [];
|
|
33
|
+
try {
|
|
34
|
+
const raw = fs.readFileSync(gatesPath, 'utf8');
|
|
35
|
+
const parsed = parseYaml(raw);
|
|
36
|
+
return Array.isArray(parsed?.gates) ? parsed.gates : [];
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Read agents.txt from a profile directory.
|
|
44
|
+
*/
|
|
45
|
+
export function readProfileAgents(profileName) {
|
|
46
|
+
if (!isValidProfileName(profileName))
|
|
47
|
+
return [];
|
|
48
|
+
const agentsPath = path.join(PKG_ROOT, 'profiles', profileName, 'agents.txt');
|
|
49
|
+
if (!fs.existsSync(agentsPath))
|
|
50
|
+
return [];
|
|
51
|
+
return fs
|
|
52
|
+
.readFileSync(agentsPath, 'utf8')
|
|
53
|
+
.split('\n')
|
|
54
|
+
.map((l) => l.trim())
|
|
55
|
+
.filter(Boolean);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Install a tech stack profile into a target directory.
|
|
59
|
+
*
|
|
60
|
+
* Copies hooks from profiles/<name>/hooks/ to .claude/hooks/
|
|
61
|
+
* Agents are listed in agents.txt — consumers can install them via installAgents()
|
|
62
|
+
* Gates are returned for the caller to append to preflight config
|
|
63
|
+
*
|
|
64
|
+
* Returns install results, gates config, and agent list.
|
|
65
|
+
*/
|
|
66
|
+
export function installProfile(profileName, targetDir, dryRun) {
|
|
67
|
+
const results = [];
|
|
68
|
+
// Security: validate profile name
|
|
69
|
+
if (!isValidProfileName(profileName)) {
|
|
70
|
+
return {
|
|
71
|
+
results: [
|
|
72
|
+
{
|
|
73
|
+
file: `profiles/${profileName}`,
|
|
74
|
+
status: 'warn',
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
gatesInstalled: [],
|
|
78
|
+
agentsInstalled: [],
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
const profilesDir = path.join(PKG_ROOT, 'profiles');
|
|
82
|
+
const profileDir = path.resolve(profilesDir, profileName);
|
|
83
|
+
// Security: ensure no path traversal
|
|
84
|
+
if (!profileDir.startsWith(profilesDir + path.sep)) {
|
|
85
|
+
return {
|
|
86
|
+
results: [{ file: `profiles/${profileName}`, status: 'warn' }],
|
|
87
|
+
gatesInstalled: [],
|
|
88
|
+
agentsInstalled: [],
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
if (!fs.existsSync(profileDir)) {
|
|
92
|
+
const available = listTechProfiles();
|
|
93
|
+
results.push({
|
|
94
|
+
file: `profiles/${profileName} (not found — available: ${available.join(', ')})`,
|
|
95
|
+
status: 'warn',
|
|
96
|
+
});
|
|
97
|
+
return { results, gatesInstalled: [], agentsInstalled: [] };
|
|
98
|
+
}
|
|
99
|
+
// Install hooks
|
|
100
|
+
const hooksDir = path.join(profileDir, 'hooks');
|
|
101
|
+
if (fs.existsSync(hooksDir)) {
|
|
102
|
+
const destHooksDir = path.join(targetDir, '.claude', 'hooks');
|
|
103
|
+
if (!dryRun) {
|
|
104
|
+
fs.mkdirSync(destHooksDir, { recursive: true });
|
|
105
|
+
}
|
|
106
|
+
const hookFiles = fs.readdirSync(hooksDir).filter((f) => f.endsWith('.sh'));
|
|
107
|
+
for (const hookFile of hookFiles) {
|
|
108
|
+
const srcPath = path.join(hooksDir, hookFile);
|
|
109
|
+
const destPath = path.join(destHooksDir, hookFile);
|
|
110
|
+
const relPath = `.claude/hooks/${hookFile}`;
|
|
111
|
+
const srcContent = fs.readFileSync(srcPath, 'utf8');
|
|
112
|
+
const exists = fs.existsSync(destPath);
|
|
113
|
+
const same = exists && fs.readFileSync(destPath, 'utf8') === srcContent;
|
|
114
|
+
if (!same && !dryRun) {
|
|
115
|
+
fs.writeFileSync(destPath, srcContent, 'utf8');
|
|
116
|
+
fs.chmodSync(destPath, 0o755);
|
|
117
|
+
}
|
|
118
|
+
results.push({
|
|
119
|
+
file: relPath,
|
|
120
|
+
status: same ? 'skipped' : exists ? 'updated' : 'installed',
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const gates = readProfileGates(profileName);
|
|
125
|
+
const agents = readProfileAgents(profileName);
|
|
126
|
+
return {
|
|
127
|
+
results,
|
|
128
|
+
gatesInstalled: gates,
|
|
129
|
+
agentsInstalled: agents,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=profiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/profiles.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
@@ -6,6 +6,7 @@ import { runFreeze } from './commands/freeze.js';
|
|
|
6
6
|
import { runUnfreeze } from './commands/unfreeze.js';
|
|
7
7
|
import { runServe } from './commands/serve.js';
|
|
8
8
|
import { runCache } from './commands/cache.js';
|
|
9
|
+
import { runCatalyze } from './commands/catalyze/index.js';
|
|
9
10
|
const [, , cmd, ...rest] = process.argv;
|
|
10
11
|
if (!cmd || cmd === 'help' || cmd === '--help' || cmd === '-h') {
|
|
11
12
|
printHelp();
|
|
@@ -30,6 +31,9 @@ switch (cmd) {
|
|
|
30
31
|
case 'cache':
|
|
31
32
|
runCache(rest);
|
|
32
33
|
break;
|
|
34
|
+
case 'catalyze':
|
|
35
|
+
runCatalyze(rest);
|
|
36
|
+
break;
|
|
33
37
|
default:
|
|
34
38
|
console.error(`\nUnknown command: ${cmd}`);
|
|
35
39
|
printHelp();
|
|
@@ -45,6 +49,7 @@ Usage:
|
|
|
45
49
|
|
|
46
50
|
Commands:
|
|
47
51
|
init Install reagent config into the current directory
|
|
52
|
+
catalyze Analyze project stack and generate gap analysis + improvement plan
|
|
48
53
|
check Check what reagent components are installed
|
|
49
54
|
freeze Create .reagent/HALT to suspend all agent operations
|
|
50
55
|
unfreeze Remove .reagent/HALT to resume agent operations
|
|
@@ -55,18 +60,39 @@ Commands:
|
|
|
55
60
|
Options for init:
|
|
56
61
|
--profile <name> Profile to install (default: client-engagement)
|
|
57
62
|
--dry-run Preview what would be installed without writing files
|
|
63
|
+
--discord Configure Discord notifications in gateway.yaml
|
|
64
|
+
--guild-id <id> Discord guild ID (used with --discord)
|
|
65
|
+
--alerts-channel Discord channel ID for security alerts
|
|
66
|
+
--tasks-channel Discord channel ID for task events
|
|
67
|
+
--releases-channel Discord channel ID for release events
|
|
68
|
+
--dev-channel Discord channel ID for dev activity
|
|
69
|
+
|
|
70
|
+
Options for catalyze [targetDir]:
|
|
71
|
+
--plan Analyze stack and generate report (default)
|
|
72
|
+
--audit Compare current state against last plan and show drift
|
|
73
|
+
--dry-run Print analysis without writing files
|
|
58
74
|
|
|
59
75
|
Options for freeze:
|
|
60
76
|
--reason <text> Reason for freeze (stored in HALT file)
|
|
61
77
|
|
|
62
|
-
Available profiles:
|
|
78
|
+
Available base profiles:
|
|
63
79
|
client-engagement Zero-trust setup for client engagements (default)
|
|
64
80
|
bst-internal BST internal project setup
|
|
65
81
|
|
|
82
|
+
Available tech stack profiles (via --profile):
|
|
83
|
+
astro Astro framework hooks and gates
|
|
84
|
+
nextjs Next.js App Router hooks and gates
|
|
85
|
+
lit-wc Lit/Web Components hooks and gates
|
|
86
|
+
drupal Drupal CMS hooks and gates
|
|
87
|
+
|
|
66
88
|
Examples:
|
|
67
89
|
npx @bookedsolid/reagent init
|
|
68
90
|
npx @bookedsolid/reagent init --profile bst-internal
|
|
91
|
+
npx @bookedsolid/reagent init --profile lit-wc
|
|
69
92
|
npx @bookedsolid/reagent init --dry-run
|
|
93
|
+
npx @bookedsolid/reagent catalyze
|
|
94
|
+
npx @bookedsolid/reagent catalyze --audit
|
|
95
|
+
npx @bookedsolid/reagent catalyze --dry-run
|
|
70
96
|
npx @bookedsolid/reagent check
|
|
71
97
|
npx @bookedsolid/reagent freeze --reason "security incident"
|
|
72
98
|
npx @bookedsolid/reagent unfreeze
|
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;
|
|
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;AAE3D,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;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuDlC,CAAC,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native-tools.d.ts","sourceRoot":"","sources":["../../src/gateway/native-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"native-tools.d.ts","sourceRoot":"","sources":["../../src/gateway/native-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,OAAO,KAAK,EAAE,UAAU,EAAqB,MAAM,uBAAuB,CAAC;AAI3E;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,SAAS,EAClB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,UAAU,EAAE,GACxB,MAAM,CAyTR"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { TaskStore } from '../pm/task-store.js';
|
|
3
3
|
import { GitHubBridge } from '../pm/github-bridge.js';
|
|
4
|
+
import { DiscordNotifier } from '../pm/discord-notifier.js';
|
|
4
5
|
import { executeChain } from './middleware/chain.js';
|
|
5
6
|
import { InvocationStatus } from '../types/index.js';
|
|
6
7
|
/**
|
|
@@ -10,6 +11,7 @@ import { InvocationStatus } from '../types/index.js';
|
|
|
10
11
|
export function registerNativeTools(gateway, baseDir, middlewares) {
|
|
11
12
|
const store = new TaskStore(baseDir);
|
|
12
13
|
const bridge = new GitHubBridge({ baseDir });
|
|
14
|
+
const discord = new DiscordNotifier(baseDir);
|
|
13
15
|
let count = 0;
|
|
14
16
|
function wrapHandler(toolName, handler) {
|
|
15
17
|
return async (params) => {
|
|
@@ -222,6 +224,29 @@ export function registerNativeTools(gateway, baseDir, middlewares) {
|
|
|
222
224
|
return bridge.syncToProject();
|
|
223
225
|
}));
|
|
224
226
|
count++;
|
|
227
|
+
// ── discord_notify ───────────────────────────────────────────────────
|
|
228
|
+
gateway.tool('discord_notify', 'Send a notification to a configured Discord channel. Requires discord_ops to be enabled in .reagent/gateway.yaml and DISCORD_BOT_TOKEN env var.', {
|
|
229
|
+
channel: z
|
|
230
|
+
.enum(['alerts', 'releases', 'tasks', 'dev'])
|
|
231
|
+
.describe('Target channel key from discord_ops.channels config'),
|
|
232
|
+
message: z.string().describe('Message content to send'),
|
|
233
|
+
title: z.string().optional().describe('Optional bold title prepended to the message'),
|
|
234
|
+
}, wrapHandler('discord_notify', (args) => {
|
|
235
|
+
if (!discord.isEnabled()) {
|
|
236
|
+
return {
|
|
237
|
+
error: 'Discord notifications are not enabled. Set discord_ops.enabled: true in .reagent/gateway.yaml and set DISCORD_BOT_TOKEN.',
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
const channel = args.channel;
|
|
241
|
+
const message = args.message;
|
|
242
|
+
const title = args.title;
|
|
243
|
+
// Fire-and-forget — discord_notify is advisory, never blocks
|
|
244
|
+
void discord.notifyAuditAlert(title ? `**${title}**\n${message}` : message).catch(() => {
|
|
245
|
+
// Fail silently
|
|
246
|
+
});
|
|
247
|
+
return { sent: true, channel, note: 'Notification dispatched (best-effort)' };
|
|
248
|
+
}));
|
|
249
|
+
count++;
|
|
225
250
|
console.error(`[reagent] Registered ${count} native tools`);
|
|
226
251
|
return count;
|
|
227
252
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native-tools.js","sourceRoot":"","sources":["../../src/gateway/native-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"native-tools.js","sourceRoot":"","sources":["../../src/gateway/native-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { TaskView } from './types.js';
|
|
2
|
+
export interface DiscordOpsConfig {
|
|
3
|
+
enabled: boolean;
|
|
4
|
+
guild_id: string;
|
|
5
|
+
channels: {
|
|
6
|
+
alerts?: string;
|
|
7
|
+
releases?: string;
|
|
8
|
+
tasks?: string;
|
|
9
|
+
dev?: string;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export interface DiscordGatewayYaml {
|
|
13
|
+
discord_ops?: DiscordOpsConfig;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Load discord_ops config from .reagent/gateway.yaml.
|
|
17
|
+
* Returns null if not configured or disabled.
|
|
18
|
+
*/
|
|
19
|
+
export declare function loadDiscordConfig(baseDir: string): DiscordOpsConfig | null;
|
|
20
|
+
/**
|
|
21
|
+
* Discord notifier — sends structured notifications to configured channels.
|
|
22
|
+
* All methods fail silently when Discord is not configured or unavailable.
|
|
23
|
+
*/
|
|
24
|
+
export declare class DiscordNotifier {
|
|
25
|
+
private readonly config;
|
|
26
|
+
constructor(baseDir: string);
|
|
27
|
+
/**
|
|
28
|
+
* Check whether Discord notifications are enabled.
|
|
29
|
+
*/
|
|
30
|
+
isEnabled(): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Notify Discord that a task was created.
|
|
33
|
+
*/
|
|
34
|
+
notifyTaskCreated(task: TaskView): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Notify Discord that a task was completed.
|
|
37
|
+
*/
|
|
38
|
+
notifyTaskCompleted(task: TaskView): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Notify Discord that a hook blocked an action.
|
|
41
|
+
*/
|
|
42
|
+
notifyHookBlocked(hookName: string, tool: string, reason: string): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Notify Discord of a release.
|
|
45
|
+
*/
|
|
46
|
+
notifyRelease(version: string, changelog: string): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Notify Discord of a security/audit alert.
|
|
49
|
+
*/
|
|
50
|
+
notifyAuditAlert(message: string): Promise<void>;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=discord-notifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discord-notifier.d.ts","sourceRoot":"","sources":["../../src/pm/discord-notifier.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE;QACR,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAChC;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAe1E;AA0CD;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;gBAErC,OAAO,EAAE,MAAM;IAI3B;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACG,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAStD;;OAEG;IACG,mBAAmB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAMxD;;OAEG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMtF;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOtE;;OAEG;IACG,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAIvD"}
|