@bookedsolid/reagent 0.4.0 → 0.5.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 (92) 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/gitignore.d.ts +3 -0
  34. package/dist/cli/commands/init/gitignore.d.ts.map +1 -0
  35. package/dist/cli/commands/init/gitignore.js +20 -0
  36. package/dist/cli/commands/init/gitignore.js.map +1 -0
  37. package/dist/cli/commands/init/husky-hooks.d.ts +3 -0
  38. package/dist/cli/commands/init/husky-hooks.d.ts.map +1 -0
  39. package/dist/cli/commands/init/husky-hooks.js +73 -0
  40. package/dist/cli/commands/init/husky-hooks.js.map +1 -0
  41. package/dist/cli/commands/{init.d.ts → init/index.d.ts} +1 -1
  42. package/dist/cli/commands/init/index.d.ts.map +1 -0
  43. package/dist/cli/commands/init/index.js +121 -0
  44. package/dist/cli/commands/init/index.js.map +1 -0
  45. package/dist/cli/commands/init/pm.d.ts +9 -0
  46. package/dist/cli/commands/init/pm.d.ts.map +1 -0
  47. package/dist/cli/commands/init/pm.js +40 -0
  48. package/dist/cli/commands/init/pm.js.map +1 -0
  49. package/dist/cli/commands/init/policy.d.ts +3 -0
  50. package/dist/cli/commands/init/policy.d.ts.map +1 -0
  51. package/dist/cli/commands/init/policy.js +61 -0
  52. package/dist/cli/commands/init/policy.js.map +1 -0
  53. package/dist/cli/commands/init/types.d.ts +29 -0
  54. package/dist/cli/commands/init/types.d.ts.map +1 -0
  55. package/dist/cli/commands/init/types.js +2 -0
  56. package/dist/cli/commands/init/types.js.map +1 -0
  57. package/dist/cli/index.js +6 -1
  58. package/dist/cli/index.js.map +1 -1
  59. package/dist/gateway/native-tools.d.ts +8 -0
  60. package/dist/gateway/native-tools.d.ts.map +1 -0
  61. package/dist/gateway/native-tools.js +190 -0
  62. package/dist/gateway/native-tools.js.map +1 -0
  63. package/dist/gateway/server.d.ts.map +1 -1
  64. package/dist/gateway/server.js +7 -3
  65. package/dist/gateway/server.js.map +1 -1
  66. package/dist/pm/github-bridge.d.ts +36 -0
  67. package/dist/pm/github-bridge.d.ts.map +1 -0
  68. package/dist/pm/github-bridge.js +138 -0
  69. package/dist/pm/github-bridge.js.map +1 -0
  70. package/dist/pm/task-store.d.ts +39 -0
  71. package/dist/pm/task-store.d.ts.map +1 -0
  72. package/dist/pm/task-store.js +189 -0
  73. package/dist/pm/task-store.js.map +1 -0
  74. package/dist/pm/types.d.ts +70 -0
  75. package/dist/pm/types.d.ts.map +1 -0
  76. package/dist/pm/types.js +22 -0
  77. package/dist/pm/types.js.map +1 -0
  78. package/hooks/_lib/common.sh +87 -0
  79. package/hooks/architecture-review-gate.sh +84 -0
  80. package/hooks/blocked-paths-enforcer.sh +169 -0
  81. package/hooks/commit-review-gate.sh +131 -0
  82. package/hooks/dangerous-bash-interceptor.sh +32 -0
  83. package/hooks/dependency-audit-gate.sh +118 -0
  84. package/hooks/push-review-gate.sh +105 -0
  85. package/hooks/settings-protection.sh +145 -0
  86. package/hooks/task-link-gate.sh +70 -0
  87. package/package.json +1 -1
  88. package/profiles/bst-internal.json +20 -3
  89. package/profiles/client-engagement.json +20 -3
  90. package/dist/cli/commands/init.d.ts.map +0 -1
  91. package/dist/cli/commands/init.js +0 -560
  92. package/dist/cli/commands/init.js.map +0 -1
@@ -0,0 +1,19 @@
1
+ Invoke the product-owner agent to plan and propose tasks for a goal.
2
+
3
+ ## Instructions
4
+
5
+ 1. First, read `.reagent/tasks.jsonl` to understand the current backlog
6
+ 2. Ask the user what they want to accomplish (if not already provided as an argument)
7
+ 3. Spawn the `product-owner` agent to:
8
+ - Review existing tasks to avoid duplication
9
+ - Propose a set of new tasks for the goal
10
+ - Show the proposed tasks in a table format
11
+ 4. Wait for user confirmation before creating any tasks
12
+ 5. Only create tasks the user explicitly approves
13
+
14
+ ## Important
15
+
16
+ - NEVER auto-create tasks without user approval
17
+ - Show proposed tasks as a preview table first
18
+ - Respect the product-owner agent's guardrails (max 10 tasks, no critical urgency without approval, parent grouping for 5+)
19
+ - If the goal is vague, ask clarifying questions before proposing tasks
@@ -0,0 +1,26 @@
1
+ Read the task store at `.reagent/tasks.jsonl` and render a clean summary table.
2
+
3
+ ## Instructions
4
+
5
+ 1. Read `.reagent/tasks.jsonl` — each line is a JSON event with fields: id, type, title, urgency, phase, assignee, timestamp
6
+ 2. Materialize the current state: for each task ID, the latest event determines its status
7
+ 3. Group by status: active (created, started, blocked) first, then completed/cancelled
8
+ 4. Render as a markdown table with columns: ID | Status | Urgency | Title | Assignee | Phase
9
+
10
+ ## Output Format
11
+
12
+ ```
13
+ ## Active Tasks
14
+
15
+ | ID | Status | Urgency | Title | Assignee | Phase |
16
+ |-------|---------|---------|------------------------------|----------|---------|
17
+ | T-001 | started | normal | Implement review cache CLI | — | Phase 2 |
18
+
19
+ ## Completed Tasks (last 10)
20
+
21
+ | ID | Title | Completed |
22
+ |-------|------------------------------|---------------|
23
+ | T-002 | Refactor init.ts | 2026-04-09 |
24
+ ```
25
+
26
+ If the file doesn't exist or is empty, say: "No tasks found. Use /plan-work to create tasks."
@@ -0,0 +1,2 @@
1
+ export declare function runCache(args: string[]): void;
2
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/cache.ts"],"names":[],"mappings":"AA8DA,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAmF7C"}
@@ -0,0 +1,114 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { parseFlag } from '../utils.js';
4
+ function getCachePath() {
5
+ const root = process.env.CLAUDE_PROJECT_DIR || process.cwd();
6
+ return path.join(root, '.reagent', 'review-cache.json');
7
+ }
8
+ function loadCache() {
9
+ const cachePath = getCachePath();
10
+ if (!fs.existsSync(cachePath)) {
11
+ return { version: '1', entries: {} };
12
+ }
13
+ try {
14
+ const data = JSON.parse(fs.readFileSync(cachePath, 'utf8'));
15
+ if (data.version !== '1') {
16
+ return { version: '1', entries: {} };
17
+ }
18
+ return data;
19
+ }
20
+ catch {
21
+ return { version: '1', entries: {} };
22
+ }
23
+ }
24
+ function saveCache(cache) {
25
+ const cachePath = getCachePath();
26
+ const dir = path.dirname(cachePath);
27
+ if (!fs.existsSync(dir)) {
28
+ fs.mkdirSync(dir, { recursive: true });
29
+ }
30
+ fs.writeFileSync(cachePath, JSON.stringify(cache, null, 2) + '\n');
31
+ }
32
+ function isExpired(entry) {
33
+ const now = Date.now();
34
+ const entryTime = new Date(entry.timestamp).getTime();
35
+ const ttlMs = (entry.ttlSeconds || 86400) * 1000;
36
+ return now - entryTime > ttlMs;
37
+ }
38
+ function buildKey(sha, branch, baseCommit) {
39
+ const parts = [branch || '', baseCommit || '', sha].filter(Boolean);
40
+ return parts.join(':');
41
+ }
42
+ export function runCache(args) {
43
+ const [subcommand, ...rest] = args;
44
+ switch (subcommand) {
45
+ case 'check': {
46
+ const sha = rest[0];
47
+ if (!sha) {
48
+ console.error('Usage: reagent cache check <sha> [--branch <b>] [--base <c>]');
49
+ process.exit(1);
50
+ }
51
+ const branch = parseFlag(rest, '--branch') || '';
52
+ const baseCommit = parseFlag(rest, '--base') || '';
53
+ const key = buildKey(sha, branch, baseCommit);
54
+ const cache = loadCache();
55
+ const entry = cache.entries[key];
56
+ if (!entry) {
57
+ console.log(JSON.stringify({ hit: false }));
58
+ process.exit(1);
59
+ }
60
+ if (isExpired(entry)) {
61
+ delete cache.entries[key];
62
+ saveCache(cache);
63
+ console.log(JSON.stringify({ hit: false, reason: 'expired' }));
64
+ process.exit(1);
65
+ }
66
+ console.log(JSON.stringify({
67
+ hit: true,
68
+ result: entry.result,
69
+ reviewer: entry.reviewer,
70
+ findingsCount: entry.findingsCount,
71
+ timestamp: entry.timestamp,
72
+ }));
73
+ process.exit(0);
74
+ break;
75
+ }
76
+ case 'set': {
77
+ const sha = rest[0];
78
+ const result = rest[1];
79
+ if (!sha || !result || !['pass', 'fail', 'advisory'].includes(result)) {
80
+ console.error('Usage: reagent cache set <sha> <pass|fail|advisory> [--branch <b>] [--base <c>] [--reviewer <r>] [--findings <n>] [--ttl <seconds>]');
81
+ process.exit(1);
82
+ }
83
+ const branch = parseFlag(rest, '--branch') || '';
84
+ const baseCommit = parseFlag(rest, '--base') || '';
85
+ const reviewer = parseFlag(rest, '--reviewer') || 'unknown';
86
+ const findingsCount = parseInt(parseFlag(rest, '--findings') || '0', 10);
87
+ const ttlSeconds = parseInt(parseFlag(rest, '--ttl') || '86400', 10);
88
+ const key = buildKey(sha, branch, baseCommit);
89
+ const cache = loadCache();
90
+ cache.entries[key] = {
91
+ sha,
92
+ branch,
93
+ baseCommit,
94
+ reviewer,
95
+ findingsCount,
96
+ result,
97
+ timestamp: new Date().toISOString(),
98
+ ttlSeconds,
99
+ };
100
+ saveCache(cache);
101
+ console.log(JSON.stringify({ stored: true, key }));
102
+ break;
103
+ }
104
+ case 'clear': {
105
+ saveCache({ version: '1', entries: {} });
106
+ console.log(JSON.stringify({ cleared: true }));
107
+ break;
108
+ }
109
+ default:
110
+ console.error('Usage: reagent cache <check|set|clear> [args]');
111
+ process.exit(1);
112
+ }
113
+ }
114
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/cli/commands/cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { InstallResult } from './types.js';
2
+ export declare function installAgents(targetDir: string, dryRun: boolean): InstallResult[];
3
+ //# sourceMappingURL=agents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/agents.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,aAAa,EAAE,CAiDjF"}
@@ -0,0 +1,47 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { PKG_ROOT } from '../../utils.js';
4
+ export function installAgents(targetDir, dryRun) {
5
+ const agentsSrcDir = path.join(PKG_ROOT, 'agents');
6
+ const agentsDestDir = path.join(targetDir, '.claude', 'agents');
7
+ if (!fs.existsSync(agentsSrcDir)) {
8
+ return [{ file: '.claude/agents/ (no agents directory in package)', status: 'warn' }];
9
+ }
10
+ if (!dryRun) {
11
+ fs.mkdirSync(agentsDestDir, { recursive: true });
12
+ }
13
+ const results = [];
14
+ // Recursively walk agents/ for all .md files
15
+ function walkDir(dir, relativeBase) {
16
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
17
+ for (const entry of entries) {
18
+ if (entry.isSymbolicLink())
19
+ continue; // skip symlinks for safety
20
+ const srcPath = path.join(dir, entry.name);
21
+ const relativePath = path.join(relativeBase, entry.name);
22
+ if (entry.isDirectory()) {
23
+ const destSubDir = path.join(agentsDestDir, relativeBase, entry.name);
24
+ if (!dryRun) {
25
+ fs.mkdirSync(destSubDir, { recursive: true });
26
+ }
27
+ walkDir(srcPath, relativePath);
28
+ }
29
+ else if (entry.name.endsWith('.md')) {
30
+ const destPath = path.join(agentsDestDir, relativePath);
31
+ const srcContent = fs.readFileSync(srcPath, 'utf8');
32
+ const exists = fs.existsSync(destPath);
33
+ const same = exists && fs.readFileSync(destPath, 'utf8') === srcContent;
34
+ if (!same && !dryRun) {
35
+ fs.writeFileSync(destPath, srcContent, 'utf8');
36
+ }
37
+ results.push({
38
+ file: `.claude/agents/${relativePath}`,
39
+ status: same ? 'skipped' : exists ? 'updated' : 'installed',
40
+ });
41
+ }
42
+ }
43
+ }
44
+ walkDir(agentsSrcDir, '');
45
+ return results;
46
+ }
47
+ //# sourceMappingURL=agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/agents.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,aAAa,CAAC,SAAiB,EAAE,MAAe;IAC9D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACnD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEhE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,EAAE,IAAI,EAAE,kDAAkD,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACxF,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,OAAO,GAAoB,EAAE,CAAC;IAEpC,6CAA6C;IAC7C,SAAS,OAAO,CAAC,GAAW,EAAE,YAAoB;QAChD,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,cAAc,EAAE;gBAAE,SAAS,CAAC,2BAA2B;YACjE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAEzD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBACtE,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAChD,CAAC;gBACD,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YACjC,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;gBAExD,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBACpD,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBACvC,MAAM,IAAI,GAAG,MAAM,IAAI,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,UAAU,CAAC;gBAExE,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;oBACrB,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;gBACjD,CAAC;gBAED,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,kBAAkB,YAAY,EAAE;oBACtC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW;iBAC5D,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IAC1B,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { InstallResult, HooksConfig } from './types.js';
2
+ export declare function installClaudeHooks(targetDir: string, hooksConfig: HooksConfig, dryRun: boolean): InstallResult[];
3
+ //# sourceMappingURL=claude-hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-hooks.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/claude-hooks.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAa,MAAM,YAAY,CAAC;AAExE,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,OAAO,GACd,aAAa,EAAE,CA6DjB"}
@@ -0,0 +1,134 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { PKG_ROOT } from '../../utils.js';
4
+ export function installClaudeHooks(targetDir, hooksConfig, dryRun) {
5
+ const claudeHooksDir = path.join(targetDir, '.claude', 'hooks');
6
+ if (!dryRun) {
7
+ fs.mkdirSync(claudeHooksDir, { recursive: true });
8
+ }
9
+ const results = [];
10
+ const installedHookNames = new Set();
11
+ const allHookEntries = [...(hooksConfig.PreToolUse || []), ...(hooksConfig.PostToolUse || [])];
12
+ for (const entry of allHookEntries) {
13
+ for (const hookName of entry.hooks || []) {
14
+ const srcFile = path.join(PKG_ROOT, 'hooks', `${hookName}.sh`);
15
+ if (!fs.existsSync(srcFile)) {
16
+ console.error(` ERROR: Hook '${hookName}' referenced in profile but not found in package.`);
17
+ results.push({
18
+ file: `.claude/hooks/${hookName}.sh (MISSING — not installed)`,
19
+ status: 'warn',
20
+ });
21
+ continue;
22
+ }
23
+ installedHookNames.add(hookName);
24
+ const srcContent = fs.readFileSync(srcFile, 'utf8');
25
+ const destFile = path.join(claudeHooksDir, `${hookName}.sh`);
26
+ const exists = fs.existsSync(destFile);
27
+ const same = exists && fs.readFileSync(destFile, 'utf8') === srcContent;
28
+ if (!same && !dryRun) {
29
+ fs.writeFileSync(destFile, srcContent, { mode: 0o755 });
30
+ }
31
+ results.push({
32
+ file: `.claude/hooks/${hookName}.sh`,
33
+ status: same ? 'skipped' : exists ? 'updated' : 'installed',
34
+ });
35
+ }
36
+ }
37
+ // Write settings.json
38
+ const settingsPath = path.join(targetDir, '.claude', 'settings.json');
39
+ const settings = buildSettingsJson(hooksConfig, installedHookNames);
40
+ const settingsContent = JSON.stringify(settings, null, 2) + '\n';
41
+ const settingsExists = fs.existsSync(settingsPath);
42
+ const settingsSame = settingsExists && fs.readFileSync(settingsPath, 'utf8') === settingsContent;
43
+ if (!settingsSame && !dryRun) {
44
+ fs.writeFileSync(settingsPath, settingsContent);
45
+ }
46
+ results.push({
47
+ file: '.claude/settings.json',
48
+ status: settingsSame ? 'skipped' : settingsExists ? 'updated' : 'installed',
49
+ });
50
+ return results;
51
+ }
52
+ function buildSettingsJson(hooksConfig, installedHookNames) {
53
+ const settings = {
54
+ env: { ENABLE_TOOL_SEARCH: 'auto:5' },
55
+ hooks: {},
56
+ };
57
+ function buildHookEntries(entries) {
58
+ const result = [];
59
+ for (const entry of entries) {
60
+ const availableHooks = entry.hooks.filter((h) => installedHookNames.has(h));
61
+ if (!availableHooks.length)
62
+ continue;
63
+ result.push({
64
+ matcher: entry.matcher,
65
+ hooks: availableHooks.map((hookName) => ({
66
+ type: 'command',
67
+ command: `"$CLAUDE_PROJECT_DIR"/.claude/hooks/${hookName}.sh`,
68
+ timeout: getHookTimeout(hookName),
69
+ statusMessage: getHookStatusMessage(hookName),
70
+ })),
71
+ });
72
+ }
73
+ return result;
74
+ }
75
+ const hooks = settings.hooks;
76
+ if (hooksConfig.PreToolUse?.length) {
77
+ const merged = mergeByMatcher(hooksConfig.PreToolUse);
78
+ const entries = buildHookEntries(merged);
79
+ if (entries.length)
80
+ hooks.PreToolUse = entries;
81
+ }
82
+ if (hooksConfig.PostToolUse?.length) {
83
+ const merged = mergeByMatcher(hooksConfig.PostToolUse);
84
+ const entries = buildHookEntries(merged);
85
+ if (entries.length)
86
+ hooks.PostToolUse = entries;
87
+ }
88
+ return settings;
89
+ }
90
+ function mergeByMatcher(entries) {
91
+ const map = new Map();
92
+ for (const entry of entries) {
93
+ if (map.has(entry.matcher)) {
94
+ map.get(entry.matcher).hooks.push(...entry.hooks);
95
+ }
96
+ else {
97
+ map.set(entry.matcher, { matcher: entry.matcher, hooks: [...entry.hooks] });
98
+ }
99
+ }
100
+ return Array.from(map.values());
101
+ }
102
+ function getHookTimeout(hookName) {
103
+ const timeouts = {
104
+ 'secret-scanner': 15000,
105
+ 'dangerous-bash-interceptor': 10000,
106
+ 'env-file-protection': 5000,
107
+ 'attribution-advisory': 5000,
108
+ 'settings-protection': 5000,
109
+ 'blocked-paths-enforcer': 5000,
110
+ 'dependency-audit-gate': 15000,
111
+ 'commit-review-gate': 30000,
112
+ 'push-review-gate': 30000,
113
+ 'architecture-review-gate': 10000,
114
+ 'task-link-gate': 5000,
115
+ };
116
+ return timeouts[hookName] || 10000;
117
+ }
118
+ function getHookStatusMessage(hookName) {
119
+ const messages = {
120
+ 'dangerous-bash-interceptor': 'Checking command safety...',
121
+ 'env-file-protection': 'Checking for .env file reads...',
122
+ 'secret-scanner': 'Scanning for credentials...',
123
+ 'attribution-advisory': 'Checking for AI attribution...',
124
+ 'settings-protection': 'Checking settings protection...',
125
+ 'blocked-paths-enforcer': 'Checking blocked paths...',
126
+ 'dependency-audit-gate': 'Verifying package exists...',
127
+ 'commit-review-gate': 'Checking commit review status...',
128
+ 'push-review-gate': 'Running push review gate...',
129
+ 'architecture-review-gate': 'Checking architecture impact...',
130
+ 'task-link-gate': 'Checking task reference...',
131
+ };
132
+ return messages[hookName] || `Running ${hookName}...`;
133
+ }
134
+ //# sourceMappingURL=claude-hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-hooks.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/claude-hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { InstallResult, ClaudeMdConfig } from './types.js';
2
+ export declare function installClaudeMd(targetDir: string, claudeMdConfig: ClaudeMdConfig, dryRun: boolean): InstallResult[];
3
+ //# sourceMappingURL=claude-md.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-md.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/claude-md.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEhE,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,cAAc,EAC9B,MAAM,EAAE,OAAO,GACd,aAAa,EAAE,CA8DjB"}
@@ -0,0 +1,52 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { PKG_ROOT, getPkgVersion } from '../../utils.js';
4
+ export function installClaudeMd(targetDir, claudeMdConfig, dryRun) {
5
+ const PKG_VERSION = getPkgVersion();
6
+ const claudeMdPath = path.join(targetDir, 'CLAUDE.md');
7
+ const templatePath = path.join(PKG_ROOT, 'templates', 'CLAUDE.md');
8
+ if (!fs.existsSync(templatePath)) {
9
+ console.error(' ERROR: templates/CLAUDE.md not found in package.');
10
+ return [{ file: 'CLAUDE.md', status: 'warn' }];
11
+ }
12
+ let template = fs.readFileSync(templatePath, 'utf8');
13
+ const safe = (val) => String(val).replace(/\{\{[^}]*\}\}/g, '');
14
+ template = template
15
+ .replace(/\{\{VERSION\}\}/g, PKG_VERSION)
16
+ .replace(/\{\{PREFLIGHT_CMD\}\}/g, safe(claudeMdConfig.preflightCmd || 'pnpm preflight'))
17
+ .replace(/\{\{ATTRIBUTION_RULE\}\}/g, safe(claudeMdConfig.attributionRule || 'Do not include AI attribution in client-facing content.'));
18
+ const MARKER_START = '<!-- reagent-managed:start -->';
19
+ const MARKER_END = '<!-- reagent-managed:end -->';
20
+ const existingContent = fs.existsSync(claudeMdPath) ? fs.readFileSync(claudeMdPath, 'utf8') : '';
21
+ const hasBlock = existingContent.includes(MARKER_START);
22
+ let newContent;
23
+ if (hasBlock) {
24
+ const startIdx = existingContent.indexOf(MARKER_START);
25
+ const endIdx = existingContent.indexOf(MARKER_END);
26
+ if (endIdx === -1) {
27
+ const stripped = (existingContent.slice(0, startIdx) + existingContent.slice(startIdx + MARKER_START.length)).trim();
28
+ newContent = stripped ? template.trimEnd() + '\n\n' + stripped.trimStart() : template;
29
+ }
30
+ else {
31
+ const endAfter = endIdx + MARKER_END.length;
32
+ const withoutBlock = (existingContent.slice(0, startIdx) + existingContent.slice(endAfter)).trim();
33
+ newContent = withoutBlock ? template.trimEnd() + '\n\n' + withoutBlock.trimStart() : template;
34
+ }
35
+ }
36
+ else {
37
+ newContent = existingContent
38
+ ? template.trimEnd() + '\n\n' + existingContent.trimStart()
39
+ : template;
40
+ }
41
+ const same = existingContent === newContent;
42
+ if (!same && !dryRun) {
43
+ fs.writeFileSync(claudeMdPath, newContent, 'utf8');
44
+ }
45
+ return [
46
+ {
47
+ file: 'CLAUDE.md',
48
+ status: same ? 'skipped' : existingContent ? 'updated' : 'installed',
49
+ },
50
+ ];
51
+ }
52
+ //# sourceMappingURL=claude-md.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-md.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/claude-md.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { InstallResult } from './types.js';
2
+ export declare function installClaudeCommands(targetDir: string, dryRun: boolean): InstallResult[];
3
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/commands.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,aAAa,EAAE,CAkCzF"}
@@ -0,0 +1,31 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { PKG_ROOT } from '../../utils.js';
4
+ export function installClaudeCommands(targetDir, dryRun) {
5
+ const commandsSrcDir = path.join(PKG_ROOT, 'commands');
6
+ const commandsDestDir = path.join(targetDir, '.claude', 'commands');
7
+ if (!fs.existsSync(commandsSrcDir)) {
8
+ return [];
9
+ }
10
+ if (!dryRun) {
11
+ fs.mkdirSync(commandsDestDir, { recursive: true });
12
+ }
13
+ const results = [];
14
+ const commandFiles = fs.readdirSync(commandsSrcDir).filter((f) => f.endsWith('.md'));
15
+ for (const fileName of commandFiles) {
16
+ const srcFile = path.join(commandsSrcDir, fileName);
17
+ const destFile = path.join(commandsDestDir, fileName);
18
+ const srcContent = fs.readFileSync(srcFile, 'utf8');
19
+ const exists = fs.existsSync(destFile);
20
+ const same = exists && fs.readFileSync(destFile, 'utf8') === srcContent;
21
+ if (!same && !dryRun) {
22
+ fs.writeFileSync(destFile, srcContent, 'utf8');
23
+ }
24
+ results.push({
25
+ file: `.claude/commands/${fileName}`,
26
+ status: same ? 'skipped' : exists ? 'updated' : 'installed',
27
+ });
28
+ }
29
+ return results;
30
+ }
31
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/commands.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,qBAAqB,CAAC,SAAiB,EAAE,MAAe;IACtE,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACvD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAEpE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,EAAE,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,MAAM,YAAY,GAAG,EAAE,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAErF,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;QAEtD,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,MAAM,IAAI,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,UAAU,CAAC;QAExE,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACrB,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QACjD,CAAC;QAED,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,oBAAoB,QAAQ,EAAE;YACpC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW;SAC5D,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { InstallResult } from './types.js';
2
+ export declare function installCursorRules(targetDir: string, ruleNames: string[], dryRun: boolean): InstallResult[];
3
+ //# sourceMappingURL=cursor-rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-rules.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/cursor-rules.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EAAE,EACnB,MAAM,EAAE,OAAO,GACd,aAAa,EAAE,CA8BjB"}
@@ -0,0 +1,30 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { PKG_ROOT } from '../../utils.js';
4
+ export function installCursorRules(targetDir, ruleNames, dryRun) {
5
+ const rulesDir = path.join(targetDir, '.cursor', 'rules');
6
+ if (!dryRun) {
7
+ fs.mkdirSync(rulesDir, { recursive: true });
8
+ }
9
+ const results = [];
10
+ for (const name of ruleNames) {
11
+ const srcFile = path.join(PKG_ROOT, 'cursor', 'rules', `${name}.mdc`);
12
+ const destFile = path.join(rulesDir, `${name}.mdc`);
13
+ if (!fs.existsSync(srcFile)) {
14
+ console.warn(` Warning: cursor rule not found in package: ${name}.mdc`);
15
+ continue;
16
+ }
17
+ const srcContent = fs.readFileSync(srcFile, 'utf8');
18
+ const exists = fs.existsSync(destFile);
19
+ const same = exists && fs.readFileSync(destFile, 'utf8') === srcContent;
20
+ if (!same && !dryRun) {
21
+ fs.writeFileSync(destFile, srcContent);
22
+ }
23
+ results.push({
24
+ file: `.cursor/rules/${name}.mdc`,
25
+ status: same ? 'skipped' : exists ? 'updated' : 'installed',
26
+ });
27
+ }
28
+ return results;
29
+ }
30
+ //# sourceMappingURL=cursor-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-rules.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/cursor-rules.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,kBAAkB,CAChC,SAAiB,EACjB,SAAmB,EACnB,MAAe;IAEf,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC1D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC;QACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC;QAEpD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,gDAAgD,IAAI,MAAM,CAAC,CAAC;YACzE,SAAS;QACX,CAAC;QAED,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,MAAM,IAAI,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,UAAU,CAAC;QAExE,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACrB,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACzC,CAAC;QAED,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,iBAAiB,IAAI,MAAM;YACjC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW;SAC5D,CAAC,CAAC;IACL,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { InstallResult } from './types.js';
2
+ export declare function installGatewayConfig(targetDir: string, dryRun: boolean): InstallResult[];
3
+ //# sourceMappingURL=gateway-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-config.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/gateway-config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,aAAa,EAAE,CAiDxF"}
@@ -0,0 +1,51 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { getPkgVersion } from '../../utils.js';
4
+ export function installGatewayConfig(targetDir, dryRun) {
5
+ const PKG_VERSION = getPkgVersion();
6
+ const reagentDir = path.join(targetDir, '.reagent');
7
+ const gatewayPath = path.join(reagentDir, 'gateway.yaml');
8
+ // Idempotent: skip if gateway.yaml already exists
9
+ if (fs.existsSync(gatewayPath)) {
10
+ return [{ file: '.reagent/gateway.yaml', status: 'skipped' }];
11
+ }
12
+ if (!dryRun) {
13
+ fs.mkdirSync(reagentDir, { recursive: true });
14
+ const content = `# .reagent/gateway.yaml — generated by @bookedsolid/reagent v${PKG_VERSION}
15
+ # Defines downstream MCP servers that reagent proxies through its middleware chain.
16
+ #
17
+ # Usage:
18
+ # reagent serve
19
+ #
20
+ # Each server entry spawns a child process and communicates over stdio MCP.
21
+ # Tool names are namespaced as: <server-name>__<tool-name>
22
+ #
23
+ # Tier classification (convention-based, overridable):
24
+ # read: get_*, list_*, search_*, query_*, read_*, fetch_*, check_*, health_*, describe_*, show_*, count_*
25
+ # destructive: delete_*, drop_*, purge_*, remove_*, destroy_*, ban_*, kick_*, revoke_*, truncate_*
26
+ # write: everything else (default)
27
+
28
+ version: "1"
29
+
30
+ # To add a server, replace "servers: {}" with:
31
+ #
32
+ # servers:
33
+ # my-server:
34
+ # command: npx
35
+ # args: ['-y', 'my-mcp-server@latest']
36
+ # env:
37
+ # API_KEY: '\${MY_API_KEY}'
38
+ # tool_overrides:
39
+ # dangerous_action:
40
+ # tier: destructive
41
+ # admin_delete:
42
+ # tier: destructive
43
+ # blocked: true
44
+
45
+ servers: {}
46
+ `;
47
+ fs.writeFileSync(gatewayPath, content, 'utf8');
48
+ }
49
+ return [{ file: '.reagent/gateway.yaml', status: 'installed' }];
50
+ }
51
+ //# sourceMappingURL=gateway-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-config.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/gateway-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAG/C,MAAM,UAAU,oBAAoB,CAAC,SAAiB,EAAE,MAAe;IACrE,MAAM,WAAW,GAAG,aAAa,EAAE,CAAC;IACpC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACpD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IAE1D,kDAAkD;IAClD,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,gEAAgE,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgC9F,CAAC;QACE,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;AAClE,CAAC"}
@@ -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"}