@bookedsolid/reagent 0.4.0 → 0.6.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.
Files changed (104) hide show
  1. package/README.md +407 -54
  2. package/agents/product-owner.md +44 -0
  3. package/commands/plan-work.md +19 -0
  4. package/commands/tasks.md +26 -0
  5. package/dist/cli/commands/cache.d.ts +2 -0
  6. package/dist/cli/commands/cache.d.ts.map +1 -0
  7. package/dist/cli/commands/cache.js +114 -0
  8. package/dist/cli/commands/cache.js.map +1 -0
  9. package/dist/cli/commands/init/agents.d.ts +3 -0
  10. package/dist/cli/commands/init/agents.d.ts.map +1 -0
  11. package/dist/cli/commands/init/agents.js +47 -0
  12. package/dist/cli/commands/init/agents.js.map +1 -0
  13. package/dist/cli/commands/init/claude-hooks.d.ts +3 -0
  14. package/dist/cli/commands/init/claude-hooks.d.ts.map +1 -0
  15. package/dist/cli/commands/init/claude-hooks.js +134 -0
  16. package/dist/cli/commands/init/claude-hooks.js.map +1 -0
  17. package/dist/cli/commands/init/claude-md.d.ts +3 -0
  18. package/dist/cli/commands/init/claude-md.d.ts.map +1 -0
  19. package/dist/cli/commands/init/claude-md.js +52 -0
  20. package/dist/cli/commands/init/claude-md.js.map +1 -0
  21. package/dist/cli/commands/init/commands.d.ts +3 -0
  22. package/dist/cli/commands/init/commands.d.ts.map +1 -0
  23. package/dist/cli/commands/init/commands.js +31 -0
  24. package/dist/cli/commands/init/commands.js.map +1 -0
  25. package/dist/cli/commands/init/cursor-rules.d.ts +3 -0
  26. package/dist/cli/commands/init/cursor-rules.d.ts.map +1 -0
  27. package/dist/cli/commands/init/cursor-rules.js +30 -0
  28. package/dist/cli/commands/init/cursor-rules.js.map +1 -0
  29. package/dist/cli/commands/init/gateway-config.d.ts +3 -0
  30. package/dist/cli/commands/init/gateway-config.d.ts.map +1 -0
  31. package/dist/cli/commands/init/gateway-config.js +51 -0
  32. package/dist/cli/commands/init/gateway-config.js.map +1 -0
  33. package/dist/cli/commands/init/github.d.ts +13 -0
  34. package/dist/cli/commands/init/github.d.ts.map +1 -0
  35. package/dist/cli/commands/init/github.js +81 -0
  36. package/dist/cli/commands/init/github.js.map +1 -0
  37. package/dist/cli/commands/init/gitignore.d.ts +3 -0
  38. package/dist/cli/commands/init/gitignore.d.ts.map +1 -0
  39. package/dist/cli/commands/init/gitignore.js +20 -0
  40. package/dist/cli/commands/init/gitignore.js.map +1 -0
  41. package/dist/cli/commands/init/husky-hooks.d.ts +3 -0
  42. package/dist/cli/commands/init/husky-hooks.d.ts.map +1 -0
  43. package/dist/cli/commands/init/husky-hooks.js +73 -0
  44. package/dist/cli/commands/init/husky-hooks.js.map +1 -0
  45. package/dist/cli/commands/{init.d.ts → init/index.d.ts} +1 -1
  46. package/dist/cli/commands/init/index.d.ts.map +1 -0
  47. package/dist/cli/commands/init/index.js +132 -0
  48. package/dist/cli/commands/init/index.js.map +1 -0
  49. package/dist/cli/commands/init/pm.d.ts +9 -0
  50. package/dist/cli/commands/init/pm.d.ts.map +1 -0
  51. package/dist/cli/commands/init/pm.js +40 -0
  52. package/dist/cli/commands/init/pm.js.map +1 -0
  53. package/dist/cli/commands/init/policy.d.ts +3 -0
  54. package/dist/cli/commands/init/policy.d.ts.map +1 -0
  55. package/dist/cli/commands/init/policy.js +61 -0
  56. package/dist/cli/commands/init/policy.js.map +1 -0
  57. package/dist/cli/commands/init/types.d.ts +29 -0
  58. package/dist/cli/commands/init/types.d.ts.map +1 -0
  59. package/dist/cli/commands/init/types.js +2 -0
  60. package/dist/cli/commands/init/types.js.map +1 -0
  61. package/dist/cli/index.js +6 -1
  62. package/dist/cli/index.js.map +1 -1
  63. package/dist/gateway/native-tools.d.ts +8 -0
  64. package/dist/gateway/native-tools.d.ts.map +1 -0
  65. package/dist/gateway/native-tools.js +228 -0
  66. package/dist/gateway/native-tools.js.map +1 -0
  67. package/dist/gateway/server.d.ts.map +1 -1
  68. package/dist/gateway/server.js +7 -3
  69. package/dist/gateway/server.js.map +1 -1
  70. package/dist/pm/github-bridge.d.ts +71 -0
  71. package/dist/pm/github-bridge.d.ts.map +1 -0
  72. package/dist/pm/github-bridge.js +323 -0
  73. package/dist/pm/github-bridge.js.map +1 -0
  74. package/dist/pm/task-store.d.ts +39 -0
  75. package/dist/pm/task-store.d.ts.map +1 -0
  76. package/dist/pm/task-store.js +189 -0
  77. package/dist/pm/task-store.js.map +1 -0
  78. package/dist/pm/types.d.ts +70 -0
  79. package/dist/pm/types.d.ts.map +1 -0
  80. package/dist/pm/types.js +22 -0
  81. package/dist/pm/types.js.map +1 -0
  82. package/hooks/_lib/common.sh +87 -0
  83. package/hooks/architecture-review-gate.sh +84 -0
  84. package/hooks/blocked-paths-enforcer.sh +169 -0
  85. package/hooks/ci-config-protection.sh +84 -0
  86. package/hooks/commit-review-gate.sh +131 -0
  87. package/hooks/dangerous-bash-interceptor.sh +32 -0
  88. package/hooks/dependency-audit-gate.sh +118 -0
  89. package/hooks/file-size-guard.sh +64 -0
  90. package/hooks/git-config-guard.sh +81 -0
  91. package/hooks/import-guard.sh +99 -0
  92. package/hooks/network-exfil-guard.sh +118 -0
  93. package/hooks/output-validation.sh +101 -0
  94. package/hooks/push-review-gate.sh +105 -0
  95. package/hooks/rate-limit-guard.sh +75 -0
  96. package/hooks/settings-protection.sh +145 -0
  97. package/hooks/symlink-guard.sh +96 -0
  98. package/hooks/task-link-gate.sh +70 -0
  99. package/package.json +1 -1
  100. package/profiles/bst-internal.json +20 -3
  101. package/profiles/client-engagement.json +20 -3
  102. package/dist/cli/commands/init.d.ts.map +0 -1
  103. package/dist/cli/commands/init.js +0 -560
  104. package/dist/cli/commands/init.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/github.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA0BhD,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,aAAa,EAAE,CA4DzE"}
@@ -0,0 +1,81 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { GitHubBridge } from '../../../pm/github-bridge.js';
3
+ const DEFAULT_LABELS = [
4
+ { name: 'reagent:task', color: '0075ca', description: 'Tracked by reagent' },
5
+ { name: 'reagent:critical', color: 'd73a4a', description: 'Critical priority reagent task' },
6
+ { name: 'reagent:blocked', color: 'e4e669', description: 'Blocked reagent task' },
7
+ ];
8
+ const DEFAULT_TOPICS = ['reagent', 'ai-governance', 'claude-code'];
9
+ /**
10
+ * Check whether gh auth is available and authenticated.
11
+ */
12
+ function isGhAvailable() {
13
+ try {
14
+ execFileSync('gh', ['auth', 'status'], {
15
+ encoding: 'utf8',
16
+ timeout: 5000,
17
+ stdio: 'pipe',
18
+ });
19
+ return true;
20
+ }
21
+ catch {
22
+ return false;
23
+ }
24
+ }
25
+ /**
26
+ * Install GitHub repo scaffolding: labels, topics, description.
27
+ * Skips gracefully if gh CLI is not available or not authenticated.
28
+ */
29
+ export function installGitHub(options) {
30
+ const { targetDir, description, topics, dryRun = false } = options;
31
+ const results = [];
32
+ // Graceful skip if gh CLI not available
33
+ if (!isGhAvailable()) {
34
+ results.push({
35
+ file: 'GitHub repo scaffold (gh CLI not available — skipped)',
36
+ status: 'skipped',
37
+ });
38
+ return results;
39
+ }
40
+ if (dryRun) {
41
+ results.push({
42
+ file: 'GitHub: labels (reagent:task, reagent:critical, reagent:blocked)',
43
+ status: 'installed',
44
+ });
45
+ results.push({
46
+ file: 'GitHub: topics (reagent, ai-governance, claude-code)',
47
+ status: 'installed',
48
+ });
49
+ if (description) {
50
+ results.push({ file: 'GitHub: description', status: 'installed' });
51
+ }
52
+ return results;
53
+ }
54
+ const bridge = new GitHubBridge({ baseDir: targetDir });
55
+ const allTopics = [...DEFAULT_TOPICS, ...(topics ?? [])];
56
+ const scaffoldResult = bridge.scaffoldRepo({
57
+ description,
58
+ topics: allTopics,
59
+ labels: DEFAULT_LABELS,
60
+ });
61
+ // Report label results
62
+ for (const label of scaffoldResult.labels_created) {
63
+ results.push({ file: `GitHub label: ${label}`, status: 'installed' });
64
+ }
65
+ for (const label of scaffoldResult.labels_skipped) {
66
+ results.push({ file: `GitHub label: ${label}`, status: 'skipped' });
67
+ }
68
+ // Report topic results
69
+ for (const topic of scaffoldResult.topics_added) {
70
+ results.push({ file: `GitHub topic: ${topic}`, status: 'installed' });
71
+ }
72
+ // Report description
73
+ if (scaffoldResult.description_set) {
74
+ results.push({ file: 'GitHub: description set', status: 'installed' });
75
+ }
76
+ if (results.length === 0) {
77
+ results.push({ file: 'GitHub repo scaffold (nothing to change)', status: 'skipped' });
78
+ }
79
+ return results;
80
+ }
81
+ //# sourceMappingURL=github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/github.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { InstallResult } from './types.js';
2
+ export declare function installGitignoreEntries(targetDir: string, entries: string[], dryRun: boolean): InstallResult[];
3
+ //# sourceMappingURL=gitignore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitignore.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/gitignore.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,EAAE,OAAO,GACd,aAAa,EAAE,CAkBjB"}
@@ -0,0 +1,20 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { gitignoreHasEntry } from '../../utils.js';
4
+ export function installGitignoreEntries(targetDir, entries, dryRun) {
5
+ const gitignorePath = path.join(targetDir, '.gitignore');
6
+ const missing = entries.filter((e) => !gitignoreHasEntry(targetDir, e));
7
+ if (!missing.length) {
8
+ return [{ file: '.gitignore', status: 'skipped' }];
9
+ }
10
+ if (!dryRun) {
11
+ const additions = [
12
+ '',
13
+ '# reagent — AI tooling (stays on developer machine, not committed)',
14
+ ...missing,
15
+ ].join('\n');
16
+ fs.appendFileSync(gitignorePath, additions + '\n');
17
+ }
18
+ return [{ file: `.gitignore (+${missing.length} entries)`, status: 'updated' }];
19
+ }
20
+ //# sourceMappingURL=gitignore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitignore.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/gitignore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGnD,MAAM,UAAU,uBAAuB,CACrC,SAAiB,EACjB,OAAiB,EACjB,MAAe;IAEf,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;IAExE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,SAAS,GAAG;YAChB,EAAE;YACF,oEAAoE;YACpE,GAAG,OAAO;SACX,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,EAAE,CAAC,cAAc,CAAC,aAAa,EAAE,SAAS,GAAG,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,CAAC,EAAE,IAAI,EAAE,gBAAgB,OAAO,CAAC,MAAM,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;AAClF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { InstallResult } from './types.js';
2
+ export declare function installHuskyHook(targetDir: string, hookName: string, srcFileName: string, dryRun: boolean): InstallResult[];
3
+ //# sourceMappingURL=husky-hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"husky-hooks.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/husky-hooks.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,OAAO,GACd,aAAa,EAAE,CA4EjB"}
@@ -0,0 +1,73 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { PKG_ROOT } from '../../utils.js';
4
+ export function installHuskyHook(targetDir, hookName, srcFileName, dryRun) {
5
+ const srcFile = path.join(PKG_ROOT, 'husky', srcFileName);
6
+ const huskyDir = path.join(targetDir, '.husky');
7
+ const huskyHook = path.join(huskyDir, hookName);
8
+ if (!fs.existsSync(srcFile)) {
9
+ console.error(` ERROR: husky hook source not found in package: husky/${srcFileName}`);
10
+ return [{ file: `.husky/${hookName}`, status: 'warn' }];
11
+ }
12
+ const srcContent = fs.readFileSync(srcFile, 'utf8');
13
+ const results = [];
14
+ if (!dryRun) {
15
+ fs.mkdirSync(huskyDir, { recursive: true });
16
+ }
17
+ const huskyExists = fs.existsSync(huskyHook);
18
+ const huskySame = huskyExists && fs.readFileSync(huskyHook, 'utf8') === srcContent;
19
+ if (!huskySame && !dryRun) {
20
+ fs.writeFileSync(huskyHook, srcContent, { mode: 0o755 });
21
+ }
22
+ results.push({
23
+ file: `.husky/${hookName}`,
24
+ status: huskySame ? 'skipped' : huskyExists ? 'updated' : 'installed',
25
+ });
26
+ // For commit-msg: also install to .git/hooks/ as fallback
27
+ if (hookName === 'commit-msg') {
28
+ const gitHooksDir = path.join(targetDir, '.git', 'hooks');
29
+ if (fs.existsSync(gitHooksDir)) {
30
+ const gitHook = path.join(gitHooksDir, hookName);
31
+ const gitHookExists = fs.existsSync(gitHook);
32
+ const gitHookSame = gitHookExists && fs.readFileSync(gitHook, 'utf8') === srcContent;
33
+ if (!gitHookSame && !dryRun) {
34
+ fs.writeFileSync(gitHook, srcContent, { mode: 0o755 });
35
+ }
36
+ results.push({
37
+ file: '.git/hooks/commit-msg (active git hook)',
38
+ status: gitHookSame ? 'skipped' : gitHookExists ? 'updated' : 'installed',
39
+ });
40
+ }
41
+ }
42
+ // Ensure package.json has husky devDependency and prepare script
43
+ if (hookName === 'commit-msg') {
44
+ const pkgJsonPath = path.join(targetDir, 'package.json');
45
+ if (fs.existsSync(pkgJsonPath) && !dryRun) {
46
+ try {
47
+ const pkg = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf8'));
48
+ const scripts = pkg.scripts || {};
49
+ let changed = false;
50
+ if (!scripts.prepare || !scripts.prepare.includes('husky')) {
51
+ scripts.prepare = scripts.prepare ? `${scripts.prepare} && husky` : 'husky';
52
+ pkg.scripts = scripts;
53
+ changed = true;
54
+ }
55
+ const devDeps = pkg.devDependencies || {};
56
+ if (!devDeps.husky) {
57
+ devDeps.husky = '^9.1.7';
58
+ pkg.devDependencies = devDeps;
59
+ changed = true;
60
+ }
61
+ if (changed) {
62
+ fs.writeFileSync(pkgJsonPath, JSON.stringify(pkg, null, 2) + '\n');
63
+ results.push({ file: 'package.json (added husky)', status: 'updated' });
64
+ }
65
+ }
66
+ catch (err) {
67
+ console.warn(` Warning: Could not update package.json: ${err.message}`);
68
+ }
69
+ }
70
+ }
71
+ return results;
72
+ }
73
+ //# sourceMappingURL=husky-hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"husky-hooks.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/husky-hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C,MAAM,UAAU,gBAAgB,CAC9B,SAAiB,EACjB,QAAgB,EAChB,WAAmB,EACnB,MAAe;IAEf,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEhD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,0DAA0D,WAAW,EAAE,CAAC,CAAC;QACvF,OAAO,CAAC,EAAE,IAAI,EAAE,UAAU,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACpD,MAAM,OAAO,GAAoB,EAAE,CAAC;IAEpC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,WAAW,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,WAAW,IAAI,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,UAAU,CAAC;IAEnF,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC;QAC1B,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,CAAC,IAAI,CAAC;QACX,IAAI,EAAE,UAAU,QAAQ,EAAE;QAC1B,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW;KACtE,CAAC,CAAC;IAEH,0DAA0D;IAC1D,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC9B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC1D,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YACjD,MAAM,aAAa,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAC7C,MAAM,WAAW,GAAG,aAAa,IAAI,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,UAAU,CAAC;YAErF,IAAI,CAAC,WAAW,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC5B,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACzD,CAAC;YACD,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,yCAAyC;gBAC/C,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW;aAC1E,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,iEAAiE;IACjE,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC9B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QACzD,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAC1C,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;gBAC7D,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;gBAClC,IAAI,OAAO,GAAG,KAAK,CAAC;gBACpB,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC3D,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC;oBAC5E,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;oBACtB,OAAO,GAAG,IAAI,CAAC;gBACjB,CAAC;gBACD,MAAM,OAAO,GAAG,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC;gBAC1C,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;oBACnB,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC;oBACzB,GAAG,CAAC,eAAe,GAAG,OAAO,CAAC;oBAC9B,OAAO,GAAG,IAAI,CAAC;gBACjB,CAAC;gBACD,IAAI,OAAO,EAAE,CAAC;oBACZ,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;oBACnE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,4BAA4B,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;gBAC1E,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,6CAA8C,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACtF,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -1,2 +1,2 @@
1
1
  export declare function runInit(args: string[]): void;
2
- //# sourceMappingURL=init.d.ts.map
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/index.ts"],"names":[],"mappings":"AAgBA,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAkJ5C"}
@@ -0,0 +1,132 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { PKG_ROOT, getPkgVersion, parseFlag } from '../../utils.js';
4
+ import { installGitignoreEntries } from './gitignore.js';
5
+ import { installCursorRules } from './cursor-rules.js';
6
+ import { installHuskyHook } from './husky-hooks.js';
7
+ import { installClaudeHooks } from './claude-hooks.js';
8
+ import { installClaudeMd } from './claude-md.js';
9
+ import { installPolicy } from './policy.js';
10
+ import { installGatewayConfig } from './gateway-config.js';
11
+ import { installAgents } from './agents.js';
12
+ import { installClaudeCommands } from './commands.js';
13
+ import { installPm } from './pm.js';
14
+ import { installGitHub } from './github.js';
15
+ export function runInit(args) {
16
+ const profileName = parseFlag(args, '--profile') || 'client-engagement';
17
+ const targetDir = process.cwd();
18
+ const dryRun = args.includes('--dry-run');
19
+ const withGitHub = args.includes('--github');
20
+ const PKG_VERSION = getPkgVersion();
21
+ console.log(`\n@bookedsolid/reagent v${PKG_VERSION} init`);
22
+ console.log(` Profile: ${profileName}`);
23
+ console.log(` Target: ${targetDir}`);
24
+ if (dryRun)
25
+ console.log(` Mode: dry-run (no changes written)`);
26
+ console.log('');
27
+ // Load profile — validate name to prevent path traversal
28
+ if (!/^[a-z0-9][a-z0-9-]*$/.test(profileName)) {
29
+ console.error(`Invalid profile name: "${profileName}" (only lowercase letters, numbers, hyphens allowed)`);
30
+ process.exit(1);
31
+ }
32
+ const profilesDir = path.join(PKG_ROOT, 'profiles');
33
+ const profilePath = path.resolve(profilesDir, `${profileName}.json`);
34
+ if (!profilePath.startsWith(profilesDir + path.sep)) {
35
+ console.error(`Invalid profile name: "${profileName}" (path traversal detected)`);
36
+ process.exit(1);
37
+ }
38
+ if (!fs.existsSync(profilePath)) {
39
+ const available = fs
40
+ .readdirSync(path.join(PKG_ROOT, 'profiles'))
41
+ .filter((f) => f.endsWith('.json'))
42
+ .map((f) => f.replace('.json', ''));
43
+ console.error(`Profile not found: ${profileName}`);
44
+ console.error(`Available profiles: ${available.join(', ')}`);
45
+ process.exit(1);
46
+ }
47
+ const profile = JSON.parse(fs.readFileSync(profilePath, 'utf8'));
48
+ const results = [];
49
+ // Step 1: .gitignore entries
50
+ if (profile.gitignoreEntries?.length) {
51
+ results.push(...installGitignoreEntries(targetDir, profile.gitignoreEntries, dryRun));
52
+ }
53
+ // Step 2: Cursor rules
54
+ if (profile.cursorRules?.length) {
55
+ results.push(...installCursorRules(targetDir, profile.cursorRules, dryRun));
56
+ }
57
+ // Step 3-5: Husky hooks
58
+ if (profile.huskyCommitMsg) {
59
+ results.push(...installHuskyHook(targetDir, 'commit-msg', 'commit-msg.sh', dryRun));
60
+ }
61
+ if (profile.huskyPreCommit) {
62
+ results.push(...installHuskyHook(targetDir, 'pre-commit', 'pre-commit.sh', dryRun));
63
+ }
64
+ if (profile.huskyPrePush) {
65
+ results.push(...installHuskyHook(targetDir, 'pre-push', 'pre-push.sh', dryRun));
66
+ }
67
+ // Step 6: Claude hooks
68
+ if (profile.claudeHooks) {
69
+ results.push(...installClaudeHooks(targetDir, profile.claudeHooks, dryRun));
70
+ }
71
+ // Step 7: CLAUDE.md
72
+ if (profile.claudeMd) {
73
+ results.push(...installClaudeMd(targetDir, profile.claudeMd, dryRun));
74
+ }
75
+ // Step 8: Policy
76
+ results.push(...installPolicy(targetDir, profileName, profile, dryRun));
77
+ // Step 9: Gateway config
78
+ results.push(...installGatewayConfig(targetDir, dryRun));
79
+ // Step 10: Agent team
80
+ results.push(...installAgents(targetDir, dryRun));
81
+ // Step 11: Claude commands
82
+ results.push(...installClaudeCommands(targetDir, dryRun));
83
+ // Step 12: Project management
84
+ results.push(...installPm(targetDir, profile.pm, dryRun));
85
+ // Step 13: GitHub repo scaffold (opt-in via --github flag)
86
+ if (withGitHub) {
87
+ const description = typeof profile.description === 'string' ? profile.description : undefined;
88
+ results.push(...installGitHub({
89
+ targetDir,
90
+ description,
91
+ dryRun,
92
+ }));
93
+ }
94
+ // Summary
95
+ console.log('');
96
+ const installed = results.filter((r) => r.status === 'installed');
97
+ const updated = results.filter((r) => r.status === 'updated');
98
+ const skipped = results.filter((r) => r.status === 'skipped');
99
+ const warned = results.filter((r) => r.status === 'warn');
100
+ if (installed.length) {
101
+ console.log('Installed:');
102
+ installed.forEach((r) => console.log(` + ${r.file}`));
103
+ }
104
+ if (updated.length) {
105
+ console.log('Updated:');
106
+ updated.forEach((r) => console.log(` ~ ${r.file}`));
107
+ }
108
+ if (skipped.length) {
109
+ console.log('Already up-to-date:');
110
+ skipped.forEach((r) => console.log(` = ${r.file}`));
111
+ }
112
+ if (warned.length) {
113
+ console.log('Warnings:');
114
+ warned.forEach((r) => console.log(` ! ${r.file}`));
115
+ }
116
+ if (!dryRun) {
117
+ console.log('\n✓ reagent init complete');
118
+ console.log('\nCommit these files (safe to commit):');
119
+ 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"');
120
+ console.log('');
121
+ console.log('Do NOT commit (gitignored — stays on your machine):');
122
+ console.log(' .claude/hooks/');
123
+ console.log(' .claude/settings.json');
124
+ console.log(' .claude/agents/');
125
+ console.log('');
126
+ console.log('Test kill switch:');
127
+ console.log(' reagent freeze --reason "testing"');
128
+ console.log(' reagent unfreeze');
129
+ console.log('');
130
+ }
131
+ }
132
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { InstallResult } from './types.js';
2
+ interface PmConfig {
3
+ enabled?: boolean;
4
+ taskLinkGate?: boolean;
5
+ maxOpenTasks?: number;
6
+ }
7
+ export declare function installPm(targetDir: string, pmConfig: PmConfig | undefined, dryRun: boolean): InstallResult[];
8
+ export {};
9
+ //# sourceMappingURL=pm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pm.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/pm.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,UAAU,QAAQ;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,SAAS,CACvB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAC9B,MAAM,EAAE,OAAO,GACd,aAAa,EAAE,CAuCjB"}
@@ -0,0 +1,40 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { gitignoreHasEntry } from '../../utils.js';
4
+ export function installPm(targetDir, pmConfig, dryRun) {
5
+ if (!pmConfig?.enabled) {
6
+ return [];
7
+ }
8
+ const results = [];
9
+ const reagentDir = path.join(targetDir, '.reagent');
10
+ const tasksPath = path.join(reagentDir, 'tasks.jsonl');
11
+ // Scaffold empty tasks.jsonl
12
+ if (!fs.existsSync(tasksPath)) {
13
+ if (!dryRun) {
14
+ fs.mkdirSync(reagentDir, { recursive: true });
15
+ fs.writeFileSync(tasksPath, '', 'utf8');
16
+ }
17
+ results.push({ file: '.reagent/tasks.jsonl', status: 'installed' });
18
+ }
19
+ else {
20
+ results.push({ file: '.reagent/tasks.jsonl', status: 'skipped' });
21
+ }
22
+ // Add tasks.jsonl to .gitignore (it's local state, not committed)
23
+ const gitignorePath = path.join(targetDir, '.gitignore');
24
+ const entry = '.reagent/tasks.jsonl';
25
+ if (!gitignoreHasEntry(targetDir, entry)) {
26
+ if (!dryRun) {
27
+ fs.appendFileSync(gitignorePath, `\n# reagent task store (local state)\n${entry}\n`);
28
+ }
29
+ results.push({ file: `.gitignore (+${entry})`, status: 'updated' });
30
+ }
31
+ // Add tasks.lock to .gitignore
32
+ const lockEntry = '.reagent/tasks.lock';
33
+ if (!gitignoreHasEntry(targetDir, lockEntry)) {
34
+ if (!dryRun) {
35
+ fs.appendFileSync(gitignorePath, `${lockEntry}\n`);
36
+ }
37
+ }
38
+ return results;
39
+ }
40
+ //# sourceMappingURL=pm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pm.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/pm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AASnD,MAAM,UAAU,SAAS,CACvB,SAAiB,EACjB,QAA8B,EAC9B,MAAe;IAEf,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAEvD,6BAA6B;IAC7B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9C,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IACtE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,kEAAkE;IAClE,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACzD,MAAM,KAAK,GAAG,sBAAsB,CAAC;IACrC,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,EAAE,CAAC,cAAc,CAAC,aAAa,EAAE,yCAAyC,KAAK,IAAI,CAAC,CAAC;QACvF,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,KAAK,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,+BAA+B;IAC/B,MAAM,SAAS,GAAG,qBAAqB,CAAC;IACxC,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC;QAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,EAAE,CAAC,cAAc,CAAC,aAAa,EAAE,GAAG,SAAS,IAAI,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { InstallResult, ProfileConfig } from './types.js';
2
+ export declare function installPolicy(targetDir: string, profileName: string, profile: ProfileConfig, dryRun: boolean): InstallResult[];
3
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +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,GACd,aAAa,EAAE,CA2DjB"}
@@ -0,0 +1,61 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { getPkgVersion } from '../../utils.js';
4
+ export function installPolicy(targetDir, profileName, profile, dryRun) {
5
+ const PKG_VERSION = getPkgVersion();
6
+ const reagentDir = path.join(targetDir, '.reagent');
7
+ const policyPath = path.join(reagentDir, 'policy.yaml');
8
+ if (fs.existsSync(policyPath)) {
9
+ return [{ file: '.reagent/policy.yaml', status: 'skipped' }];
10
+ }
11
+ if (!dryRun) {
12
+ fs.mkdirSync(reagentDir, { recursive: true });
13
+ const now = new Date().toISOString();
14
+ const blockAttribution = profile.blockAiAttribution === true;
15
+ const blockedPaths = profile.blockedPaths ?? [
16
+ '.reagent/',
17
+ '.github/workflows/',
18
+ '.env',
19
+ '.env.*',
20
+ ];
21
+ const blockedPathsYaml = blockedPaths.length
22
+ ? '\n' + blockedPaths.map((p) => ` - "${p}"`).join('\n')
23
+ : ' []';
24
+ const content = `# .reagent/policy.yaml — generated by @bookedsolid/reagent v${PKG_VERSION}
25
+ # Commit this file. Edit autonomy_level and max_autonomy_level as needed.
26
+ # Run 'reagent freeze --reason "..."' to halt all agent operations.
27
+
28
+ version: "1"
29
+ profile: "${profileName}"
30
+ installed_by: "reagent@${PKG_VERSION}"
31
+ installed_at: "${now}"
32
+
33
+ # Autonomy levels:
34
+ # L0 — Read-only; every write requires explicit user approval
35
+ # L1 — Writes allowed to non-blocked paths; destructive operations blocked
36
+ # L2 — Writes + PR creation allowed; destructive tier blocked
37
+ # L3 — All writes allowed; advisory on anomalous patterns
38
+ autonomy_level: L1
39
+ max_autonomy_level: L2
40
+
41
+ # Human must approve any autonomy level increase
42
+ promotion_requires_human_approval: true
43
+
44
+ # Block AI attribution in commits and PRs (opt-in)
45
+ # When true, the commit-msg hook rejects commits containing AI attribution
46
+ # markers (Co-Authored-By, "Generated with [Tool]", etc.) and the
47
+ # attribution-advisory hook blocks gh pr create/edit commands with attribution.
48
+ # Casual mentions of AI tools in commit messages are still allowed.
49
+ block_ai_attribution: ${blockAttribution}
50
+
51
+ # Paths hooks and agents must never modify
52
+ blocked_paths:${blockedPathsYaml}
53
+
54
+ # Optional: Discord webhook for halt/promote notifications
55
+ notification_channel: ""
56
+ `;
57
+ fs.writeFileSync(policyPath, content, 'utf8');
58
+ }
59
+ return [{ file: '.reagent/policy.yaml', status: 'installed' }];
60
+ }
61
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +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;IAEf,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,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI;YAC3C,WAAW;YACX,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;yBACE,WAAW;iBACnB,GAAG;;;;;;;;;;;;;;;;;;wBAkBI,gBAAgB;;;gBAGxB,gBAAgB;;;;CAI/B,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"}
@@ -0,0 +1,29 @@
1
+ export interface InstallResult {
2
+ file: string;
3
+ status: 'installed' | 'updated' | 'skipped' | 'warn';
4
+ }
5
+ export interface HookEntry {
6
+ matcher: string;
7
+ hooks: string[];
8
+ }
9
+ export interface HooksConfig {
10
+ PreToolUse?: HookEntry[];
11
+ PostToolUse?: HookEntry[];
12
+ }
13
+ export interface ClaudeMdConfig {
14
+ preflightCmd?: string;
15
+ attributionRule?: string;
16
+ }
17
+ export interface ProfileConfig {
18
+ blockAiAttribution?: boolean;
19
+ blockedPaths?: string[];
20
+ gitignoreEntries?: string[];
21
+ cursorRules?: string[];
22
+ huskyCommitMsg?: boolean;
23
+ huskyPreCommit?: boolean;
24
+ huskyPrePush?: boolean;
25
+ claudeHooks?: HooksConfig;
26
+ claudeMd?: ClaudeMdConfig;
27
+ [key: string]: unknown;
28
+ }
29
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;CACtD;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,SAAS,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/types.ts"],"names":[],"mappings":""}
package/dist/cli/index.js CHANGED
@@ -1,10 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import { getPkgVersion } from './utils.js';
3
- import { runInit } from './commands/init.js';
3
+ import { runInit } from './commands/init/index.js';
4
4
  import { runCheck } from './commands/check.js';
5
5
  import { runFreeze } from './commands/freeze.js';
6
6
  import { runUnfreeze } from './commands/unfreeze.js';
7
7
  import { runServe } from './commands/serve.js';
8
+ import { runCache } from './commands/cache.js';
8
9
  const [, , cmd, ...rest] = process.argv;
9
10
  if (!cmd || cmd === 'help' || cmd === '--help' || cmd === '-h') {
10
11
  printHelp();
@@ -26,6 +27,9 @@ switch (cmd) {
26
27
  case 'serve':
27
28
  await runServe(rest);
28
29
  break;
30
+ case 'cache':
31
+ runCache(rest);
32
+ break;
29
33
  default:
30
34
  console.error(`\nUnknown command: ${cmd}`);
31
35
  printHelp();
@@ -45,6 +49,7 @@ Commands:
45
49
  freeze Create .reagent/HALT to suspend all agent operations
46
50
  unfreeze Remove .reagent/HALT to resume agent operations
47
51
  serve Start the MCP gateway server (stdio transport)
52
+ cache Manage review cache (check, set, clear)
48
53
  help Show this help
49
54
 
50
55
  Options for init:
@@ -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,oBAAoB,CAAC;AAC7C,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;AAE/C,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;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgClC,CAAC,CAAC;AACH,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;AAE/C,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;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiClC,CAAC,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { Middleware } from './middleware/chain.js';
3
+ /**
4
+ * Register first-party MCP tools (task management) on the gateway.
5
+ * These go through the same middleware chain as proxied tools.
6
+ */
7
+ export declare function registerNativeTools(gateway: McpServer, baseDir: string, middlewares: Middleware[]): number;
8
+ //# sourceMappingURL=native-tools.d.ts.map
@@ -0,0 +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;AAIzE,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,CAuRR"}