@givolt/i3-composer-agent 1.0.1 → 2.0.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.
- package/.agents/plugins/marketplace.json +1 -1
- package/.claude/commands/{build.md → i3-build.md} +10 -10
- package/.claude/commands/{code-simplify.md → i3-code-simplify.md} +2 -2
- package/.claude/commands/{constraints.md → i3-constraints.md} +4 -4
- package/.claude/commands/{plan.md → i3-plan.md} +1 -1
- package/.claude/commands/{review.md → i3-review.md} +3 -3
- package/.claude/commands/{ship.md → i3-ship.md} +4 -4
- package/.claude/commands/{spec.md → i3-spec.md} +1 -1
- package/.claude/commands/{test.md → i3-test.md} +2 -2
- package/.claude/commands/{webperf.md → i3-webperf.md} +1 -1
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.gemini/commands/{build.toml → i3-build.toml} +10 -10
- package/.gemini/commands/{code-simplify.toml → i3-code-simplify.toml} +2 -2
- package/.gemini/commands/{constraints.toml → i3-constraints.toml} +4 -4
- package/.gemini/commands/{planning.toml → i3-planning.toml} +1 -1
- package/{commands/review.toml → .gemini/commands/i3-review.toml} +3 -3
- package/.gemini/commands/{ship.toml → i3-ship.toml} +4 -4
- package/.gemini/commands/{spec.toml → i3-spec.toml} +1 -1
- package/{commands/test.toml → .gemini/commands/i3-test.toml} +2 -2
- package/.gemini/commands/{webperf.toml → i3-webperf.toml} +1 -1
- package/CHANGELOG.md +17 -0
- package/NOTICE.md +2 -1
- package/README.md +47 -41
- package/agents/code-reviewer.md +2 -2
- package/agents/security-auditor.md +1 -1
- package/agents/test-engineer.md +1 -1
- package/agents/web-performance-auditor.md +3 -3
- package/bin/i3-composer-agent.cjs +2 -2
- package/bin/install.cjs +20 -4
- package/commands/{build.toml → i3-build.toml} +10 -10
- package/commands/{code-simplify.toml → i3-code-simplify.toml} +2 -2
- package/commands/{constraints.toml → i3-constraints.toml} +4 -4
- package/commands/{planning.toml → i3-planning.toml} +1 -1
- package/{.gemini/commands/review.toml → commands/i3-review.toml} +3 -3
- package/commands/{ship.toml → i3-ship.toml} +4 -4
- package/commands/{spec.toml → i3-spec.toml} +1 -1
- package/{.gemini/commands/test.toml → commands/i3-test.toml} +2 -2
- package/commands/{webperf.toml → i3-webperf.toml} +1 -1
- package/docs/adoption-guide.md +35 -35
- package/docs/agents.md +12 -12
- package/docs/antigravity-setup.md +14 -14
- package/docs/codebuddy-setup.md +16 -15
- package/docs/codex-setup.md +6 -6
- package/docs/commandcode-setup.md +5 -5
- package/docs/copilot-cli-setup.md +5 -5
- package/docs/copilot-setup.md +22 -22
- package/docs/cursor-setup.md +20 -20
- package/docs/developer-onboarding.md +5 -5
- package/docs/gemini-cli-setup.md +26 -26
- package/docs/getting-started.md +36 -36
- package/docs/opencode-setup.md +27 -27
- package/docs/skill-anatomy.md +3 -3
- package/docs/windsurf-setup.md +7 -7
- package/evals/cases/{api-and-interface-design.json → i3-api-and-interface-design.json} +4 -4
- package/evals/cases/{browser-testing-with-devtools.json → i3-browser-testing-with-devtools.json} +4 -4
- package/evals/cases/{ci-cd-and-automation.json → i3-ci-cd-and-automation.json} +4 -4
- package/evals/cases/{code-review-and-quality.json → i3-code-review-and-quality.json} +4 -4
- package/evals/cases/{code-simplification.json → i3-code-simplification.json} +4 -4
- package/evals/cases/{constraint-driven-development.json → i3-constraint-driven-development.json} +4 -4
- package/evals/cases/{context-engineering.json → i3-context-engineering.json} +4 -4
- package/evals/cases/{debugging-and-error-recovery.json → i3-debugging-and-error-recovery.json} +5 -5
- package/evals/cases/{deprecation-and-migration.json → i3-deprecation-and-migration.json} +4 -4
- package/evals/cases/{documentation-and-adrs.json → i3-documentation-and-adrs.json} +4 -4
- package/evals/cases/{doubt-driven-development.json → i3-doubt-driven-development.json} +3 -3
- package/evals/cases/{frontend-ui-engineering.json → i3-frontend-ui-engineering.json} +4 -4
- package/evals/cases/{git-workflow-and-versioning.json → i3-git-workflow-and-versioning.json} +3 -3
- package/evals/cases/{idea-refine.json → i3-idea-refine.json} +3 -3
- package/evals/cases/{incremental-implementation.json → i3-incremental-implementation.json} +4 -4
- package/evals/cases/{interview-me.json → i3-interview-me.json} +3 -3
- package/evals/cases/{observability-and-instrumentation.json → i3-observability-and-instrumentation.json} +3 -3
- package/evals/cases/{performance-optimization.json → i3-performance-optimization.json} +4 -4
- package/evals/cases/{planning-and-task-breakdown.json → i3-planning-and-task-breakdown.json} +4 -4
- package/evals/cases/{security-and-hardening.json → i3-security-and-hardening.json} +4 -4
- package/evals/cases/{shipping-and-launch.json → i3-shipping-and-launch.json} +4 -4
- package/evals/cases/{source-driven-development.json → i3-source-driven-development.json} +4 -4
- package/evals/cases/{spec-driven-development.json → i3-spec-driven-development.json} +5 -5
- package/evals/cases/{test-driven-development.json → i3-test-driven-development.json} +5 -5
- package/evals/cases/{using-agent-skills.json → i3-using-agent-skills.json} +4 -4
- package/evals/fixtures/{git-workflow-and-versioning → i3-git-workflow-and-versioning}/.eval/working-tree.patch +3 -3
- package/evals/plugin/code-review-fires/graders/skill-fired.md +1 -1
- package/evals/plugin/code-review-stays-quiet/graders/not-fired.md +1 -1
- package/evals/plugin/code-review-stays-quiet/graders/tdd-fired.md +1 -1
- package/evals/plugin/code-review-stays-quiet/prompt.md +2 -2
- package/evals/plugin/code-review-stays-quiet-on-commit-message/graders/not-fired.md +1 -1
- package/evals/plugin/code-review-stays-quiet-on-commit-message/prompt.md +2 -2
- package/hooks/SDD-CACHE.md +3 -3
- package/hooks/SIMPLIFY-IGNORE.md +2 -2
- package/hooks/session-start-test.sh +1 -1
- package/hooks/session-start.sh +3 -3
- package/package.json +1 -1
- package/plugin.json +1 -1
- package/rebrand/INSTALLATION-SPEC.md +2 -1
- package/rebrand/MAINTENANCE.md +3 -2
- package/rebrand/NOTICE.md +2 -1
- package/rebrand/PREFIX-SPEC.md +16 -0
- package/rebrand/UNIFICATION-SPEC.md +2 -2
- package/rebrand/VALIDATION.md +2 -2
- package/rebrand/VERSIONING.md +5 -3
- package/rebrand/apply.cjs +33 -10
- package/rebrand/brand.json +1 -1
- package/rebrand/catalog.cjs +16 -2
- package/rebrand/fork-patches.json +15 -0
- package/rebrand/identifiers.cjs +41 -0
- package/rebrand/overlay/CHANGELOG.md +17 -0
- package/rebrand/overlay/bin/i3-composer-agent.cjs +2 -2
- package/rebrand/overlay/bin/install.cjs +20 -4
- package/rebrand/overlay/scripts/validate-brand.cjs +3 -3
- package/rebrand/overlay/tests/installer.test.cjs +60 -12
- package/rebrand/templates/README.md +11 -5
- package/rebrand/templates/codebuddy-setup.md +16 -15
- package/rebrand/templates/codex-setup.md +6 -6
- package/rebrand/tests/pipeline.test.cjs +71 -3
- package/references/accessibility-checklist.md +1 -1
- package/references/definition-of-done.md +7 -7
- package/references/observability-checklist.md +3 -3
- package/references/orchestration-patterns.md +17 -17
- package/references/performance-checklist.md +2 -2
- package/references/security-checklist.md +1 -1
- package/references/testing-patterns.md +1 -1
- package/scripts/floor-guard-reference-test.js +2 -2
- package/scripts/lib/skill-lint.js +2 -0
- package/scripts/run-evals-test.js +2 -2
- package/scripts/validate-artifact-paths-test.js +3 -3
- package/scripts/validate-artifact-paths.js +4 -2
- package/scripts/validate-brand.cjs +3 -3
- package/scripts/validate-commands.js +1 -0
- package/scripts/validate-reference-links-test.js +11 -11
- package/scripts/validate-reference-links.js +1 -1
- package/skills/{api-and-interface-design → i3-api-and-interface-design}/SKILL.md +2 -2
- package/skills/{browser-testing-with-devtools → i3-browser-testing-with-devtools}/SKILL.md +1 -1
- package/skills/{ci-cd-and-automation → i3-ci-cd-and-automation}/SKILL.md +2 -2
- package/skills/{code-review-and-quality → i3-code-review-and-quality}/SKILL.md +5 -5
- package/skills/{code-simplification → i3-code-simplification}/SKILL.md +1 -1
- package/skills/{constraint-driven-development → i3-constraint-driven-development}/SKILL.md +15 -15
- package/skills/{context-engineering → i3-context-engineering}/SKILL.md +1 -1
- package/skills/{debugging-and-error-recovery → i3-debugging-and-error-recovery}/SKILL.md +2 -2
- package/skills/{deprecation-and-migration → i3-deprecation-and-migration}/SKILL.md +2 -2
- package/skills/{documentation-and-adrs → i3-documentation-and-adrs}/SKILL.md +1 -1
- package/skills/{doubt-driven-development → i3-doubt-driven-development}/SKILL.md +8 -8
- package/skills/{frontend-ui-engineering → i3-frontend-ui-engineering}/SKILL.md +1 -1
- package/skills/{git-workflow-and-versioning → i3-git-workflow-and-versioning}/SKILL.md +4 -4
- package/skills/{idea-refine → i3-idea-refine}/SKILL.md +2 -2
- package/skills/{idea-refine → i3-idea-refine}/scripts/idea-refine.sh +1 -1
- package/skills/{incremental-implementation → i3-incremental-implementation}/SKILL.md +3 -3
- package/skills/{interview-me → i3-interview-me}/SKILL.md +12 -12
- package/skills/{observability-and-instrumentation → i3-observability-and-instrumentation}/SKILL.md +5 -5
- package/skills/{performance-optimization → i3-performance-optimization}/SKILL.md +1 -1
- package/skills/{performance-optimization → i3-performance-optimization}/references/optimization-patterns.md +1 -1
- package/skills/{planning-and-task-breakdown → i3-planning-and-task-breakdown}/SKILL.md +2 -2
- package/skills/{security-and-hardening → i3-security-and-hardening}/SKILL.md +3 -3
- package/skills/{security-and-hardening → i3-security-and-hardening}/references/hardening-patterns.md +1 -1
- package/skills/{shipping-and-launch → i3-shipping-and-launch}/SKILL.md +2 -2
- package/skills/{source-driven-development → i3-source-driven-development}/SKILL.md +2 -2
- package/skills/{spec-driven-development → i3-spec-driven-development}/SKILL.md +7 -7
- package/skills/{test-driven-development → i3-test-driven-development}/SKILL.md +2 -2
- package/skills/{using-agent-skills → i3-using-agent-skills}/SKILL.md +67 -67
- package/tests/installer.test.cjs +60 -12
- /package/evals/fixtures/{api-and-interface-design → i3-api-and-interface-design}/service-brief.md +0 -0
- /package/evals/fixtures/{browser-testing-with-devtools → i3-browser-testing-with-devtools}/README.md +0 -0
- /package/evals/fixtures/{browser-testing-with-devtools → i3-browser-testing-with-devtools}/index.html +0 -0
- /package/evals/fixtures/{browser-testing-with-devtools → i3-browser-testing-with-devtools}/server.js +0 -0
- /package/evals/fixtures/{ci-cd-and-automation → i3-ci-cd-and-automation}/package.json +0 -0
- /package/evals/fixtures/{ci-cd-and-automation → i3-ci-cd-and-automation}/src/slug.js +0 -0
- /package/evals/fixtures/{ci-cd-and-automation → i3-ci-cd-and-automation}/test/slug.test.js +0 -0
- /package/evals/fixtures/{code-review-and-quality → i3-code-review-and-quality}/user-search.diff +0 -0
- /package/evals/fixtures/{code-simplification → i3-code-simplification}/config-parser.js +0 -0
- /package/evals/fixtures/{code-simplification → i3-code-simplification}/config-parser.test.js +0 -0
- /package/evals/fixtures/{context-engineering → i3-context-engineering}/context-audit.md +0 -0
- /package/evals/fixtures/{debugging-and-error-recovery → i3-debugging-and-error-recovery}/pagination.js +0 -0
- /package/evals/fixtures/{debugging-and-error-recovery → i3-debugging-and-error-recovery}/pagination.test.js +0 -0
- /package/evals/fixtures/{debugging-and-error-recovery → i3-debugging-and-error-recovery}/time-pressure.md +0 -0
- /package/evals/fixtures/{deprecation-and-migration → i3-deprecation-and-migration}/api-inventory.md +0 -0
- /package/evals/fixtures/{documentation-and-adrs → i3-documentation-and-adrs}/decision-context.md +0 -0
- /package/evals/fixtures/{doubt-driven-development → i3-doubt-driven-development}/migration-plan.md +0 -0
- /package/evals/fixtures/{frontend-ui-engineering → i3-frontend-ui-engineering}/Button.tsx +0 -0
- /package/evals/fixtures/{frontend-ui-engineering → i3-frontend-ui-engineering}/design-system.md +0 -0
- /package/evals/fixtures/{git-workflow-and-versioning → i3-git-workflow-and-versioning}/app.js +0 -0
- /package/evals/fixtures/{git-workflow-and-versioning → i3-git-workflow-and-versioning}/app.test.js +0 -0
- /package/evals/fixtures/{incremental-implementation → i3-incremental-implementation}/reports.js +0 -0
- /package/evals/fixtures/{incremental-implementation → i3-incremental-implementation}/reports.test.js +0 -0
- /package/evals/fixtures/{incremental-implementation → i3-incremental-implementation}/tasks/plan.md +0 -0
- /package/evals/fixtures/{observability-and-instrumentation → i3-observability-and-instrumentation}/operations.md +0 -0
- /package/evals/fixtures/{observability-and-instrumentation → i3-observability-and-instrumentation}/payment-retry.js +0 -0
- /package/evals/fixtures/{performance-optimization → i3-performance-optimization}/benchmark.js +0 -0
- /package/evals/fixtures/{performance-optimization → i3-performance-optimization}/products.js +0 -0
- /package/evals/fixtures/{planning-and-task-breakdown → i3-planning-and-task-breakdown}/notifications-spec.md +0 -0
- /package/evals/fixtures/{security-and-hardening → i3-security-and-hardening}/webhook.js +0 -0
- /package/evals/fixtures/{security-and-hardening → i3-security-and-hardening}/webhook.test.js +0 -0
- /package/evals/fixtures/{shipping-and-launch → i3-shipping-and-launch}/authority-pressure.md +0 -0
- /package/evals/fixtures/{shipping-and-launch → i3-shipping-and-launch}/launch-status.md +0 -0
- /package/evals/fixtures/{source-driven-development → i3-source-driven-development}/framework-task.md +0 -0
- /package/evals/fixtures/{spec-driven-development → i3-spec-driven-development}/billing-brief.md +0 -0
- /package/evals/fixtures/{test-driven-development → i3-test-driven-development}/BUG.md +0 -0
- /package/evals/fixtures/{test-driven-development → i3-test-driven-development}/README.md +0 -0
- /package/evals/fixtures/{test-driven-development → i3-test-driven-development}/package.json +0 -0
- /package/evals/fixtures/{test-driven-development → i3-test-driven-development}/src/split.js +0 -0
- /package/evals/fixtures/{test-driven-development → i3-test-driven-development}/test/split.test.js +0 -0
- /package/evals/fixtures/{using-agent-skills → i3-using-agent-skills}/incident.md +0 -0
- /package/skills/{constraint-driven-development → i3-constraint-driven-development}/references/floor-guard.md +0 -0
- /package/skills/{idea-refine → i3-idea-refine}/examples.md +0 -0
- /package/skills/{idea-refine → i3-idea-refine}/frameworks.md +0 -0
- /package/skills/{idea-refine → i3-idea-refine}/refinement-criteria.md +0 -0
|
@@ -11,7 +11,7 @@ npx @givolt/i3-composer-agent --codebuddy
|
|
|
11
11
|
The terminal wizard preselects CodeBuddy, still allows multiple tools, and asks
|
|
12
12
|
for project or global scope before installing. Project scope writes these paths:
|
|
13
13
|
|
|
14
|
-
- `.codebuddy/skills/` — all {{SKILL_COUNT}} skills with
|
|
14
|
+
- `.codebuddy/skills/` — all {{SKILL_COUNT}} skills with `i3-` IDs.
|
|
15
15
|
- `.codebuddy/references/` — shared checklists used by skill-relative links.
|
|
16
16
|
- `.codebuddy/commands/` — all {{COMMAND_COUNT}} existing lifecycle workflows.
|
|
17
17
|
- `.codebuddy/agents/` — all {{PERSONA_COUNT}} persona definitions.
|
|
@@ -22,12 +22,12 @@ not replaced. Reload the CodeBuddy window or start a new chat, then inspect
|
|
|
22
22
|
the Skills list and type `/` to inspect the command menu.
|
|
23
23
|
|
|
24
24
|
```text
|
|
25
|
-
/spec
|
|
26
|
-
/plan
|
|
27
|
-
/build
|
|
28
|
-
/build auto
|
|
29
|
-
/review
|
|
30
|
-
/ship
|
|
25
|
+
/i3-spec
|
|
26
|
+
/i3-plan
|
|
27
|
+
/i3-build
|
|
28
|
+
/i3-build auto
|
|
29
|
+
/i3-review
|
|
30
|
+
/i3-ship
|
|
31
31
|
```
|
|
32
32
|
|
|
33
33
|
The command wrappers reference installed skill IDs without the plugin namespace.
|
|
@@ -70,16 +70,17 @@ manifest. It declares `.claude/commands/` and `commands/`, preserving the nine
|
|
|
70
70
|
original lifecycle commands and their workflow content.
|
|
71
71
|
|
|
72
72
|
```text
|
|
73
|
-
/i3-composer-agent:spec
|
|
74
|
-
/i3-composer-agent:plan
|
|
75
|
-
/i3-composer-agent:build
|
|
76
|
-
/i3-composer-agent:build auto
|
|
77
|
-
/i3-composer-agent:review
|
|
78
|
-
/i3-composer-agent:ship
|
|
73
|
+
/i3-composer-agent:i3-spec
|
|
74
|
+
/i3-composer-agent:i3-plan
|
|
75
|
+
/i3-composer-agent:i3-build
|
|
76
|
+
/i3-composer-agent:i3-build auto
|
|
77
|
+
/i3-composer-agent:i3-review
|
|
78
|
+
/i3-composer-agent:i3-ship
|
|
79
79
|
```
|
|
80
80
|
|
|
81
|
-
Skill IDs
|
|
82
|
-
upstream behavior. The plugin namespace
|
|
81
|
+
Skill IDs and command filenames use `i3-`. Persona names, artifact paths,
|
|
82
|
+
and workflow gates retain their upstream behavior. The plugin namespace is
|
|
83
|
+
`i3-composer-agent`.
|
|
83
84
|
|
|
84
85
|
The prepared plugin includes all skills, personas, commands, hooks and shared
|
|
85
86
|
`references/`. Native skill installation above does not enable plugin hooks.
|
|
@@ -7,8 +7,8 @@ npx @givolt/i3-composer-agent --codex
|
|
|
7
7
|
```
|
|
8
8
|
|
|
9
9
|
Choose project or global scope. Native installation uses `.agents/skills/`
|
|
10
|
-
or `~/.agents/skills/`, plus the sibling `references/` directory. It
|
|
11
|
-
the {{SKILL_COUNT}}
|
|
10
|
+
or `~/.agents/skills/`, plus the sibling `references/` directory. It installs
|
|
11
|
+
the {{SKILL_COUNT}} skills with `i3-` IDs. This mode does not add short lifecycle
|
|
12
12
|
slash commands or enable plugin hooks.
|
|
13
13
|
|
|
14
14
|
For complete plugin registration, prepare a persistent bundle explicitly:
|
|
@@ -25,20 +25,20 @@ codex plugin marketplace add ./i3-composer-agent
|
|
|
25
25
|
codex plugin add i3-composer-agent@i3-composer-agent
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
-
Start a new Codex session after registration. All {{SKILL_COUNT}}
|
|
29
|
-
|
|
28
|
+
Start a new Codex session after registration. All {{SKILL_COUNT}} skills use
|
|
29
|
+
`i3-` IDs. In CLI/IDE, use `/skills` or `$i3-spec-driven-development`; in chat,
|
|
30
30
|
explicitly request the relevant skill from i3 Composer Agent.
|
|
31
31
|
|
|
32
32
|
The adapter in `.codex-plugin/plugin.json` points at the unchanged `skills/`
|
|
33
33
|
layout. Shared checklists remain under `references/`, so skill-relative links
|
|
34
34
|
resolve inside the complete plugin bundle.
|
|
35
35
|
|
|
36
|
-
The short lifecycle commands (`/spec`, `/plan`, `/build`, `/ship`) remain
|
|
36
|
+
The short lifecycle commands (`/i3-spec`, `/i3-plan`, `/i3-build`, `/i3-ship`) remain
|
|
37
37
|
available in hosts that load the Claude-compatible command manifest. Codex
|
|
38
38
|
lifecycle-command adaptation is separate from this brand conversion. Native
|
|
39
39
|
Codex `/plan` switches planning mode; it is not the plugin's planning wrapper.
|
|
40
40
|
|
|
41
|
-
Do not preload `using-agent-skills/SKILL.md` into always-on context: Codex routes
|
|
41
|
+
Do not preload `i3-using-agent-skills/SKILL.md` into always-on context: Codex routes
|
|
42
42
|
skills natively. The meta-skill can remain installed and explicitly invoked.
|
|
43
43
|
|
|
44
44
|
For local source testing, replace `./i3-composer-agent` above with the absolute
|
|
@@ -8,6 +8,8 @@ const path = require('node:path');
|
|
|
8
8
|
const { spawnSync } = require('node:child_process');
|
|
9
9
|
const root = path.resolve(__dirname, '../..');
|
|
10
10
|
const baselineVersion = require('../upstream.json').upstreamVersion;
|
|
11
|
+
const upstream = require('../upstream.json');
|
|
12
|
+
const { runtimePath, rewriteReferences } = require('../identifiers.cjs');
|
|
11
13
|
|
|
12
14
|
function run(directory, executable, args) {
|
|
13
15
|
return spawnSync(executable, args, { cwd: directory, encoding: 'utf8' });
|
|
@@ -24,6 +26,19 @@ function fixture(t, branch = 'release/test-candidate') {
|
|
|
24
26
|
for (const name of ['skills', 'references', 'agents', 'commands', '.claude', '.gemini', '.claude-plugin', '.codex-plugin', '.agents', 'hooks', 'docs', 'scripts', 'evals', 'rebrand', 'LICENSE', 'plugin.json', 'README.md']) {
|
|
25
27
|
fs.cpSync(path.join(root, name), path.join(directory, name), { recursive: true, filter: file => !file.includes(`${path.sep}results${path.sep}`) });
|
|
26
28
|
}
|
|
29
|
+
function restore(folder) {
|
|
30
|
+
for (const entry of fs.readdirSync(folder, { withFileTypes: true })) {
|
|
31
|
+
if (entry.name === 'rebrand') continue;
|
|
32
|
+
const file = path.join(folder, entry.name);
|
|
33
|
+
if (entry.isDirectory()) restore(file);
|
|
34
|
+
else if (/\.(?:md|js|cjs|sh|toml|json|yml|patch|diff)$/.test(entry.name)) fs.writeFileSync(file, rewriteReferences(fs.readFileSync(file, 'utf8'), true));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
restore(directory);
|
|
38
|
+
for (const source of [...upstream.skills.map(id => `skills/${id}`), ...upstream.skills.map(id => `evals/cases/${id}.json`), ...upstream.skills.map(id => `evals/fixtures/${id}`), ...upstream.runtimeFiles.filter(file => /commands\/[^/]+\.(md|toml)$/.test(file))]) {
|
|
39
|
+
const branded = runtimePath(source);
|
|
40
|
+
if (fs.existsSync(path.join(directory, branded))) fs.renameSync(path.join(directory, branded), path.join(directory, source));
|
|
41
|
+
}
|
|
27
42
|
// Model an upstream source checkout, including when this suite runs in a packed branded bundle.
|
|
28
43
|
for (const name of ['plugin.json', '.claude-plugin/plugin.json', '.codex-plugin/plugin.json']) {
|
|
29
44
|
const file = path.join(directory, name);
|
|
@@ -57,9 +72,62 @@ test('a source checkout generates a complete, repeatable branded distribution',
|
|
|
57
72
|
const brand = JSON.parse(fs.readFileSync(path.join(directory, 'rebrand/brand.json'), 'utf8'));
|
|
58
73
|
assert.equal(pkg.version, brand.releaseVersion);
|
|
59
74
|
assert.equal(fs.existsSync(path.join(directory, 'bin/i3-composer-agent.cjs')), true);
|
|
60
|
-
|
|
75
|
+
const validation = node(directory, 'scripts/validate-brand.cjs');
|
|
76
|
+
assert.equal(validation.status, 0, validation.stdout + validation.stderr);
|
|
77
|
+
const complete = run(directory, 'npm', ['run', 'validate']);
|
|
78
|
+
assert.equal(complete.status, 0, complete.stdout + complete.stderr);
|
|
79
|
+
const routing = node(directory, 'scripts/run-evals.js', ['--min-rank1', '95']);
|
|
80
|
+
assert.equal(routing.status, 0, routing.stdout + routing.stderr);
|
|
81
|
+
const check = node(directory, 'rebrand/apply.cjs', ['--check']);
|
|
82
|
+
assert.equal(check.status, 0, check.stdout + check.stderr);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
test('branded commands and skills use i3 identifiers with working local references', t => {
|
|
86
|
+
const directory = fixture(t);
|
|
87
|
+
record(directory);
|
|
88
|
+
apply(directory);
|
|
89
|
+
const skill = 'i3-spec-driven-development';
|
|
90
|
+
const file = path.join(directory, 'skills', skill, 'SKILL.md');
|
|
91
|
+
assert.ok(fs.existsSync(file), 'branded Skill directory must use i3-');
|
|
92
|
+
assert.match(fs.readFileSync(file, 'utf8'), /^name: i3-spec-driven-development$/m);
|
|
93
|
+
assert.equal(fs.existsSync(path.join(directory, 'skills/spec-driven-development')), false);
|
|
94
|
+
const command = fs.readFileSync(path.join(directory, '.claude/commands/i3-spec.md'), 'utf8');
|
|
95
|
+
assert.match(command, /i3-composer-agent:i3-spec-driven-development/);
|
|
96
|
+
assert.equal(fs.existsSync(path.join(directory, '.claude/commands/spec.md')), false);
|
|
97
|
+
const helper = 'skills/i3-idea-refine/scripts/idea-refine.sh';
|
|
98
|
+
assert.ok(fs.statSync(path.join(directory, helper)).mode & 0o111, 'helper execution permissions must survive renaming');
|
|
99
|
+
assert.ok(fs.readFileSync(path.join(directory, 'skills/i3-idea-refine/SKILL.md'), 'utf8').includes(helper), 'helper reference must resolve to its retained filename');
|
|
100
|
+
for (const commands of ['commands', '.gemini/commands']) {
|
|
101
|
+
assert.ok(fs.existsSync(path.join(directory, commands, 'i3-planning.toml')));
|
|
102
|
+
}
|
|
103
|
+
const hook = fs.readFileSync(path.join(directory, 'hooks/session-start.sh'), 'utf8');
|
|
104
|
+
assert.match(hook, /i3-using-agent-skills\/SKILL\.md/);
|
|
105
|
+
assert.equal(node(directory, 'scripts/validate-commands.js').status, 0);
|
|
106
|
+
const readme = fs.readFileSync(path.join(directory, 'README.md'), 'utf8');
|
|
107
|
+
assert.match(readme, /\/i3-spec/);
|
|
108
|
+
assert.match(readme, /skills\/i3-spec-driven-development\/SKILL\.md/);
|
|
61
109
|
const check = node(directory, 'rebrand/apply.cjs', ['--check']);
|
|
62
110
|
assert.equal(check.status, 0, check.stdout + check.stderr);
|
|
111
|
+
apply(directory);
|
|
112
|
+
assert.equal(fs.existsSync(path.join(directory, 'skills/i3-i3-spec-driven-development')), false);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
test('generated native installer preserves references and migrates legacy identifiers safely', t => {
|
|
116
|
+
const directory = fixture(t);
|
|
117
|
+
record(directory);
|
|
118
|
+
apply(directory);
|
|
119
|
+
const result = run(directory, process.execPath, ['--test', 'tests/installer.test.cjs']);
|
|
120
|
+
assert.equal(result.status, 0, result.stdout + result.stderr);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
test('identifier rewriting preserves upstream URLs and avoids repeated prefixes', () => {
|
|
124
|
+
const content = 'Use spec-driven-development and /spec. https://github.com/addyosmani/agent-skills/blob/main/skills/spec-driven-development/SKILL.md';
|
|
125
|
+
const expected = 'Use i3-spec-driven-development and /i3-spec. https://github.com/addyosmani/agent-skills/blob/main/skills/spec-driven-development/SKILL.md';
|
|
126
|
+
assert.equal(rewriteReferences(content), expected);
|
|
127
|
+
assert.equal(rewriteReferences(expected), expected);
|
|
128
|
+
assert.equal(rewriteReferences(expected, true), content);
|
|
129
|
+
assert.equal(rewriteReferences('Save specs/auth/spec.md; use .claude/commands/spec.md.'), 'Save specs/auth/spec.md; use .claude/commands/i3-spec.md.');
|
|
130
|
+
assert.equal(rewriteReferences('skills/idea-refine/scripts/idea-refine.sh'), 'skills/i3-idea-refine/scripts/idea-refine.sh');
|
|
63
131
|
});
|
|
64
132
|
|
|
65
133
|
test('brand fixes advance independently while preserving upstream provenance', t => {
|
|
@@ -132,9 +200,9 @@ test('missing files and altered skill identifiers fail preservation validation',
|
|
|
132
200
|
const directory = fixture(t);
|
|
133
201
|
record(directory);
|
|
134
202
|
apply(directory);
|
|
135
|
-
const file = path.join(directory, 'skills/using-agent-skills/SKILL.md');
|
|
203
|
+
const file = path.join(directory, 'skills/i3-using-agent-skills/SKILL.md');
|
|
136
204
|
const original = fs.readFileSync(file, 'utf8');
|
|
137
|
-
fs.writeFileSync(file, original.replace('name: using-agent-skills', 'name: renamed-meta-skill'));
|
|
205
|
+
fs.writeFileSync(file, original.replace('name: i3-using-agent-skills', 'name: renamed-meta-skill'));
|
|
138
206
|
assert.notEqual(node(directory, 'scripts/validate-brand.cjs').status, 0);
|
|
139
207
|
fs.writeFileSync(file, original);
|
|
140
208
|
fs.rmSync(file);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Definition of Done
|
|
2
2
|
|
|
3
|
-
A standing, project-wide bar that every change must clear before it counts as done. Unlike acceptance criteria, which vary per task and answer "did we build the right thing?", the Definition of Done is the same every time and answers "is this finished to our standard?". Use it as the final gate in `planning-and-task-breakdown`, `incremental-implementation`, and `shipping-and-launch`.
|
|
3
|
+
A standing, project-wide bar that every change must clear before it counts as done. Unlike acceptance criteria, which vary per task and answer "did we build the right thing?", the Definition of Done is the same every time and answers "is this finished to our standard?". Use it as the final gate in `i3-planning-and-task-breakdown`, `i3-incremental-implementation`, and `i3-shipping-and-launch`.
|
|
4
4
|
|
|
5
5
|
## Definition of Done vs. Acceptance Criteria
|
|
6
6
|
|
|
@@ -32,7 +32,7 @@ Apply this to every change before declaring it done.
|
|
|
32
32
|
- [ ] Changes are scoped to the task; no unrelated refactors snuck in
|
|
33
33
|
- [ ] Linting and formatting pass
|
|
34
34
|
|
|
35
|
-
The depth behind these items lives in `code-review-and-quality` (the five-axis review) and `code-simplification` (reducing complexity without changing behavior).
|
|
35
|
+
The depth behind these items lives in `i3-code-review-and-quality` (the five-axis review) and `i3-code-simplification` (reducing complexity without changing behavior).
|
|
36
36
|
|
|
37
37
|
### Integration
|
|
38
38
|
- [ ] Change works with the rest of the system, not just in isolation
|
|
@@ -41,20 +41,20 @@ The depth behind these items lives in `code-review-and-quality` (the five-axis r
|
|
|
41
41
|
|
|
42
42
|
### Documentation
|
|
43
43
|
- [ ] Public interfaces, APIs, and user-facing behavior are documented
|
|
44
|
-
- [ ] Architectural decisions worth preserving are recorded (see `documentation-and-adrs`)
|
|
44
|
+
- [ ] Architectural decisions worth preserving are recorded (see `i3-documentation-and-adrs`)
|
|
45
45
|
- [ ] Documentation describes the current state in timeless language, not the change history
|
|
46
46
|
|
|
47
47
|
### Ship-readiness
|
|
48
|
-
- [ ] Security implications reviewed for any untrusted input, auth, or data handling (see `security-and-hardening`)
|
|
49
|
-
- [ ] Observability in place for new critical paths (logs, metrics, traces) (see `observability-and-instrumentation`)
|
|
50
|
-
- [ ] Rollback path exists for anything risky (see `shipping-and-launch`)
|
|
48
|
+
- [ ] Security implications reviewed for any untrusted input, auth, or data handling (see `i3-security-and-hardening`)
|
|
49
|
+
- [ ] Observability in place for new critical paths (logs, metrics, traces) (see `i3-observability-and-instrumentation`)
|
|
50
|
+
- [ ] Rollback path exists for anything risky (see `i3-shipping-and-launch`)
|
|
51
51
|
- [ ] The human has reviewed and approved before merge or deploy
|
|
52
52
|
|
|
53
53
|
## How to Apply
|
|
54
54
|
|
|
55
55
|
- **Per task**: confirm the Correctness and Quality sections before checking the task off.
|
|
56
56
|
- **Per feature**: confirm Integration and Documentation before considering the feature complete.
|
|
57
|
-
- **Per release**: the full checklist is the floor; `shipping-and-launch` adds the deploy-specific gates on top.
|
|
57
|
+
- **Per release**: the full checklist is the floor; `i3-shipping-and-launch` adds the deploy-specific gates on top.
|
|
58
58
|
|
|
59
59
|
Tailor the list to the project once, then reuse it unchanged. A Definition of Done that is renegotiated every sprint is not a Definition of Done.
|
|
60
60
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Observability Checklist
|
|
2
2
|
|
|
3
|
-
Quick reference for instrumenting production code. Use alongside the `observability-and-instrumentation` skill.
|
|
3
|
+
Quick reference for instrumenting production code. Use alongside the `i3-observability-and-instrumentation` skill.
|
|
4
4
|
|
|
5
5
|
## Table of Contents
|
|
6
6
|
|
|
@@ -28,7 +28,7 @@ Telemetry without a question is noise. Before instrumenting anything:
|
|
|
28
28
|
- [ ] Correlation ID is propagated on every outbound call and async boundary (HTTP headers, queue metadata)
|
|
29
29
|
- [ ] Any log stream written by more than one entry point (scheduler, replay endpoint, manual run) carries an entry-point field, set where the run starts and propagated alongside the correlation ID
|
|
30
30
|
- [ ] Log levels are consistent: `error` = invariant broken, someone may act; `warn` = degraded but handled; `info` = significant business event; `debug` = off in production
|
|
31
|
-
- [ ] No secrets, tokens, passwords, or unredacted PII in any log line (hard rule from `security-and-hardening`)
|
|
31
|
+
- [ ] No secrets, tokens, passwords, or unredacted PII in any log line (hard rule from `i3-security-and-hardening`)
|
|
32
32
|
- [ ] Fields are allowlisted — no whole request/response bodies, no auth headers
|
|
33
33
|
- [ ] External service calls logged with metadata only: endpoint, status, latency, attempt count, sanitized identifiers
|
|
34
34
|
- [ ] Actual log output spot-checked: structured fields, not `[object Object]`
|
|
@@ -89,4 +89,4 @@ Before a feature ships to production, all of the following are true:
|
|
|
89
89
|
- [ ] A request can be traced across every service it touches
|
|
90
90
|
- [ ] On-call knows where the runbooks are
|
|
91
91
|
|
|
92
|
-
For launch-day monitoring sequence and rollback triggers, see the `shipping-and-launch` skill.
|
|
92
|
+
For launch-day monitoring sequence and rollback triggers, see the `i3-shipping-and-launch` skill.
|
|
@@ -32,12 +32,12 @@ user → code-reviewer → report → user
|
|
|
32
32
|
A slash command that wraps one persona with the project's skills. Saves the user from re-explaining the workflow every time.
|
|
33
33
|
|
|
34
34
|
```
|
|
35
|
-
/review → code-reviewer (with code-review-and-quality skill) → report
|
|
35
|
+
/i3-review → code-reviewer (with i3-code-review-and-quality skill) → report
|
|
36
36
|
```
|
|
37
37
|
|
|
38
38
|
**Use when:** the same single-persona invocation happens repeatedly with the same setup.
|
|
39
39
|
|
|
40
|
-
**Examples in this repo:** `/review`, `/test`, `/code-simplify`.
|
|
40
|
+
**Examples in this repo:** `/i3-review`, `/i3-test`, `/i3-code-simplify`.
|
|
41
41
|
|
|
42
42
|
**Cost:** same as direct invocation. The slash command is just a saved prompt.
|
|
43
43
|
|
|
@@ -51,7 +51,7 @@ Multiple personas operate on the same input concurrently, each producing an inde
|
|
|
51
51
|
|
|
52
52
|
```
|
|
53
53
|
┌─→ code-reviewer ─┐
|
|
54
|
-
/ship → fan out ───┼─→ security-auditor ─┤→ merge → go/no-go + rollback
|
|
54
|
+
/i3-ship → fan out ───┼─→ security-auditor ─┤→ merge → go/no-go + rollback
|
|
55
55
|
└─→ test-engineer ─┘
|
|
56
56
|
```
|
|
57
57
|
|
|
@@ -61,7 +61,7 @@ Multiple personas operate on the same input concurrently, each producing an inde
|
|
|
61
61
|
- The merge step is small enough to stay in the main context
|
|
62
62
|
- Wall-clock latency matters
|
|
63
63
|
|
|
64
|
-
**Examples in this repo:** `/ship`.
|
|
64
|
+
**Examples in this repo:** `/i3-ship`.
|
|
65
65
|
|
|
66
66
|
**Cost:** N parallel sub-agent contexts + one merge turn. Higher than direct invocation, but faster wall-clock and produces better reports because each sub-agent stays focused on its single perspective.
|
|
67
67
|
|
|
@@ -80,7 +80,7 @@ If any answer is "no," fall back to direct invocation or a single-persona comman
|
|
|
80
80
|
The user runs slash commands in a defined order, carrying context (or commit history) between them. There is no orchestrator agent — the user IS the orchestrator.
|
|
81
81
|
|
|
82
82
|
```
|
|
83
|
-
user runs: /spec → /plan → /build → /test → /review → /ship
|
|
83
|
+
user runs: /i3-spec → /i3-plan → /i3-build → /i3-test → /i3-review → /i3-ship
|
|
84
84
|
```
|
|
85
85
|
|
|
86
86
|
**Use when:** the workflow has dependencies (each step needs the previous step's output) and human judgment between steps adds value.
|
|
@@ -134,7 +134,7 @@ Claude Code has two parallelism primitives. Pattern 3 (parallel fan-out with mer
|
|
|
134
134
|
| Status | Stable | Experimental — requires `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` |
|
|
135
135
|
| Cost | Lower | Higher — each teammate is a separate Claude instance |
|
|
136
136
|
|
|
137
|
-
**The personas in this repo work in both modes.** When spawned as subagents (e.g. by `/ship`), they report findings to the main session. When spawned as teammates (`Spawn a teammate using the security-auditor agent type…`), they can challenge each other's findings directly. The persona definition is the same; only the spawning context changes.
|
|
137
|
+
**The personas in this repo work in both modes.** When spawned as subagents (e.g. by `/i3-ship`), they report findings to the main session. When spawned as teammates (`Spawn a teammate using the security-auditor agent type…`), they can challenge each other's findings directly. The persona definition is the same; only the spawning context changes.
|
|
138
138
|
|
|
139
139
|
One subtlety: the `skills` and `mcpServers` frontmatter fields in a persona are honored when it runs as a subagent but **ignored when it runs as a teammate** — teammates load skills and MCP servers from your project and user settings, the same as a regular session. If a persona depends on a specific skill or MCP server being loaded, configure it at the session level so it's available in both modes.
|
|
140
140
|
|
|
@@ -167,13 +167,13 @@ The fields that DO work in plugin agents are: `name`, `description`, `tools`, `d
|
|
|
167
167
|
|
|
168
168
|
### Spawning multiple subagents in parallel
|
|
169
169
|
|
|
170
|
-
In Claude Code, parallel fan-out (Pattern 3) requires issuing **multiple Agent tool calls in a single assistant turn**. Sequential turns serialize execution. `/ship` calls this out explicitly. Any new orchestrator command should do the same.
|
|
170
|
+
In Claude Code, parallel fan-out (Pattern 3) requires issuing **multiple Agent tool calls in a single assistant turn**. Sequential turns serialize execution. `/i3-ship` calls this out explicitly. Any new orchestrator command should do the same.
|
|
171
171
|
|
|
172
172
|
---
|
|
173
173
|
|
|
174
174
|
## Worked example: Agent Teams for competing-hypothesis debugging
|
|
175
175
|
|
|
176
|
-
This example shows when to reach for **Agent Teams** instead of `/ship`'s subagent fan-out. The two patterns look similar from a distance — both spawn the same three personas — but the value comes from a different place.
|
|
176
|
+
This example shows when to reach for **Agent Teams** instead of `/i3-ship`'s subagent fan-out. The two patterns look similar from a distance — both spawn the same three personas — but the value comes from a different place.
|
|
177
177
|
|
|
178
178
|
### The scenario
|
|
179
179
|
|
|
@@ -186,19 +186,19 @@ Plausible root causes (mutually exclusive, all fit the symptoms):
|
|
|
186
186
|
3. A missing index on a query that scales with cart size
|
|
187
187
|
4. A flaky third-party API where the SDK retries silently before timing out
|
|
188
188
|
|
|
189
|
-
A single agent will pick the first plausible theory and stop investigating. A `/ship`-style subagent fan-out would have each persona report independently — but their reports never meet, so nothing rules out the wrong theories.
|
|
189
|
+
A single agent will pick the first plausible theory and stop investigating. A `/i3-ship`-style subagent fan-out would have each persona report independently — but their reports never meet, so nothing rules out the wrong theories.
|
|
190
190
|
|
|
191
191
|
This is exactly the case the Agent Teams docs describe: *"With multiple independent investigators actively trying to disprove each other, the theory that survives is much more likely to be the actual root cause."*
|
|
192
192
|
|
|
193
|
-
### Why this is *not* a `/ship` job
|
|
193
|
+
### Why this is *not* a `/i3-ship` job
|
|
194
194
|
|
|
195
|
-
| | `/ship` (subagents) | Agent Teams |
|
|
195
|
+
| | `/i3-ship` (subagents) | Agent Teams |
|
|
196
196
|
|--|--------------------|-------------|
|
|
197
197
|
| Sub-agents see | The same diff, different lenses | A shared task list, each other's messages |
|
|
198
198
|
| Output | Three independent reports → one merge | Adversarial debate → consensus root cause |
|
|
199
199
|
| Right when | You want a verdict on a known artifact | You want to *find* the artifact among hypotheses |
|
|
200
200
|
|
|
201
|
-
`/ship` is a verdict; Agent Teams is an investigation.
|
|
201
|
+
`/i3-ship` is a verdict; Agent Teams is an investigation.
|
|
202
202
|
|
|
203
203
|
### Setup (one-time, per-environment)
|
|
204
204
|
|
|
@@ -262,7 +262,7 @@ Always cleanup through the lead, not a teammate (per the docs: teammates lack fu
|
|
|
262
262
|
|
|
263
263
|
### Cost expectation
|
|
264
264
|
|
|
265
|
-
Three Sonnet teammates running for ~10–15 minutes of investigation costs noticeably more than the same three personas spawned as subagents by `/ship`. The justification is *quality of conclusion* — for production debugging where the wrong fix is expensive, the extra tokens are a bargain. For a routine PR review, stick with `/ship`.
|
|
265
|
+
Three Sonnet teammates running for ~10–15 minutes of investigation costs noticeably more than the same three personas spawned as subagents by `/i3-ship`. The justification is *quality of conclusion* — for production debugging where the wrong fix is expensive, the extra tokens are a bargain. For a routine PR review, stick with `/i3-ship`.
|
|
266
266
|
|
|
267
267
|
### Anti-pattern in this scenario
|
|
268
268
|
|
|
@@ -270,7 +270,7 @@ Do **not** rebuild this as a `/debug` slash command that fans out subagents. Sub
|
|
|
270
270
|
|
|
271
271
|
### When *not* to use Agent Teams
|
|
272
272
|
|
|
273
|
-
- Production-bound verdict on a known diff → use `/ship` (subagents).
|
|
273
|
+
- Production-bound verdict on a known diff → use `/i3-ship` (subagents).
|
|
274
274
|
- One specialist perspective on one artifact → direct persona invocation.
|
|
275
275
|
- Sequential lifecycle (spec → plan → build) → user-driven slash commands (Pattern 4).
|
|
276
276
|
- Read-heavy research with a small digest → built-in `Explore` subagent.
|
|
@@ -292,7 +292,7 @@ A persona whose job is to decide which other persona to call.
|
|
|
292
292
|
**Why it fails:**
|
|
293
293
|
- Pure routing layer with no domain value
|
|
294
294
|
- Adds two paraphrasing hops → information loss + roughly 2× token cost
|
|
295
|
-
- The user already knew they wanted a review; they could have called `/review` directly
|
|
295
|
+
- The user already knew they wanted a review; they could have called `/i3-review` directly
|
|
296
296
|
- Replicates the work that slash commands and intent mapping in `AGENTS.md` already do
|
|
297
297
|
|
|
298
298
|
**What to do instead:** add or refine slash commands. Document intent → command mapping in `AGENTS.md`.
|
|
@@ -315,7 +315,7 @@ A `code-reviewer` that internally invokes `security-auditor` when it sees auth c
|
|
|
315
315
|
|
|
316
316
|
### C. Sequential orchestrator that paraphrases
|
|
317
317
|
|
|
318
|
-
An agent that calls `/spec`, then `/plan`, then `/build`, etc. on the user's behalf.
|
|
318
|
+
An agent that calls `/i3-spec`, then `/i3-plan`, then `/i3-build`, etc. on the user's behalf.
|
|
319
319
|
|
|
320
320
|
**Why it fails:**
|
|
321
321
|
- Loses the human checkpoints that catch wrong-direction work
|
|
@@ -329,7 +329,7 @@ An agent that calls `/spec`, then `/plan`, then `/build`, etc. on the user's beh
|
|
|
329
329
|
|
|
330
330
|
### D. Deep persona trees
|
|
331
331
|
|
|
332
|
-
`/ship` calls a `pre-ship-coordinator` that calls a `quality-coordinator` that calls `code-reviewer`.
|
|
332
|
+
`/i3-ship` calls a `pre-ship-coordinator` that calls a `quality-coordinator` that calls `code-reviewer`.
|
|
333
333
|
|
|
334
334
|
**Why it fails:**
|
|
335
335
|
- Each layer adds latency and tokens with no decision value
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Performance Checklist
|
|
2
2
|
|
|
3
|
-
Quick reference checklist for web application performance. Use alongside the `performance-optimization` skill.
|
|
3
|
+
Quick reference checklist for web application performance. Use alongside the `i3-performance-optimization` skill.
|
|
4
4
|
|
|
5
5
|
## Table of Contents
|
|
6
6
|
|
|
@@ -132,7 +132,7 @@ When TTFB is slow (> 800ms), check each component in DevTools Network waterfall:
|
|
|
132
132
|
|
|
133
133
|
## Caching Strategies
|
|
134
134
|
|
|
135
|
-
The decision material (which layer, which invalidation strategy, what never to cache) lives in the `performance-optimization` skill. This section covers the read/write patterns and the checklist.
|
|
135
|
+
The decision material (which layer, which invalidation strategy, what never to cache) lives in the `i3-performance-optimization` skill. This section covers the read/write patterns and the checklist.
|
|
136
136
|
|
|
137
137
|
### Read and write patterns
|
|
138
138
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Testing Patterns Reference (JavaScript/TypeScript)
|
|
2
2
|
|
|
3
|
-
Quick reference of JavaScript/TypeScript testing patterns — Jest, React Testing Library, Supertest, and Playwright — illustrating the universal principles from the `test-driven-development` skill. The principles (Arrange-Act-Assert, naming, mock discipline, anti-patterns) apply in any ecosystem; the syntax and tooling shown here are JS/TS-specific. In another stack, follow the same principles with the repository's own test framework and commands.
|
|
3
|
+
Quick reference of JavaScript/TypeScript testing patterns — Jest, React Testing Library, Supertest, and Playwright — illustrating the universal principles from the `i3-test-driven-development` skill. The principles (Arrange-Act-Assert, naming, mock discipline, anti-patterns) apply in any ecosystem; the syntax and tooling shown here are JS/TS-specific. In another stack, follow the same principles with the repository's own test framework and commands.
|
|
4
4
|
|
|
5
5
|
## Table of Contents
|
|
6
6
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
'use strict';
|
|
4
4
|
|
|
5
|
-
// Contract test for skills/constraint-driven-development/references/floor-guard.md.
|
|
5
|
+
// Contract test for skills/i3-constraint-driven-development/references/floor-guard.md.
|
|
6
6
|
// The fenced `js` block is extracted unchanged and run, with real git, against small
|
|
7
7
|
// fixtures: each is a fresh repository with one source file, one test file and a
|
|
8
8
|
// CONSTRAINTS.md carrying a floor bullet, a coverage minimum, a bundle maximum and an
|
|
@@ -16,7 +16,7 @@ const { spawnSync } = require('node:child_process');
|
|
|
16
16
|
const { after, before, test } = require('node:test');
|
|
17
17
|
|
|
18
18
|
const REFERENCE = path.join(
|
|
19
|
-
__dirname, '..', 'skills', 'constraint-driven-development', 'references', 'floor-guard.md',
|
|
19
|
+
__dirname, '..', 'skills', 'i3-constraint-driven-development', 'references', 'floor-guard.md',
|
|
20
20
|
);
|
|
21
21
|
const CONSTRAINTS = [
|
|
22
22
|
'# Constraints',
|
|
@@ -85,6 +85,8 @@ const REQUIRED_SECTIONS = [
|
|
|
85
85
|
// cannot bypass the validator by editing their own skill file.
|
|
86
86
|
// Every entry must have a documented reason.
|
|
87
87
|
const SECTION_EXEMPT_SKILLS = {
|
|
88
|
+
'i3-using-agent-skills': 'Branded alias of the reviewed upstream meta-skill.',
|
|
89
|
+
'i3-idea-refine': 'Branded alias of the reviewed upstream legacy structure.',
|
|
88
90
|
'using-agent-skills': 'Meta-skill — orchestrates other skills; When-to-Use and Verification are not applicable to a routing document.',
|
|
89
91
|
'idea-refine': 'Legacy structure predating skill-anatomy.md — uses How-It-Works/Usage/Anti-patterns instead of standard headings. Tracked for conformance in https://github.com/addyosmani/agent-skills/issues',
|
|
90
92
|
};
|
|
@@ -608,13 +608,13 @@ test('accepted grading omits run key when no metadata is provided', () => {
|
|
|
608
608
|
});
|
|
609
609
|
|
|
610
610
|
test('materializes a git baseline and applies a working-tree patch', () => {
|
|
611
|
-
const workspace = materializeWorkspace({ files: ['git-workflow-and-versioning'] });
|
|
611
|
+
const workspace = materializeWorkspace({ files: ['i3-git-workflow-and-versioning'] });
|
|
612
612
|
try {
|
|
613
613
|
const status = spawnSync('git', ['status', '--short'], { cwd: workspace, encoding: 'utf8' });
|
|
614
614
|
const commits = spawnSync('git', ['rev-list', '--count', 'HEAD'], { cwd: workspace, encoding: 'utf8' });
|
|
615
615
|
|
|
616
616
|
assert.equal(status.status, 0, status.stdout + status.stderr);
|
|
617
|
-
assert.match(status.stdout, / M git-workflow-and-versioning\/app\.js/);
|
|
617
|
+
assert.match(status.stdout, / M i3-git-workflow-and-versioning\/app\.js/);
|
|
618
618
|
assert.equal(commits.stdout.trim(), '1');
|
|
619
619
|
assert.equal(fs.existsSync(path.join(workspace, '.eval')), false);
|
|
620
620
|
} finally {
|
|
@@ -45,8 +45,8 @@ test('passes when producers and consumers use the canonical artifact paths', ()
|
|
|
45
45
|
writeFile(root, '.claude/commands/spec.md', 'Save the spec as `SPEC.md` in the project root.\n');
|
|
46
46
|
writeFile(root, '.claude/commands/plan.md', 'Save the plan to `tasks/plan.md` and task list to `tasks/todo.md`.\n');
|
|
47
47
|
writeFile(root, '.claude/commands/build.md', 'Look for a spec at `SPEC.md`, `docs/SPEC.md`, or under `spec/`. Require `tasks/plan.md`.\n');
|
|
48
|
-
writeFile(root, 'skills/spec-driven-development/SKILL.md', 'Save the plan to `tasks/plan.md` and the task list to `tasks/todo.md`.\n');
|
|
49
|
-
writeFile(root, 'skills/planning-and-task-breakdown/SKILL.md', 'Save to `tasks/plan.md` and `tasks/todo.md`.\n');
|
|
48
|
+
writeFile(root, 'skills/i3-spec-driven-development/SKILL.md', 'Save the plan to `tasks/plan.md` and the task list to `tasks/todo.md`.\n');
|
|
49
|
+
writeFile(root, 'skills/i3-planning-and-task-breakdown/SKILL.md', 'Save to `tasks/plan.md` and `tasks/todo.md`.\n');
|
|
50
50
|
|
|
51
51
|
const result = run(root);
|
|
52
52
|
|
|
@@ -94,7 +94,7 @@ test('ignores non-artifact markdown references (no false positives)', () => {
|
|
|
94
94
|
const root = makeSandbox();
|
|
95
95
|
writeFile(
|
|
96
96
|
root,
|
|
97
|
-
'skills/spec-driven-development/SKILL.md',
|
|
97
|
+
'skills/i3-spec-driven-development/SKILL.md',
|
|
98
98
|
'See `SKILL.md` and `references/testing-patterns.md`. Save the plan to `tasks/plan.md`.\n',
|
|
99
99
|
);
|
|
100
100
|
|
|
@@ -60,8 +60,8 @@ const GUARDED_FILES = [
|
|
|
60
60
|
'commands/planning.toml',
|
|
61
61
|
'commands/build.toml',
|
|
62
62
|
// Skills the commands invoke
|
|
63
|
-
'skills/spec-driven-development/SKILL.md',
|
|
64
|
-
'skills/planning-and-task-breakdown/SKILL.md',
|
|
63
|
+
'skills/i3-spec-driven-development/SKILL.md',
|
|
64
|
+
'skills/i3-planning-and-task-breakdown/SKILL.md',
|
|
65
65
|
// Docs that tell users where the artifacts live
|
|
66
66
|
'docs/getting-started.md',
|
|
67
67
|
'docs/adoption-guide.md',
|
|
@@ -74,6 +74,8 @@ const GUARDED_FILES = [
|
|
|
74
74
|
// drifted spec.md are both caught, then compared against the allowlist.
|
|
75
75
|
const ARTIFACT_RE = /(?:[A-Za-z0-9._[\]-]+\/)*(?:spec|plan|todo)\.md/gi;
|
|
76
76
|
|
|
77
|
+
GUARDED_FILES.push(...GUARDED_FILES.filter(relative => /(?:^|\/)commands\//.test(relative)).map(relative => relative.replace(/(commands\/)([^/]+)(\.md|\.toml)$/, '$1i3-$2$3')));
|
|
78
|
+
|
|
77
79
|
function findViolations(relPath) {
|
|
78
80
|
const abs = path.join(ROOT, relPath);
|
|
79
81
|
if (!fs.existsSync(abs)) return null; // skipped
|
|
@@ -9,7 +9,7 @@ const brand = require('../rebrand/brand.json');
|
|
|
9
9
|
const pkg = require('../package.json');
|
|
10
10
|
const upstream = require('../rebrand/upstream.json');
|
|
11
11
|
const { validateCatalog } = require('../rebrand/catalog.cjs');
|
|
12
|
-
validateCatalog(root, upstream);
|
|
12
|
+
validateCatalog(root, upstream, { branded: true });
|
|
13
13
|
function json(relative) { return JSON.parse(fs.readFileSync(path.join(root, relative), 'utf8')); }
|
|
14
14
|
assert.equal(pkg.name, brand.npmName);
|
|
15
15
|
assert.equal(pkg.version, brand.releaseVersion);
|
|
@@ -31,13 +31,13 @@ for (const relative of ['.claude-plugin/marketplace.json', '.agents/plugins/mark
|
|
|
31
31
|
assert.ok(json('.codex-plugin/plugin.json').interface.shortDescription.length <= 30);
|
|
32
32
|
const skills = fs.readdirSync(path.join(root, 'skills')).filter(name => fs.existsSync(path.join(root, 'skills', name, 'SKILL.md')));
|
|
33
33
|
assert.equal(skills.length, upstream.skills.length, 'brand conversion must preserve the reviewed upstream skills');
|
|
34
|
-
assert.ok(skills.includes('using-agent-skills'), 'meta-skill ID must
|
|
34
|
+
assert.ok(skills.includes('i3-using-agent-skills'), 'meta-skill ID must use the branded prefix');
|
|
35
35
|
const commands = fs.readdirSync(path.join(root, '.claude/commands')).filter(name => name.endsWith('.md'));
|
|
36
36
|
assert.equal(commands.length, upstream.commands.length, 'brand conversion must preserve the reviewed upstream commands');
|
|
37
37
|
for (const command of commands) {
|
|
38
38
|
const body = fs.readFileSync(path.join(root, '.claude/commands', command), 'utf8');
|
|
39
39
|
assert.ok(!body.includes('agent-skills:'), `${command}: stale plugin namespace`);
|
|
40
|
-
for (const match of body.matchAll(/i3-composer-agent:([a-
|
|
40
|
+
for (const match of body.matchAll(/(?<!\/)i3-composer-agent:([a-z0-9-]+)/g)) assert.ok(skills.includes(match[1]), `${command}: unknown skill ${match[1]}`);
|
|
41
41
|
}
|
|
42
42
|
for (const relative of pkg.i3ComposerAgent.pluginFiles) assert.ok(fs.existsSync(path.join(root, relative)), `bundle is missing ${relative}`);
|
|
43
43
|
assert.match(fs.readFileSync(path.join(root, 'LICENSE'), 'utf8'), /Copyright \(c\) 2025 Addy Osmani/);
|