pixelcrew 0.2.3 → 0.2.6

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 (171) hide show
  1. package/README.md +389 -315
  2. package/bin/pixel-agents.js +306 -149
  3. package/package.json +3 -1
  4. package/skill/SKILL.md +185 -0
  5. package/skill/references/anti-ai-rubric.md +30 -0
  6. package/skill/references/anti-ai-slop-encyclopedia.md +181 -0
  7. package/skill/references/commands-reference.md +135 -0
  8. package/skill/references/testing-and-qa-strategy.md +25 -0
  9. package/skill/references/token-efficiency.md +20 -0
  10. package/src/adapters/adapter.interface.js +77 -0
  11. package/src/adapters/antigravity.js +138 -0
  12. package/src/adapters/claude-code.js +149 -0
  13. package/src/adapters/codex.js +131 -0
  14. package/src/adapters/cursor.js +133 -0
  15. package/src/adapters/generic.js +63 -0
  16. package/src/adapters/index.js +15 -0
  17. package/src/adapters/kiro.js +134 -0
  18. package/src/adapters/registry.js +150 -0
  19. package/src/backend/analyzer/complexity-analyzer.js +104 -0
  20. package/src/backend/analyzer/requirement-analyzer.js +213 -0
  21. package/src/backend/analyzer/threat-analyzer.js +122 -0
  22. package/src/backend/api/api-designer.js +90 -0
  23. package/src/backend/api/error-contract.js +132 -0
  24. package/src/backend/api/route-generator.js +92 -0
  25. package/src/backend/api/schema-generator.js +64 -0
  26. package/src/backend/architecture/adr-generator.js +62 -0
  27. package/src/backend/architecture/architecture-reasoner.js +119 -0
  28. package/src/backend/architecture/architecture-selector.js +57 -0
  29. package/src/backend/architecture/tradeoff-analyzer.js +92 -0
  30. package/src/backend/data/data-modeler.js +114 -0
  31. package/src/backend/data/index-analyzer.js +93 -0
  32. package/src/backend/data/query-analyzer.js +41 -0
  33. package/src/backend/data/schema-generator.js +92 -0
  34. package/src/backend/data/transaction-analyzer.js +49 -0
  35. package/src/backend/index.js +67 -0
  36. package/src/backend/observability/logging-engine.js +80 -0
  37. package/src/backend/observability/metrics-engine.js +31 -0
  38. package/src/backend/observability/tracing-engine.js +16 -0
  39. package/src/backend/patterns/pattern-registry.js +74 -0
  40. package/src/backend/patterns/pattern-selector.js +39 -0
  41. package/src/backend/patterns/tradeoff-engine.js +17 -0
  42. package/src/backend/performance/cache-analyzer.js +31 -0
  43. package/src/backend/performance/concurrency-analyzer.js +34 -0
  44. package/src/backend/performance/performance-engine.js +98 -0
  45. package/src/backend/performance/query-optimizer.js +16 -0
  46. package/src/backend/reliability/failure-analyzer.js +22 -0
  47. package/src/backend/reliability/idempotency-engine.js +56 -0
  48. package/src/backend/reliability/resilience-engine.js +141 -0
  49. package/src/backend/reliability/retry-analyzer.js +15 -0
  50. package/src/backend/security/auth-selector.js +33 -0
  51. package/src/backend/security/authorization-engine.js +90 -0
  52. package/src/backend/security/policy-engine.js +49 -0
  53. package/src/backend/security/secret-analyzer.js +39 -0
  54. package/src/backend/security/security-engine.js +122 -0
  55. package/src/backend/security/threat-model.js +59 -0
  56. package/src/backend/synthesis/backend-synthesizer.js +98 -0
  57. package/src/backend/synthesis/infrastructure-synthesizer.js +108 -0
  58. package/src/backend/synthesis/module-synthesizer.js +262 -0
  59. package/src/backend/validation/architecture-validator.js +70 -0
  60. package/src/backend/validation/backend-quality-validator.js +71 -0
  61. package/src/backend/validation/dependency-validator.js +20 -0
  62. package/src/backend/validation/performance-validator.js +38 -0
  63. package/src/backend/validation/security-validator.js +73 -0
  64. package/src/commands/adapt.js +105 -0
  65. package/src/commands/add.js +78 -0
  66. package/src/commands/animate.js +48 -0
  67. package/src/commands/assemble.js +57 -0
  68. package/src/commands/audit.js +93 -0
  69. package/src/commands/backend.js +125 -0
  70. package/src/commands/bento.js +25 -0
  71. package/src/commands/blueprint.js +65 -0
  72. package/src/commands/bolder.js +48 -0
  73. package/src/commands/boss-fight.js +60 -0
  74. package/src/commands/build.js +39 -0
  75. package/src/commands/calibrate.js +25 -0
  76. package/src/commands/chromatic.js +25 -0
  77. package/src/commands/clarify.js +52 -0
  78. package/src/commands/colorize.js +57 -0
  79. package/src/commands/command.interface.js +28 -0
  80. package/src/commands/commands.js +84 -0
  81. package/src/commands/craft.js +57 -0
  82. package/src/commands/crew.js +66 -0
  83. package/src/commands/critique.js +25 -0
  84. package/src/commands/de-slop.js +25 -0
  85. package/src/commands/delight.js +46 -0
  86. package/src/commands/deploy.js +42 -0
  87. package/src/commands/distill.js +48 -0
  88. package/src/commands/doctor.js +89 -0
  89. package/src/commands/document.js +83 -0
  90. package/src/commands/eight-bit.js +25 -0
  91. package/src/commands/extract.js +75 -0
  92. package/src/commands/fix.js +46 -0
  93. package/src/commands/harden.js +85 -0
  94. package/src/commands/index.js +67 -0
  95. package/src/commands/install.js +75 -0
  96. package/src/commands/layout.js +48 -0
  97. package/src/commands/live.js +44 -0
  98. package/src/commands/manifest.js +25 -0
  99. package/src/commands/office.js +25 -0
  100. package/src/commands/onboard.js +46 -0
  101. package/src/commands/oneshot.js +60 -0
  102. package/src/commands/optimize.js +46 -0
  103. package/src/commands/overdrive.js +46 -0
  104. package/src/commands/parser.js +143 -0
  105. package/src/commands/pixelcrew.js +96 -0
  106. package/src/commands/plan.js +66 -0
  107. package/src/commands/polish.js +45 -0
  108. package/src/commands/quieter.js +48 -0
  109. package/src/commands/recap.js +358 -0
  110. package/src/commands/registry.js +353 -0
  111. package/src/commands/render.js +26 -0
  112. package/src/commands/retrofit.js +25 -0
  113. package/src/commands/review.js +118 -0
  114. package/src/commands/roster.js +25 -0
  115. package/src/commands/sentinel.js +25 -0
  116. package/src/commands/shape.js +66 -0
  117. package/src/commands/skills.js +57 -0
  118. package/src/commands/status.js +48 -0
  119. package/src/commands/stop.js +50 -0
  120. package/src/commands/sync.js +58 -0
  121. package/src/commands/typeset.js +58 -0
  122. package/src/commands/warp.js +25 -0
  123. package/src/core/agent-runtime.js +94 -0
  124. package/src/core/event-bus.js +98 -0
  125. package/src/core/index.js +9 -0
  126. package/src/core/orchestrator.js +234 -0
  127. package/src/core/scheduler.js +124 -0
  128. package/src/core/task-graph.js +185 -0
  129. package/src/dashboard/app.js +1172 -30
  130. package/src/dashboard/index.html +223 -23
  131. package/src/dashboard/styles.css +870 -0
  132. package/src/index.js +16 -0
  133. package/src/orchestrator/artifact-graph.js +104 -0
  134. package/src/orchestrator/ast-normalizer.js +147 -0
  135. package/src/orchestrator/code-generator.js +632 -780
  136. package/src/orchestrator/design-engine.js +203 -0
  137. package/src/orchestrator/engine.js +307 -38
  138. package/src/orchestrator/oneshot.js +367 -380
  139. package/src/orchestrator/ontology.js +394 -0
  140. package/src/orchestrator/planner.js +231 -258
  141. package/src/orchestrator/repair-planner.js +67 -0
  142. package/src/orchestrator/requirement-contract.js +177 -0
  143. package/src/orchestrator/requirement-validator.js +39 -0
  144. package/src/orchestrator/semantic-engine.js +582 -0
  145. package/src/orchestrator/semantic-reviewer.js +179 -0
  146. package/src/orchestrator/task-planner.js +111 -0
  147. package/src/orchestrator/telemetry.js +209 -0
  148. package/src/orchestrator/ui-synthesizer.js +245 -0
  149. package/src/orchestrator/visual-critic.js +106 -0
  150. package/src/policies/architecture/layering.policy.js +14 -0
  151. package/src/policies/performance/indexing.policy.js +13 -0
  152. package/src/policies/reliability/resilience.policy.js +13 -0
  153. package/src/policies/security/auth.policy.js +31 -0
  154. package/src/protocol/agent.js +124 -0
  155. package/src/protocol/event.js +78 -0
  156. package/src/protocol/index.js +8 -0
  157. package/src/protocol/skill.js +54 -0
  158. package/src/protocol/task.js +100 -0
  159. package/src/scaffold/claude-generator.js +60 -0
  160. package/src/scaffold/commands-catalog.js +321 -0
  161. package/src/scaffold/cursor-generator.js +74 -0
  162. package/src/scaffold/ide-rules.js +133 -0
  163. package/src/scaffold/init.js +415 -91
  164. package/src/scaffold/installer.js +571 -0
  165. package/src/scaffold/kiro-generator.js +86 -0
  166. package/src/scaffold/skills-bundle.js +520 -0
  167. package/src/scaffold/templates.js +57 -4
  168. package/src/scaffold/workstations.js +364 -0
  169. package/src/server/server.js +283 -40
  170. package/src/utils/fs-safe.js +168 -0
  171. package/src/utils/markdown-report.js +175 -0
@@ -0,0 +1,364 @@
1
+ /**
2
+ * PIXEL CREW — Floor 42 Workstation Scanner & Interactive Installer
3
+ *
4
+ * Detects workspace harnesses and global AI coding environments across Kiro, Cursor,
5
+ * Antigravity, Claude Code, Codex, and Gemini, providing a personalized interactive deployment flow.
6
+ */
7
+
8
+ import fs from 'node:fs/promises';
9
+ import path from 'node:path';
10
+ import os from 'node:os';
11
+ import readline from 'node:readline/promises';
12
+ import { PROVIDER_PATHS, GLOBAL_PROVIDER_PATHS, detectActiveIDE } from './installer.js';
13
+ import { getSkillBundle, getAllCanonicalSkillIds } from './skills-bundle.js';
14
+ import { generateKiroFiles } from './kiro-generator.js';
15
+ import { generateCursorFiles, generateAntigravityFiles, generateClaudeFiles } from './ide-rules.js';
16
+ import { FLOOR42_COMMANDS } from './commands-catalog.js';
17
+ import { safeWriteFile, safeMkdir, DryRunReporter } from '../utils/fs-safe.js';
18
+
19
+ /**
20
+ /**
21
+ * Discovers all active workspace and global user AI coding workstations
22
+ */
23
+ export function getWorkstationCandidates(targetDir = process.cwd()) {
24
+ const home = os.homedir();
25
+
26
+ return [
27
+ // Local Workspace Workstations
28
+ {
29
+ id: 'kiro',
30
+ name: 'Kiro AI',
31
+ scope: 'workspace',
32
+ path: path.join(targetDir, '.kiro'),
33
+ displayPath: './.kiro',
34
+ configFiles: [path.join(targetDir, '.kirorules'), path.join(targetDir, 'kiro.json'), path.join(targetDir, '.kiro.json')]
35
+ },
36
+ {
37
+ id: 'cursor',
38
+ name: 'Cursor IDE',
39
+ scope: 'workspace',
40
+ path: path.join(targetDir, '.cursor'),
41
+ displayPath: './.cursor',
42
+ configFiles: [path.join(targetDir, '.cursorrules')]
43
+ },
44
+ {
45
+ id: 'antigravity',
46
+ name: 'Google Antigravity',
47
+ scope: 'workspace',
48
+ path: path.join(targetDir, '.agents'),
49
+ displayPath: './.agents',
50
+ configFiles: [path.join(targetDir, 'AGENTS.md'), path.join(targetDir, '.agent')]
51
+ },
52
+ {
53
+ id: 'claude-code',
54
+ name: 'Claude Code',
55
+ scope: 'workspace',
56
+ path: path.join(targetDir, '.claude'),
57
+ displayPath: './.claude',
58
+ configFiles: [path.join(targetDir, 'CLAUDE.md')]
59
+ },
60
+ {
61
+ id: 'pixel-crew',
62
+ name: 'Pixel Crew HQ',
63
+ scope: 'workspace',
64
+ path: path.join(targetDir, '.pixel-crew'),
65
+ displayPath: './.pixel-crew',
66
+ configFiles: [path.join(targetDir, '.pixel-crew', 'pixel.json')]
67
+ },
68
+
69
+ // Global User-Level AI Environments
70
+ {
71
+ id: 'kiro',
72
+ name: 'Kiro AI (Global)',
73
+ scope: 'global',
74
+ path: path.join(home, '.kiro'),
75
+ displayPath: '~/.kiro',
76
+ configFiles: [path.join(home, '.config', 'kiro')]
77
+ },
78
+ {
79
+ id: 'antigravity',
80
+ name: 'Google Antigravity (Global)',
81
+ scope: 'global',
82
+ path: path.join(home, '.gemini', 'config'),
83
+ displayPath: '~/.gemini/config',
84
+ configFiles: [path.join(home, '.gemini', 'antigravity-ide'), path.join(home, '.agents')]
85
+ },
86
+ {
87
+ id: 'claude-code',
88
+ name: 'Claude Code (Global)',
89
+ scope: 'global',
90
+ path: path.join(home, '.claude'),
91
+ displayPath: '~/.claude',
92
+ configFiles: []
93
+ },
94
+ {
95
+ id: 'cursor',
96
+ name: 'Cursor IDE (Global)',
97
+ scope: 'global',
98
+ path: path.join(home, '.cursor'),
99
+ displayPath: '~/.cursor',
100
+ configFiles: []
101
+ },
102
+ {
103
+ id: 'codex',
104
+ name: 'OpenAI Codex (Global)',
105
+ scope: 'global',
106
+ path: path.join(home, '.codex'),
107
+ displayPath: '~/.codex',
108
+ configFiles: []
109
+ }
110
+ ];
111
+ }
112
+
113
+ export async function scanAllWorkstations(targetDir = process.cwd()) {
114
+ const candidates = getWorkstationCandidates(targetDir);
115
+ const detected = [];
116
+ const activeIDE = detectActiveIDE();
117
+
118
+ for (const c of candidates) {
119
+ let isPresent = false;
120
+
121
+ try {
122
+ await fs.access(c.path);
123
+ isPresent = true;
124
+ } catch {
125
+ for (const cf of c.configFiles) {
126
+ try {
127
+ await fs.access(cf);
128
+ isPresent = true;
129
+ break;
130
+ } catch {}
131
+ }
132
+ }
133
+
134
+ // Always include active IDE workspace or default
135
+ if (!isPresent && c.scope === 'workspace' && c.id === activeIDE.id) {
136
+ isPresent = true;
137
+ }
138
+
139
+ if (isPresent) {
140
+ detected.push({
141
+ ...c,
142
+ isActive: c.id === activeIDE.id
143
+ });
144
+ }
145
+ }
146
+
147
+ // Ensure pixel-crew workspace is always present
148
+ if (!detected.some(d => d.id === 'pixel-crew' && d.scope === 'workspace')) {
149
+ detected.push({
150
+ id: 'pixel-crew',
151
+ name: 'Pixel Crew HQ',
152
+ scope: 'workspace',
153
+ path: path.join(targetDir, '.pixel-crew'),
154
+ displayPath: './.pixel-crew',
155
+ isActive: true
156
+ });
157
+ }
158
+
159
+ return detected;
160
+ }
161
+
162
+ /**
163
+ * Runs the interactive Floor 42 Workstation Dispatcher
164
+ */
165
+ export async function promptWorkstationSetup(targetDir = process.cwd(), options = {}) {
166
+ const activeIDE = detectActiveIDE();
167
+ const detected = await scanAllWorkstations(targetDir);
168
+
169
+ const isInteractive = !options.yes && !options.dryRun && process.stdin.isTTY;
170
+ let selectedPlan = options.scope || 'detected';
171
+ let targetWorkstations = [];
172
+
173
+ if (isInteractive) {
174
+ const rl = readline.createInterface({
175
+ input: process.stdin,
176
+ output: process.stdout
177
+ });
178
+
179
+ console.log('\n\x1b[36m' + `
180
+ ╔══════════════════════════════════════════════════════════════════════╗
181
+ ║ PIXEL CREW — AGENT WORKSTATION DISPATCHER ║
182
+ ║ [ ◉ _ ◉ ] ║
183
+ ╚══════════════════════════════════════════════════════════════════════╝
184
+ ` + '\x1b[0m');
185
+
186
+ console.log('\x1b[33mScanning AI coding environments and workstations:\x1b[0m\n');
187
+ console.log(' \x1b[90m┌── DETECTED AGENT WORKSTATIONS ──────────────────────────────────────┐\x1b[0m');
188
+ for (const w of detected) {
189
+ const activeTag = w.isActive ? ' \x1b[32m(Active Terminal)\x1b[0m' : '';
190
+ const padName = (w.name + activeTag).padEnd(38, ' ');
191
+ console.log(` \x1b[90m│\x1b[0m \x1b[36m•\x1b[0m ${padName} \x1b[90m->\x1b[0m \x1b[33m${w.displayPath}\x1b[0m`);
192
+ }
193
+ console.log(' \x1b[90m└─────────────────────────────────────────────────────────────────────┘\x1b[0m\n');
194
+
195
+ console.log('\x1b[1mChoose deployment strategy:\x1b[0m');
196
+ console.log(` \x1b[36m1)\x1b[0m \x1b[1mDetected Workstations Only\x1b[0m (${activeIDE.name} Workspace) \x1b[32m[Recommended]\x1b[0m`);
197
+ console.log(` \x1b[36m2)\x1b[0m \x1b[1mGlobal Deployment\x1b[0m (Install to all detected user AI IDEs: ~/.kiro, ~/.gemini, etc.)`);
198
+ console.log(` \x1b[36m3)\x1b[0m \x1b[1mCustomize Selection\x1b[0m (Pick specific IDE workstations from list)`);
199
+ console.log(` \x1b[36m4)\x1b[0m \x1b[1mUniversal Sync\x1b[0m (Sync all 17 skills + Kiro workflows + steering rules across all folders)`);
200
+
201
+ const choice = await rl.question('\n\x1b[33mChoice [1-4] (1):\x1b[0m ');
202
+ const trimmed = choice.trim();
203
+
204
+ if (trimmed === '2' || trimmed.toLowerCase() === 'global') {
205
+ selectedPlan = 'global';
206
+ targetWorkstations = detected.filter(d => d.scope === 'global');
207
+ } else if (trimmed === '3' || trimmed.toLowerCase() === 'custom') {
208
+ selectedPlan = 'custom';
209
+ console.log('\n\x1b[36mSelect target workstations by number (comma-separated, e.g. 1, 3):\x1b[0m');
210
+ detected.forEach((w, idx) => {
211
+ console.log(` ${idx + 1}) [${w.scope.toUpperCase()}] ${w.name} (${w.displayPath})`);
212
+ });
213
+ const customAns = await rl.question('\nEnter selections: ');
214
+ const indices = customAns.split(',').map(s => parseInt(s.trim(), 10) - 1).filter(i => !isNaN(i) && detected[i]);
215
+ targetWorkstations = indices.length > 0 ? indices.map(i => detected[i]) : detected;
216
+ } else if (trimmed === '4' || trimmed.toLowerCase() === 'all' || trimmed.toLowerCase() === 'sync') {
217
+ selectedPlan = 'all';
218
+ targetWorkstations = detected;
219
+ } else {
220
+ selectedPlan = 'detected';
221
+ targetWorkstations = detected.filter(d => d.scope === 'workspace' || d.isActive);
222
+ }
223
+
224
+ rl.close();
225
+ } else {
226
+ // Non-interactive / CI
227
+ if (options.scope === 'global' || options.global) {
228
+ selectedPlan = 'global';
229
+ targetWorkstations = detected.filter(d => d.scope === 'global');
230
+ if (targetWorkstations.length === 0) {
231
+ const allCandidates = getWorkstationCandidates(targetDir);
232
+ targetWorkstations = allCandidates.filter(c => c.scope === 'global');
233
+ }
234
+ } else if (options.scope === 'all') {
235
+ selectedPlan = 'all';
236
+ const allCandidates = getWorkstationCandidates(targetDir);
237
+ targetWorkstations = allCandidates;
238
+ } else {
239
+ selectedPlan = 'detected';
240
+ targetWorkstations = detected.filter(d => d.scope === 'workspace' || d.isActive);
241
+ }
242
+ }
243
+
244
+ return {
245
+ plan: selectedPlan,
246
+ workstations: targetWorkstations,
247
+ allDetected: detected,
248
+ activeIDE
249
+ };
250
+ }
251
+
252
+ /**
253
+ * Deploys PixelCrew skills, workflows, and rules to the selected workstations
254
+ */
255
+ export async function deployToWorkstations(targetDir = process.cwd(), deploymentPlan, options = {}) {
256
+ const {
257
+ dryRun = false,
258
+ reporter = new DryRunReporter(targetDir),
259
+ homeDir = (process.env.PIXELCREW_HOME || os.homedir())
260
+ } = options;
261
+ const { workstations, activeIDE } = deploymentPlan;
262
+
263
+ const deployedSummary = [];
264
+
265
+ for (const w of workstations) {
266
+ const isGlobal = w.scope === 'global';
267
+ const baseDir = isGlobal ? homeDir : targetDir;
268
+
269
+ // 1. Install all canonical production skills & references
270
+ const canonicalSkills = getAllCanonicalSkillIds();
271
+ for (const sName of canonicalSkills) {
272
+ const bundle = await getSkillBundle(sName);
273
+ let skillFile = null;
274
+
275
+ if (isGlobal) {
276
+ const globalPathFn = GLOBAL_PROVIDER_PATHS[w.id] || GLOBAL_PROVIDER_PATHS['pixel-crew'];
277
+ if (globalPathFn) skillFile = globalPathFn(sName, homeDir);
278
+ } else {
279
+ const pathFn = PROVIDER_PATHS[w.id] || PROVIDER_PATHS['pixel-crew'];
280
+ if (pathFn) skillFile = pathFn(targetDir, sName);
281
+ }
282
+
283
+ if (skillFile) {
284
+ await safeWriteFile(skillFile, bundle.content.trim() + '\n', { dryRun, reporter, targetDir: baseDir });
285
+
286
+ // Write attached reference documents for directory-based providers
287
+ if (w.id !== 'pixel-crew' && bundle.references && Object.keys(bundle.references).length > 0) {
288
+ const skillDir = path.dirname(skillFile);
289
+ for (const [refName, refContent] of Object.entries(bundle.references)) {
290
+ const refFullPath = path.join(skillDir, 'references', refName);
291
+ await safeWriteFile(refFullPath, refContent, { dryRun, reporter, targetDir: baseDir });
292
+ }
293
+ }
294
+ }
295
+ }
296
+
297
+ // 2. Install Kiro Workflows, Prompts & Rules if targeting Kiro
298
+ if (w.id === 'kiro') {
299
+ const kiroTarget = isGlobal ? path.join(homeDir, '.kiro') : targetDir;
300
+ const kiroFiles = generateKiroFiles(kiroTarget, isGlobal);
301
+ for (const kf of kiroFiles) {
302
+ await safeWriteFile(kf.path, kf.content, { dryRun, reporter, targetDir: baseDir });
303
+ }
304
+ }
305
+
306
+ // 3. Install Cursor Commands, Rules & Settings if targeting Cursor
307
+ if (w.id === 'cursor') {
308
+ const cursorTarget = isGlobal ? path.join(homeDir, '.cursor') : targetDir;
309
+ const cursorFiles = generateCursorFiles(cursorTarget, isGlobal);
310
+ for (const cf of cursorFiles) {
311
+ await safeWriteFile(cf.path, cf.content, { dryRun, reporter, targetDir: baseDir });
312
+ }
313
+ }
314
+
315
+ // 4. Install Antigravity Instructions & Rules if targeting Antigravity
316
+ if (w.id === 'antigravity') {
317
+ const antigravityTarget = isGlobal ? path.join(homeDir, '.gemini', 'config') : targetDir;
318
+ const antigravityFiles = generateAntigravityFiles(antigravityTarget, isGlobal);
319
+ for (const af of antigravityFiles) {
320
+ await safeWriteFile(af.path, af.content, { dryRun, reporter, targetDir: baseDir });
321
+ }
322
+ }
323
+
324
+ // 5. Install Claude Code Slash Commands & Instructions if targeting Claude Code
325
+ if (w.id === 'claude-code') {
326
+ const claudeTarget = isGlobal ? path.join(homeDir, '.claude') : targetDir;
327
+ const claudeFiles = generateClaudeFiles(claudeTarget, isGlobal);
328
+ for (const clf of claudeFiles) {
329
+ await safeWriteFile(clf.path, clf.content, { dryRun, reporter, targetDir: baseDir });
330
+ }
331
+ }
332
+
333
+ // 6. Install Floor 42 command definitions if targeting pixel-crew
334
+ if (w.id === 'pixel-crew') {
335
+ const commandsDir = path.join(baseDir, isGlobal ? '.pixel-crew/commands' : '.pixel-crew/commands');
336
+ for (const cmd of FLOOR42_COMMANDS) {
337
+ const cmdContent = `---
338
+ description: ${cmd.description}
339
+ ---
340
+
341
+ # /${cmd.name}
342
+
343
+ ${cmd.prompt}
344
+ `;
345
+ await safeWriteFile(path.join(commandsDir, `${cmd.name}.md`), cmdContent, { dryRun, reporter, targetDir: baseDir });
346
+ }
347
+ }
348
+
349
+ deployedSummary.push({
350
+ id: w.id,
351
+ name: w.name,
352
+ scope: w.scope,
353
+ displayPath: w.displayPath
354
+ });
355
+ }
356
+
357
+ return {
358
+ success: true,
359
+ deployedCount: deployedSummary.length,
360
+ workstations: deployedSummary,
361
+ dryRun,
362
+ reporter
363
+ };
364
+ }