diff --git a/.changeset/add-asset-system.md b/.changeset/add-asset-system.md new file mode 100644 index 0000000..2756309 --- /dev/null +++ b/.changeset/add-asset-system.md @@ -0,0 +1,13 @@ +--- +"dev-workflows": minor +--- + +Add asset system for commands, templates, hooks, and presets + +- **Commands**: `devw add command/spec` downloads slash commands that deploy to `.claude/commands/` +- **Templates**: `devw add template/feature-spec` installs spec templates to `docs/specs/` +- **Hooks**: `devw add hook/auto-format` merges editor hooks into `.claude/settings.local.json` +- **Presets**: `devw add preset/spec-driven` installs a full workflow bundle (rules + commands + templates + hooks) +- **Init with preset**: `devw init --preset spec-driven` scaffolds a project with a complete workflow +- **Asset-aware commands**: `list`, `remove`, `doctor`, `watch`, and `compile` all support the new asset types +- **Content**: 4 slash commands (spec, plan, build, learn), 1 template (feature-spec), 1 hook (auto-format), 1 preset (spec-driven), 1 rule (workflow/spec-driven) diff --git a/content/hooks/auto-format.json b/content/hooks/auto-format.json index 4977dfd..2c1585a 100644 --- a/content/hooks/auto-format.json +++ b/content/hooks/auto-format.json @@ -8,7 +8,9 @@ "PostToolUse": [ { "matcher": "Write|Edit", - "command": "pnpm format || true" + "hooks": [ + { "type": "command", "command": "pnpm format || true" } + ] } ] } diff --git a/packages/cli/tests/core/assets.test.ts b/packages/cli/tests/core/assets.test.ts index d25ddd1..4a15ce7 100644 --- a/packages/cli/tests/core/assets.test.ts +++ b/packages/cli/tests/core/assets.test.ts @@ -184,7 +184,12 @@ describe('deployHooks', () => { version: '0.1.0', settings: { hooks: { - PostToolUse: [{ matcher: 'Write|Edit', command: 'pnpm format || true' }], + PostToolUse: [ + { + matcher: 'Write|Edit', + hooks: [{ type: 'command', command: 'pnpm format || true' }], + }, + ], }, }, }); @@ -198,6 +203,8 @@ describe('deployHooks', () => { ); assert.ok(Array.isArray(settings.hooks.PostToolUse)); assert.equal(settings.hooks.PostToolUse[0].matcher, 'Write|Edit'); + assert.ok(Array.isArray(settings.hooks.PostToolUse[0].hooks)); + assert.equal(settings.hooks.PostToolUse[0].hooks[0].type, 'command'); }); });