dev-workflows 0.3.0 → 0.5.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 (67) hide show
  1. package/README.md +68 -21
  2. package/dist/bridges/types.d.ts +20 -0
  3. package/dist/bridges/types.d.ts.map +1 -1
  4. package/dist/bridges/types.js +5 -1
  5. package/dist/bridges/types.js.map +1 -1
  6. package/dist/commands/add.d.ts +26 -0
  7. package/dist/commands/add.d.ts.map +1 -1
  8. package/dist/commands/add.js +517 -57
  9. package/dist/commands/add.js.map +1 -1
  10. package/dist/commands/compile.d.ts +1 -0
  11. package/dist/commands/compile.d.ts.map +1 -1
  12. package/dist/commands/compile.js +8 -3
  13. package/dist/commands/compile.js.map +1 -1
  14. package/dist/commands/doctor.d.ts +3 -1
  15. package/dist/commands/doctor.d.ts.map +1 -1
  16. package/dist/commands/doctor.js +49 -1
  17. package/dist/commands/doctor.js.map +1 -1
  18. package/dist/commands/init.d.ts +1 -0
  19. package/dist/commands/init.d.ts.map +1 -1
  20. package/dist/commands/init.js +15 -3
  21. package/dist/commands/init.js.map +1 -1
  22. package/dist/commands/list.d.ts.map +1 -1
  23. package/dist/commands/list.js +51 -17
  24. package/dist/commands/list.js.map +1 -1
  25. package/dist/commands/remove.d.ts.map +1 -1
  26. package/dist/commands/remove.js +111 -22
  27. package/dist/commands/remove.js.map +1 -1
  28. package/dist/commands/watch.js +1 -1
  29. package/dist/commands/watch.js.map +1 -1
  30. package/dist/core/assets.d.ts +28 -0
  31. package/dist/core/assets.d.ts.map +1 -0
  32. package/dist/core/assets.js +169 -0
  33. package/dist/core/assets.js.map +1 -0
  34. package/dist/core/converter.d.ts +18 -0
  35. package/dist/core/converter.d.ts.map +1 -0
  36. package/dist/core/converter.js +113 -0
  37. package/dist/core/converter.js.map +1 -0
  38. package/dist/core/parser.d.ts.map +1 -1
  39. package/dist/core/parser.js +28 -0
  40. package/dist/core/parser.js.map +1 -1
  41. package/dist/core/settings-merge.d.ts +6 -0
  42. package/dist/core/settings-merge.d.ts.map +1 -0
  43. package/dist/core/settings-merge.js +41 -0
  44. package/dist/core/settings-merge.js.map +1 -0
  45. package/dist/utils/cache.d.ts +10 -0
  46. package/dist/utils/cache.d.ts.map +1 -0
  47. package/dist/utils/cache.js +43 -0
  48. package/dist/utils/cache.js.map +1 -0
  49. package/dist/utils/github.d.ts +13 -0
  50. package/dist/utils/github.d.ts.map +1 -0
  51. package/dist/utils/github.js +76 -0
  52. package/dist/utils/github.js.map +1 -0
  53. package/package.json +2 -2
  54. package/content/blocks/nextjs-approuter.yml +0 -37
  55. package/content/blocks/react-conventions.yml +0 -36
  56. package/content/blocks/supabase-rls.yml +0 -30
  57. package/content/blocks/tailwind.yml +0 -28
  58. package/content/blocks/testing-basics.yml +0 -36
  59. package/content/blocks/typescript-strict.yml +0 -33
  60. package/dist/blocks/installer.d.ts +0 -4
  61. package/dist/blocks/installer.d.ts.map +0 -1
  62. package/dist/blocks/installer.js +0 -119
  63. package/dist/blocks/installer.js.map +0 -1
  64. package/dist/blocks/registry.d.ts +0 -18
  65. package/dist/blocks/registry.d.ts.map +0 -1
  66. package/dist/blocks/registry.js +0 -85
  67. package/dist/blocks/registry.js.map +0 -1
package/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  Define rules once. Compile them everywhere.
8
8
 
9
- A local-first CLI to define AI coding rules and compile them for every editor and agent.
9
+ A local-first CLI to define AI coding rules, slash commands, templates, and hooks compiled for every editor and agent.
10
10
 
11
11
  ---
12
12
 
@@ -14,21 +14,33 @@ A local-first CLI to define AI coding rules and compile them for every editor an
14
14
 
15
15
  ```bash
16
16
  npx dev-workflows init
17
- devw add react-conventions
17
+ devw add typescript/strict
18
18
  devw compile
19
19
  ```
20
20
 
21
+ Or bootstrap a full spec-driven workflow:
22
+
23
+ ```bash
24
+ devw init --preset spec-driven -y
25
+ ```
26
+
21
27
  ---
22
28
 
23
29
  ## What it does
24
30
 
25
31
  ```
26
32
  .dwf/rules/*.yml → devw compile → CLAUDE.md
27
- .cursor/rules
33
+ .cursor/rules/devworkflows.mdc
28
34
  GEMINI.md
35
+ .windsurf/rules/devworkflows.md
36
+ .github/copilot-instructions.md
37
+
38
+ .dwf/assets/commands/* → devw compile → .claude/commands/*.md
39
+ .dwf/assets/templates/* → devw compile → docs/specs/*.md
40
+ .dwf/assets/hooks/* → devw compile → .claude/settings.local.json
29
41
  ```
30
42
 
31
- You define rules in YAML. The compiler generates each editor's native format. Change a rule, recompile — every editor stays in sync.
43
+ You define rules in YAML and assets in Markdown/JSON. The compiler generates each editor's native format. Change a rule, recompile — every editor stays in sync.
32
44
 
33
45
  ---
34
46
 
@@ -37,29 +49,64 @@ You define rules in YAML. The compiler generates each editor's native format. Ch
37
49
  | Command | Description |
38
50
  |---------|-------------|
39
51
  | `devw init` | Initialize a `.dwf/` ruleset in your project |
40
- | `devw add <block>` | Install a prebuilt rule block |
41
- | `devw remove <block>` | Remove a rule block |
42
- | `devw compile` | Generate editor-specific rule files |
52
+ | `devw init --preset <name>` | Initialize with a preset (e.g., `spec-driven`) |
53
+ | `devw add <category>/<name>` | Install a rule from the registry |
54
+ | `devw add command/<name>` | Install a slash command |
55
+ | `devw add template/<name>` | Install a spec template |
56
+ | `devw add hook/<name>` | Install an editor hook |
57
+ | `devw add preset/<name>` | Install a preset (bundle of rules + assets) |
58
+ | `devw remove <category>/<name>` | Remove a rule or asset |
59
+ | `devw compile` | Generate editor configs and deploy assets |
43
60
  | `devw watch` | Watch `.dwf/` and recompile on changes |
44
- | `devw doctor` | Validate config and detect rule drift |
61
+ | `devw doctor` | Validate config and detect drift |
45
62
  | `devw list rules` | List all active rules |
46
- | `devw list blocks` | List installed blocks |
63
+ | `devw list assets` | List installed assets |
47
64
  | `devw list tools` | List configured editors |
48
65
 
49
66
  ---
50
67
 
51
- ## Rule Blocks
68
+ ## Rules Registry
69
+
70
+ Install rules from the registry with `devw add <category>/<rule>`.
71
+
72
+ | Rule | Description |
73
+ |------|-------------|
74
+ | `typescript/strict` | Strict TypeScript patterns |
75
+ | `javascript/react` | React component and hook conventions |
76
+ | `javascript/nextjs` | Next.js App Router best practices |
77
+ | `css/tailwind` | Utility-first styling conventions |
78
+ | `testing/vitest` | Test naming and structure rules |
79
+ | `security/supabase-rls` | Database security and RLS rules |
80
+ | `security/auth-patterns` | Authentication best practices |
81
+ | `frontend/design-guidelines` | UI/UX design conventions |
82
+ | `frontend/accessibility` | Accessibility (a11y) rules |
83
+ | `frontend/performance` | Frontend performance patterns |
84
+ | `workflow/git-conventions` | Git commit and branch conventions |
85
+ | `workflow/debugging` | Systematic debugging methodology |
86
+ | `workflow/spec-driven` | Spec-driven development workflow |
87
+
88
+ ---
89
+
90
+ ## Assets
91
+
92
+ Beyond rules, dev-workflows manages **assets** — slash commands, templates, and hooks that power AI workflows.
93
+
94
+ | Asset | Type | Description |
95
+ |-------|------|-------------|
96
+ | `command/spec` | Command | Generate a feature spec through guided questions |
97
+ | `command/plan` | Command | Create an implementation plan from a spec |
98
+ | `command/build` | Command | Execute a plan step by step with verification |
99
+ | `command/learn` | Command | Capture a lesson learned as a project rule |
100
+ | `template/feature-spec` | Template | Markdown template for feature specifications |
101
+ | `hook/auto-format` | Hook | Auto-format files after AI edits |
102
+
103
+ ### Presets
52
104
 
53
- Prebuilt rule blocks you can stack. Install with `devw add <block>`.
105
+ Presets bundle rules and assets into a single install.
54
106
 
55
- | Block | Purpose |
56
- |-------|---------|
57
- | `typescript-strict` | Enforces strict TypeScript patterns |
58
- | `react-conventions` | Common React component and hook rules |
59
- | `nextjs-approuter` | Next.js App Router best practices |
60
- | `tailwind` | Utility-first styling conventions |
61
- | `supabase-rls` | Database security and RLS rules |
62
- | `testing-basics` | Test naming and structure rules |
107
+ | Preset | Includes |
108
+ |--------|----------|
109
+ | `preset/spec-driven` | `workflow/spec-driven` rule + all 4 commands + feature-spec template + auto-format hook |
63
110
 
64
111
  ---
65
112
 
@@ -72,7 +119,7 @@ Bridges generate editor-compatible rule files. One adapter per tool.
72
119
  | Claude Code | `CLAUDE.md` |
73
120
  | Cursor | `.cursor/rules/devworkflows.mdc` |
74
121
  | Gemini CLI | `GEMINI.md` |
75
- | Windsurf | `.windsurfrules` |
122
+ | Windsurf | `.windsurf/rules/devworkflows.md` |
76
123
  | VS Code Copilot | `.github/copilot-instructions.md` |
77
124
 
78
125
  ---
@@ -99,4 +146,4 @@ Issues and PRs welcome. If you find a bug or have an idea, [open an issue](https
99
146
 
100
147
  ## License
101
148
 
102
- MIT
149
+ MIT
@@ -6,6 +6,12 @@ export interface Rule {
6
6
  tags?: string[];
7
7
  enabled: boolean;
8
8
  sourceBlock?: string;
9
+ source?: string;
10
+ }
11
+ export interface PulledEntry {
12
+ path: string;
13
+ version: string;
14
+ pulled_at: string;
9
15
  }
10
16
  export interface ProjectConfig {
11
17
  version: string;
@@ -16,6 +22,20 @@ export interface ProjectConfig {
16
22
  tools: string[];
17
23
  mode: 'copy' | 'link';
18
24
  blocks: string[];
25
+ pulled: PulledEntry[];
26
+ assets: AssetEntry[];
27
+ }
28
+ export declare const ASSET_TYPE: {
29
+ readonly Command: "command";
30
+ readonly Template: "template";
31
+ readonly Hook: "hook";
32
+ };
33
+ export type AssetType = typeof ASSET_TYPE[keyof typeof ASSET_TYPE];
34
+ export interface AssetEntry {
35
+ type: AssetType;
36
+ name: string;
37
+ version: string;
38
+ installed_at: string;
19
39
  }
20
40
  export interface Bridge {
21
41
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/bridges/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpE"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/bridges/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,MAAM,EAAE,UAAU,EAAE,CAAC;CACtB;AAED,eAAO,MAAM,UAAU;;;;CAIb,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,OAAO,UAAU,CAAC,MAAM,OAAO,UAAU,CAAC,CAAC;AAEnE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpE"}
@@ -1,2 +1,6 @@
1
- export {};
1
+ export const ASSET_TYPE = {
2
+ Command: 'command',
3
+ Template: 'template',
4
+ Hook: 'hook',
5
+ };
2
6
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/bridges/types.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/bridges/types.ts"],"names":[],"mappings":"AA8BA,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,UAAU;IACpB,IAAI,EAAE,MAAM;CACJ,CAAC"}
@@ -1,7 +1,33 @@
1
1
  import type { Command } from 'commander';
2
+ import { convert } from '../core/converter.js';
3
+ import type { PulledEntry, AssetEntry, AssetType } from '../bridges/types.js';
4
+ export declare const BACK_VALUE = "__back__";
5
+ export declare function pluralRules(count: number): string;
2
6
  export interface AddOptions {
3
7
  list?: boolean;
4
8
  noCompile?: boolean;
9
+ force?: boolean;
10
+ dryRun?: boolean;
5
11
  }
12
+ export declare function validateInput(input: string): {
13
+ category: string;
14
+ name: string;
15
+ } | null;
16
+ interface CachedRegistry {
17
+ categories: Array<{
18
+ name: string;
19
+ rules: Array<{
20
+ name: string;
21
+ description: string;
22
+ }>;
23
+ }>;
24
+ }
25
+ export declare function fetchRegistry(cwd: string): Promise<CachedRegistry | null>;
26
+ export declare function generateYamlOutput(category: string, name: string, result: ReturnType<typeof convert>, pulledAt: string): string;
27
+ export declare function updateConfig(cwd: string, entry: PulledEntry): Promise<void>;
28
+ export declare function updateConfigAssets(cwd: string, entry: AssetEntry): Promise<void>;
29
+ export declare function downloadAndInstallAsset(cwd: string, type: AssetType, name: string, options: AddOptions): Promise<boolean>;
30
+ export declare function installPreset(cwd: string, presetName: string, options: AddOptions): Promise<boolean>;
6
31
  export declare function registerAddCommand(program: Command): void;
32
+ export {};
7
33
  //# sourceMappingURL=add.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAiGD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAQzD"}
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAO/C,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAI9E,eAAO,MAAM,UAAU,aAAa,CAAC;AAErC,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAUtF;AAED,UAAU,cAAc;IACtB,UAAU,EAAE,KAAK,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACrD,CAAC,CAAC;CACJ;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAoD/E;AAuCD,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,UAAU,CAAC,OAAO,OAAO,CAAC,EAClC,QAAQ,EAAE,MAAM,GACf,MAAM,CA6BR;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBjF;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBtF;AAOD,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,SAAS,EACf,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,OAAO,CAAC,CAwElB;AAiPD,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,OAAO,CAAC,CAyDlB;AAuED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAUzD"}