@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/rebrand/apply.cjs DELETED
@@ -1,194 +0,0 @@
1
- #!/usr/bin/env node
2
- 'use strict';
3
-
4
- const fs = require('node:fs');
5
- const path = require('node:path');
6
- const { spawnSync } = require('node:child_process');
7
- const { validateCatalog, frontmatter } = require('./catalog.cjs');
8
- const brand = require('./brand.json');
9
- const upstream = require('./upstream.json');
10
- const root = path.resolve(__dirname, '..');
11
- const mode = process.argv[2];
12
- if (!['--apply', '--check'].includes(mode)) {
13
- console.error('Usage: node rebrand/apply.cjs --apply | --check');
14
- process.exit(1);
15
- }
16
- if (mode === '--apply') {
17
- const branch = spawnSync('git', ['-C', root, 'branch', '--show-current'], { encoding: 'utf8' });
18
- if (branch.status === 0 && branch.stdout.trim() === brand.sourceBranch) {
19
- console.error(`Refusing to transform the source branch ${brand.sourceBranch}; create a release candidate first.`);
20
- process.exit(1);
21
- }
22
- }
23
- const inventory = validateCatalog(root, upstream);
24
- const packageFile = path.join(root, 'package.json');
25
- if (fs.existsSync(packageFile) && JSON.parse(fs.readFileSync(packageFile, 'utf8')).name !== brand.npmName) {
26
- console.error('Upstream package.json now exists; explicitly adapt the distribution overlay before replaying.');
27
- process.exit(1);
28
- }
29
- const changes = new Map();
30
- function update(relative, content) {
31
- const file = path.join(root, relative);
32
- if (!fs.existsSync(file) || fs.readFileSync(file, 'utf8') !== content) changes.set(relative, content);
33
- }
34
- function transform(content, relative) {
35
- const head = /^skills\/[^/]+\/SKILL\.md$/.test(relative) ? frontmatter(content) : '';
36
- content = content.slice(head.length);
37
- // Agent Skills is also the name of an independent specification.
38
- const standard = '__I3_AGENT_SKILLS_STANDARD__';
39
- let result = content
40
- .replace('agents working on the [`addyosmani/agent-skills`](https://github.com/addyosmani/agent-skills) repository itself',
41
- 'agents working on the i3 Composer Agent repository itself, derived from [`addyosmani/agent-skills`](https://github.com/addyosmani/agent-skills)')
42
- .replace(/Agent Skills(?=\s+(?:specification|spec\b|format\b|standard\b))/g, standard)
43
- .replaceAll('addy-agent-skills', brand.name)
44
- .replaceAll('agent-skills@addy-agent-skills', `${brand.name}@${brand.name}`)
45
- .replaceAll('agent-skills@agent-skills', `${brand.name}@${brand.name}`)
46
- .replaceAll('agent-skills:', `${brand.name}:`)
47
- .replaceAll('/path/to/agent-skills', `/path/to/${brand.name}`)
48
- .replaceAll('./agent-skills', `./${brand.name}`)
49
- .replace(/(?<![\w/.-])agent-skills(?![\w-])/g, brand.name)
50
- .replaceAll('Agent Skills', brand.displayName)
51
- .replaceAll(standard, 'Agent Skills');
52
- if (relative.startsWith('docs/')) {
53
- result = result.split('\n').map(line => {
54
- if (/^\s*git clone https:\/\/github\.com\/addyosmani\/agent-skills(?:\.git)?\s*$/.test(line)) {
55
- return `${line.match(/^\s*/)[0]}npx ${brand.npmName} --extract --dir ./${brand.name}`;
56
- }
57
- if (/^\s*(?:npx |codex |copilot |cmd |agy |gemini |\/plugin )/.test(line)) {
58
- return line.replaceAll('https://github.com/addyosmani/agent-skills.git', `/path/to/${brand.name}`)
59
- .replaceAll('https://github.com/addyosmani/agent-skills', `/path/to/${brand.name}`)
60
- .replaceAll('addyosmani/agent-skills', `/path/to/${brand.name}`);
61
- }
62
- return line;
63
- }).join('\n');
64
- result = result
65
- .replace(/^cmd skills add \/path\/to\/i3-composer-agent@main[^\n]*$/gm,
66
- '# Branch selectors apply to Git sources; prepared npm bundles have no Git history.')
67
- .replaceAll('Clone the repository', 'Prepare the plugin bundle')
68
- .replaceAll('Clone this repository', 'Prepare the plugin bundle')
69
- .replaceAll('Install from the remote repository', 'Install from a prepared local bundle')
70
- .replaceAll('npx skills add addyosmani/agent-skills', `npx skills add /path/to/${brand.name}`)
71
- .replaceAll('plugin marketplace add addyosmani/agent-skills', `plugin marketplace add /path/to/${brand.name}`)
72
- .replaceAll('~/.gemini/config/plugins/agent-skills/', `~/.gemini/config/plugins/${brand.name}/`)
73
- .replaceAll('.cursor/rules/agent-skills.mdc', `.cursor/rules/${brand.name}.mdc`)
74
- .replace(/\[[^\]]+\]\(https:\/\/github\.com\/addyosmani\/agent-skills\/issues\/(\d+)\)/g,
75
- (_, issue) => `[upstream agent-skills #${issue}](https://github.com/addyosmani/agent-skills/issues/${issue})`);
76
- }
77
- return head + result;
78
- }
79
- const skipDirectories = new Set(['.git', 'node_modules', 'rebrand', 'dist', 'tests', 'bin']);
80
- const skipFiles = new Set(['LICENSE', 'NOTICE.md', 'CHANGELOG.md', 'package.json', 'README.md', 'evals/README.md', 'evals/skill-impact.md', 'docs/comparison.md', 'scripts/validate-brand.cjs', 'scripts/lib/skill-lint.js', 'scripts/lib/skill-lint-test.js']);
81
- function walk(directory, prefix = '') {
82
- for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {
83
- const relative = prefix ? `${prefix}/${entry.name}` : entry.name;
84
- if (entry.isDirectory()) {
85
- if (!skipDirectories.has(entry.name) && !relative.startsWith('evals/results')) walk(path.join(directory, entry.name), relative);
86
- } else if (entry.isFile() && !skipFiles.has(relative) && /\.(?:md|js|cjs|sh|toml|yml)$/.test(entry.name)) {
87
- const original = fs.readFileSync(path.join(root, relative), 'utf8');
88
- update(relative, transform(original, relative));
89
- }
90
- }
91
- }
92
- walk(root);
93
- for (const patch of require('./fork-patches.json')) {
94
- if (path.isAbsolute(patch.file) || patch.file.split(/[\\/]/).includes('..')) throw new Error('Patch must stay inside this Agent repository.');
95
- const original = (changes.get(patch.file) ?? fs.readFileSync(path.join(root, patch.file), 'utf8')).replace(/\r\n/g, '\n');
96
- if (original.includes(patch.to)) continue;
97
- if (!original.includes(patch.from)) throw new Error(`Upstream changed ${patch.file}; review the fork patch before proceeding.`);
98
- update(patch.file, original.replace(patch.from, patch.to));
99
- }
100
- const comparisonPath = 'docs/comparison.md';
101
- const comparison = fs.readFileSync(path.join(root, comparisonPath), 'utf8');
102
- if (!comparison.includes('> **Upstream research:**')) {
103
- const note = `> **Upstream research:** This comparison is retained from Addy Osmani's \`agent-skills\` at commit \`${brand.upstreamCommit}\`. Its experiments describe the upstream project; they are not independent evaluations of ${brand.displayName}.\n\n`;
104
- update(comparisonPath, comparison.replace('# How agent-skills compares\n\n', '# How agent-skills compares\n\n' + note));
105
- }
106
- for (const relative of ['plugin.json', '.claude-plugin/plugin.json', '.codex-plugin/plugin.json']) {
107
- const manifest = JSON.parse(fs.readFileSync(path.join(root, relative), 'utf8'));
108
- manifest.name = brand.name;
109
- manifest.version = brand.releaseVersion;
110
- manifest.description = brand.description;
111
- if (manifest.author) manifest.author = { name: brand.maintainer };
112
- manifest.homepage = brand.repository;
113
- manifest.repository = brand.repository;
114
- if (manifest.interface) {
115
- manifest.interface.displayName = brand.displayName;
116
- manifest.interface.developerName = brand.maintainer;
117
- manifest.interface.shortDescription = 'Engineering workflow skills';
118
- manifest.interface.longDescription = `${brand.displayName} packages ${inventory.skills.length} engineering skills from Addy Osmani's Agent Skills, covering requirements, planning, implementation, testing, review, and shipping.`;
119
- manifest.interface.defaultPrompt = manifest.interface.defaultPrompt.map(prompt => prompt.replaceAll('Agent Skills', brand.displayName));
120
- }
121
- update(relative, JSON.stringify(manifest, null, 2) + '\n');
122
- }
123
- for (const relative of ['.claude-plugin/marketplace.json', '.agents/plugins/marketplace.json']) {
124
- const manifest = JSON.parse(fs.readFileSync(path.join(root, relative), 'utf8'));
125
- manifest.name = brand.name;
126
- if (manifest.version) manifest.version = brand.releaseVersion;
127
- if (manifest.description) manifest.description = brand.description;
128
- if (manifest.owner) manifest.owner = { name: brand.maintainer };
129
- if (manifest.interface) manifest.interface.displayName = brand.displayName;
130
- for (const plugin of manifest.plugins) {
131
- plugin.name = brand.name;
132
- plugin.version = brand.releaseVersion;
133
- plugin.description = brand.description;
134
- plugin.source = relative.startsWith('.agents/') ? { source: 'local', path: './' } : './';
135
- plugin.homepage = brand.repository;
136
- }
137
- update(relative, JSON.stringify(manifest, null, 2) + '\n');
138
- }
139
- function overlay(directory, prefix = '') {
140
- for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {
141
- const relative = prefix ? `${prefix}/${entry.name}` : entry.name;
142
- if (relative === '.github' && !fs.existsSync(path.join(root, '.github'))) continue;
143
- if (entry.isDirectory()) overlay(path.join(directory, entry.name), relative);
144
- else if (entry.isFile()) update(relative, fs.readFileSync(path.join(directory, entry.name), 'utf8'));
145
- else throw new Error(`Unsupported distribution overlay entry: ${relative}`);
146
- }
147
- }
148
- overlay(path.join(__dirname, 'overlay'));
149
- const ignoreFile = path.join(root, '.gitignore');
150
- if (fs.existsSync(ignoreFile)) {
151
- const original = fs.readFileSync(ignoreFile, 'utf8');
152
- const entries = new Set(original.split(/\r?\n/));
153
- const missing = ['dist/', '*.tgz', `${brand.name}/`].filter(entry => !entries.has(entry));
154
- if (missing.length) update('.gitignore', original.replace(/\n?$/, '\n') + missing.join('\n') + '\n');
155
- }
156
- const pkg = JSON.parse(fs.readFileSync(path.join(__dirname, 'package.template.json'), 'utf8'));
157
- pkg.name = brand.npmName;
158
- pkg.version = brand.releaseVersion;
159
- pkg.repository = { type: 'git', url: brand.repository + '.git' };
160
- pkg.homepage = brand.repository + '#readme';
161
- pkg.i3ComposerAgent.upstreamVersion = upstream.upstreamVersion;
162
- pkg.i3ComposerAgent.upstreamCommit = upstream.upstreamCommit;
163
- pkg.i3ComposerAgent.upstreamRepository = brand.upstream;
164
- update('package.json', JSON.stringify(pkg, null, 2) + '\n');
165
- update('NOTICE.md', fs.readFileSync(path.join(__dirname, 'NOTICE.md'), 'utf8'));
166
- function description(relative) {
167
- const head = fs.readFileSync(path.join(root, relative), 'utf8').match(/^---\r?\n([\s\S]*?)\r?\n---/)?.[1] || '';
168
- return (head.match(/^description:\s*(.*)$/m)?.[1] || '').replace(/^["']|["']$/g, '').replaceAll('|', '\\|');
169
- }
170
- const values = {
171
- RELEASE_VERSION: brand.releaseVersion,
172
- UPSTREAM_VERSION: upstream.upstreamVersion,
173
- SKILL_COUNT: inventory.skills.length,
174
- COMMAND_COUNT: inventory.commands.length,
175
- PERSONA_COUNT: inventory.personas.length,
176
- SKILL_TABLE: inventory.skills.map(id => `| [${id}](skills/${id}/SKILL.md) | ${description(`skills/${id}/SKILL.md`)} |`).join('\n'),
177
- COMMAND_TABLE: inventory.commands.map(id => `| /${brand.name}:${id} | ${description(`.claude/commands/${id}.md`)} |`).join('\n'),
178
- };
179
- for (const [relative, template] of [
180
- ['README.md', 'README.md'], ['docs/codex-setup.md', 'codex-setup.md'], ['docs/codebuddy-setup.md', 'codebuddy-setup.md'],
181
- ]) {
182
- const content = fs.readFileSync(path.join(__dirname, 'templates', template), 'utf8').replace(/\{\{([A-Z_]+)\}\}/g, (_, key) => {
183
- if (!(key in values)) throw new Error(`Unknown template variable: ${key}`);
184
- return values[key];
185
- });
186
- update(relative, content);
187
- }
188
- if (mode === '--apply') for (const [relative, content] of changes) {
189
- fs.mkdirSync(path.dirname(path.join(root, relative)), { recursive: true });
190
- fs.writeFileSync(path.join(root, relative), content);
191
- }
192
- if (mode === '--apply') fs.chmodSync(path.join(root, 'bin/i3-composer-agent.cjs'), 0o755);
193
- console.log(JSON.stringify({ mode, changedFiles: [...changes.keys()] }, null, 2));
194
- if (mode === '--check' && changes.size) process.exitCode = 1;
@@ -1,13 +0,0 @@
1
- {
2
- "name": "i3-composer-agent",
3
- "displayName": "i3 Composer Agent",
4
- "npmName": "@givolt/i3-composer-agent",
5
- "maintainer": "Givolt",
6
- "upstream": "https://github.com/addyosmani/agent-skills",
7
- "upstreamCommit": "1401c8b8030e023baeebb31781a6653fe8e93026",
8
- "description": "Production-grade engineering skills for AI coding agents covering the development lifecycle from spec to ship.",
9
- "repository": "https://github.com/49780522/i3-composer-agent",
10
- "sourceBranch": "agent/source",
11
- "releaseBranch": "main",
12
- "releaseVersion": "1.0.1"
13
- }
@@ -1,56 +0,0 @@
1
- 'use strict';
2
-
3
- const fs = require('node:fs');
4
- const path = require('node:path');
5
- const crypto = require('node:crypto');
6
- const assert = require('node:assert/strict');
7
- const runtimeRoots = ['skills', 'references', 'agents', 'commands', '.claude/commands', '.gemini/commands', 'hooks', '.claude-plugin', '.codex-plugin', '.agents/plugins'];
8
- const runtimeFiles = ['plugin.json', 'LICENSE'];
9
-
10
- function frontmatter(content) {
11
- const match = content.match(/^---\r?\n[\s\S]*?\r?\n---(?:\r?\n|$)/);
12
- assert.ok(match, 'Skill must have YAML frontmatter');
13
- return match[0];
14
- }
15
- function describe(files, read) {
16
- files = files.filter(file => path.basename(file) !== '.DS_Store');
17
- const select = pattern => files.filter(name => pattern.test(name)).sort();
18
- const skillFiles = select(/^skills\/[^/]+\/SKILL\.md$/);
19
- const skillFrontmatter = {};
20
- for (const file of skillFiles) {
21
- const id = file.split('/')[1];
22
- const head = frontmatter(read(file));
23
- const name = head.match(/^name:\s*["']?([^\s"']+)["']?\s*$/m)?.[1];
24
- assert.equal(name, id, `${file}: unstable skill identifier`);
25
- skillFrontmatter[id] = crypto.createHash('sha256').update(head.replace(/\r\n/g, '\n')).digest('hex');
26
- }
27
- return {
28
- skills: skillFiles.map(file => file.split('/')[1]),
29
- commands: select(/^\.claude\/commands\/[^/]+\.md$/).map(file => path.basename(file, '.md')),
30
- personas: select(/^agents\/[^/]+\.md$/).map(file => path.basename(file, '.md')),
31
- references: select(/^references\/[^/]+\.md$/),
32
- runtimeFiles: files.filter(file => runtimeFiles.includes(file) || runtimeRoots.some(root => file.startsWith(root + '/'))).sort(),
33
- skillFrontmatter,
34
- };
35
- }
36
- function catalog(root) {
37
- const files = [];
38
- function walk(directory, prefix) {
39
- for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {
40
- const relative = `${prefix}/${entry.name}`;
41
- if (entry.isDirectory()) walk(path.join(directory, entry.name), relative);
42
- else if (entry.isFile()) files.push(relative);
43
- }
44
- }
45
- for (const name of runtimeRoots) if (fs.existsSync(path.join(root, name))) walk(path.join(root, name), name);
46
- for (const name of runtimeFiles) if (fs.existsSync(path.join(root, name))) files.push(name);
47
- return describe(files, file => fs.readFileSync(path.join(root, file), 'utf8'));
48
- }
49
- function validateCatalog(root, expected) {
50
- const actual = catalog(root);
51
- for (const field of ['skills', 'commands', 'personas', 'references', 'runtimeFiles', 'skillFrontmatter']) {
52
- assert.deepEqual(actual[field], expected[field], `upstream preservation failed: ${field}`);
53
- }
54
- return actual;
55
- }
56
- module.exports = { runtimeRoots, runtimeFiles, frontmatter, describe, catalog, validateCatalog };
@@ -1,12 +0,0 @@
1
- [
2
- {
3
- "file": "scripts/validate-versions.js",
4
- "from": "const manifestPaths = [\n \"plugin.json\",",
5
- "to": "const manifestPaths = [\n \"package.json\",\n \"plugin.json\","
6
- },
7
- {
8
- "file": "scripts/validate-versions-test.js",
9
- "from": "const manifestPaths = [\n \"plugin.json\",",
10
- "to": "const manifestPaths = [\n \"package.json\",\n \"plugin.json\","
11
- }
12
- ]
@@ -1,177 +0,0 @@
1
- name: Test Plugin Installation
2
-
3
- on:
4
- push:
5
- pull_request:
6
- workflow_dispatch:
7
-
8
- jobs:
9
- validate-skills:
10
- name: Validate skill content
11
- runs-on: ubuntu-latest
12
- steps:
13
- - uses: actions/checkout@v6
14
- with:
15
- fetch-depth: 0
16
-
17
- - name: Set up Node.js
18
- uses: actions/setup-node@v6
19
- with:
20
- node-version: '24'
21
-
22
- - name: Validate all skills
23
- run: node scripts/validate-skills.js
24
-
25
- - name: Test skill lint rules
26
- run: node --test scripts/lib/skill-lint-test.js
27
-
28
- - name: Validate manifest versions
29
- run: node scripts/validate-versions.js
30
-
31
- - name: Validate i3 Composer Agent identity and replay
32
- run: |
33
- node scripts/validate-brand.cjs
34
- node rebrand/apply.cjs --check
35
-
36
- - name: Test npm bundle CLI
37
- run: node --test tests/*.test.cjs rebrand/tests/*.test.cjs
38
-
39
- - name: Test manifest version validator
40
- run: node --test scripts/validate-versions-test.js
41
-
42
- - name: Test skill eval runner
43
- run: node --test scripts/run-evals-test.js
44
-
45
- - name: Run skill evals (trigger + routing)
46
- run: node scripts/run-evals.js --min-rank1 95
47
-
48
- - name: Validate references/ links in skills
49
- run: node scripts/validate-reference-links.js
50
-
51
- - name: Test reference-link validator
52
- run: node --test scripts/validate-reference-links-test.js
53
-
54
- - name: Test floor-guard reference
55
- run: node --test scripts/floor-guard-reference-test.js
56
-
57
- - name: Test session-start hook payload
58
- run: bash hooks/session-start-test.sh
59
-
60
- validate-commands:
61
- name: Validate command parity and description sync
62
- runs-on: ubuntu-latest
63
- steps:
64
- - uses: actions/checkout@v6
65
-
66
- - name: Set up Node.js
67
- uses: actions/setup-node@v6
68
- with:
69
- node-version: '24'
70
-
71
- - name: Validate commands across all tool directories
72
- run: node scripts/validate-commands.js
73
-
74
- - name: Test command validator
75
- run: node --test scripts/validate-commands-test.js
76
-
77
- - name: Validate spec/plan/todo artifact paths
78
- run: node scripts/validate-artifact-paths.js
79
-
80
- - name: Test artifact-path validator
81
- run: node --test scripts/validate-artifact-paths-test.js
82
-
83
- # Ubuntu coverage stays in the existing jobs above, preserving their check names.
84
- validate-platforms:
85
- name: Validate tooling (${{ matrix.os }})
86
- runs-on: ${{ matrix.os }}
87
- strategy:
88
- fail-fast: false
89
- matrix:
90
- os: [macos-latest, windows-latest]
91
- steps:
92
- - uses: actions/checkout@v6
93
- with:
94
- fetch-depth: 0
95
-
96
- - name: Set up Node.js
97
- uses: actions/setup-node@v6
98
- with:
99
- node-version: '24'
100
-
101
- - name: Test validators and eval runner
102
- run: >-
103
- node --test
104
- scripts/lib/skill-lint-test.js
105
- scripts/validate-versions-test.js
106
- scripts/run-evals-test.js
107
- scripts/validate-reference-links-test.js
108
- scripts/validate-commands-test.js
109
- scripts/validate-artifact-paths-test.js
110
- scripts/floor-guard-reference-test.js
111
- tests/*.test.cjs
112
- rebrand/tests/*.test.cjs
113
-
114
- - name: Validate all skills
115
- run: node scripts/validate-skills.js
116
-
117
- - name: Validate manifest versions
118
- run: node scripts/validate-versions.js
119
-
120
- - name: Validate references/ links in skills
121
- run: node scripts/validate-reference-links.js
122
-
123
- - name: Validate commands across all tool directories
124
- run: node scripts/validate-commands.js
125
-
126
- - name: Validate spec/plan/todo artifact paths
127
- run: node scripts/validate-artifact-paths.js
128
-
129
- - name: Run skill evals (trigger + routing)
130
- run: node scripts/run-evals.js --min-rank1 95
131
-
132
- test-hooks:
133
- name: Hook regression tests
134
- runs-on: ubuntu-latest
135
- steps:
136
- - uses: actions/checkout@v6
137
-
138
- - name: Test sdd-cache hooks (stubbed curl, no network)
139
- run: bash hooks/sdd-cache-test.sh
140
-
141
- - name: Test simplify-ignore hook
142
- run: bash hooks/simplify-ignore-test.sh
143
-
144
- validate:
145
- name: Validate plugin structure
146
- needs: [validate-skills, validate-commands, validate-platforms]
147
- runs-on: ubuntu-latest
148
- steps:
149
- - uses: actions/checkout@v6
150
-
151
- - name: Install Claude Code
152
- run: npm install -g @anthropic-ai/claude-code
153
-
154
- - name: Validate marketplace and plugin manifests
155
- run: claude plugin validate .
156
-
157
- test-install:
158
- name: Test plugin installation
159
- runs-on: ubuntu-latest
160
- needs: validate
161
- steps:
162
- - uses: actions/checkout@v6
163
-
164
- - name: Install Claude Code
165
- run: npm install -g @anthropic-ai/claude-code
166
-
167
- - name: Configure git to use HTTPS
168
- run: git config --global url."https://github.com/".insteadOf "git@github.com:"
169
-
170
- - name: Add marketplace
171
- run: claude plugin marketplace add ./
172
-
173
- - name: List marketplaces
174
- run: claude plugin marketplace list
175
-
176
- - name: Install plugin
177
- run: claude plugin install i3-composer-agent@i3-composer-agent --scope user
@@ -1,34 +0,0 @@
1
- # i3 Composer Agent changes
2
-
3
- ## 1.0.1 — 2026-10-07
4
-
5
- Upstream baseline: agent-skills 0.6.12 at commit 1401c8b8030e023baeebb31781a6653fe8e93026.
6
-
7
- ### Fixed
8
-
9
- - Restore the promised terminal installation wizard with multiple tool selection, project/global scope, a destination summary and confirmation.
10
- - Install complete native skill files and shared references; include short lifecycle commands and personas for CodeBuddy and Claude Code.
11
- - Protect existing assets with confirmed replacement, backups and rollback on installation failure.
12
- - Retain complete plugin preparation with --prepare and existing explicit --dir calls.
13
-
14
- ## 1.0.0 — 2026-10-07
15
-
16
- Upstream baseline: agent-skills 0.6.12 at commit 1401c8b8030e023baeebb31781a6653fe8e93026.
17
-
18
- ### Changed
19
-
20
- - Start independent i3 release numbering. The upstream baseline remains 0.6.12; this replaces the unpublished 0.6.13 candidate.
21
- - Display the i3 release and upstream baseline together in the README, CLI help, and bundle preparation output. Keep --version machine-readable.
22
- - Include the upstream version, commit, and repository in package metadata.
23
- - Maintain source changes on agent/source, generate and validate a branded candidate, then update main in this independent repository.
24
-
25
- ### Fixed
26
-
27
- - Preserve complete reviewed runtime assets when replaying branding, including newly approved upstream skills and commands.
28
- - Keep replay checks repeatable in npm bundles without repository CI files.
29
- - Preserve branded ignore rules and exclude Finder metadata from runtime preservation checks.
30
-
31
- ## 0.6.12
32
-
33
- - Publish the first i3 Composer Agent npm distribution based on agent-skills 0.6.12.
34
- - Retain upstream skill IDs, command workflows, specialist personas, shared references, and MIT attribution.