dev-workflows 0.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 (80) hide show
  1. package/bin/devw.js +2 -0
  2. package/content/blocks/nextjs-approuter.yml +37 -0
  3. package/content/blocks/react-conventions.yml +36 -0
  4. package/content/blocks/supabase-rls.yml +30 -0
  5. package/content/blocks/tailwind.yml +28 -0
  6. package/content/blocks/testing-basics.yml +36 -0
  7. package/content/blocks/typescript-strict.yml +33 -0
  8. package/dist/blocks/installer.d.ts +4 -0
  9. package/dist/blocks/installer.d.ts.map +1 -0
  10. package/dist/blocks/installer.js +119 -0
  11. package/dist/blocks/installer.js.map +1 -0
  12. package/dist/blocks/registry.d.ts +18 -0
  13. package/dist/blocks/registry.d.ts.map +1 -0
  14. package/dist/blocks/registry.js +85 -0
  15. package/dist/blocks/registry.js.map +1 -0
  16. package/dist/bridges/claude.d.ts +3 -0
  17. package/dist/bridges/claude.d.ts.map +1 -0
  18. package/dist/bridges/claude.js +54 -0
  19. package/dist/bridges/claude.js.map +1 -0
  20. package/dist/bridges/cursor.d.ts +3 -0
  21. package/dist/bridges/cursor.d.ts.map +1 -0
  22. package/dist/bridges/cursor.js +61 -0
  23. package/dist/bridges/cursor.js.map +1 -0
  24. package/dist/bridges/gemini.d.ts +3 -0
  25. package/dist/bridges/gemini.d.ts.map +1 -0
  26. package/dist/bridges/gemini.js +54 -0
  27. package/dist/bridges/gemini.js.map +1 -0
  28. package/dist/bridges/types.d.ts +25 -0
  29. package/dist/bridges/types.d.ts.map +1 -0
  30. package/dist/bridges/types.js +2 -0
  31. package/dist/bridges/types.js.map +1 -0
  32. package/dist/commands/add.d.ts +7 -0
  33. package/dist/commands/add.d.ts.map +1 -0
  34. package/dist/commands/add.js +64 -0
  35. package/dist/commands/add.js.map +1 -0
  36. package/dist/commands/compile.d.ts +9 -0
  37. package/dist/commands/compile.d.ts.map +1 -0
  38. package/dist/commands/compile.js +130 -0
  39. package/dist/commands/compile.js.map +1 -0
  40. package/dist/commands/doctor.d.ts +16 -0
  41. package/dist/commands/doctor.d.ts.map +1 -0
  42. package/dist/commands/doctor.js +229 -0
  43. package/dist/commands/doctor.js.map +1 -0
  44. package/dist/commands/init.d.ts +8 -0
  45. package/dist/commands/init.d.ts.map +1 -0
  46. package/dist/commands/init.js +159 -0
  47. package/dist/commands/init.js.map +1 -0
  48. package/dist/commands/list.d.ts +3 -0
  49. package/dist/commands/list.d.ts.map +1 -0
  50. package/dist/commands/list.js +106 -0
  51. package/dist/commands/list.js.map +1 -0
  52. package/dist/commands/remove.d.ts +3 -0
  53. package/dist/commands/remove.d.ts.map +1 -0
  54. package/dist/commands/remove.js +40 -0
  55. package/dist/commands/remove.js.map +1 -0
  56. package/dist/core/hash.d.ts +5 -0
  57. package/dist/core/hash.d.ts.map +1 -0
  58. package/dist/core/hash.js +24 -0
  59. package/dist/core/hash.js.map +1 -0
  60. package/dist/core/markers.d.ts +4 -0
  61. package/dist/core/markers.d.ts.map +1 -0
  62. package/dist/core/markers.js +18 -0
  63. package/dist/core/markers.js.map +1 -0
  64. package/dist/core/parser.d.ts +4 -0
  65. package/dist/core/parser.d.ts.map +1 -0
  66. package/dist/core/parser.js +82 -0
  67. package/dist/core/parser.js.map +1 -0
  68. package/dist/index.d.ts +4 -0
  69. package/dist/index.d.ts.map +1 -0
  70. package/dist/index.js +21 -0
  71. package/dist/index.js.map +1 -0
  72. package/dist/utils/detect-tools.d.ts +8 -0
  73. package/dist/utils/detect-tools.d.ts.map +1 -0
  74. package/dist/utils/detect-tools.js +28 -0
  75. package/dist/utils/detect-tools.js.map +1 -0
  76. package/dist/utils/prompt.d.ts +3 -0
  77. package/dist/utils/prompt.d.ts.map +1 -0
  78. package/dist/utils/prompt.js +21 -0
  79. package/dist/utils/prompt.js.map +1 -0
  80. package/package.json +42 -0
@@ -0,0 +1,159 @@
1
+ import { mkdir, writeFile, readFile, appendFile, access } from 'node:fs/promises';
2
+ import { join, basename } from 'node:path';
3
+ import { stringify } from 'yaml';
4
+ import chalk from 'chalk';
5
+ import { detectTools, SUPPORTED_TOOLS } from '../utils/detect-tools.js';
6
+ import { ask } from '../utils/prompt.js';
7
+ const RULE_SCOPES = ['architecture', 'conventions', 'security', 'workflow', 'testing'];
8
+ function buildRuleFileContent(scope) {
9
+ return `# .dwf/rules/${scope}.yml
10
+ scope: ${scope}
11
+
12
+ rules: []
13
+ # Example:
14
+ # - id: my-rule
15
+ # severity: error
16
+ # content: |
17
+ # Describe your rule here.
18
+ `;
19
+ }
20
+ function parseToolsFlag(raw) {
21
+ const ids = raw.split(',').map((s) => s.trim()).filter(Boolean);
22
+ for (const id of ids) {
23
+ if (!SUPPORTED_TOOLS.includes(id)) {
24
+ throw new Error(`Unknown tool "${id}". Supported: ${SUPPORTED_TOOLS.join(', ')}`);
25
+ }
26
+ }
27
+ return ids;
28
+ }
29
+ async function resolveTools(options, cwd) {
30
+ const detected = await detectTools(cwd);
31
+ const detectedIds = detected.filter((t) => t.detected).map((t) => t.id);
32
+ if (options.tools) {
33
+ return parseToolsFlag(options.tools);
34
+ }
35
+ if (options.yes) {
36
+ return detectedIds.length > 0 ? detectedIds : ['claude'];
37
+ }
38
+ const defaultTools = detectedIds.length > 0 ? detectedIds.join(',') : 'claude';
39
+ if (detectedIds.length > 0) {
40
+ console.log(`Detected tools: ${chalk.cyan(detectedIds.join(', '))}`);
41
+ }
42
+ for (;;) {
43
+ const answer = await ask(`Which tools to configure? (${SUPPORTED_TOOLS.join(',')}) [${defaultTools}]: `, defaultTools);
44
+ try {
45
+ return parseToolsFlag(answer);
46
+ }
47
+ catch {
48
+ console.log(chalk.yellow(`Invalid selection. Supported tools: ${SUPPORTED_TOOLS.join(', ')}`));
49
+ }
50
+ }
51
+ }
52
+ async function resolveMode(options) {
53
+ if (options.mode) {
54
+ if (options.mode !== 'copy' && options.mode !== 'link') {
55
+ throw new Error(`Unknown mode "${options.mode}". Supported: copy, link`);
56
+ }
57
+ return options.mode;
58
+ }
59
+ if (options.yes) {
60
+ return 'copy';
61
+ }
62
+ for (;;) {
63
+ const answer = await ask('Output mode — copy or link? [copy]: ', 'copy');
64
+ if (answer === 'copy' || answer === 'link') {
65
+ return answer;
66
+ }
67
+ console.log(chalk.yellow(`Unknown mode "${answer}". Please enter copy or link.`));
68
+ }
69
+ }
70
+ async function fileExists(filePath) {
71
+ try {
72
+ await access(filePath);
73
+ return true;
74
+ }
75
+ catch {
76
+ return false;
77
+ }
78
+ }
79
+ async function appendToGitignore(cwd) {
80
+ const gitignorePath = join(cwd, '.gitignore');
81
+ const entry = '.dwf/.cache/';
82
+ if (await fileExists(gitignorePath)) {
83
+ const content = await readFile(gitignorePath, 'utf-8');
84
+ if (content.includes(entry))
85
+ return;
86
+ const suffix = content.endsWith('\n') ? '' : '\n';
87
+ await appendFile(gitignorePath, `${suffix}${entry}\n`);
88
+ }
89
+ else {
90
+ await writeFile(gitignorePath, `${entry}\n`, 'utf-8');
91
+ }
92
+ }
93
+ async function runInit(options) {
94
+ const cwd = process.cwd();
95
+ const dwfDir = join(cwd, '.dwf');
96
+ if (await fileExists(dwfDir)) {
97
+ console.error(chalk.red('Error: .dwf/ already exists in this directory.'));
98
+ console.error('Remove it first or run from a different directory.');
99
+ process.exitCode = 1;
100
+ return;
101
+ }
102
+ let tools;
103
+ let mode;
104
+ try {
105
+ tools = await resolveTools(options, cwd);
106
+ mode = await resolveMode(options);
107
+ }
108
+ catch (err) {
109
+ console.error(chalk.red(`Error: ${err instanceof Error ? err.message : String(err)}`));
110
+ process.exitCode = 1;
111
+ return;
112
+ }
113
+ const projectName = basename(cwd);
114
+ // Create .dwf/rules/
115
+ const rulesDir = join(dwfDir, 'rules');
116
+ await mkdir(rulesDir, { recursive: true });
117
+ // Write config.yml
118
+ const config = {
119
+ version: '0.1',
120
+ project: { name: projectName },
121
+ tools,
122
+ mode,
123
+ blocks: [],
124
+ };
125
+ const configContent = `# Dev Workflows configuration\n${stringify(config)}`;
126
+ await writeFile(join(dwfDir, 'config.yml'), configContent, 'utf-8');
127
+ // Write empty rule files
128
+ for (const scope of RULE_SCOPES) {
129
+ await writeFile(join(rulesDir, `${scope}.yml`), buildRuleFileContent(scope), 'utf-8');
130
+ }
131
+ // Append .dwf/.cache/ to .gitignore
132
+ await appendToGitignore(cwd);
133
+ // Success summary
134
+ console.log('');
135
+ console.log(chalk.green('Initialized .dwf/ successfully!'));
136
+ console.log('');
137
+ console.log(` Project: ${chalk.bold(projectName)}`);
138
+ console.log(` Tools: ${chalk.cyan(tools.join(', '))}`);
139
+ console.log(` Mode: ${mode}`);
140
+ console.log('');
141
+ console.log(' Created files:');
142
+ console.log(` ${chalk.dim('.dwf/config.yml')}`);
143
+ for (const scope of RULE_SCOPES) {
144
+ console.log(` ${chalk.dim(`.dwf/rules/${scope}.yml`)}`);
145
+ }
146
+ console.log(` ${chalk.dim('.gitignore')} (added .dwf/.cache/)`);
147
+ console.log('');
148
+ console.log(`Next: edit ${chalk.cyan('.dwf/rules/')} and run ${chalk.cyan('devw compile')}`);
149
+ }
150
+ export function registerInitCommand(program) {
151
+ program
152
+ .command('init')
153
+ .description('Initialize .dwf/ in the current project')
154
+ .option('--tools <tools>', 'Comma-separated list of tools (claude,cursor,gemini)')
155
+ .option('--mode <mode>', 'Output mode: copy or link')
156
+ .option('-y, --yes', 'Accept all defaults')
157
+ .action((options) => runInit(options));
158
+ }
159
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerListCommand(program: Command): void;
3
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6GzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAM1D"}
@@ -0,0 +1,106 @@
1
+ import { access } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import chalk from 'chalk';
4
+ import { readConfig, readRules } from '../core/parser.js';
5
+ async function fileExists(filePath) {
6
+ try {
7
+ await access(filePath);
8
+ return true;
9
+ }
10
+ catch {
11
+ return false;
12
+ }
13
+ }
14
+ async function ensureConfig(cwd) {
15
+ if (!(await fileExists(join(cwd, '.dwf', 'config.yml')))) {
16
+ console.error(chalk.red('Error: .dwf/config.yml not found.'));
17
+ console.error('Run "devw init" first.');
18
+ process.exitCode = 1;
19
+ return false;
20
+ }
21
+ return true;
22
+ }
23
+ async function listRules() {
24
+ const cwd = process.cwd();
25
+ if (!(await ensureConfig(cwd)))
26
+ return;
27
+ let rules;
28
+ try {
29
+ rules = await readRules(cwd);
30
+ }
31
+ catch {
32
+ console.log(chalk.yellow('No rules found.'));
33
+ return;
34
+ }
35
+ const active = rules.filter((r) => r.enabled);
36
+ if (active.length === 0) {
37
+ console.log(chalk.yellow('No active rules found.'));
38
+ return;
39
+ }
40
+ console.log(chalk.bold(`Active rules (${String(active.length)}):\n`));
41
+ for (const rule of active) {
42
+ const severityColor = rule.severity === 'error' ? chalk.red : rule.severity === 'warning' ? chalk.yellow : chalk.dim;
43
+ const source = rule.sourceBlock ? chalk.dim(` [${rule.sourceBlock}]`) : '';
44
+ console.log(` ${severityColor(rule.severity.padEnd(7))} ${chalk.cyan(rule.scope.padEnd(14))} ${rule.id}${source}`);
45
+ }
46
+ }
47
+ async function listBlocks() {
48
+ const cwd = process.cwd();
49
+ if (!(await ensureConfig(cwd)))
50
+ return;
51
+ const config = await readConfig(cwd);
52
+ if (config.blocks.length === 0) {
53
+ console.log(chalk.yellow('No blocks installed.'));
54
+ console.log(chalk.dim('Run "devw add --list" to see available blocks.'));
55
+ return;
56
+ }
57
+ console.log(chalk.bold(`Installed blocks (${String(config.blocks.length)}):\n`));
58
+ for (const blockId of config.blocks) {
59
+ console.log(` ${chalk.cyan(blockId)}`);
60
+ }
61
+ }
62
+ async function listTools() {
63
+ const cwd = process.cwd();
64
+ if (!(await ensureConfig(cwd)))
65
+ return;
66
+ const config = await readConfig(cwd);
67
+ if (config.tools.length === 0) {
68
+ console.log(chalk.yellow('No tools configured.'));
69
+ return;
70
+ }
71
+ console.log(chalk.bold(`Configured tools (${String(config.tools.length)}):\n`));
72
+ for (const tool of config.tools) {
73
+ console.log(` ${chalk.cyan(tool)}`);
74
+ }
75
+ }
76
+ async function runList(subcommand) {
77
+ if (!subcommand) {
78
+ console.error(chalk.red('Error: specify what to list.'));
79
+ console.error('Usage: devw list <rules|blocks|tools>');
80
+ process.exitCode = 1;
81
+ return;
82
+ }
83
+ switch (subcommand) {
84
+ case 'rules':
85
+ await listRules();
86
+ break;
87
+ case 'blocks':
88
+ await listBlocks();
89
+ break;
90
+ case 'tools':
91
+ await listTools();
92
+ break;
93
+ default:
94
+ console.error(chalk.red(`Error: unknown list type "${subcommand}".`));
95
+ console.error('Usage: devw list <rules|blocks|tools>');
96
+ process.exitCode = 1;
97
+ }
98
+ }
99
+ export function registerListCommand(program) {
100
+ program
101
+ .command('list')
102
+ .argument('[type]', 'What to list: rules, blocks, or tools')
103
+ .description('List rules, installed blocks, or configured tools')
104
+ .action((type) => runList(type));
105
+ }
106
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerRemoveCommand(program: Command): void;
3
+ //# sourceMappingURL=remove.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.d.ts","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoCzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAM5D"}
@@ -0,0 +1,40 @@
1
+ import { access } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import chalk from 'chalk';
4
+ import { readConfig } from '../core/parser.js';
5
+ import { uninstallBlock } from '../blocks/installer.js';
6
+ async function fileExists(filePath) {
7
+ try {
8
+ await access(filePath);
9
+ return true;
10
+ }
11
+ catch {
12
+ return false;
13
+ }
14
+ }
15
+ async function runRemove(blockId) {
16
+ const cwd = process.cwd();
17
+ if (!(await fileExists(join(cwd, '.dwf', 'config.yml')))) {
18
+ console.error(chalk.red('Error: .dwf/config.yml not found.'));
19
+ console.error('Run "devw init" first.');
20
+ process.exitCode = 1;
21
+ return;
22
+ }
23
+ const config = await readConfig(cwd);
24
+ if (!config.blocks.includes(blockId)) {
25
+ console.error(chalk.red(`Error: block "${blockId}" is not installed.`));
26
+ console.error(`Installed blocks: ${config.blocks.length > 0 ? config.blocks.join(', ') : '(none)'}`);
27
+ process.exitCode = 1;
28
+ return;
29
+ }
30
+ const rulesRemoved = await uninstallBlock(cwd, blockId);
31
+ console.log(chalk.green(`Removed block "${blockId}" (${String(rulesRemoved)} rules removed).`));
32
+ }
33
+ export function registerRemoveCommand(program) {
34
+ program
35
+ .command('remove')
36
+ .argument('<block>', 'Block ID to remove')
37
+ .description('Remove an installed rule block')
38
+ .action((blockId) => runRemove(blockId));
39
+ }
40
+ //# sourceMappingURL=remove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.js","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,KAAK,UAAU,UAAU,CAAC,QAAgB;IACxC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,OAAe;IACtC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QACxC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACrC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,OAAO,qBAAqB,CAAC,CAAC,CAAC;QACxE,OAAO,CAAC,KAAK,CAAC,qBAAqB,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrG,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,kBAAkB,OAAO,MAAM,MAAM,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC,CAAC;AAClG,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,QAAQ,CAAC,SAAS,EAAE,oBAAoB,CAAC;SACzC,WAAW,CAAC,gCAAgC,CAAC;SAC7C,MAAM,CAAC,CAAC,OAAe,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { Rule } from '../bridges/types.js';
2
+ export declare function computeRulesHash(rules: Rule[]): string;
3
+ export declare function readStoredHash(cwd: string): Promise<string | null>;
4
+ export declare function writeHash(cwd: string, hash: string): Promise<void>;
5
+ //# sourceMappingURL=hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../src/core/hash.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAIhD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CAMtD;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOxE;AAED,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIxE"}
@@ -0,0 +1,24 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
3
+ import { join, dirname } from 'node:path';
4
+ const HASH_FILE = '.dwf/.cache/rules.hash';
5
+ export function computeRulesHash(rules) {
6
+ const sorted = [...rules].sort((a, b) => a.id.localeCompare(b.id));
7
+ const payload = sorted.map((r) => `${r.id}|${r.scope}|${r.severity}|${r.content}|${String(r.enabled)}`).join('\n');
8
+ return createHash('sha256').update(payload).digest('hex');
9
+ }
10
+ export async function readStoredHash(cwd) {
11
+ try {
12
+ const content = await readFile(join(cwd, HASH_FILE), 'utf-8');
13
+ return content.trim();
14
+ }
15
+ catch {
16
+ return null;
17
+ }
18
+ }
19
+ export async function writeHash(cwd, hash) {
20
+ const filePath = join(cwd, HASH_FILE);
21
+ await mkdir(dirname(filePath), { recursive: true });
22
+ await writeFile(filePath, hash, 'utf-8');
23
+ }
24
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/core/hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAG1C,MAAM,SAAS,GAAG,wBAAwB,CAAC;AAE3C,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC/B,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CACrE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAW;IAC9C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;QAC9D,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW,EAAE,IAAY;IACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACtC,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare const MARKER_BEGIN = "<!-- BEGIN dev-workflows -->";
2
+ export declare const MARKER_END = "<!-- END dev-workflows -->";
3
+ export declare function mergeMarkedContent(existingContent: string | null, newBlock: string): string;
4
+ //# sourceMappingURL=markers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markers.d.ts","sourceRoot":"","sources":["../../src/core/markers.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,iCAAiC,CAAC;AAC3D,eAAO,MAAM,UAAU,+BAA+B,CAAC;AAEvD,wBAAgB,kBAAkB,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAkB3F"}
@@ -0,0 +1,18 @@
1
+ export const MARKER_BEGIN = '<!-- BEGIN dev-workflows -->';
2
+ export const MARKER_END = '<!-- END dev-workflows -->';
3
+ export function mergeMarkedContent(existingContent, newBlock) {
4
+ const markedBlock = `${MARKER_BEGIN}\n${newBlock}${MARKER_END}\n`;
5
+ if (existingContent === null) {
6
+ return markedBlock;
7
+ }
8
+ const beginIndex = existingContent.indexOf(MARKER_BEGIN);
9
+ const endIndex = existingContent.indexOf(MARKER_END);
10
+ if (beginIndex !== -1 && endIndex !== -1) {
11
+ const before = existingContent.slice(0, beginIndex);
12
+ const afterEndLine = existingContent.indexOf('\n', endIndex);
13
+ const after = afterEndLine !== -1 ? existingContent.slice(afterEndLine + 1) : '';
14
+ return `${before}${markedBlock}${after}`;
15
+ }
16
+ return `${existingContent}\n${markedBlock}`;
17
+ }
18
+ //# sourceMappingURL=markers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markers.js","sourceRoot":"","sources":["../../src/core/markers.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,8BAA8B,CAAC;AAC3D,MAAM,CAAC,MAAM,UAAU,GAAG,4BAA4B,CAAC;AAEvD,MAAM,UAAU,kBAAkB,CAAC,eAA8B,EAAE,QAAgB;IACjF,MAAM,WAAW,GAAG,GAAG,YAAY,KAAK,QAAQ,GAAG,UAAU,IAAI,CAAC;IAElE,IAAI,eAAe,KAAK,IAAI,EAAE,CAAC;QAC7B,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAErD,IAAI,UAAU,KAAK,CAAC,CAAC,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACpD,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC7D,MAAM,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACjF,OAAO,GAAG,MAAM,GAAG,WAAW,GAAG,KAAK,EAAE,CAAC;IAC3C,CAAC;IAED,OAAO,GAAG,eAAe,KAAK,WAAW,EAAE,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Rule, ProjectConfig } from '../bridges/types.js';
2
+ export declare function readConfig(cwd: string): Promise<ProjectConfig>;
3
+ export declare function readRules(cwd: string): Promise<Rule[]>;
4
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/core/parser.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAgB/D,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA4CpE;AAqBD,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CA0B5D"}
@@ -0,0 +1,82 @@
1
+ import { readFile, readdir } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { parse } from 'yaml';
4
+ export async function readConfig(cwd) {
5
+ const configPath = join(cwd, '.dwf', 'config.yml');
6
+ const raw = await readFile(configPath, 'utf-8');
7
+ const parsed = parse(raw);
8
+ if (!parsed || typeof parsed !== 'object') {
9
+ throw new Error('Invalid config.yml: expected an object');
10
+ }
11
+ const doc = parsed;
12
+ const version = typeof doc['version'] === 'string' ? doc['version'] : '0.1';
13
+ const projectRaw = doc['project'];
14
+ if (!projectRaw || typeof projectRaw !== 'object') {
15
+ throw new Error('Invalid config.yml: missing "project" section');
16
+ }
17
+ const projectObj = projectRaw;
18
+ const projectName = typeof projectObj['name'] === 'string' ? projectObj['name'] : '';
19
+ const projectDescription = typeof projectObj['description'] === 'string' ? projectObj['description'] : undefined;
20
+ const toolsRaw = doc['tools'];
21
+ if (!Array.isArray(toolsRaw)) {
22
+ throw new Error('Invalid config.yml: "tools" must be an array');
23
+ }
24
+ const tools = toolsRaw.filter((t) => typeof t === 'string');
25
+ const modeRaw = doc['mode'];
26
+ if (modeRaw !== 'copy' && modeRaw !== 'link') {
27
+ throw new Error('Invalid config.yml: "mode" must be "copy" or "link"');
28
+ }
29
+ const blocksRaw = doc['blocks'];
30
+ const blocks = Array.isArray(blocksRaw)
31
+ ? blocksRaw.filter((b) => typeof b === 'string')
32
+ : [];
33
+ return {
34
+ version,
35
+ project: { name: projectName, description: projectDescription },
36
+ tools,
37
+ mode: modeRaw,
38
+ blocks,
39
+ };
40
+ }
41
+ function normalizeRule(raw, scope) {
42
+ if (!raw.id || !raw.content)
43
+ return null;
44
+ const severity = raw.severity ?? 'error';
45
+ if (severity !== 'error' && severity !== 'warning' && severity !== 'info')
46
+ return null;
47
+ const enabled = raw.enabled !== false;
48
+ return {
49
+ id: raw.id,
50
+ scope,
51
+ severity,
52
+ content: raw.content.trimEnd(),
53
+ tags: raw.tags,
54
+ enabled,
55
+ sourceBlock: raw.sourceBlock,
56
+ };
57
+ }
58
+ export async function readRules(cwd) {
59
+ const rulesDir = join(cwd, '.dwf', 'rules');
60
+ const entries = await readdir(rulesDir);
61
+ const ymlFiles = entries.filter((f) => f.endsWith('.yml') || f.endsWith('.yaml'));
62
+ const allRules = [];
63
+ for (const file of ymlFiles) {
64
+ const raw = await readFile(join(rulesDir, file), 'utf-8');
65
+ const parsed = parse(raw);
66
+ if (!parsed || typeof parsed !== 'object')
67
+ continue;
68
+ const doc = parsed;
69
+ const scope = doc.scope ?? file.replace(/\.ya?ml$/, '');
70
+ if (!Array.isArray(doc.rules))
71
+ continue;
72
+ for (const rawRule of doc.rules) {
73
+ if (!rawRule || typeof rawRule !== 'object')
74
+ continue;
75
+ const rule = normalizeRule(rawRule, scope);
76
+ if (rule)
77
+ allRules.push(rule);
78
+ }
79
+ }
80
+ return allRules;
81
+ }
82
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/core/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Command } from 'commander';
2
+ declare const program: Command;
3
+ export { program };
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,QAAA,MAAM,OAAO,SAAgB,CAAC;AAgB9B,OAAO,EAAE,OAAO,EAAE,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,21 @@
1
+ import { Command } from 'commander';
2
+ import { registerInitCommand } from './commands/init.js';
3
+ import { registerCompileCommand } from './commands/compile.js';
4
+ import { registerDoctorCommand } from './commands/doctor.js';
5
+ import { registerAddCommand } from './commands/add.js';
6
+ import { registerRemoveCommand } from './commands/remove.js';
7
+ import { registerListCommand } from './commands/list.js';
8
+ const program = new Command();
9
+ program
10
+ .name('devw')
11
+ .description('Compile developer rules into editor-specific config files')
12
+ .version('0.1.0');
13
+ registerInitCommand(program);
14
+ registerCompileCommand(program);
15
+ registerDoctorCommand(program);
16
+ registerAddCommand(program);
17
+ registerRemoveCommand(program);
18
+ registerListCommand(program);
19
+ program.parse();
20
+ export { program };
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,MAAM,CAAC;KACZ,WAAW,CAAC,2DAA2D,CAAC;KACxE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAC5B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAE7B,OAAO,CAAC,KAAK,EAAE,CAAC;AAEhB,OAAO,EAAE,OAAO,EAAE,CAAC"}
@@ -0,0 +1,8 @@
1
+ export type ToolId = 'claude' | 'cursor' | 'gemini';
2
+ export declare const SUPPORTED_TOOLS: ToolId[];
3
+ export interface DetectedTool {
4
+ id: ToolId;
5
+ detected: boolean;
6
+ }
7
+ export declare function detectTools(cwd: string): Promise<DetectedTool[]>;
8
+ //# sourceMappingURL=detect-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-tools.d.ts","sourceRoot":"","sources":["../../src/utils/detect-tools.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEpD,eAAO,MAAM,eAAe,EAAE,MAAM,EAAmC,CAAC;AAExE,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,OAAO,CAAC;CACnB;AAiBD,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAUtE"}
@@ -0,0 +1,28 @@
1
+ import { access } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ export const SUPPORTED_TOOLS = ['claude', 'cursor', 'gemini'];
4
+ const TOOL_MARKERS = {
5
+ claude: 'CLAUDE.md',
6
+ cursor: '.cursor',
7
+ gemini: 'GEMINI.md',
8
+ };
9
+ async function exists(filePath) {
10
+ try {
11
+ await access(filePath);
12
+ return true;
13
+ }
14
+ catch {
15
+ return false;
16
+ }
17
+ }
18
+ export async function detectTools(cwd) {
19
+ const results = await Promise.all(SUPPORTED_TOOLS.map(async (id) => {
20
+ const marker = TOOL_MARKERS[id];
21
+ if (!marker)
22
+ return { id, detected: false };
23
+ const detected = await exists(join(cwd, marker));
24
+ return { id, detected };
25
+ }));
26
+ return results;
27
+ }
28
+ //# sourceMappingURL=detect-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-tools.js","sourceRoot":"","sources":["../../src/utils/detect-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,MAAM,CAAC,MAAM,eAAe,GAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAOxE,MAAM,YAAY,GAA2B;IAC3C,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,WAAW;CACpB,CAAC;AAEF,KAAK,UAAU,MAAM,CAAC,QAAgB;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW;IAC3C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;QAC/B,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;QACjD,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC;IAC1B,CAAC,CAAC,CACH,CAAC;IACF,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function ask(question: string, defaultValue?: string): Promise<string>;
2
+ export declare function confirm(question: string, defaultYes?: boolean): Promise<boolean>;
3
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"AAGA,wBAAsB,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CASlF;AAED,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,UAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAKnF"}