@ironbee-ai/cli 0.1.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.
Files changed (100) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/LICENSE +21 -0
  3. package/README.md +159 -0
  4. package/dist/assets/banner.txt +6 -0
  5. package/dist/assets/icon.svg +59 -0
  6. package/dist/clients/base.d.ts +20 -0
  7. package/dist/clients/base.d.ts.map +1 -0
  8. package/dist/clients/base.js +3 -0
  9. package/dist/clients/base.js.map +1 -0
  10. package/dist/clients/claude/hooks/clear-verdict.d.ts +11 -0
  11. package/dist/clients/claude/hooks/clear-verdict.d.ts.map +1 -0
  12. package/dist/clients/claude/hooks/clear-verdict.js +58 -0
  13. package/dist/clients/claude/hooks/clear-verdict.js.map +1 -0
  14. package/dist/clients/claude/hooks/session-start.d.ts +9 -0
  15. package/dist/clients/claude/hooks/session-start.d.ts.map +1 -0
  16. package/dist/clients/claude/hooks/session-start.js +72 -0
  17. package/dist/clients/claude/hooks/session-start.js.map +1 -0
  18. package/dist/clients/claude/hooks/track-action.d.ts +11 -0
  19. package/dist/clients/claude/hooks/track-action.d.ts.map +1 -0
  20. package/dist/clients/claude/hooks/track-action.js +73 -0
  21. package/dist/clients/claude/hooks/track-action.js.map +1 -0
  22. package/dist/clients/claude/hooks/verify-gate.d.ts +11 -0
  23. package/dist/clients/claude/hooks/verify-gate.d.ts.map +1 -0
  24. package/dist/clients/claude/hooks/verify-gate.js +48 -0
  25. package/dist/clients/claude/hooks/verify-gate.js.map +1 -0
  26. package/dist/clients/claude/index.d.ts +22 -0
  27. package/dist/clients/claude/index.d.ts.map +1 -0
  28. package/dist/clients/claude/index.js +270 -0
  29. package/dist/clients/claude/index.js.map +1 -0
  30. package/dist/clients/claude/rule.md +35 -0
  31. package/dist/clients/claude/skill.md +63 -0
  32. package/dist/clients/registry.d.ts +6 -0
  33. package/dist/clients/registry.d.ts.map +1 -0
  34. package/dist/clients/registry.js +20 -0
  35. package/dist/clients/registry.js.map +1 -0
  36. package/dist/commands/hook.d.ts +3 -0
  37. package/dist/commands/hook.d.ts.map +1 -0
  38. package/dist/commands/hook.js +57 -0
  39. package/dist/commands/hook.js.map +1 -0
  40. package/dist/commands/install.d.ts +3 -0
  41. package/dist/commands/install.d.ts.map +1 -0
  42. package/dist/commands/install.js +69 -0
  43. package/dist/commands/install.js.map +1 -0
  44. package/dist/commands/status.d.ts +3 -0
  45. package/dist/commands/status.d.ts.map +1 -0
  46. package/dist/commands/status.js +71 -0
  47. package/dist/commands/status.js.map +1 -0
  48. package/dist/commands/uninstall.d.ts +3 -0
  49. package/dist/commands/uninstall.d.ts.map +1 -0
  50. package/dist/commands/uninstall.js +54 -0
  51. package/dist/commands/uninstall.js.map +1 -0
  52. package/dist/commands/update.d.ts +3 -0
  53. package/dist/commands/update.d.ts.map +1 -0
  54. package/dist/commands/update.js +38 -0
  55. package/dist/commands/update.js.map +1 -0
  56. package/dist/commands/verify.d.ts +3 -0
  57. package/dist/commands/verify.d.ts.map +1 -0
  58. package/dist/commands/verify.js +150 -0
  59. package/dist/commands/verify.js.map +1 -0
  60. package/dist/hooks/core/actions.d.ts +35 -0
  61. package/dist/hooks/core/actions.d.ts.map +1 -0
  62. package/dist/hooks/core/actions.js +61 -0
  63. package/dist/hooks/core/actions.js.map +1 -0
  64. package/dist/hooks/core/clear-verdict.d.ts +12 -0
  65. package/dist/hooks/core/clear-verdict.d.ts.map +1 -0
  66. package/dist/hooks/core/clear-verdict.js +25 -0
  67. package/dist/hooks/core/clear-verdict.js.map +1 -0
  68. package/dist/hooks/core/verify-gate.d.ts +20 -0
  69. package/dist/hooks/core/verify-gate.d.ts.map +1 -0
  70. package/dist/hooks/core/verify-gate.js +222 -0
  71. package/dist/hooks/core/verify-gate.js.map +1 -0
  72. package/dist/index.d.ts +3 -0
  73. package/dist/index.d.ts.map +1 -0
  74. package/dist/index.js +56 -0
  75. package/dist/index.js.map +1 -0
  76. package/dist/lib/config.d.ts +44 -0
  77. package/dist/lib/config.d.ts.map +1 -0
  78. package/dist/lib/config.js +135 -0
  79. package/dist/lib/config.js.map +1 -0
  80. package/dist/lib/icon.d.ts +2 -0
  81. package/dist/lib/icon.d.ts.map +1 -0
  82. package/dist/lib/icon.js +14 -0
  83. package/dist/lib/icon.js.map +1 -0
  84. package/dist/lib/logger.d.ts +7 -0
  85. package/dist/lib/logger.d.ts.map +1 -0
  86. package/dist/lib/logger.js +70 -0
  87. package/dist/lib/logger.js.map +1 -0
  88. package/dist/lib/output.d.ts +21 -0
  89. package/dist/lib/output.d.ts.map +1 -0
  90. package/dist/lib/output.js +45 -0
  91. package/dist/lib/output.js.map +1 -0
  92. package/dist/lib/stdin.d.ts +6 -0
  93. package/dist/lib/stdin.d.ts.map +1 -0
  94. package/dist/lib/stdin.js +18 -0
  95. package/dist/lib/stdin.js.map +1 -0
  96. package/dist/lib/version.d.ts +10 -0
  97. package/dist/lib/version.d.ts.map +1 -0
  98. package/dist/lib/version.js +81 -0
  99. package/dist/lib/version.js.map +1 -0
  100. package/package.json +72 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-gate.js","sourceRoot":"","sources":["../../../../src/clients/claude/hooks/verify-gate.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAWH,kBAkCC;AA3CD,iEAAkF;AAClF,gDAA+E;AAC/E,gDAAyD;AACzD,8CAA+C;AAM/C,SAAgB,GAAG,CAAC,UAAkB;IAClC,IAAI,KAA0B,CAAC;IAC/B,IAAI,CAAC;QACD,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAS,GAAE,CAAwB,CAAC;IAC3D,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QAClB,eAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,SAAS,GAAW,KAAK,CAAC,UAAU,IAAI,SAAS,CAAC;IACxD,IAAA,mBAAU,EAAC,GAAG,UAAU,sBAAsB,SAAS,cAAc,CAAC,CAAC;IAEvE,MAAM,MAAM,GAAkB,IAAA,mBAAU,EAAC,UAAU,CAAC,CAAC;IAErD,MAAM,MAAM,GAAqB,IAAA,2BAAa,EAAC;QAC3C,SAAS;QACT,WAAW,EAAE,GAAG,UAAU,sBAAsB,SAAS,gBAAgB;QACzE,WAAW,EAAE,GAAG,UAAU,sBAAsB,SAAS,eAAe;QACxE,SAAS,EAAE,GAAG,UAAU,sBAAsB,SAAS,UAAU;QACjE,UAAU,EAAE,IAAA,sBAAa,EAAC,MAAM,CAAC;KACpC,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QAC5B,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,+CAA+C;IAC/C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { IClient } from "../base";
2
+ export declare class ClaudeClient implements IClient {
3
+ readonly name: string;
4
+ detect(projectDir: string): boolean;
5
+ resolveProjectDir(): string;
6
+ install(projectDir: string, ironBeePath: string): void;
7
+ uninstall(projectDir: string): void;
8
+ runVerifyGate(projectDir: string): void;
9
+ runClearVerdict(projectDir: string): void;
10
+ runTrackAction(projectDir: string): void;
11
+ runSessionStart(projectDir: string): void;
12
+ private isIronBeeHook;
13
+ private mergeHooksConfig;
14
+ private removeIronBeeHooks;
15
+ private removeMcpServer;
16
+ private removePermission;
17
+ private removeFile;
18
+ private writeMcpConfig;
19
+ private writePermissions;
20
+ }
21
+ export declare function prepareIronBeeDir(projectDir: string): void;
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/clients/claude/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAyClC,qBAAa,YAAa,YAAW,OAAO;IACxC,SAAgB,IAAI,EAAE,MAAM,CAAY;IAEjC,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAInC,iBAAiB,IAAI,MAAM;IAI3B,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IA6BtD,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAqBnC,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIvC,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIzC,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIxC,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIhD,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,gBAAgB;IA6ExB,OAAO,CAAC,kBAAkB;IAuB1B,OAAO,CAAC,eAAe;IAgBvB,OAAO,CAAC,gBAAgB;IAoBxB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,cAAc;IA0BtB,OAAO,CAAC,gBAAgB;CA2B3B;AAuBD,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAG1D"}
@@ -0,0 +1,270 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ClaudeClient = void 0;
4
+ exports.prepareIronBeeDir = prepareIronBeeDir;
5
+ const fs_1 = require("fs");
6
+ const path_1 = require("path");
7
+ const logger_1 = require("../../lib/logger");
8
+ const output_1 = require("../../lib/output");
9
+ const verify_gate_1 = require("./hooks/verify-gate");
10
+ const clear_verdict_1 = require("./hooks/clear-verdict");
11
+ const track_action_1 = require("./hooks/track-action");
12
+ const session_start_1 = require("./hooks/session-start");
13
+ const MCP_SERVER_NAME = "browser-devtools";
14
+ const MCP_SERVER_PACKAGE = "browser-devtools-mcp";
15
+ const IRONBEE_HOOK_MARKER = "ironbee";
16
+ class ClaudeClient {
17
+ constructor() {
18
+ this.name = "claude";
19
+ }
20
+ detect(projectDir) {
21
+ return (0, fs_1.existsSync)((0, path_1.join)(projectDir, ".claude"));
22
+ }
23
+ resolveProjectDir() {
24
+ return process.env.CLAUDE_PROJECT_DIR ?? process.cwd();
25
+ }
26
+ install(projectDir, ironBeePath) {
27
+ const claudeDir = (0, path_1.join)(projectDir, ".claude");
28
+ const skillsDir = (0, path_1.join)(claudeDir, "skills");
29
+ const rulesDir = (0, path_1.join)(claudeDir, "rules");
30
+ (0, fs_1.mkdirSync)(skillsDir, { recursive: true });
31
+ (0, fs_1.mkdirSync)(rulesDir, { recursive: true });
32
+ const settingsPath = (0, path_1.join)(claudeDir, "settings.json");
33
+ this.mergeHooksConfig(settingsPath, ironBeePath);
34
+ this.writePermissions(settingsPath);
35
+ const skillPath = (0, path_1.join)(skillsDir, "ironbee-verification.md");
36
+ const skillContent = (0, fs_1.readFileSync)((0, path_1.join)(__dirname, "skill.md"), "utf-8");
37
+ (0, fs_1.writeFileSync)(skillPath, skillContent);
38
+ const rulePath = (0, path_1.join)(rulesDir, "ironbee-verification.md");
39
+ const ruleContent = (0, fs_1.readFileSync)((0, path_1.join)(__dirname, "rule.md"), "utf-8");
40
+ (0, fs_1.writeFileSync)(rulePath, ruleContent);
41
+ const mcpPath = (0, path_1.join)(projectDir, ".mcp.json");
42
+ this.writeMcpConfig(mcpPath);
43
+ console.log(` ${output_1.pc.dim("→")} ${(0, output_1.orange)("[claude]")} settings ${output_1.pc.dim("→")} ${output_1.pc.dim(settingsPath)}`);
44
+ console.log(` ${output_1.pc.dim("→")} ${(0, output_1.orange)("[claude]")} skill ${output_1.pc.dim("→")} ${output_1.pc.dim(skillPath)}`);
45
+ console.log(` ${output_1.pc.dim("→")} ${(0, output_1.orange)("[claude]")} rule ${output_1.pc.dim("→")} ${output_1.pc.dim(rulePath)}`);
46
+ console.log(` ${output_1.pc.dim("→")} ${(0, output_1.orange)("[claude]")} mcp ${output_1.pc.dim("→")} ${output_1.pc.dim(mcpPath)}`);
47
+ }
48
+ uninstall(projectDir) {
49
+ const claudeDir = (0, path_1.join)(projectDir, ".claude");
50
+ // remove skill and rule files
51
+ const skillPath = (0, path_1.join)(claudeDir, "skills", "ironbee-verification.md");
52
+ const rulePath = (0, path_1.join)(claudeDir, "rules", "ironbee-verification.md");
53
+ this.removeFile(skillPath);
54
+ this.removeFile(rulePath);
55
+ // remove ironbee hooks and permission from settings.json
56
+ const settingsPath = (0, path_1.join)(claudeDir, "settings.json");
57
+ this.removeIronBeeHooks(settingsPath);
58
+ this.removePermission(settingsPath);
59
+ // remove browser-devtools from .mcp.json
60
+ const mcpPath = (0, path_1.join)(projectDir, ".mcp.json");
61
+ this.removeMcpServer(mcpPath);
62
+ console.log(` ${output_1.pc.dim("→")} ${(0, output_1.orange)("[claude]")} removed hooks, skill, rule, MCP, and permissions`);
63
+ }
64
+ runVerifyGate(projectDir) {
65
+ (0, verify_gate_1.run)(projectDir);
66
+ }
67
+ runClearVerdict(projectDir) {
68
+ (0, clear_verdict_1.run)(projectDir);
69
+ }
70
+ runTrackAction(projectDir) {
71
+ (0, track_action_1.run)(projectDir);
72
+ }
73
+ runSessionStart(projectDir) {
74
+ (0, session_start_1.run)(projectDir);
75
+ }
76
+ isIronBeeHook(entry) {
77
+ return entry.hooks.some((h) => h.command.includes(IRONBEE_HOOK_MARKER));
78
+ }
79
+ mergeHooksConfig(settingsPath, ironBeePath) {
80
+ let settings = {};
81
+ if ((0, fs_1.existsSync)(settingsPath)) {
82
+ try {
83
+ settings = JSON.parse((0, fs_1.readFileSync)(settingsPath, "utf-8"));
84
+ }
85
+ catch (e) {
86
+ logger_1.logger.debug(`failed to parse ${settingsPath}: ${e}`);
87
+ settings = {};
88
+ }
89
+ }
90
+ if (!settings.hooks) {
91
+ settings.hooks = {};
92
+ }
93
+ // remove existing ironbee entries first (for re-install)
94
+ for (const eventType of Object.keys(settings.hooks)) {
95
+ settings.hooks[eventType] = settings.hooks[eventType].filter((entry) => !this.isIronBeeHook(entry));
96
+ }
97
+ // add ironbee PostToolUse hooks
98
+ if (!settings.hooks.PostToolUse) {
99
+ settings.hooks.PostToolUse = [];
100
+ }
101
+ settings.hooks.PostToolUse.push({
102
+ matcher: "Write|Edit|MultiEdit",
103
+ hooks: [
104
+ {
105
+ type: "command",
106
+ command: `"${ironBeePath}" hook clear-verdict --client claude`,
107
+ },
108
+ ],
109
+ });
110
+ settings.hooks.PostToolUse.push({
111
+ matcher: "mcp__browser-devtools__.*",
112
+ hooks: [
113
+ {
114
+ type: "command",
115
+ command: `"${ironBeePath}" hook track-action --client claude`,
116
+ },
117
+ ],
118
+ });
119
+ // add ironbee SessionStart hook
120
+ if (!settings.hooks.SessionStart) {
121
+ settings.hooks.SessionStart = [];
122
+ }
123
+ settings.hooks.SessionStart.push({
124
+ matcher: "",
125
+ hooks: [
126
+ {
127
+ type: "command",
128
+ command: `"${ironBeePath}" hook session-start --client claude`,
129
+ },
130
+ ],
131
+ });
132
+ // add ironbee Stop hook
133
+ if (!settings.hooks.Stop) {
134
+ settings.hooks.Stop = [];
135
+ }
136
+ settings.hooks.Stop.push({
137
+ matcher: "",
138
+ hooks: [
139
+ {
140
+ type: "command",
141
+ command: `"${ironBeePath}" hook verify-gate --client claude`,
142
+ },
143
+ ],
144
+ });
145
+ (0, fs_1.writeFileSync)(settingsPath, JSON.stringify(settings, null, 2));
146
+ }
147
+ removeIronBeeHooks(settingsPath) {
148
+ if (!(0, fs_1.existsSync)(settingsPath)) {
149
+ return;
150
+ }
151
+ try {
152
+ const settings = JSON.parse((0, fs_1.readFileSync)(settingsPath, "utf-8"));
153
+ if (!settings.hooks) {
154
+ return;
155
+ }
156
+ for (const eventType of Object.keys(settings.hooks)) {
157
+ settings.hooks[eventType] = settings.hooks[eventType].filter((entry) => !this.isIronBeeHook(entry));
158
+ }
159
+ (0, fs_1.writeFileSync)(settingsPath, JSON.stringify(settings, null, 2));
160
+ }
161
+ catch (e) {
162
+ logger_1.logger.debug(`failed to remove hooks from ${settingsPath}: ${e}`);
163
+ }
164
+ }
165
+ removeMcpServer(mcpPath) {
166
+ if (!(0, fs_1.existsSync)(mcpPath)) {
167
+ return;
168
+ }
169
+ try {
170
+ const config = JSON.parse((0, fs_1.readFileSync)(mcpPath, "utf-8"));
171
+ if (config.mcpServers && config.mcpServers[MCP_SERVER_NAME]) {
172
+ delete config.mcpServers[MCP_SERVER_NAME];
173
+ (0, fs_1.writeFileSync)(mcpPath, JSON.stringify(config, null, 2));
174
+ }
175
+ }
176
+ catch (e) {
177
+ logger_1.logger.debug(`failed to remove MCP server from ${mcpPath}: ${e}`);
178
+ }
179
+ }
180
+ removePermission(settingsPath) {
181
+ if (!(0, fs_1.existsSync)(settingsPath)) {
182
+ return;
183
+ }
184
+ try {
185
+ const settings = JSON.parse((0, fs_1.readFileSync)(settingsPath, "utf-8"));
186
+ const permission = `mcp__${MCP_SERVER_NAME}__*`;
187
+ if (settings.permissions?.allow) {
188
+ settings.permissions.allow = settings.permissions.allow.filter((p) => p !== permission);
189
+ (0, fs_1.writeFileSync)(settingsPath, JSON.stringify(settings, null, 2));
190
+ }
191
+ }
192
+ catch (e) {
193
+ logger_1.logger.debug(`failed to remove permission from ${settingsPath}: ${e}`);
194
+ }
195
+ }
196
+ removeFile(filePath) {
197
+ if ((0, fs_1.existsSync)(filePath)) {
198
+ (0, fs_1.unlinkSync)(filePath);
199
+ }
200
+ }
201
+ writeMcpConfig(mcpPath) {
202
+ let config = { mcpServers: {} };
203
+ if ((0, fs_1.existsSync)(mcpPath)) {
204
+ try {
205
+ config = JSON.parse((0, fs_1.readFileSync)(mcpPath, "utf-8"));
206
+ if (!config.mcpServers) {
207
+ config.mcpServers = {};
208
+ }
209
+ }
210
+ catch (e) {
211
+ logger_1.logger.debug(`failed to parse ${mcpPath}: ${e}`);
212
+ config = { mcpServers: {} };
213
+ }
214
+ }
215
+ config.mcpServers[MCP_SERVER_NAME] = {
216
+ command: "npx",
217
+ args: ["-y", MCP_SERVER_PACKAGE],
218
+ env: {
219
+ BROWSER_DEVTOOLS_INSTALL_CHROMIUM: "true",
220
+ },
221
+ };
222
+ (0, fs_1.writeFileSync)(mcpPath, JSON.stringify(config, null, 2));
223
+ }
224
+ writePermissions(settingsPath) {
225
+ let settings = {};
226
+ if ((0, fs_1.existsSync)(settingsPath)) {
227
+ try {
228
+ settings = JSON.parse((0, fs_1.readFileSync)(settingsPath, "utf-8"));
229
+ }
230
+ catch (e) {
231
+ logger_1.logger.debug(`failed to parse ${settingsPath}: ${e}`);
232
+ settings = {};
233
+ }
234
+ }
235
+ if (!settings.permissions) {
236
+ settings.permissions = { allow: [], deny: [] };
237
+ }
238
+ if (!settings.permissions.allow) {
239
+ settings.permissions.allow = [];
240
+ }
241
+ const permission = `mcp__${MCP_SERVER_NAME}__*`;
242
+ if (!settings.permissions.allow.includes(permission)) {
243
+ settings.permissions.allow.push(permission);
244
+ }
245
+ (0, fs_1.writeFileSync)(settingsPath, JSON.stringify(settings, null, 2));
246
+ }
247
+ }
248
+ exports.ClaudeClient = ClaudeClient;
249
+ function updateGitignore(projectDir) {
250
+ const gitignorePath = (0, path_1.join)(projectDir, ".gitignore");
251
+ const lines = [
252
+ "",
253
+ "# IronBee runtime artifacts",
254
+ ".ironbee/sessions/",
255
+ ];
256
+ if (!(0, fs_1.existsSync)(gitignorePath)) {
257
+ (0, fs_1.writeFileSync)(gitignorePath, lines.join("\n") + "\n");
258
+ return;
259
+ }
260
+ const existing = (0, fs_1.readFileSync)(gitignorePath, "utf-8");
261
+ if (existing.includes(".ironbee/sessions/")) {
262
+ return;
263
+ }
264
+ (0, fs_1.writeFileSync)(gitignorePath, existing + lines.join("\n") + "\n");
265
+ }
266
+ function prepareIronBeeDir(projectDir) {
267
+ (0, fs_1.mkdirSync)((0, path_1.join)(projectDir, ".ironbee"), { recursive: true });
268
+ updateGitignore(projectDir);
269
+ }
270
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/clients/claude/index.ts"],"names":[],"mappings":";;;AAsVA,8CAGC;AAzVD,2BAAoF;AACpF,+BAA4B;AAE5B,6CAA0C;AAC1C,6CAA8C;AAC9C,qDAA+D;AAC/D,yDAAmE;AACnE,uDAAiE;AACjE,yDAAmE;AAEnE,MAAM,eAAe,GAAW,kBAAkB,CAAC;AACnD,MAAM,kBAAkB,GAAW,sBAAsB,CAAC;AAC1D,MAAM,mBAAmB,GAAW,SAAS,CAAC;AA+B9C,MAAa,YAAY;IAAzB;QACoB,SAAI,GAAW,QAAQ,CAAC;IAmR5C,CAAC;IAjRU,MAAM,CAAC,UAAkB;QAC5B,OAAO,IAAA,eAAU,EAAC,IAAA,WAAI,EAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;IACnD,CAAC;IAEM,iBAAiB;QACpB,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC3D,CAAC;IAEM,OAAO,CAAC,UAAkB,EAAE,WAAmB;QAClD,MAAM,SAAS,GAAW,IAAA,WAAI,EAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QACtD,MAAM,SAAS,GAAW,IAAA,WAAI,EAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAW,IAAA,WAAI,EAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAElD,IAAA,cAAS,EAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,IAAA,cAAS,EAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEzC,MAAM,YAAY,GAAW,IAAA,WAAI,EAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QAC9D,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QACjD,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;QAEpC,MAAM,SAAS,GAAW,IAAA,WAAI,EAAC,SAAS,EAAE,yBAAyB,CAAC,CAAC;QACrE,MAAM,YAAY,GAAW,IAAA,iBAAY,EAAC,IAAA,WAAI,EAAC,SAAS,EAAE,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;QAChF,IAAA,kBAAa,EAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAEvC,MAAM,QAAQ,GAAW,IAAA,WAAI,EAAC,QAAQ,EAAE,yBAAyB,CAAC,CAAC;QACnE,MAAM,WAAW,GAAW,IAAA,iBAAY,EAAC,IAAA,WAAI,EAAC,SAAS,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;QAC9E,IAAA,kBAAa,EAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAErC,MAAM,OAAO,GAAW,IAAA,WAAI,EAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QACtD,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAE7B,OAAO,CAAC,GAAG,CAAC,KAAK,WAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAA,eAAM,EAAC,UAAU,CAAC,aAAa,WAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,WAAE,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACtG,OAAO,CAAC,GAAG,CAAC,KAAK,WAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAA,eAAM,EAAC,UAAU,CAAC,aAAa,WAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,WAAE,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACnG,OAAO,CAAC,GAAG,CAAC,KAAK,WAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAA,eAAM,EAAC,UAAU,CAAC,aAAa,WAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,WAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAClG,OAAO,CAAC,GAAG,CAAC,KAAK,WAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAA,eAAM,EAAC,UAAU,CAAC,aAAa,WAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,WAAE,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACrG,CAAC;IAEM,SAAS,CAAC,UAAkB;QAC/B,MAAM,SAAS,GAAW,IAAA,WAAI,EAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAEtD,8BAA8B;QAC9B,MAAM,SAAS,GAAW,IAAA,WAAI,EAAC,SAAS,EAAE,QAAQ,EAAE,yBAAyB,CAAC,CAAC;QAC/E,MAAM,QAAQ,GAAW,IAAA,WAAI,EAAC,SAAS,EAAE,OAAO,EAAE,yBAAyB,CAAC,CAAC;QAC7E,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAC3B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAE1B,yDAAyD;QACzD,MAAM,YAAY,GAAW,IAAA,WAAI,EAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QAC9D,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;QACtC,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;QAEpC,yCAAyC;QACzC,MAAM,OAAO,GAAW,IAAA,WAAI,EAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QACtD,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAE9B,OAAO,CAAC,GAAG,CAAC,KAAK,WAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAA,eAAM,EAAC,UAAU,CAAC,mDAAmD,CAAC,CAAC;IAC3G,CAAC;IAEM,aAAa,CAAC,UAAkB;QACnC,IAAA,iBAAiB,EAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IAEM,eAAe,CAAC,UAAkB;QACrC,IAAA,mBAAmB,EAAC,UAAU,CAAC,CAAC;IACpC,CAAC;IAEM,cAAc,CAAC,UAAkB;QACpC,IAAA,kBAAkB,EAAC,UAAU,CAAC,CAAC;IACnC,CAAC;IAEM,eAAe,CAAC,UAAkB;QACrC,IAAA,mBAAmB,EAAC,UAAU,CAAC,CAAC;IACpC,CAAC;IAEO,aAAa,CAAC,KAAgB;QAClC,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAc,EAAW,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAClG,CAAC;IAEO,gBAAgB,CAAC,YAAoB,EAAE,WAAmB;QAC9D,IAAI,QAAQ,GAAmB,EAAE,CAAC;QAElC,IAAI,IAAA,eAAU,EAAC,YAAY,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACD,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,YAAY,EAAE,OAAO,CAAC,CAAmB,CAAC;YACjF,CAAC;YAAC,OAAO,CAAU,EAAE,CAAC;gBAClB,eAAM,CAAC,KAAK,CAAC,mBAAmB,YAAY,KAAK,CAAC,EAAE,CAAC,CAAC;gBACtD,QAAQ,GAAG,EAAE,CAAC;YAClB,CAAC;QACL,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YAClB,QAAQ,CAAC,KAAK,GAAG,EAAE,CAAC;QACxB,CAAC;QAED,yDAAyD;QACzD,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAClD,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CACxD,CAAC,KAAgB,EAAW,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAC5D,CAAC;QACN,CAAC;QAED,gCAAgC;QAChC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;YAC9B,QAAQ,CAAC,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC;QACpC,CAAC;QACD,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC;YAC5B,OAAO,EAAE,sBAAsB;YAC/B,KAAK,EAAE;gBACH;oBACI,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,IAAI,WAAW,sCAAsC;iBACjE;aACJ;SACJ,CAAC,CAAC;QACH,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC;YAC5B,OAAO,EAAE,2BAA2B;YACpC,KAAK,EAAE;gBACH;oBACI,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,IAAI,WAAW,qCAAqC;iBAChE;aACJ;SACJ,CAAC,CAAC;QAEH,gCAAgC;QAChC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;YAC/B,QAAQ,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC;QACrC,CAAC;QACD,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC;YAC7B,OAAO,EAAE,EAAE;YACX,KAAK,EAAE;gBACH;oBACI,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,IAAI,WAAW,sCAAsC;iBACjE;aACJ;SACJ,CAAC,CAAC;QAEH,wBAAwB;QACxB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACvB,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC;QAC7B,CAAC;QACD,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YACrB,OAAO,EAAE,EAAE;YACX,KAAK,EAAE;gBACH;oBACI,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,IAAI,WAAW,oCAAoC;iBAC/D;aACJ;SACJ,CAAC,CAAC;QAEH,IAAA,kBAAa,EAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC;IAEO,kBAAkB,CAAC,YAAoB;QAC3C,IAAI,CAAC,IAAA,eAAU,EAAC,YAAY,CAAC,EAAE,CAAC;YAC5B,OAAO;QACX,CAAC;QAED,IAAI,CAAC;YACD,MAAM,QAAQ,GAAmB,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,YAAY,EAAE,OAAO,CAAC,CAAmB,CAAC;YACnG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;gBAClB,OAAO;YACX,CAAC;YAED,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClD,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CACxD,CAAC,KAAgB,EAAW,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAC5D,CAAC;YACN,CAAC;YAED,IAAA,kBAAa,EAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACnE,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YAClB,eAAM,CAAC,KAAK,CAAC,+BAA+B,YAAY,KAAK,CAAC,EAAE,CAAC,CAAC;QACtE,CAAC;IACL,CAAC;IAEO,eAAe,CAAC,OAAe;QACnC,IAAI,CAAC,IAAA,eAAU,EAAC,OAAO,CAAC,EAAE,CAAC;YACvB,OAAO;QACX,CAAC;QAED,IAAI,CAAC;YACD,MAAM,MAAM,GAAc,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,OAAO,EAAE,OAAO,CAAC,CAAc,CAAC;YAClF,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;gBAC1D,OAAO,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;gBAC1C,IAAA,kBAAa,EAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC5D,CAAC;QACL,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YAClB,eAAM,CAAC,KAAK,CAAC,oCAAoC,OAAO,KAAK,CAAC,EAAE,CAAC,CAAC;QACtE,CAAC;IACL,CAAC;IAEO,gBAAgB,CAAC,YAAoB;QACzC,IAAI,CAAC,IAAA,eAAU,EAAC,YAAY,CAAC,EAAE,CAAC;YAC5B,OAAO;QACX,CAAC;QAED,IAAI,CAAC;YACD,MAAM,QAAQ,GAAmB,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,YAAY,EAAE,OAAO,CAAC,CAAmB,CAAC;YACnG,MAAM,UAAU,GAAW,QAAQ,eAAe,KAAK,CAAC;YAExD,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC;gBAC9B,QAAQ,CAAC,WAAW,CAAC,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAC1D,CAAC,CAAS,EAAW,EAAE,CAAC,CAAC,KAAK,UAAU,CAC3C,CAAC;gBACF,IAAA,kBAAa,EAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACnE,CAAC;QACL,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YAClB,eAAM,CAAC,KAAK,CAAC,oCAAoC,YAAY,KAAK,CAAC,EAAE,CAAC,CAAC;QAC3E,CAAC;IACL,CAAC;IAEO,UAAU,CAAC,QAAgB;QAC/B,IAAI,IAAA,eAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;YACvB,IAAA,eAAU,EAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;IACL,CAAC;IAEO,cAAc,CAAC,OAAe;QAClC,IAAI,MAAM,GAAc,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;QAE3C,IAAI,IAAA,eAAU,EAAC,OAAO,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC;gBACD,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,OAAO,EAAE,OAAO,CAAC,CAAc,CAAC;gBACjE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;oBACrB,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC;gBAC3B,CAAC;YACL,CAAC;YAAC,OAAO,CAAU,EAAE,CAAC;gBAClB,eAAM,CAAC,KAAK,CAAC,mBAAmB,OAAO,KAAK,CAAC,EAAE,CAAC,CAAC;gBACjD,MAAM,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;YAChC,CAAC;QACL,CAAC;QAED,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,GAAG;YACjC,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,CAAC,IAAI,EAAE,kBAAkB,CAAC;YAChC,GAAG,EAAE;gBACD,iCAAiC,EAAE,MAAM;aAC5C;SACJ,CAAC;QAEF,IAAA,kBAAa,EAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC;IAEO,gBAAgB,CAAC,YAAoB;QACzC,IAAI,QAAQ,GAAmB,EAAE,CAAC;QAElC,IAAI,IAAA,eAAU,EAAC,YAAY,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACD,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,YAAY,EAAE,OAAO,CAAC,CAAmB,CAAC;YACjF,CAAC;YAAC,OAAO,CAAU,EAAE,CAAC;gBAClB,eAAM,CAAC,KAAK,CAAC,mBAAmB,YAAY,KAAK,CAAC,EAAE,CAAC,CAAC;gBACtD,QAAQ,GAAG,EAAE,CAAC;YAClB,CAAC;QACL,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YACxB,QAAQ,CAAC,WAAW,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACnD,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;YAC9B,QAAQ,CAAC,WAAW,CAAC,KAAK,GAAG,EAAE,CAAC;QACpC,CAAC;QAED,MAAM,UAAU,GAAW,QAAQ,eAAe,KAAK,CAAC;QACxD,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACnD,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChD,CAAC;QAED,IAAA,kBAAa,EAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC;CACJ;AApRD,oCAoRC;AAED,SAAS,eAAe,CAAC,UAAkB;IACvC,MAAM,aAAa,GAAW,IAAA,WAAI,EAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAa;QACpB,EAAE;QACF,6BAA6B;QAC7B,oBAAoB;KACvB,CAAC;IAEF,IAAI,CAAC,IAAA,eAAU,EAAC,aAAa,CAAC,EAAE,CAAC;QAC7B,IAAA,kBAAa,EAAC,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QACtD,OAAO;IACX,CAAC;IAED,MAAM,QAAQ,GAAW,IAAA,iBAAY,EAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAC9D,IAAI,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAC1C,OAAO;IACX,CAAC;IAED,IAAA,kBAAa,EAAC,aAAa,EAAE,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AACrE,CAAC;AAED,SAAgB,iBAAiB,CAAC,UAAkB;IAChD,IAAA,cAAS,EAAC,IAAA,WAAI,EAAC,UAAU,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,eAAe,CAAC,UAAU,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,35 @@
1
+ You MUST verify all code changes in the browser before completing any task.
2
+
3
+ Verification is NOT just visual — you must functionally test the changes by interacting with the application through the browser-devtools MCP server. Click buttons, fill forms, trigger the flows you changed, and confirm things actually work end-to-end.
4
+
5
+ You are responsible for the full application lifecycle during verification:
6
+ - **Build** the application if needed (e.g. `npm run build`, `npm run dev`, `docker compose build`)
7
+ - **Start** the dev server before navigating to any page (e.g. `npm run dev`, `docker compose up -d`)
8
+ - **Stop** the dev server after verification is complete (e.g. `Ctrl+C`, `docker compose down`)
9
+ If the application is already running, skip the start step. If the build fails, fix it before proceeding.
10
+
11
+ Required verification steps:
12
+ 1. Build and start the application if not already running
13
+ 2. Navigate to affected page(s) with `mcp__browser-devtools__navigation_go-to`
14
+ 3. **Functionally test** the changes — click, type, submit, navigate, interact with the UI to exercise the code paths you modified
15
+ 4. Take a screenshot with `mcp__browser-devtools__content_take-screenshot` to capture the final state
16
+ 5. Check accessibility with `mcp__browser-devtools__a11y_take-aria-snapshot`
17
+ 6. Check console for errors with `mcp__browser-devtools__o11y_get-console-messages`
18
+ 7. Stop the dev server when done
19
+ 8. Write your verdict to the path provided at session start using the Write tool
20
+
21
+ Steps 2, 4, 5, and 6 are enforced by the Stop hook. Step 3 is expected — do not just take a screenshot and call it done.
22
+
23
+ The SessionStart hook outputs your verdict file path at the beginning of your session. After verification, write your verdict to that exact path using the Write tool. The Stop hook will validate it when you stop.
24
+
25
+ If verification fails, fix the code and re-verify.
26
+
27
+ Every code edit (Write/Edit) automatically clears your verdict, requiring re-verification.
28
+
29
+ ## BANNED
30
+
31
+ - Writing a verdict to any path other than the one provided at session start
32
+ - Writing a verdict file without actually performing browser verification
33
+ - Writing a verdict based on assumptions, code reading, or prior knowledge
34
+ - Copying example verdicts from hook messages without doing real verification first
35
+ - Using Bash echo to write verdict files — always use the Write tool
@@ -0,0 +1,63 @@
1
+ ---
2
+ name: ironbee-verification
3
+ description: >
4
+ MANDATORY browser verification after code changes. Activates when: implementing features,
5
+ fixing bugs, modifying UI components, changing API endpoints, updating styles, refactoring code,
6
+ or completing ANY task that changes application behavior. After writing or editing code files,
7
+ you MUST verify changes through the browser-devtools MCP server before reporting task completion.
8
+ ---
9
+
10
+ # IronBee Browser Verification
11
+
12
+ ## Rule
13
+ No task is complete until changes are verified in the browser — visually AND functionally.
14
+
15
+ ## MCP Server
16
+ Verification is performed using the **browser-devtools** MCP server (`browser-devtools-mcp` package).
17
+ All browser interactions must go through this server's tools.
18
+
19
+ ## Application Lifecycle
20
+ You are responsible for managing the application during verification:
21
+ - **Build** the application if needed (e.g. `npm run build`, `npm run dev`, `docker compose build`, or whatever the project uses)
22
+ - **Start** the dev server before navigating to any page (e.g. `npm run dev`, `docker compose up`, `docker compose up -d`)
23
+ - **Stop** the dev server after verification is complete (e.g. `Ctrl+C`, `docker compose down`)
24
+
25
+ If the application is already running, skip the start step. If the build fails, fix the build error before proceeding with verification.
26
+
27
+ ## Flow
28
+ 1. Implement your changes (write/edit code)
29
+ 2. **Build and start** the application if not already running
30
+ 3. **Functionally test** your changes through the browser:
31
+ - **Navigate**: `mcp__browser-devtools__navigation_go-to` — go to the affected page(s)
32
+ - **Interact**: Use the browser agent to **actually test** what you changed — click buttons, fill forms, submit data, trigger workflows, navigate between pages. Do not just look at the page.
33
+ - **Screenshot**: `mcp__browser-devtools__content_take-screenshot` — capture the final visual state
34
+ - **Accessibility**: `mcp__browser-devtools__a11y_take-aria-snapshot` — verify page structure
35
+ - **Console**: `mcp__browser-devtools__o11y_get-console-messages` — check for errors
36
+ Navigate, Screenshot, Accessibility, and Console tools are MANDATORY (the Stop hook checks the transcript for each one). Functional interaction is expected for every verification.
37
+ 4. **Stop** the dev server when verification is complete
38
+ 5. Write your verdict using the Write tool to the path provided at session start (`.ironbee/sessions/<session-id>/verdict.json`). The SessionStart hook outputs the exact path at the beginning of your session — use that path.
39
+ 6. If failed → fix the code → rebuild → re-verify → update verdict → repeat until pass
40
+
41
+ ## What good verification looks like
42
+ - Changed a form handler? → Start the app, fill the form, submit it, verify the response
43
+ - Added a button? → Click it, confirm the expected action happens
44
+ - Fixed a routing bug? → Navigate through the affected routes
45
+ - Updated an API call? → Trigger the action that calls the API, verify the result in the UI
46
+ - Changed styling? → Take a screenshot AND interact to ensure layout didn't break functionality
47
+
48
+ ## How it works
49
+ - At session start, the SessionStart hook outputs your verdict file path — use it
50
+ - After verification, write your verdict to that path using the Write tool
51
+ - When you stop, the Stop hook checks that browser tools were used AND the verdict file exists
52
+ - If something is missing, the hook blocks you and gives you instructions
53
+
54
+ ## Agent Teams
55
+ - Subagents focus on implementation only — do NOT verify
56
+ - The main orchestrator agent verifies ALL changes after subagents complete
57
+ - Each session's verification is isolated via session-specific verdict files
58
+
59
+ ## Important
60
+ - The Stop hook checks BOTH that browser-devtools MCP tools were used AND a verdict file exists
61
+ - Write the verdict to the path given at session start — do NOT guess the path
62
+ - Every code edit (Write/Edit) automatically clears your session's verdict
63
+ - After 3 failed verification attempts, you may complete but must report issues
@@ -0,0 +1,6 @@
1
+ import { IClient } from "./base";
2
+ /** All registered clients. Add new clients here as they are implemented. */
3
+ export declare const REGISTERED_CLIENTS: IClient[];
4
+ export declare function findClient(name: string): IClient | undefined;
5
+ export declare function detectClients(projectDir: string): IClient[];
6
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/clients/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGjC,4EAA4E;AAC5E,eAAO,MAAM,kBAAkB,EAAE,OAAO,EAKvC,CAAC;AAEF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAE5D;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,EAAE,CAE3D"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.REGISTERED_CLIENTS = void 0;
4
+ exports.findClient = findClient;
5
+ exports.detectClients = detectClients;
6
+ const claude_1 = require("./claude");
7
+ /** All registered clients. Add new clients here as they are implemented. */
8
+ exports.REGISTERED_CLIENTS = [
9
+ new claude_1.ClaudeClient(),
10
+ // new CursorClient(), // TODO: add when implementing Cursor support
11
+ // new OpenCodeClient(), // TODO: add when implementing OpenCode support
12
+ // new CodexClient(), // TODO: add when implementing Codex support
13
+ ];
14
+ function findClient(name) {
15
+ return exports.REGISTERED_CLIENTS.find((c) => c.name === name);
16
+ }
17
+ function detectClients(projectDir) {
18
+ return exports.REGISTERED_CLIENTS.filter((c) => c.detect(projectDir));
19
+ }
20
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/clients/registry.ts"],"names":[],"mappings":";;;AAWA,gCAEC;AAED,sCAEC;AAhBD,qCAAwC;AAExC,4EAA4E;AAC/D,QAAA,kBAAkB,GAAc;IACzC,IAAI,qBAAY,EAAE;IAClB,sEAAsE;IACtE,wEAAwE;IACxE,qEAAqE;CACxE,CAAC;AAEF,SAAgB,UAAU,CAAC,IAAY;IACnC,OAAO,0BAAkB,CAAC,IAAI,CAAC,CAAC,CAAU,EAAW,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAC7E,CAAC;AAED,SAAgB,aAAa,CAAC,UAAkB;IAC5C,OAAO,0BAAkB,CAAC,MAAM,CAAC,CAAC,CAAU,EAAW,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;AACpF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const hookCommand: Command;
3
+ //# sourceMappingURL=hook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/commands/hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBpC,eAAO,MAAM,WAAW,EAAE,OACiD,CAAC"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hookCommand = void 0;
4
+ const commander_1 = require("commander");
5
+ const registry_1 = require("../clients/registry");
6
+ function resolveClient(clientName) {
7
+ const name = clientName ?? process.env.IRONBEE_CLIENT;
8
+ if (!name) {
9
+ process.stderr.write("Error: client not specified. Use --client <name> or set IRONBEE_CLIENT env var.\n");
10
+ process.exit(1);
11
+ }
12
+ const client = (0, registry_1.findClient)(name);
13
+ if (!client) {
14
+ process.stderr.write(`Error: unknown client "${name}". Run \`ironbee install\` to set up.\n`);
15
+ process.exit(1);
16
+ }
17
+ return client;
18
+ }
19
+ exports.hookCommand = new commander_1.Command("hook")
20
+ .description("Internal hook runners (invoked by the AI coding client)");
21
+ exports.hookCommand
22
+ .command("verify-gate")
23
+ .description("Stop hook — gates task completion until browser verification passes")
24
+ .option("--client <name>", "client name (overrides IRONBEE_CLIENT env var)")
25
+ .action((options) => {
26
+ const client = resolveClient(options.client);
27
+ const projectDir = client.resolveProjectDir();
28
+ client.runVerifyGate(projectDir);
29
+ });
30
+ exports.hookCommand
31
+ .command("clear-verdict")
32
+ .description("PostToolUse hook — clears stale verdict after code edits")
33
+ .option("--client <name>", "client name (overrides IRONBEE_CLIENT env var)")
34
+ .action((options) => {
35
+ const client = resolveClient(options.client);
36
+ const projectDir = client.resolveProjectDir();
37
+ client.runClearVerdict(projectDir);
38
+ });
39
+ exports.hookCommand
40
+ .command("track-action")
41
+ .description("PostToolUse hook — tracks browser-devtools tool calls in actions.jsonl")
42
+ .option("--client <name>", "client name (overrides IRONBEE_CLIENT env var)")
43
+ .action((options) => {
44
+ const client = resolveClient(options.client);
45
+ const projectDir = client.resolveProjectDir();
46
+ client.runTrackAction(projectDir);
47
+ });
48
+ exports.hookCommand
49
+ .command("session-start")
50
+ .description("SessionStart hook — records session start in actions.jsonl")
51
+ .option("--client <name>", "client name (overrides IRONBEE_CLIENT env var)")
52
+ .action((options) => {
53
+ const client = resolveClient(options.client);
54
+ const projectDir = client.resolveProjectDir();
55
+ client.runSessionStart(projectDir);
56
+ });
57
+ //# sourceMappingURL=hook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook.js","sourceRoot":"","sources":["../../src/commands/hook.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AAEpC,kDAAiD;AAEjD,SAAS,aAAa,CAAC,UAA8B;IACjD,MAAM,IAAI,GAAuB,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAE1E,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mFAAmF,CAAC,CAAC;QAC1G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,MAAM,GAAwB,IAAA,qBAAU,EAAC,IAAI,CAAC,CAAC;IAErD,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,IAAI,yCAAyC,CAAC,CAAC;QAC9F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAEY,QAAA,WAAW,GAAY,IAAI,mBAAO,CAAC,MAAM,CAAC;KAClD,WAAW,CAAC,yDAAyD,CAAC,CAAC;AAE5E,mBAAW;KACN,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,qEAAqE,CAAC;KAClF,MAAM,CAAC,iBAAiB,EAAE,gDAAgD,CAAC;KAC3E,MAAM,CAAC,CAAC,OAA4B,EAAQ,EAAE;IAC3C,MAAM,MAAM,GAAY,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,UAAU,GAAW,MAAM,CAAC,iBAAiB,EAAE,CAAC;IACtD,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC;AAEP,mBAAW;KACN,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,0DAA0D,CAAC;KACvE,MAAM,CAAC,iBAAiB,EAAE,gDAAgD,CAAC;KAC3E,MAAM,CAAC,CAAC,OAA4B,EAAQ,EAAE;IAC3C,MAAM,MAAM,GAAY,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,UAAU,GAAW,MAAM,CAAC,iBAAiB,EAAE,CAAC;IACtD,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;AACvC,CAAC,CAAC,CAAC;AAEP,mBAAW;KACN,OAAO,CAAC,cAAc,CAAC;KACvB,WAAW,CAAC,wEAAwE,CAAC;KACrF,MAAM,CAAC,iBAAiB,EAAE,gDAAgD,CAAC;KAC3E,MAAM,CAAC,CAAC,OAA4B,EAAQ,EAAE;IAC3C,MAAM,MAAM,GAAY,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,UAAU,GAAW,MAAM,CAAC,iBAAiB,EAAE,CAAC;IACtD,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;AACtC,CAAC,CAAC,CAAC;AAEP,mBAAW;KACN,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,4DAA4D,CAAC;KACzE,MAAM,CAAC,iBAAiB,EAAE,gDAAgD,CAAC;KAC3E,MAAM,CAAC,CAAC,OAA4B,EAAQ,EAAE;IAC3C,MAAM,MAAM,GAAY,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,UAAU,GAAW,MAAM,CAAC,iBAAiB,EAAE,CAAC;IACtD,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;AACvC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const installCommand: Command;
3
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBpC,eAAO,MAAM,cAAc,EAAE,OA+CvB,CAAC"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.installCommand = void 0;
4
+ const commander_1 = require("commander");
5
+ const fs_1 = require("fs");
6
+ const path_1 = require("path");
7
+ const child_process_1 = require("child_process");
8
+ const registry_1 = require("../clients/registry");
9
+ const claude_1 = require("../clients/claude");
10
+ const output_1 = require("../lib/output");
11
+ function resolveIronBeePath() {
12
+ const cmd = process.platform === "win32" ? "where" : "which";
13
+ try {
14
+ return (0, child_process_1.execFileSync)(cmd, ["ironbee"]).toString().trim();
15
+ }
16
+ catch {
17
+ return process.argv[1];
18
+ }
19
+ }
20
+ function clientNames() {
21
+ const names = registry_1.REGISTERED_CLIENTS.map((c) => c.name);
22
+ return names.join(", ");
23
+ }
24
+ exports.installCommand = new commander_1.Command("install")
25
+ .description("Install IronBee hooks and guidance files into a project")
26
+ .argument("[project-dir]", "target project directory", ".")
27
+ .option("--client <name>", `client to install for (${clientNames()}), or "all"`)
28
+ .action((dir, options) => {
29
+ const projectDir = (0, path_1.resolve)(dir);
30
+ if (!(0, fs_1.existsSync)(projectDir)) {
31
+ output_1.log.error(`Directory not found: ${projectDir}`);
32
+ process.exit(1);
33
+ }
34
+ const ironBeePath = resolveIronBeePath();
35
+ let clients;
36
+ if (options.client === "all") {
37
+ clients = registry_1.REGISTERED_CLIENTS;
38
+ }
39
+ else if (options.client) {
40
+ const found = (0, registry_1.findClient)(options.client);
41
+ if (!found) {
42
+ output_1.log.error(`Unknown client: "${options.client}". Available: ${clientNames()}`);
43
+ process.exit(1);
44
+ }
45
+ clients = [found];
46
+ }
47
+ else {
48
+ clients = (0, registry_1.detectClients)(projectDir);
49
+ if (clients.length === 0) {
50
+ output_1.log.warn(`No client detected. Defaulting to: ${registry_1.REGISTERED_CLIENTS[0].name}`);
51
+ clients = [registry_1.REGISTERED_CLIENTS[0]];
52
+ }
53
+ else {
54
+ const detected = clients.map((c) => c.name).join(", ");
55
+ output_1.log.info(`Detected client(s): ${output_1.pc.bold(detected)}`);
56
+ }
57
+ }
58
+ output_1.log.blank();
59
+ (0, claude_1.prepareIronBeeDir)(projectDir);
60
+ for (const client of clients) {
61
+ client.install(projectDir, ironBeePath);
62
+ }
63
+ output_1.log.blank();
64
+ output_1.log.label("binary", output_1.pc.dim(ironBeePath));
65
+ output_1.log.label("project", output_1.pc.dim(projectDir));
66
+ output_1.log.blank();
67
+ output_1.log.success(`IronBee installed. ${output_1.pc.dim("Restart your AI coding client to activate the hooks.")}`);
68
+ });
69
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const statusCommand: Command;
3
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,eAAO,MAAM,aAAa,EAAE,OA4EtB,CAAC"}