@givolt/i3-composer-agent 1.0.1 → 2.1.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 (238) hide show
  1. package/.agents/plugins/marketplace.json +1 -1
  2. package/.claude/commands/{build.md → i3-build.md} +10 -10
  3. package/.claude/commands/{code-simplify.md → i3-code-simplify.md} +2 -2
  4. package/.claude/commands/{constraints.md → i3-constraints.md} +4 -4
  5. package/.claude/commands/{plan.md → i3-plan.md} +1 -1
  6. package/.claude/commands/{review.md → i3-review.md} +3 -3
  7. package/.claude/commands/{ship.md → i3-ship.md} +4 -4
  8. package/.claude/commands/{spec.md → i3-spec.md} +1 -1
  9. package/.claude/commands/{test.md → i3-test.md} +2 -2
  10. package/.claude/commands/{webperf.md → i3-webperf.md} +1 -1
  11. package/.claude-plugin/marketplace.json +1 -1
  12. package/.claude-plugin/plugin.json +1 -1
  13. package/.codex-plugin/plugin.json +1 -1
  14. package/.gemini/commands/{build.toml → i3-build.toml} +10 -10
  15. package/.gemini/commands/{code-simplify.toml → i3-code-simplify.toml} +2 -2
  16. package/.gemini/commands/{constraints.toml → i3-constraints.toml} +4 -4
  17. package/.gemini/commands/{planning.toml → i3-planning.toml} +1 -1
  18. package/{commands/review.toml → .gemini/commands/i3-review.toml} +3 -3
  19. package/.gemini/commands/{ship.toml → i3-ship.toml} +4 -4
  20. package/.gemini/commands/{spec.toml → i3-spec.toml} +1 -1
  21. package/{commands/test.toml → .gemini/commands/i3-test.toml} +2 -2
  22. package/.gemini/commands/{webperf.toml → i3-webperf.toml} +1 -1
  23. package/README.md +72 -69
  24. package/agents/code-reviewer.md +2 -2
  25. package/agents/security-auditor.md +1 -1
  26. package/agents/test-engineer.md +1 -1
  27. package/agents/web-performance-auditor.md +3 -3
  28. package/bin/agent-targets.json +11 -0
  29. package/bin/asset-fingerprint.cjs +38 -0
  30. package/bin/cleanup-backups.cjs +16 -0
  31. package/bin/i3-composer-agent.cjs +29 -14
  32. package/bin/install.cjs +81 -19
  33. package/bin/native-content.cjs +29 -0
  34. package/bin/wizard.cjs +2 -1
  35. package/commands/{build.toml → i3-build.toml} +10 -10
  36. package/commands/{code-simplify.toml → i3-code-simplify.toml} +2 -2
  37. package/commands/{constraints.toml → i3-constraints.toml} +4 -4
  38. package/commands/{planning.toml → i3-planning.toml} +1 -1
  39. package/{.gemini/commands/review.toml → commands/i3-review.toml} +3 -3
  40. package/commands/{ship.toml → i3-ship.toml} +4 -4
  41. package/commands/{spec.toml → i3-spec.toml} +1 -1
  42. package/{.gemini/commands/test.toml → commands/i3-test.toml} +2 -2
  43. package/commands/{webperf.toml → i3-webperf.toml} +1 -1
  44. package/docs/adoption-guide.md +35 -35
  45. package/docs/agents.md +12 -12
  46. package/docs/antigravity-setup.md +14 -14
  47. package/docs/codebuddy-setup.md +27 -18
  48. package/docs/codex-setup.md +6 -6
  49. package/docs/commandcode-setup.md +5 -5
  50. package/docs/copilot-cli-setup.md +5 -5
  51. package/docs/copilot-setup.md +22 -22
  52. package/docs/cursor-setup.md +22 -22
  53. package/docs/gemini-cli-setup.md +26 -26
  54. package/docs/getting-started.md +36 -38
  55. package/docs/opencode-setup.md +31 -31
  56. package/docs/windsurf-setup.md +7 -7
  57. package/docs/workbuddy-setup.md +92 -0
  58. package/hooks/SDD-CACHE.md +3 -3
  59. package/hooks/SIMPLIFY-IGNORE.md +2 -2
  60. package/hooks/session-start-test.sh +1 -1
  61. package/hooks/session-start.sh +3 -3
  62. package/package.json +36 -20
  63. package/plugin.json +1 -1
  64. package/references/accessibility-checklist.md +1 -1
  65. package/references/definition-of-done.md +7 -7
  66. package/references/observability-checklist.md +3 -3
  67. package/references/orchestration-patterns.md +17 -17
  68. package/references/performance-checklist.md +2 -2
  69. package/references/security-checklist.md +1 -1
  70. package/references/testing-patterns.md +1 -1
  71. package/skills/{api-and-interface-design → i3-api-and-interface-design}/SKILL.md +2 -2
  72. package/skills/{browser-testing-with-devtools → i3-browser-testing-with-devtools}/SKILL.md +1 -1
  73. package/skills/{ci-cd-and-automation → i3-ci-cd-and-automation}/SKILL.md +2 -2
  74. package/skills/{code-review-and-quality → i3-code-review-and-quality}/SKILL.md +5 -5
  75. package/skills/{code-simplification → i3-code-simplification}/SKILL.md +1 -1
  76. package/skills/{constraint-driven-development → i3-constraint-driven-development}/SKILL.md +15 -15
  77. package/skills/{context-engineering → i3-context-engineering}/SKILL.md +1 -1
  78. package/skills/{debugging-and-error-recovery → i3-debugging-and-error-recovery}/SKILL.md +2 -2
  79. package/skills/{deprecation-and-migration → i3-deprecation-and-migration}/SKILL.md +2 -2
  80. package/skills/{documentation-and-adrs → i3-documentation-and-adrs}/SKILL.md +1 -1
  81. package/skills/{doubt-driven-development → i3-doubt-driven-development}/SKILL.md +8 -8
  82. package/skills/{frontend-ui-engineering → i3-frontend-ui-engineering}/SKILL.md +1 -1
  83. package/skills/{git-workflow-and-versioning → i3-git-workflow-and-versioning}/SKILL.md +4 -4
  84. package/skills/{idea-refine → i3-idea-refine}/SKILL.md +2 -2
  85. package/skills/{idea-refine → i3-idea-refine}/scripts/idea-refine.sh +1 -1
  86. package/skills/{incremental-implementation → i3-incremental-implementation}/SKILL.md +3 -3
  87. package/skills/{interview-me → i3-interview-me}/SKILL.md +12 -12
  88. package/skills/{observability-and-instrumentation → i3-observability-and-instrumentation}/SKILL.md +5 -5
  89. package/skills/{performance-optimization → i3-performance-optimization}/SKILL.md +1 -1
  90. package/skills/{performance-optimization → i3-performance-optimization}/references/optimization-patterns.md +1 -1
  91. package/skills/{planning-and-task-breakdown → i3-planning-and-task-breakdown}/SKILL.md +2 -2
  92. package/skills/{security-and-hardening → i3-security-and-hardening}/SKILL.md +3 -3
  93. package/skills/{security-and-hardening → i3-security-and-hardening}/references/hardening-patterns.md +1 -1
  94. package/skills/{shipping-and-launch → i3-shipping-and-launch}/SKILL.md +2 -2
  95. package/skills/{source-driven-development → i3-source-driven-development}/SKILL.md +2 -2
  96. package/skills/{spec-driven-development → i3-spec-driven-development}/SKILL.md +7 -7
  97. package/skills/{test-driven-development → i3-test-driven-development}/SKILL.md +2 -2
  98. package/skills/{using-agent-skills → i3-using-agent-skills}/SKILL.md +67 -67
  99. package/CHANGELOG.md +0 -34
  100. package/NOTICE.md +0 -14
  101. package/docs/advanced-per-agent-configuration.md +0 -70
  102. package/docs/comparison.md +0 -131
  103. package/docs/developer-onboarding.md +0 -116
  104. package/docs/skill-anatomy.md +0 -203
  105. package/evals/README.md +0 -101
  106. package/evals/cases/api-and-interface-design.json +0 -45
  107. package/evals/cases/browser-testing-with-devtools.json +0 -44
  108. package/evals/cases/ci-cd-and-automation.json +0 -45
  109. package/evals/cases/code-review-and-quality.json +0 -49
  110. package/evals/cases/code-simplification.json +0 -45
  111. package/evals/cases/constraint-driven-development.json +0 -79
  112. package/evals/cases/context-engineering.json +0 -44
  113. package/evals/cases/debugging-and-error-recovery.json +0 -58
  114. package/evals/cases/deprecation-and-migration.json +0 -52
  115. package/evals/cases/documentation-and-adrs.json +0 -44
  116. package/evals/cases/doubt-driven-development.json +0 -43
  117. package/evals/cases/frontend-ui-engineering.json +0 -52
  118. package/evals/cases/git-workflow-and-versioning.json +0 -47
  119. package/evals/cases/idea-refine.json +0 -43
  120. package/evals/cases/incremental-implementation.json +0 -57
  121. package/evals/cases/interview-me.json +0 -42
  122. package/evals/cases/observability-and-instrumentation.json +0 -44
  123. package/evals/cases/performance-optimization.json +0 -53
  124. package/evals/cases/planning-and-task-breakdown.json +0 -45
  125. package/evals/cases/security-and-hardening.json +0 -53
  126. package/evals/cases/shipping-and-launch.json +0 -56
  127. package/evals/cases/source-driven-development.json +0 -44
  128. package/evals/cases/spec-driven-development.json +0 -72
  129. package/evals/cases/test-driven-development.json +0 -73
  130. package/evals/cases/using-agent-skills.json +0 -44
  131. package/evals/fixtures/api-and-interface-design/service-brief.md +0 -19
  132. package/evals/fixtures/browser-testing-with-devtools/README.md +0 -5
  133. package/evals/fixtures/browser-testing-with-devtools/index.html +0 -24
  134. package/evals/fixtures/browser-testing-with-devtools/server.js +0 -15
  135. package/evals/fixtures/ci-cd-and-automation/package.json +0 -8
  136. package/evals/fixtures/ci-cd-and-automation/src/slug.js +0 -3
  137. package/evals/fixtures/ci-cd-and-automation/test/slug.test.js +0 -9
  138. package/evals/fixtures/code-review-and-quality/user-search.diff +0 -16
  139. package/evals/fixtures/code-simplification/config-parser.js +0 -46
  140. package/evals/fixtures/code-simplification/config-parser.test.js +0 -15
  141. package/evals/fixtures/context-engineering/context-audit.md +0 -15
  142. package/evals/fixtures/debugging-and-error-recovery/pagination.js +0 -8
  143. package/evals/fixtures/debugging-and-error-recovery/pagination.test.js +0 -9
  144. package/evals/fixtures/debugging-and-error-recovery/time-pressure.md +0 -6
  145. package/evals/fixtures/deprecation-and-migration/api-inventory.md +0 -9
  146. package/evals/fixtures/documentation-and-adrs/decision-context.md +0 -16
  147. package/evals/fixtures/doubt-driven-development/migration-plan.md +0 -19
  148. package/evals/fixtures/frontend-ui-engineering/Button.tsx +0 -7
  149. package/evals/fixtures/frontend-ui-engineering/design-system.md +0 -11
  150. package/evals/fixtures/git-workflow-and-versioning/.eval/working-tree.patch +0 -21
  151. package/evals/fixtures/git-workflow-and-versioning/app.js +0 -7
  152. package/evals/fixtures/git-workflow-and-versioning/app.test.js +0 -9
  153. package/evals/fixtures/incremental-implementation/reports.js +0 -7
  154. package/evals/fixtures/incremental-implementation/reports.test.js +0 -12
  155. package/evals/fixtures/incremental-implementation/tasks/plan.md +0 -8
  156. package/evals/fixtures/incremental-implementation-pressure/draft-export.js +0 -17
  157. package/evals/fixtures/incremental-implementation-pressure/scenario.md +0 -9
  158. package/evals/fixtures/observability-and-instrumentation/operations.md +0 -11
  159. package/evals/fixtures/observability-and-instrumentation/payment-retry.js +0 -14
  160. package/evals/fixtures/performance-optimization/benchmark.js +0 -15
  161. package/evals/fixtures/performance-optimization/products.js +0 -14
  162. package/evals/fixtures/planning-and-task-breakdown/notifications-spec.md +0 -18
  163. package/evals/fixtures/security-and-hardening/webhook.js +0 -11
  164. package/evals/fixtures/security-and-hardening/webhook.test.js +0 -13
  165. package/evals/fixtures/shipping-and-launch/authority-pressure.md +0 -6
  166. package/evals/fixtures/shipping-and-launch/launch-status.md +0 -11
  167. package/evals/fixtures/source-driven-development/framework-task.md +0 -10
  168. package/evals/fixtures/spec-driven-development/billing-brief.md +0 -16
  169. package/evals/fixtures/spec-driven-development-decomposition/portal-brief.md +0 -22
  170. package/evals/fixtures/test-driven-development/BUG.md +0 -10
  171. package/evals/fixtures/test-driven-development/README.md +0 -28
  172. package/evals/fixtures/test-driven-development/package.json +0 -9
  173. package/evals/fixtures/test-driven-development/src/split.js +0 -8
  174. package/evals/fixtures/test-driven-development/test/split.test.js +0 -13
  175. package/evals/fixtures/test-driven-development-ecosystem/README.md +0 -9
  176. package/evals/fixtures/test-driven-development-ecosystem/ledger.py +0 -15
  177. package/evals/fixtures/test-driven-development-ecosystem/test_ledger.py +0 -19
  178. package/evals/fixtures/using-agent-skills/incident.md +0 -6
  179. package/evals/plugin/code-review-fires/graders/off-by-one.md +0 -7
  180. package/evals/plugin/code-review-fires/graders/severity-labels.md +0 -4
  181. package/evals/plugin/code-review-fires/graders/skill-fired.md +0 -5
  182. package/evals/plugin/code-review-fires/prompt.md +0 -31
  183. package/evals/plugin/code-review-stays-quiet/graders/not-fired.md +0 -8
  184. package/evals/plugin/code-review-stays-quiet/graders/tdd-fired.md +0 -6
  185. package/evals/plugin/code-review-stays-quiet/prompt.md +0 -8
  186. package/evals/plugin/code-review-stays-quiet-on-commit-message/graders/not-fired.md +0 -8
  187. package/evals/plugin/code-review-stays-quiet-on-commit-message/prompt.md +0 -25
  188. package/evals/skill-impact.md +0 -6
  189. package/rebrand/INSTALLATION-SPEC.md +0 -46
  190. package/rebrand/MAINTENANCE.md +0 -113
  191. package/rebrand/NOTICE.md +0 -14
  192. package/rebrand/PR-WORKFLOW.md +0 -34
  193. package/rebrand/UNIFICATION-SPEC.md +0 -33
  194. package/rebrand/VALIDATION.md +0 -32
  195. package/rebrand/VERSIONING.md +0 -33
  196. package/rebrand/apply.cjs +0 -194
  197. package/rebrand/brand.json +0 -13
  198. package/rebrand/catalog.cjs +0 -56
  199. package/rebrand/fork-patches.json +0 -12
  200. package/rebrand/overlay/.github/workflows/test-plugin-install.yml +0 -177
  201. package/rebrand/overlay/CHANGELOG.md +0 -34
  202. package/rebrand/overlay/bin/agent-targets.json +0 -726
  203. package/rebrand/overlay/bin/i3-composer-agent.cjs +0 -190
  204. package/rebrand/overlay/bin/install.cjs +0 -164
  205. package/rebrand/overlay/bin/skills-registry.LICENSE +0 -21
  206. package/rebrand/overlay/bin/wizard.cjs +0 -66
  207. package/rebrand/overlay/scripts/validate-brand.cjs +0 -44
  208. package/rebrand/overlay/tests/bundle.test.cjs +0 -85
  209. package/rebrand/overlay/tests/installer.test.cjs +0 -193
  210. package/rebrand/package.template.json +0 -82
  211. package/rebrand/rebrand.sh +0 -4
  212. package/rebrand/record-upstream.cjs +0 -37
  213. package/rebrand/templates/README.md +0 -124
  214. package/rebrand/templates/codebuddy-setup.md +0 -88
  215. package/rebrand/templates/codex-setup.md +0 -45
  216. package/rebrand/tests/pipeline.test.cjs +0 -185
  217. package/rebrand/upstream.json +0 -171
  218. package/scripts/floor-guard-reference-test.js +0 -291
  219. package/scripts/lib/skill-lint-test.js +0 -650
  220. package/scripts/lib/skill-lint.js +0 -584
  221. package/scripts/run-evals-test.js +0 -623
  222. package/scripts/run-evals.js +0 -638
  223. package/scripts/validate-artifact-paths-test.js +0 -179
  224. package/scripts/validate-artifact-paths.js +0 -128
  225. package/scripts/validate-brand.cjs +0 -44
  226. package/scripts/validate-commands-test.js +0 -216
  227. package/scripts/validate-commands.js +0 -222
  228. package/scripts/validate-reference-links-test.js +0 -495
  229. package/scripts/validate-reference-links.js +0 -187
  230. package/scripts/validate-skills.js +0 -69
  231. package/scripts/validate-versions-test.js +0 -32
  232. package/scripts/validate-versions.js +0 -35
  233. package/tests/bundle.test.cjs +0 -85
  234. package/tests/installer.test.cjs +0 -193
  235. /package/skills/{constraint-driven-development → i3-constraint-driven-development}/references/floor-guard.md +0 -0
  236. /package/skills/{idea-refine → i3-idea-refine}/examples.md +0 -0
  237. /package/skills/{idea-refine → i3-idea-refine}/frameworks.md +0 -0
  238. /package/skills/{idea-refine → i3-idea-refine}/refinement-criteria.md +0 -0
package/bin/install.cjs CHANGED
@@ -5,8 +5,12 @@ const path = require('node:path');
5
5
  const os = require('node:os');
6
6
  const crypto = require('node:crypto');
7
7
  const registry = require('./agent-targets.json');
8
+ const { cleanupBackups } = require('./cleanup-backups.cjs');
9
+ const { nativeContent } = require('./native-content.cjs');
10
+ const { fingerprint } = require('./asset-fingerprint.cjs');
8
11
  const root = path.resolve(__dirname, '..');
9
12
  const name = 'i3-composer-agent';
13
+ const version = require('../package.json').version;
10
14
  const aliases = { claude: 'claude-code', gemini: 'gemini-cli', copilot: 'github-copilot' };
11
15
  function exists(file) {
12
16
  try { fs.lstatSync(file); return true; }
@@ -42,6 +46,10 @@ function checkDestination(file) {
42
46
  throw new Error('Installation destinations must be outside this package directory.');
43
47
  }
44
48
  }
49
+ function manifestContent(plan, asset) {
50
+ return JSON.stringify({ name, version, entryPrefix: 'i3-', scope: plan.scope, agents: asset.target.agents,
51
+ assets: plan.assets.filter(item => item.base === asset.base && item.kind !== 'legacy').map(item => path.relative(asset.base, item.destination)) }, null, 2) + '\n';
52
+ }
45
53
  function planInstallation({ agents, scope, projectDir = process.cwd(), home = os.homedir(), env = process.env }) {
46
54
  agents = selectAgents(agents);
47
55
  if (!agents.length) throw new Error('Choose at least one tool.');
@@ -54,7 +62,7 @@ function planInstallation({ agents, scope, projectDir = process.cwd(), home = os
54
62
  if (!targets.has(skillsDirectory)) targets.set(skillsDirectory, { agents: [], skillsDirectory, referencesDirectory: path.join(base, 'references'), base });
55
63
  const target = targets.get(skillsDirectory);
56
64
  target.agents.push(id);
57
- if (['codebuddy', 'claude-code'].includes(id)) {
65
+ if (['codebuddy', 'workbuddy', 'claude-code'].includes(id)) {
58
66
  target.commandsDirectory = path.join(base, 'commands');
59
67
  target.personasDirectory = path.join(base, 'agents');
60
68
  }
@@ -70,6 +78,20 @@ function planInstallation({ agents, scope, projectDir = process.cwd(), home = os
70
78
  }
71
79
  }
72
80
  for (const target of targets.values()) {
81
+ const manifestFile = path.join(target.base, `.${name}.json`);
82
+ const previous = exists(manifestFile) && !fs.lstatSync(manifestFile).isSymbolicLink()
83
+ ? JSON.parse(fs.readFileSync(manifestFile, 'utf8')) : undefined;
84
+ const owned = previous?.name === name && Array.isArray(previous.assets);
85
+ const sameVersion = owned && previous.version === version && previous.scope === scope && previous.entryPrefix === 'i3-';
86
+ if (owned && previous.scope === scope && Array.isArray(previous.agents)) {
87
+ const applicable = previous.agents.filter(id => {
88
+ const agent = registry.agents.find(item => item.id === id);
89
+ if (!agent || (scope === 'global' && !agent.globalSkillsDir)) return false;
90
+ const directory = scope === 'project' ? path.resolve(projectDir, agent.projectSkillsDir) : globalSkillsDir(agent, home, env);
91
+ return destination(directory) === target.skillsDirectory;
92
+ });
93
+ target.agents = [...new Set([...applicable, ...target.agents])];
94
+ }
73
95
  const start = assets.length;
74
96
  addDirectory('skills', target.skillsDirectory, 'skill');
75
97
  addDirectory('references', target.referencesDirectory, 'reference');
@@ -80,36 +102,59 @@ function planInstallation({ agents, scope, projectDir = process.cwd(), home = os
80
102
  if (exists(docs) && fs.lstatSync(docs).isSymbolicLink()) throw new Error(`Installation directory is a symlink: ${docs}.`);
81
103
  assets.push({ source: path.join(root, 'docs/agents.md'), destination: destination(path.join(target.base, 'docs/agents.md')), kind: 'documentation' });
82
104
  }
83
- assets.push({ source: path.join(root, 'LICENSE'), destination: destination(path.join(target.base, `${name}-LICENSE`)), kind: 'attribution' });
84
- assets.push({ source: path.join(root, 'NOTICE.md'), destination: destination(path.join(target.base, `${name}-NOTICE.md`)), kind: 'attribution' });
85
- assets.push({ target, destination: destination(path.join(target.base, `.${name}.json`)), kind: 'manifest' });
105
+ const licenseDirectory = path.join(target.referencesDirectory, name);
106
+ if (exists(licenseDirectory) && fs.lstatSync(licenseDirectory).isSymbolicLink()) throw new Error(`Installation directory is a symlink: ${licenseDirectory}.`);
107
+ assets.push({ source: path.join(root, 'LICENSE'), destination: destination(path.join(licenseDirectory, 'LICENSE')), kind: 'attribution' });
108
+ if (owned) {
109
+ const legacy = fs.readdirSync(path.join(root, 'skills')).filter(id => id.startsWith('i3-')).map(id => `skills/${id.slice(3)}`);
110
+ if (target.commandsDirectory) legacy.push(...fs.readdirSync(path.join(root, '.claude/commands')).filter(file => file.startsWith('i3-') && file.endsWith('.md')).map(file => `commands/${file.slice(3)}`));
111
+ legacy.push(`${name}-LICENSE`, `${name}-NOTICE.md`);
112
+ for (const relative of legacy) {
113
+ const file = destination(path.join(target.base, relative));
114
+ if (previous.assets.includes(relative) && exists(file)) assets.push({ destination: file, kind: 'legacy' });
115
+ }
116
+ }
117
+ assets.push({ target, destination: destination(manifestFile), kind: 'manifest', mergeable: sameVersion });
86
118
  for (const asset of assets.slice(start)) {
87
119
  asset.base = target.base;
88
- asset.codebuddyCommand = asset.kind === 'command' && target.agents.includes('codebuddy');
120
+ asset.buddyCommand = asset.kind === 'command' && target.agents.some(id => ['codebuddy', 'workbuddy'].includes(id));
121
+ asset.scope = scope;
122
+ asset.personasDirectory = target.personasDirectory;
123
+ if (sameVersion && previous.assets.includes(path.relative(target.base, asset.destination)) && asset.source && exists(asset.destination)) {
124
+ asset.expectedFingerprint = fingerprint(asset.source, asset);
125
+ asset.reusable = fingerprint(asset.destination) === asset.expectedFingerprint;
126
+ }
89
127
  }
90
128
  }
91
129
  for (const asset of assets) { checkDestination(asset.destination); asset.existing = exists(asset.destination); }
92
- return { mode: 'install', scope, agents, targets: [...targets.values()], assets, conflicts: assets.filter(asset => asset.existing).map(asset => asset.destination) };
130
+ const plan = { mode: 'install', scope, agents, targets: [...targets.values()], assets };
131
+ for (const asset of assets.filter(item => item.kind === 'manifest' && item.mergeable)) {
132
+ asset.observedFingerprint = fingerprint(asset.destination);
133
+ asset.reusable = fs.readFileSync(asset.destination, 'utf8') === manifestContent(plan, asset);
134
+ if (asset.reusable) asset.expectedFingerprint = asset.observedFingerprint;
135
+ }
136
+ plan.conflicts = assets.filter(asset => asset.existing && !asset.reusable && !asset.mergeable).map(asset => asset.destination);
137
+ plan.reused = assets.filter(asset => asset.reusable).map(asset => asset.destination);
138
+ return plan;
93
139
  }
94
140
  function executeInstallation(plan, { force = false } = {}) {
95
- if (plan.conflicts.length && !force) throw new Error('Existing installation assets require confirmation or --force; previous files will be backed up.');
96
- const pkg = require('../package.json');
141
+ if (plan.conflicts.length && !force) throw new Error('Existing installation assets require confirmation or --force before replacement.');
97
142
  const contexts = new Map();
98
143
  const createdDirectories = [];
99
144
  const committed = [];
145
+ let completed = false;
146
+ let rolledBack = false;
100
147
  function mkdir(directory) {
101
148
  if (exists(directory)) return;
102
149
  mkdir(path.dirname(directory));
103
150
  fs.mkdirSync(directory);
104
151
  createdDirectories.push(directory);
105
152
  }
106
- function portable(file, markdown = false, codebuddyCommand = false) {
153
+ function portable(file, asset, markdown = false) {
107
154
  if (fs.statSync(file).isDirectory()) {
108
- for (const entry of fs.readdirSync(file)) portable(path.join(file, entry), false, codebuddyCommand);
155
+ for (const entry of fs.readdirSync(file)) portable(path.join(file, entry), asset);
109
156
  } else if (markdown || file.endsWith('.md')) {
110
- let content = fs.readFileSync(file, 'utf8').replaceAll('i3-composer-agent:', '').replaceAll('agent-skills:', '');
111
- if (codebuddyCommand) content = content.replaceAll('.claude/agents/', '.codebuddy/agents/');
112
- fs.writeFileSync(file, content);
157
+ fs.writeFileSync(file, nativeContent(fs.readFileSync(file, 'utf8'), asset));
113
158
  }
114
159
  }
115
160
  try {
@@ -120,22 +165,31 @@ function executeInstallation(plan, { force = false } = {}) {
120
165
  contexts.set(asset.base, { staging: fs.mkdtempSync(path.join(asset.base, `.${name}-stage-`)), backup: path.join(asset.base, `.${name}-backup-${crypto.randomUUID()}`) });
121
166
  }
122
167
  const context = contexts.get(asset.base);
168
+ if (asset.kind === 'legacy') continue;
123
169
  asset.staged = path.join(context.staging, String(index));
124
170
  if (asset.kind === 'manifest') {
125
- fs.writeFileSync(asset.staged, JSON.stringify({ name, version: pkg.version, upstreamVersion: pkg.i3ComposerAgent.upstreamVersion, upstreamCommit: pkg.i3ComposerAgent.upstreamCommit, scope: plan.scope, agents: asset.target.agents, assets: plan.assets.filter(item => item.base === asset.base).map(item => path.relative(asset.base, item.destination)) }, null, 2) + '\n');
171
+ fs.writeFileSync(asset.staged, manifestContent(plan, asset));
126
172
  } else {
127
173
  fs.cpSync(asset.source, asset.staged, { recursive: true, filter: file => {
128
174
  if (fs.lstatSync(file).isSymbolicLink()) throw new Error(`Package contains a symlink: ${file}`);
129
175
  return path.basename(file) !== '.DS_Store';
130
176
  } });
131
- portable(asset.staged, asset.source.endsWith('.md'), asset.codebuddyCommand);
177
+ portable(asset.staged, asset, asset.source.endsWith('.md'));
132
178
  }
133
179
  }
134
180
  for (const asset of plan.assets) {
135
181
  const context = contexts.get(asset.base);
136
182
  mkdir(path.dirname(asset.destination));
183
+ if (asset.reusable) {
184
+ const unchanged = fingerprint(asset.destination) === asset.expectedFingerprint
185
+ && fingerprint(asset.staged) === asset.expectedFingerprint;
186
+ if (unchanged) continue;
187
+ if (!force) throw new Error(`Destination changed during installation: ${asset.destination}. Retry with confirmed replacement.`);
188
+ } else if (asset.mergeable) {
189
+ if (fingerprint(asset.destination) !== asset.observedFingerprint && !force) throw new Error(`Manifest changed during installation: ${asset.destination}. Retry with confirmed replacement.`);
190
+ }
137
191
  // A destination may have appeared since planning; never replace it implicitly.
138
- if (exists(asset.destination) && !force) throw new Error(`Destination appeared during installation: ${asset.destination}. Retry with confirmed replacement.`);
192
+ if (exists(asset.destination) && !force && !asset.mergeable) throw new Error(`Destination appeared during installation: ${asset.destination}. Retry with confirmed replacement.`);
139
193
  const change = { destination: asset.destination, written: false };
140
194
  if (exists(asset.destination)) {
141
195
  change.backup = path.join(context.backup, path.relative(asset.base, asset.destination));
@@ -143,18 +197,26 @@ function executeInstallation(plan, { force = false } = {}) {
143
197
  fs.renameSync(asset.destination, change.backup);
144
198
  }
145
199
  committed.push(change);
146
- fs.renameSync(asset.staged, asset.destination);
147
- change.written = true;
200
+ if (asset.kind !== 'legacy') {
201
+ fs.renameSync(asset.staged, asset.destination);
202
+ change.written = true;
203
+ }
148
204
  }
149
- return [...contexts.values()].map(context => context.backup).filter(exists);
205
+ completed = true;
206
+ return [];
150
207
  } catch (error) {
151
208
  for (const change of committed.reverse()) {
152
209
  if (change.written) fs.rmSync(change.destination, { recursive: true, force: true });
153
210
  if (change.backup) fs.renameSync(change.backup, change.destination);
154
211
  }
212
+ rolledBack = true;
155
213
  throw error;
156
214
  } finally {
157
215
  for (const context of contexts.values()) fs.rmSync(context.staging, { recursive: true, force: true });
216
+ for (const [base, context] of contexts) {
217
+ if (completed) cleanupBackups(base, `.${name}-backup-`);
218
+ else if (rolledBack) fs.rmSync(context.backup, { recursive: true, force: true });
219
+ }
158
220
  for (const directory of createdDirectories.reverse()) {
159
221
  try { fs.rmdirSync(directory); }
160
222
  catch (error) { if (!['ENOENT', 'ENOTEMPTY', 'EEXIST'].includes(error.code)) throw error; }
@@ -0,0 +1,29 @@
1
+ 'use strict';
2
+
3
+ // Project commands are identical for both Buddy clients, including when the
4
+ // other client is added later. Global commands use the selected profile path.
5
+ function nativeContent(content, asset) {
6
+ content = content.replaceAll('i3-composer-agent:', '').replaceAll('agent-skills:', '');
7
+ if (!asset.buddyCommand) return content;
8
+ const projectPersonas = '.codebuddy/agents/';
9
+ const userPersonas = asset.scope === 'project'
10
+ ? "the current host's user-level agents directory"
11
+ : `\`${asset.personasDirectory.replaceAll('\\', '/')}/\``;
12
+ content = content.replaceAll('CLAUDE.md', 'CODEBUDDY.md')
13
+ .replaceAll('`~/.claude/agents/`', userPersonas)
14
+ .replaceAll('.claude/agents/', projectPersonas);
15
+ if (!asset.source.endsWith('i3-ship.md')) return content;
16
+ return content
17
+ .replace('Spawn three subagents concurrently using the Agent tool. **Issue all three Agent tool calls in a single assistant turn so they execute in parallel** — sequential calls defeat the purpose of this command.',
18
+ 'Use the host\'s native subagent capability to run three specialist personas concurrently. Issue all three calls together when the host supports parallel execution.')
19
+ .replace("In Claude Code, each call passes `subagent_type` matching the persona's `name` field:",
20
+ 'Select the following persona names using the host\'s native subagent mechanism:')
21
+ .replace('In other harnesses without an Agent tool, invoke each persona\'s system prompt sequentially and treat their outputs as if returned in parallel — the merge phase still works.',
22
+ 'If native subagents are unavailable, read each persona prompt from the installed agents directory, perform the three reviews sequentially, and retain the same merge phase.')
23
+ .replace(/Constraints \(from Claude Code's subagent model\):\n[\s\S]*?\n\n\*\*Persona resolution\.\*\*[^\n]*/,
24
+ `Constraints:\n- Each specialist reviews independently and returns a report to this session.\n- Specialists do not delegate to one another.\n- Follow the host's execution and permission limits.\n\n**Persona resolution.** Read installed persona prompts from \`${asset.scope === 'project' ? projectPersonas : asset.personasDirectory.replaceAll('\\', '/') + '/'}\`. For project installations, check ${userPersonas} for the current host's user-defined personas, and follow its native precedence rules.`)
25
+ .replace('The three Phase A personas run in parallel — never sequentially.',
26
+ 'Run the three Phase A personas in parallel when native subagents are available; otherwise use the sequential fallback above.');
27
+ }
28
+
29
+ module.exports = { nativeContent };
package/bin/wizard.cjs CHANGED
@@ -56,7 +56,8 @@ async function confirm(plan) {
56
56
  console.log(` ${target.agents.join(', ')}: ${target.skillsDirectory}`);
57
57
  if (target.commandsDirectory) console.log(` Commands: ${target.commandsDirectory}`);
58
58
  }
59
- if (plan.conflicts.length) console.log(`${plan.conflicts.length} existing assets will be preserved in backups before replacement.`);
59
+ if (plan.conflicts.length) console.log(`${plan.conflicts.length} existing assets will be replaced. Previous files are removed after successful installation.`);
60
+ if (plan.reused.length) console.log(`${plan.reused.length} unchanged assets from the same version will be reused.`);
60
61
  console.log('Includes all skills and shared references. Plugin hooks require native plugin registration.');
61
62
  return session(async ask => {
62
63
  const answer = await ask('Install these files? [y/N]: ');
@@ -1,12 +1,12 @@
1
1
  description = "Implement tasks incrementally — build, test, verify, commit. Add \"auto\" to run the whole plan in one approved pass."
2
2
 
3
3
  prompt = """
4
- Invoke the incremental-implementation skill alongside test-driven-development.
4
+ Invoke the i3-incremental-implementation skill alongside i3-test-driven-development.
5
5
 
6
6
  ## Modes
7
7
 
8
- - `/build` — implement the next pending task, then stop (careful, one slice at a time).
9
- - `/build auto` — generate the plan if needed, get a single approval, then implement every task without stopping between them.
8
+ - `/i3-build` — implement the next pending task, then stop (careful, one slice at a time).
9
+ - `/i3-build auto` — generate the plan if needed, get a single approval, then implement every task without stopping between them.
10
10
 
11
11
  The arguments select the mode. Treat `auto` (canonical) or `all` as autonomous mode; anything else (or empty) is the default single-task mode. Note: autonomous mode is not faster per task — it runs the same test-driven loop — it only removes the human stepping between tasks.
12
12
 
@@ -23,21 +23,21 @@ Pick the next pending task from the plan. Then:
23
23
  7. Commit with a descriptive message
24
24
  8. Mark the task complete and stop
25
25
 
26
- ## Autonomous: the whole plan (`/build auto`)
26
+ ## Autonomous: the whole plan (`/i3-build auto`)
27
27
 
28
28
  Use this once a spec exists and you want to collapse plan + build into one run. It removes the manual stepping between tasks — not the verification. Every task still earns a passing test and its own commit.
29
29
 
30
- 1. Require a spec. Look only for a spec at a known path: SPEC.md at the repo root, docs/SPEC.md, or a file under spec/. A README or arbitrary doc does NOT count. If none exists, stop and tell the user to run /spec first — do not invent requirements.
30
+ 1. Require a spec. Look only for a spec at a known path: SPEC.md at the repo root, docs/SPEC.md, or a file under spec/. A README or arbitrary doc does NOT count. If none exists, stop and tell the user to run /i3-spec first — do not invent requirements.
31
31
  2. Establish a clean baseline. Run `git status --porcelain`. If there are uncommitted changes outside the expected planning artifacts (SPEC.md, docs/SPEC.md, spec/*, tasks/plan.md, tasks/todo.md), stop and ask the user to commit, stash, or confirm how to handle them. Autonomous per-task commits must not absorb unrelated local work, or the clean-rollback guarantee breaks.
32
- 3. Plan if needed. If there is no tasks/plan.md, invoke the planning-and-task-breakdown skill to generate one.
32
+ 3. Plan if needed. If there is no tasks/plan.md, invoke the i3-planning-and-task-breakdown skill to generate one.
33
33
  4. Single checkpoint. Present the full plan and wait for an unambiguous affirmative (e.g. "approve", "go", "yes"). Treat hedged responses ("looks reasonable", "I guess") as NOT approved. This is the only human gate — after approval, run autonomously. If you generated tasks/plan.md, commit it as a single preparatory commit now so it doesn't bleed into the first task's commit.
34
34
  5. Execute every task in dependency order. Use each task's declared dependencies; if they aren't explicit, execute in the order the plan lists them. For each task, run the full default loop above (RED → GREEN → regression → build → commit → mark complete). Stage only the files that task touched plus its task-status update — never `git add -A` blindly — and make one commit per task so any point is a clean rollback.
35
35
  6. Stop and ask the user (do not push through) when:
36
- - a test can't be made to pass or the build breaks without an obvious fix → follow the debugging-and-error-recovery skill
36
+ - a test can't be made to pass or the build breaks without an obvious fix → follow the i3-debugging-and-error-recovery skill
37
37
  - the spec is ambiguous, or a task needs a decision the spec doesn't cover
38
- - a task is high-risk or irreversible — auth/permission changes, destructive data migrations, payments, deletions, deploys, anything touching secrets, or anything you can't undo with `git revert` → follow the doubt-driven-development skill and get explicit sign-off before continuing
39
- After the user resolves a blocker, they re-invoke /build auto — it resumes from the next pending task.
38
+ - a task is high-risk or irreversible — auth/permission changes, destructive data migrations, payments, deletions, deploys, anything touching secrets, or anything you can't undo with `git revert` → follow the i3-doubt-driven-development skill and get explicit sign-off before continuing
39
+ After the user resolves a blocker, they re-invoke /i3-build auto — it resumes from the next pending task.
40
40
  7. Summarize at the end: tasks completed, tests added, commits made, and anything skipped, flagged, or left for the user.
41
41
 
42
- If any step fails, follow the debugging-and-error-recovery skill.
42
+ If any step fails, follow the i3-debugging-and-error-recovery skill.
43
43
  """
@@ -1,7 +1,7 @@
1
1
  description = "Simplify code for clarity and maintainability — reduce complexity without changing behavior"
2
2
 
3
3
  prompt = """
4
- Invoke the code-simplification skill.
4
+ Invoke the i3-code-simplification skill.
5
5
 
6
6
  Simplify recently changed code (or the specified scope) while preserving exact behavior:
7
7
 
@@ -18,5 +18,5 @@ Simplify recently changed code (or the specified scope) while preserving exact b
18
18
  5. Apply each simplification incrementally — run tests after each change
19
19
  6. Verify all tests pass, the build succeeds, and the diff is clean
20
20
 
21
- If tests fail after a simplification, revert that change and reconsider. Use `code-review-and-quality` to review the result.
21
+ If tests fail after a simplification, revert that change and reconsider. Use `i3-code-review-and-quality` to review the result.
22
22
  """
@@ -1,7 +1,7 @@
1
1
  description = "Define and enforce this project's quality bar — interview, sane defaults, CONSTRAINTS.md"
2
2
 
3
3
  prompt = """
4
- Invoke the constraint-driven-development skill.
4
+ Invoke the i3-constraint-driven-development skill.
5
5
 
6
6
  $ARGUMENTS
7
7
 
@@ -26,7 +26,7 @@ Default behaviour with no arguments: set up constraints for this repository.
26
26
  7. **Verify.** Run the constraints against the current branch. If anything fails that the user disagrees with, fix the constraint now rather than leaving a gate people will learn to ignore.
27
27
 
28
28
  Sub-commands:
29
- - `/constraints check` — run the current constraints against this branch and report
30
- - `/constraints guard` — inspect the diff for a weakened bar: lowered thresholds, skipped or deleted tests, new suppression comments, unfinished stubs, new exceptions
31
- - `/constraints ratchet` — record today's measured values as the floor that must not fall
29
+ - `/i3-constraints check` — run the current constraints against this branch and report
30
+ - `/i3-constraints guard` — inspect the diff for a weakened bar: lowered thresholds, skipped or deleted tests, new suppression comments, unfinished stubs, new exceptions
31
+ - `/i3-constraints ratchet` — record today's measured values as the floor that must not fall
32
32
  """
@@ -1,7 +1,7 @@
1
1
  description = "Break work into small verifiable tasks with acceptance criteria and dependency ordering"
2
2
 
3
3
  prompt = """
4
- Invoke the planning-and-task-breakdown skill.
4
+ Invoke the i3-planning-and-task-breakdown skill.
5
5
 
6
6
  Read the existing spec (SPEC.md or equivalent) and the relevant codebase sections. Then:
7
7
 
@@ -1,15 +1,15 @@
1
1
  description = "Conduct a five-axis code review — correctness, readability, architecture, security, performance"
2
2
 
3
3
  prompt = """
4
- Invoke the code-review-and-quality skill.
4
+ Invoke the i3-code-review-and-quality skill.
5
5
 
6
6
  Review the current changes (staged or recent commits) across all five axes:
7
7
 
8
8
  1. **Correctness** — Does it match the spec? Edge cases handled? Tests adequate?
9
9
  2. **Readability** — Clear names? Straightforward logic? Well-organized?
10
10
  3. **Architecture** — Follows existing patterns? Clean boundaries? Right abstraction level?
11
- 4. **Security** — Input validated? Secrets safe? Auth checked? (Use security-and-hardening skill)
12
- 5. **Performance** — No N+1 queries? No unbounded ops? (Use performance-optimization skill)
11
+ 4. **Security** — Input validated? Secrets safe? Auth checked? (Use i3-security-and-hardening skill)
12
+ 5. **Performance** — No N+1 queries? No unbounded ops? (Use i3-performance-optimization skill)
13
13
 
14
14
  Categorize findings as Critical, Important, or Suggestion.
15
15
  Output a structured review with specific file:line references and fix recommendations.
@@ -1,9 +1,9 @@
1
1
  description = "Run the pre-launch checklist via parallel fan-out to specialist personas, then synthesize a go/no-go decision"
2
2
 
3
3
  prompt = """
4
- Invoke the shipping-and-launch skill.
4
+ Invoke the i3-shipping-and-launch skill.
5
5
 
6
- `/ship` is a **fan-out orchestrator**. It runs three specialist personas in parallel against the current change, then merges their reports into a single go/no-go decision with a rollback plan. The personas operate independently — no shared state, no ordering — which is what makes parallel execution safe and useful here.
6
+ `/i3-ship` is a **fan-out orchestrator**. It runs three specialist personas in parallel against the current change, then merges their reports into a single go/no-go decision with a rollback plan. The personas operate independently — no shared state, no ordering — which is what makes parallel execution safe and useful here.
7
7
 
8
8
  ## Phase A — Parallel fan-out
9
9
 
@@ -22,7 +22,7 @@ Constraints (from CLI's subagent model):
22
22
  - Do not let one persona delegate to another — keep the fan-out flat.
23
23
  - For richer multi-agent collaboration where teammates talk to each other instead of just reporting back, see `references/orchestration-patterns.md`.
24
24
 
25
- **Persona resolution.** If you've defined your own `code-reviewer`, `security-auditor`, or `test-engineer` in `agents/` or your global configuration, those take precedence over this plugin's versions — `/ship` picks up your customizations automatically. This is intentional: plugin subagents sit at the bottom of the CLI's scope priority table, so user-level definitions win by design.
25
+ **Persona resolution.** If you've defined your own `code-reviewer`, `security-auditor`, or `test-engineer` in `agents/` or your global configuration, those take precedence over this plugin's versions — `/i3-ship` picks up your customizations automatically. This is intentional: plugin subagents sit at the bottom of the CLI's scope priority table, so user-level definitions win by design.
26
26
 
27
27
  ## Phase B — Merge in main context
28
28
 
@@ -68,5 +68,5 @@ Produce a single output:
68
68
  2. Personas do not call each other. The main agent merges in Phase B.
69
69
  3. The rollback plan is mandatory before any GO decision.
70
70
  4. If any persona returns a Critical finding, the default verdict is NO-GO unless the user explicitly accepts the risk.
71
- 5. **Skip the fan-out only if all of the following are true:** the change touches 2 files or fewer, the diff is under 50 lines, and it does not touch auth, payments, data access, or config/env. Otherwise, default to fan-out. `/ship` is designed for production-bound changes — when the blast radius is non-trivial, run the parallel review even if the diff looks small.
71
+ 5. **Skip the fan-out only if all of the following are true:** the change touches 2 files or fewer, the diff is under 50 lines, and it does not touch auth, payments, data access, or config/env. Otherwise, default to fan-out. `/i3-ship` is designed for production-bound changes — when the blast radius is non-trivial, run the parallel review even if the diff looks small.
72
72
  """
@@ -1,7 +1,7 @@
1
1
  description = "Start spec-driven development — write a structured specification before writing code"
2
2
 
3
3
  prompt = """
4
- Invoke the spec-driven-development skill.
4
+ Invoke the i3-spec-driven-development skill.
5
5
 
6
6
  Begin by understanding what the user wants to build. Ask clarifying questions about:
7
7
  1. The objective and target users
@@ -1,7 +1,7 @@
1
1
  description = "Run TDD workflow — write failing tests, implement, verify. For bugs, use the Prove-It pattern."
2
2
 
3
3
  prompt = """
4
- Invoke the test-driven-development skill.
4
+ Invoke the i3-test-driven-development skill.
5
5
 
6
6
  For new features:
7
7
  1. Write tests that describe the expected behavior (they should FAIL)
@@ -15,5 +15,5 @@ For bug fixes (Prove-It pattern):
15
15
  4. Confirm the test passes
16
16
  5. Run the full test suite for regressions
17
17
 
18
- For browser-related issues, also invoke browser-testing-with-devtools to verify with Chrome DevTools MCP.
18
+ For browser-related issues, also invoke i3-browser-testing-with-devtools to verify with Chrome DevTools MCP.
19
19
  """
@@ -1,7 +1,7 @@
1
1
  description = "Run a web performance audit via the web-performance-auditor persona"
2
2
 
3
3
  prompt = """
4
- /webperf targets web applications specifically. Do not use it for utility libraries, CLIs, or server-only code with no browser-facing output.
4
+ /i3-webperf targets web applications specifically. Do not use it for utility libraries, CLIs, or server-only code with no browser-facing output.
5
5
 
6
6
  ## Determine the mode
7
7
 
@@ -28,44 +28,44 @@ A new project is the best-case scenario: there's no legacy behavior to preserve,
28
28
  ### Day 0 | Install and wire up
29
29
 
30
30
  1. Install the pack (`npx skills add /path/to/i3-composer-agent`, or the native integration for your tool, see [getting-started.md](getting-started.md)).
31
- 2. If the host has no native skill router, load `using-agent-skills` (the meta-skill) so the agent can route work to the right skill on its own. On hosts with native routing, install the individual skills and do not preload the meta-skill as always-on context.
32
- 3. Add a short project rules file (`CLAUDE.md`, `.cursorrules`, etc.) with your stack, commands, and boundaries, `context-engineering` describes what belongs there.
31
+ 2. If the host has no native skill router, load `i3-using-agent-skills` (the meta-skill) so the agent can route work to the right skill on its own. On hosts with native routing, install the individual skills and do not preload the meta-skill as always-on context.
32
+ 3. Add a short project rules file (`CLAUDE.md`, `.cursorrules`, etc.) with your stack, commands, and boundaries, `i3-context-engineering` describes what belongs there.
33
33
 
34
34
  ### Day 0 | Define before you build
35
35
 
36
36
  Run the lifecycle in order for the project's first real feature:
37
37
 
38
38
  ```
39
- /spec → SPEC.md (spec-driven-development)
40
- /plan → tasks/plan.md (planning-and-task-breakdown)
41
- /build → one slice at a time (incremental-implementation + test-driven-development)
42
- /review → before every merge (code-review-and-quality)
43
- /ship → when going live (shipping-and-launch)
39
+ /i3-spec → SPEC.md (i3-spec-driven-development)
40
+ /i3-plan → tasks/plan.md (i3-planning-and-task-breakdown)
41
+ /i3-build → one slice at a time (i3-incremental-implementation + i3-test-driven-development)
42
+ /i3-review → before every merge (i3-code-review-and-quality)
43
+ /i3-ship → when going live (i3-shipping-and-launch)
44
44
  ```
45
45
 
46
- `/build auto` is a good fit for greenfield: you approve the plan once and every task still runs test-driven and commits individually. The spec and plan artifacts (`SPEC.md`, `tasks/`) are living documents, keep them in version control while the work is in flight. If the feature spans more than one session, those files are also the handoff, see [working across sessions](getting-started.md#working-across-sessions).
46
+ `/i3-build auto` is a good fit for greenfield: you approve the plan once and every task still runs test-driven and commits individually. The spec and plan artifacts (`SPEC.md`, `tasks/`) are living documents, keep them in version control while the work is in flight. If the feature spans more than one session, those files are also the handoff, see [working across sessions](getting-started.md#working-across-sessions).
47
47
 
48
48
  ### From the start, treat these as always-on
49
49
 
50
- - **test-driven-development**, coverage debt is cheapest to avoid at zero.
51
- - **git-workflow-and-versioning**, atomic commits and ~100-line changes are habits, not retrofits.
52
- - **security-and-hardening**, auth, input validation, and secrets handling are structural; bolting them on later is a migration project.
53
- - **documentation-and-adrs**, the first architectural decisions are exactly the ones nobody will remember the _why_ of in two years. An ADR now prevents the brownfield archaeology described in Path B.
50
+ - **i3-test-driven-development**, coverage debt is cheapest to avoid at zero.
51
+ - **i3-git-workflow-and-versioning**, atomic commits and ~100-line changes are habits, not retrofits.
52
+ - **i3-security-and-hardening**, auth, input validation, and secrets handling are structural; bolting them on later is a migration project.
53
+ - **i3-documentation-and-adrs**, the first architectural decisions are exactly the ones nobody will remember the _why_ of in two years. An ADR now prevents the brownfield archaeology described in Path B.
54
54
 
55
55
  ### Add as the project grows
56
56
 
57
57
  | When | Load |
58
58
  | ----------------------------------- | ------------------------------------------------------------- |
59
- | First public API or module boundary | `api-and-interface-design` |
60
- | First UI work | `frontend-ui-engineering` (+ `browser-testing-with-devtools`) |
61
- | First CI pipeline | `ci-cd-and-automation` |
62
- | First production deploy | `observability-and-instrumentation`, `shipping-and-launch` |
63
- | Performance requirements appear | `performance-optimization` |
59
+ | First public API or module boundary | `i3-api-and-interface-design` |
60
+ | First UI work | `i3-frontend-ui-engineering` (+ `i3-browser-testing-with-devtools`) |
61
+ | First CI pipeline | `i3-ci-cd-and-automation` |
62
+ | First production deploy | `i3-observability-and-instrumentation`, `i3-shipping-and-launch` |
63
+ | Performance requirements appear | `i3-performance-optimization` |
64
64
 
65
65
  ### Greenfield anti-patterns
66
66
 
67
- - **Skipping `/spec` because "it's just a prototype."** Prototypes become products. The spec is the cheapest artifact you'll ever write for this codebase.
68
- - **Loading all 25 skills into every session.** It wastes context and dilutes the ones that matter. Load by phase; let the host's native router or `using-agent-skills` route, but not both.
67
+ - **Skipping `/i3-spec` because "it's just a prototype."** Prototypes become products. The spec is the cheapest artifact you'll ever write for this codebase.
68
+ - **Loading all 25 skills into every session.** It wastes context and dilutes the ones that matter. Load by phase; let the host's native router or `i3-using-agent-skills` route, but not both.
69
69
  - **Deferring observability until "there's something to observe."** Instrument as you build, retrofitting structured logging is a Path B problem you're choosing to create.
70
70
 
71
71
  ---
@@ -78,38 +78,38 @@ In an established codebase, the risk profile inverts: the danger isn't building
78
78
 
79
79
  Goal: the agent understands the codebase before it modifies anything.
80
80
 
81
- 1. **`context-engineering` first.** Write the project rules file describing the real conventions, the ones in the code, not the ones in the wiki. Include build/test commands, directory meaning, known landmines ("don't touch `legacy/billing`, it has no tests and three known workarounds").
82
- 2. **`code-review-and-quality` on incoming changes.** Reviewing is zero-risk and immediately valuable: the five-axis review and its severity labels (which separate what blocks a merge, Critical and Required, from what doesn't) work on any PR regardless of the codebase's state.
83
- 3. **`debugging-and-error-recovery` for the bugs you were fixing anyway.** The five-step triage (reproduce → localize → reduce → fix → guard) shines in unfamiliar code, and the "guard" step starts building the regression suite you don't have.
84
- 4. **`doubt-driven-development` as a safety net.** Legacy code is exactly the "unfamiliar code, high cost of being wrong" scenario this skill targets. Adversarial fresh-context review of the agent's claims about how the legacy system works catches confident hallucinations before they become commits.
81
+ 1. **`i3-context-engineering` first.** Write the project rules file describing the real conventions, the ones in the code, not the ones in the wiki. Include build/test commands, directory meaning, known landmines ("don't touch `legacy/billing`, it has no tests and three known workarounds").
82
+ 2. **`i3-code-review-and-quality` on incoming changes.** Reviewing is zero-risk and immediately valuable: the five-axis review and its severity labels (which separate what blocks a merge, Critical and Required, from what doesn't) work on any PR regardless of the codebase's state.
83
+ 3. **`i3-debugging-and-error-recovery` for the bugs you were fixing anyway.** The five-step triage (reproduce → localize → reduce → fix → guard) shines in unfamiliar code, and the "guard" step starts building the regression suite you don't have.
84
+ 4. **`i3-doubt-driven-development` as a safety net.** Legacy code is exactly the "unfamiliar code, high cost of being wrong" scenario this skill targets. Adversarial fresh-context review of the agent's claims about how the legacy system works catches confident hallucinations before they become commits.
85
85
 
86
86
  ### Phase 2 | Tests before change
87
87
 
88
88
  Goal: every area the agent will touch gets a safety net first.
89
89
 
90
- - **`test-driven-development`, applied selectively.** Don't aim for global coverage; aim for coverage _where change is planned_. For untested legacy behavior, write characterization tests, tests that pin down what the code currently does, right or wrong, before any modification. The Beyonce Rule applies: if the agent liked a behavior enough to depend on it, it should have put a test on it.
91
- - **`code-simplification` on the worst hotspots.** Chesterton's Fence is the operative principle: the skill forces the agent to understand _why_ code exists before removing it. Behavior-preserving simplification plus characterization tests is the lowest-risk way to make legacy code changeable.
92
- - **`git-workflow-and-versioning` everywhere.** Small atomic commits matter _more_ in brownfield: when a change to old code breaks something subtle, a ~100-line commit is bisectable; a 2,000-line "modernization" commit is not.
90
+ - **`i3-test-driven-development`, applied selectively.** Don't aim for global coverage; aim for coverage _where change is planned_. For untested legacy behavior, write characterization tests, tests that pin down what the code currently does, right or wrong, before any modification. The Beyonce Rule applies: if the agent liked a behavior enough to depend on it, it should have put a test on it.
91
+ - **`i3-code-simplification` on the worst hotspots.** Chesterton's Fence is the operative principle: the skill forces the agent to understand _why_ code exists before removing it. Behavior-preserving simplification plus characterization tests is the lowest-risk way to make legacy code changeable.
92
+ - **`i3-git-workflow-and-versioning` everywhere.** Small atomic commits matter _more_ in brownfield: when a change to old code breaks something subtle, a ~100-line commit is bisectable; a 2,000-line "modernization" commit is not.
93
93
 
94
94
  ### Phase 3 | New work runs the full lifecycle
95
95
 
96
96
  Goal: two-speed adoption, legacy code stays under the Phase 1–2 regime; **new features get the greenfield treatment**.
97
97
 
98
- - New feature in the old codebase? `/spec → /plan → /build → /review`. The spec's boundaries section is where you declare what legacy surface the feature may and may not touch.
99
- - **`api-and-interface-design` at the seams.** When new code must talk to old code, design the boundary contract-first. Hyrum's Law is not theoretical in a years-old codebase, someone depends on every observable behavior, including the bugs.
100
- - **`security-and-hardening` as an audit, then a gate.** Run it once across the existing attack surface (auth, input handling, dependencies, the dependency audit alone usually pays for the exercise), file what you find, then enforce it on new changes.
98
+ - New feature in the old codebase? `/i3-spec → /i3-plan → /i3-build → /i3-review`. The spec's boundaries section is where you declare what legacy surface the feature may and may not touch.
99
+ - **`i3-api-and-interface-design` at the seams.** When new code must talk to old code, design the boundary contract-first. Hyrum's Law is not theoretical in a years-old codebase, someone depends on every observable behavior, including the bugs.
100
+ - **`i3-security-and-hardening` as an audit, then a gate.** Run it once across the existing attack surface (auth, input handling, dependencies, the dependency audit alone usually pays for the exercise), file what you find, then enforce it on new changes.
101
101
 
102
102
  ### Phase 4 | Pay down, deprecate, observe
103
103
 
104
- - **`deprecation-and-migration`** is the brownfield skill par excellence: code-as-liability, compulsory vs. advisory deprecation, and zombie-code removal give you a disciplined way to shrink the legacy surface instead of just wrapping it.
105
- - **`observability-and-instrumentation`** retrofitted along the paths you actually debug: structured logging and RED metrics on the top incident sources first.
106
- - **`performance-optimization`** when regressions matter, its measure-first rule prevents the classic legacy trap of optimizing code that was never the bottleneck.
104
+ - **`i3-deprecation-and-migration`** is the brownfield skill par excellence: code-as-liability, compulsory vs. advisory deprecation, and zombie-code removal give you a disciplined way to shrink the legacy surface instead of just wrapping it.
105
+ - **`i3-observability-and-instrumentation`** retrofitted along the paths you actually debug: structured logging and RED metrics on the top incident sources first.
106
+ - **`i3-performance-optimization`** when regressions matter, its measure-first rule prevents the classic legacy trap of optimizing code that was never the bottleneck.
107
107
 
108
108
  ### Brownfield anti-patterns
109
109
 
110
110
  - **"Big bang" adoption.** Loading the full lifecycle onto a legacy codebase on day one produces specs for code that already exists and refactors without safety nets. Sequence it.
111
111
  - **Letting the agent refactor untested code.** No characterization tests, no refactor. This is the single most expensive shortcut in brownfield adoption.
112
- - **Skipping `context-engineering` because "the code is the documentation."** The agent will infer conventions from the worst file it happens to read. Tell it the real ones.
112
+ - **Skipping `i3-context-engineering` because "the code is the documentation."** The agent will infer conventions from the worst file it happens to read. Tell it the real ones.
113
113
  - **Treating the legacy system's behavior as wrong by default.** Chesterton's Fence: the weird retry loop may be load-bearing. Understand, then change.
114
114
  - **Ratcheting nothing.** Adoption should make quality monotonically better: each phase adds a gate that doesn't come back off. If a month in you can't name what's now enforced that wasn't before, the rollout has stalled.
115
115
 
@@ -117,11 +117,11 @@ Goal: two-speed adoption, legacy code stays under the Phase 1–2 regime; **new
117
117
 
118
118
  ## The two paths converge
119
119
 
120
- Both end in the same steady state: `/spec → /plan → /build → /review → /ship` for new work, always-on TDD and git discipline, review gates before merge, and skills loaded by phase rather than in bulk. Greenfield gets there in days; brownfield gets there in a quarter, and the difference is exactly the safety nets (context, characterization tests, boundaries) that the old codebase never had.
120
+ Both end in the same steady state: `/i3-spec → /i3-plan → /i3-build → /i3-review → /i3-ship` for new work, always-on TDD and git discipline, review gates before merge, and skills loaded by phase rather than in bulk. Greenfield gets there in days; brownfield gets there in a quarter, and the difference is exactly the safety nets (context, characterization tests, boundaries) that the old codebase never had.
121
121
 
122
122
  | | Greenfield | Brownfield |
123
123
  | ---------------------- | ------------------------------ | ---------------------------------------- |
124
- | First skill loaded | Native router, or `using-agent-skills` + `/spec` | `context-engineering` |
124
+ | First skill loaded | Native router, or `i3-using-agent-skills` + `/i3-spec` | `i3-context-engineering` |
125
125
  | First value delivered | Spec'd, tested first feature | Zero-risk reviews and safer bug fixes |
126
126
  | TDD posture | Universal from commit one | Selective: tests where change is planned |
127
127
  | Refactoring rule | Rare (little to refactor) | Characterization tests first, always |