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
@@ -1,67 +1,503 @@
1
1
  import { join } from 'node:path';
2
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
2
3
  import chalk from 'chalk';
3
- import { select } from '@inquirer/prompts';
4
- import { loadAllBlocks, loadBlock } from '../blocks/registry.js';
5
- import { installBlock } from '../blocks/installer.js';
4
+ import { stringify, parse } from 'yaml';
5
+ import { select, checkbox, confirm } from '@inquirer/prompts';
6
+ import { fetchRawContent, fetchContent, listDirectory } from '../utils/github.js';
7
+ import { convert } from '../core/converter.js';
8
+ import { isAssetType, parseAssetFrontmatter } from '../core/assets.js';
6
9
  import { fileExists } from '../utils/fs.js';
7
10
  import { readConfig } from '../core/parser.js';
11
+ import * as cache from '../utils/cache.js';
8
12
  import * as ui from '../utils/ui.js';
9
13
  import { ICONS } from '../utils/ui.js';
10
- async function listAvailableBlocks() {
11
- const blocks = await loadAllBlocks();
12
- if (blocks.length === 0) {
13
- ui.warn('No blocks available');
14
+ const KEBAB_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
15
+ export const BACK_VALUE = '__back__';
16
+ export function pluralRules(count) {
17
+ return count === 1 ? '1 rule' : `${String(count)} rules`;
18
+ }
19
+ export function validateInput(input) {
20
+ const parts = input.split('/');
21
+ if (parts.length !== 2)
22
+ return null;
23
+ const category = parts[0];
24
+ const name = parts[1];
25
+ if (!category || !name)
26
+ return null;
27
+ if (!KEBAB_RE.test(category) || !KEBAB_RE.test(name))
28
+ return null;
29
+ return { category, name };
30
+ }
31
+ export async function fetchRegistry(cwd) {
32
+ const cached = await cache.getFromDisk(cwd, 'registry');
33
+ if (cached)
34
+ return cached;
35
+ ui.info('Fetching available rules from GitHub...');
36
+ ui.newline();
37
+ let topLevel;
38
+ try {
39
+ topLevel = await listDirectory();
40
+ }
41
+ catch (err) {
42
+ const msg = err instanceof Error ? err.message : String(err);
43
+ ui.error(`Could not fetch rule registry: ${msg}`);
44
+ return null;
45
+ }
46
+ const categories = [];
47
+ for (const entry of topLevel) {
48
+ if (entry.type !== 'dir')
49
+ continue;
50
+ try {
51
+ const files = await listDirectory(entry.name);
52
+ const rules = [];
53
+ for (const file of files) {
54
+ if (file.type !== 'file')
55
+ continue;
56
+ try {
57
+ const content = await fetchRawContent(`${entry.name}/${file.name}`);
58
+ const fmMatch = /^---\n([\s\S]*?)\n---/.exec(content);
59
+ if (fmMatch?.[1]) {
60
+ const fm = parse(fmMatch[1]);
61
+ const description = typeof fm['description'] === 'string' ? fm['description'] : '';
62
+ rules.push({ name: file.name, description });
63
+ }
64
+ }
65
+ catch {
66
+ rules.push({ name: file.name, description: '' });
67
+ }
68
+ }
69
+ if (rules.length > 0) {
70
+ categories.push({ name: entry.name, rules });
71
+ }
72
+ }
73
+ catch {
74
+ // Skip categories that fail to list
75
+ }
76
+ }
77
+ const registry = { categories };
78
+ await cache.set(cwd, 'registry', registry);
79
+ return registry;
80
+ }
81
+ async function runList(categoryFilter) {
82
+ const cwd = process.cwd();
83
+ const registry = await fetchRegistry(cwd);
84
+ if (!registry) {
85
+ process.exitCode = 1;
86
+ return;
87
+ }
88
+ const displayCategories = categoryFilter
89
+ ? registry.categories.filter((c) => c.name === categoryFilter)
90
+ : registry.categories;
91
+ if (displayCategories.length === 0) {
92
+ if (categoryFilter) {
93
+ ui.warn(`Category "${categoryFilter}" not found`);
94
+ }
95
+ else {
96
+ ui.warn('No rules available');
97
+ }
14
98
  return;
15
99
  }
16
- // Try to load installed blocks from config
17
- let installedBlocks = [];
100
+ ui.header('Available rules');
101
+ ui.newline();
102
+ for (const category of displayCategories) {
103
+ console.log(` ${chalk.cyan(`${category.name}/`)}`);
104
+ for (const rule of category.rules) {
105
+ const desc = rule.description ? chalk.dim(` ${rule.description}`) : '';
106
+ console.log(` ${chalk.white(rule.name.padEnd(20))}${desc}`);
107
+ }
108
+ ui.newline();
109
+ }
110
+ console.log(` ${chalk.dim(`Add a rule: devw add <category>/<rule>`)}`);
111
+ }
112
+ export function generateYamlOutput(category, name, result, pulledAt) {
113
+ const source = `${category}/${name}`;
114
+ const githubUrl = `https://github.com/gpolanco/dev-workflows/blob/main/content/rules/${source}.md`;
115
+ const header = [
116
+ `# Pulled from: ${source} (v${result.version})`,
117
+ `# Source: ${githubUrl}`,
118
+ `# Do not edit manually — changes will be overwritten on next pull.`,
119
+ '',
120
+ ].join('\n');
121
+ const doc = {
122
+ source: {
123
+ registry: 'dev-workflows',
124
+ path: source,
125
+ version: result.version,
126
+ pulled_at: pulledAt,
127
+ },
128
+ scope: result.scope,
129
+ rules: result.rules.map((r) => ({
130
+ id: r.id,
131
+ severity: r.severity,
132
+ content: r.content,
133
+ tags: r.tags,
134
+ source: r.source,
135
+ })),
136
+ };
137
+ return header + stringify(doc, { lineWidth: 0 });
138
+ }
139
+ export async function updateConfig(cwd, entry) {
140
+ const configPath = join(cwd, '.dwf', 'config.yml');
141
+ const raw = await readFile(configPath, 'utf-8');
142
+ const doc = parse(raw);
143
+ const pulled = Array.isArray(doc['pulled']) ? doc['pulled'] : [];
144
+ const existingIdx = pulled.findIndex((p) => p.path === entry.path);
145
+ if (existingIdx >= 0) {
146
+ pulled[existingIdx] = entry;
147
+ }
148
+ else {
149
+ pulled.push(entry);
150
+ }
151
+ doc['pulled'] = pulled;
152
+ await writeFile(configPath, stringify(doc, { lineWidth: 0 }), 'utf-8');
153
+ }
154
+ export async function updateConfigAssets(cwd, entry) {
155
+ const configPath = join(cwd, '.dwf', 'config.yml');
156
+ const raw = await readFile(configPath, 'utf-8');
157
+ const doc = parse(raw);
158
+ const assets = Array.isArray(doc['assets']) ? doc['assets'] : [];
159
+ const existingIdx = assets.findIndex((a) => a.type === entry.type && a.name === entry.name);
160
+ if (existingIdx >= 0) {
161
+ assets[existingIdx] = entry;
162
+ }
163
+ else {
164
+ assets.push(entry);
165
+ }
166
+ doc['assets'] = assets;
167
+ await writeFile(configPath, stringify(doc, { lineWidth: 0 }), 'utf-8');
168
+ }
169
+ function getAssetContentPath(type, name) {
170
+ const ext = type === 'hook' ? 'json' : 'md';
171
+ return `${type}s/${name}.${ext}`;
172
+ }
173
+ export async function downloadAndInstallAsset(cwd, type, name, options) {
174
+ const source = `${type}/${name}`;
175
+ const ext = type === 'hook' ? 'json' : 'md';
176
+ const fileName = `${name}.${ext}`;
177
+ const assetDir = join(cwd, '.dwf', 'assets', `${type}s`);
178
+ const filePath = join(assetDir, fileName);
179
+ ui.info(`Downloading ${source}...`);
180
+ let content;
18
181
  try {
19
- const config = await readConfig(process.cwd());
20
- installedBlocks = config.blocks;
182
+ content = await fetchContent(getAssetContentPath(type, name));
21
183
  }
22
- catch {
23
- // No config that's fine, just don't show installed indicator
184
+ catch (err) {
185
+ const msg = err instanceof Error ? err.message : String(err);
186
+ ui.error(msg);
187
+ process.exitCode = 1;
188
+ return false;
24
189
  }
25
- ui.header('Available blocks');
26
- ui.newline();
27
- for (const block of blocks) {
28
- const installed = installedBlocks.includes(block.id) ? chalk.green(` ${ICONS.success}`) + chalk.dim(' installed') : '';
29
- console.log(`${chalk.cyan(` ${block.id}`)} ${chalk.dim(ICONS.dash)} ${block.description}${installed}`);
30
- console.log(` ${chalk.dim(`${String(block.rules.length)} rules ${ICONS.dot} v${block.version}`)}`);
190
+ let version = '0.1.0';
191
+ if (type === 'hook') {
192
+ try {
193
+ const parsed = JSON.parse(content);
194
+ if (typeof parsed['version'] === 'string')
195
+ version = parsed['version'];
196
+ }
197
+ catch {
198
+ // Use default version
199
+ }
200
+ }
201
+ else {
202
+ const { frontmatter } = parseAssetFrontmatter(content);
203
+ version = frontmatter.version;
204
+ }
205
+ if (await fileExists(filePath)) {
206
+ if (!options.force) {
207
+ ui.info(`${source} already exists locally`);
208
+ try {
209
+ const shouldOverwrite = await confirm({
210
+ message: 'Overwrite?',
211
+ default: true,
212
+ });
213
+ if (!shouldOverwrite) {
214
+ ui.error('Cancelled');
215
+ return false;
216
+ }
217
+ }
218
+ catch {
219
+ ui.error('Cancelled');
220
+ return false;
221
+ }
222
+ }
223
+ }
224
+ if (options.dryRun) {
31
225
  ui.newline();
226
+ ui.header('Dry run — would write:');
227
+ ui.newline();
228
+ console.log(chalk.dim(` .dwf/assets/${type}s/${fileName}`));
229
+ return false;
32
230
  }
231
+ await mkdir(assetDir, { recursive: true });
232
+ await writeFile(filePath, content, 'utf-8');
233
+ const entry = {
234
+ type,
235
+ name,
236
+ version,
237
+ installed_at: new Date().toISOString(),
238
+ };
239
+ await updateConfigAssets(cwd, entry);
240
+ ui.success(`Added ${source} (v${version})`);
241
+ return true;
33
242
  }
34
- async function selectBlock(installedBlocks) {
35
- const blocks = await loadAllBlocks();
36
- if (blocks.length === 0) {
37
- ui.warn('No blocks available');
38
- return undefined;
243
+ async function downloadAndInstall(cwd, category, name, options) {
244
+ const source = `${category}/${name}`;
245
+ const fileName = `pulled-${category}-${name}.yml`;
246
+ const filePath = join(cwd, '.dwf', 'rules', fileName);
247
+ ui.info(`Downloading ${source}...`);
248
+ let markdown;
249
+ try {
250
+ markdown = await fetchRawContent(source);
251
+ }
252
+ catch (err) {
253
+ const msg = err instanceof Error ? err.message : String(err);
254
+ ui.error(msg);
255
+ process.exitCode = 1;
256
+ return false;
257
+ }
258
+ let result;
259
+ try {
260
+ result = convert(markdown, category, name);
261
+ }
262
+ catch (err) {
263
+ const msg = err instanceof Error ? err.message : String(err);
264
+ ui.error(`Conversion failed: ${msg}`);
265
+ process.exitCode = 1;
266
+ return false;
267
+ }
268
+ if (await fileExists(filePath)) {
269
+ try {
270
+ const existingRaw = await readFile(filePath, 'utf-8');
271
+ const existingDoc = parse(existingRaw);
272
+ const existingSource = existingDoc['source'];
273
+ const existingVersion = typeof existingSource?.['version'] === 'string' ? existingSource['version'] : '';
274
+ if (existingVersion === result.version) {
275
+ ui.success(`Already up to date (${source} v${result.version})`);
276
+ return false;
277
+ }
278
+ if (!options.force) {
279
+ ui.newline();
280
+ ui.info(`${source} already exists locally (v${existingVersion} ${ICONS.arrow} v${result.version})`);
281
+ try {
282
+ const shouldOverwrite = await confirm({
283
+ message: 'Overwrite with new version?',
284
+ default: true,
285
+ });
286
+ if (!shouldOverwrite) {
287
+ ui.error('Cancelled');
288
+ return false;
289
+ }
290
+ }
291
+ catch {
292
+ ui.error('Cancelled');
293
+ return false;
294
+ }
295
+ }
296
+ }
297
+ catch {
298
+ // Can't parse existing file — overwrite
299
+ }
300
+ }
301
+ const pulledAt = new Date().toISOString();
302
+ const yamlOutput = generateYamlOutput(category, name, result, pulledAt);
303
+ if (options.dryRun) {
304
+ ui.newline();
305
+ ui.header('Dry run — would write:');
306
+ ui.newline();
307
+ console.log(chalk.dim(` ${fileName}`));
308
+ ui.newline();
309
+ console.log(yamlOutput);
310
+ return false;
311
+ }
312
+ await mkdir(join(cwd, '.dwf', 'rules'), { recursive: true });
313
+ await writeFile(filePath, yamlOutput, 'utf-8');
314
+ const entry = {
315
+ path: source,
316
+ version: result.version,
317
+ pulled_at: pulledAt,
318
+ };
319
+ await updateConfig(cwd, entry);
320
+ ui.success(`Added ${source} (${pluralRules(result.rules.length)})`);
321
+ return true;
322
+ }
323
+ async function runInteractive(cwd, options) {
324
+ const registry = await fetchRegistry(cwd);
325
+ if (!registry) {
326
+ process.exitCode = 1;
327
+ return;
39
328
  }
40
- const available = blocks.filter((b) => !installedBlocks.includes(b.id));
41
- if (available.length === 0) {
42
- ui.success('All blocks already installed');
43
- return undefined;
329
+ if (registry.categories.length === 0) {
330
+ ui.warn('No rules available');
331
+ return;
332
+ }
333
+ let installedPaths;
334
+ try {
335
+ const config = await readConfig(cwd);
336
+ installedPaths = new Set(config.pulled.map((p) => p.path));
337
+ }
338
+ catch {
339
+ installedPaths = new Set();
340
+ }
341
+ const allSelected = [];
342
+ const processedCategories = new Set();
343
+ try {
344
+ for (;;) {
345
+ const availableCategories = registry.categories.filter((c) => !processedCategories.has(c.name));
346
+ if (availableCategories.length === 0)
347
+ break;
348
+ const selectedCategoryName = await select({
349
+ message: 'Choose a category',
350
+ choices: availableCategories.map((c) => {
351
+ const allInstalled = c.rules.every((r) => installedPaths.has(`${c.name}/${r.name}`));
352
+ const label = `${c.name} (${pluralRules(c.rules.length)})`;
353
+ return {
354
+ name: allInstalled ? `${label} ${chalk.dim('(all installed)')}` : label,
355
+ value: c.name,
356
+ };
357
+ }),
358
+ });
359
+ const category = registry.categories.find((c) => c.name === selectedCategoryName);
360
+ if (!category)
361
+ break;
362
+ const selected = await checkbox({
363
+ message: 'Select rules to add',
364
+ choices: [
365
+ { name: '\u2190 Back to categories', value: BACK_VALUE },
366
+ ...category.rules.map((r) => {
367
+ const path = `${category.name}/${r.name}`;
368
+ const installed = installedPaths.has(path);
369
+ const desc = r.description ? ` ${ICONS.dash} ${r.description}` : '';
370
+ const suffix = installed ? chalk.dim(' (already installed)') : '';
371
+ return {
372
+ name: `${r.name}${desc}${suffix}`,
373
+ value: r.name,
374
+ };
375
+ }),
376
+ ],
377
+ });
378
+ const realRules = selected.filter((v) => v !== BACK_VALUE);
379
+ if (realRules.length === 0) {
380
+ if (selected.includes(BACK_VALUE))
381
+ continue;
382
+ ui.warn('No rules selected');
383
+ continue;
384
+ }
385
+ for (const ruleName of realRules) {
386
+ const ruleInfo = category.rules.find((r) => r.name === ruleName);
387
+ allSelected.push({
388
+ category: category.name,
389
+ name: ruleName,
390
+ description: ruleInfo?.description ?? '',
391
+ });
392
+ }
393
+ processedCategories.add(category.name);
394
+ const remaining = registry.categories.filter((c) => !processedCategories.has(c.name));
395
+ if (remaining.length === 0)
396
+ break;
397
+ const addMore = await confirm({
398
+ message: 'Add rules from another category?',
399
+ default: true,
400
+ });
401
+ if (!addMore)
402
+ break;
403
+ }
404
+ }
405
+ catch {
406
+ ui.error('Cancelled');
407
+ return;
408
+ }
409
+ if (allSelected.length === 0)
410
+ return;
411
+ ui.newline();
412
+ ui.header('Rules to install:');
413
+ for (const rule of allSelected) {
414
+ const desc = rule.description ? chalk.dim(` ${ICONS.dash} ${rule.description}`) : '';
415
+ console.log(` ${rule.category}/${rule.name}${desc}`);
44
416
  }
417
+ ui.newline();
45
418
  try {
46
- return await select({
47
- message: 'Which block to install?',
48
- choices: blocks.map((b) => {
49
- const installed = installedBlocks.includes(b.id);
50
- return {
51
- name: installed ? `${b.id} ${ICONS.success} installed` : `${b.id} ${ICONS.dash} ${b.description}`,
52
- value: b.id,
53
- disabled: installed,
54
- };
55
- }),
419
+ const shouldProceed = await confirm({
420
+ message: `Install ${pluralRules(allSelected.length)}?`,
421
+ default: true,
56
422
  });
423
+ if (!shouldProceed) {
424
+ ui.error('Cancelled');
425
+ return;
426
+ }
57
427
  }
58
428
  catch {
59
- return undefined;
429
+ ui.error('Cancelled');
430
+ return;
431
+ }
432
+ let anyAdded = false;
433
+ for (const rule of allSelected) {
434
+ const added = await downloadAndInstall(cwd, rule.category, rule.name, options);
435
+ if (added)
436
+ anyAdded = true;
437
+ }
438
+ if (anyAdded && !options.noCompile) {
439
+ const { runCompileFromAdd } = await import('./compile.js');
440
+ await runCompileFromAdd();
60
441
  }
61
442
  }
62
- async function runAdd(blockId, options) {
443
+ export async function installPreset(cwd, presetName, options) {
444
+ ui.info(`Downloading preset ${presetName}...`);
445
+ let content;
446
+ try {
447
+ content = await fetchContent(`presets/${presetName}.yml`);
448
+ }
449
+ catch (err) {
450
+ const msg = err instanceof Error ? err.message : String(err);
451
+ ui.error(`Preset not found: ${msg}`);
452
+ process.exitCode = 1;
453
+ return false;
454
+ }
455
+ let manifest;
456
+ try {
457
+ manifest = parse(content);
458
+ }
459
+ catch {
460
+ ui.error(`Invalid preset YAML: ${presetName}`);
461
+ process.exitCode = 1;
462
+ return false;
463
+ }
464
+ ui.newline();
465
+ ui.header(`Preset: ${manifest.name}`);
466
+ if (manifest.description) {
467
+ ui.info(manifest.description);
468
+ }
469
+ ui.newline();
470
+ const noCompileOptions = { ...options, noCompile: true };
471
+ let anyAdded = false;
472
+ const rules = manifest.includes.rules ?? [];
473
+ for (const rule of rules) {
474
+ const added = await downloadAndInstall(cwd, rule.split('/')[0] ?? '', rule.split('/')[1] ?? rule, noCompileOptions);
475
+ if (added)
476
+ anyAdded = true;
477
+ }
478
+ const commands = manifest.includes.commands ?? [];
479
+ for (const cmd of commands) {
480
+ const added = await downloadAndInstallAsset(cwd, 'command', cmd, noCompileOptions);
481
+ if (added)
482
+ anyAdded = true;
483
+ }
484
+ const templates = manifest.includes.templates ?? [];
485
+ for (const tmpl of templates) {
486
+ const added = await downloadAndInstallAsset(cwd, 'template', tmpl, noCompileOptions);
487
+ if (added)
488
+ anyAdded = true;
489
+ }
490
+ const hooks = manifest.includes.hooks ?? [];
491
+ for (const hook of hooks) {
492
+ const added = await downloadAndInstallAsset(cwd, 'hook', hook, noCompileOptions);
493
+ if (added)
494
+ anyAdded = true;
495
+ }
496
+ return anyAdded;
497
+ }
498
+ async function runAdd(ruleArg, options) {
63
499
  if (options.list) {
64
- await listAvailableBlocks();
500
+ await runList(ruleArg);
65
501
  return;
66
502
  }
67
503
  const cwd = process.cwd();
@@ -70,23 +506,45 @@ async function runAdd(blockId, options) {
70
506
  process.exitCode = 1;
71
507
  return;
72
508
  }
73
- if (!blockId) {
74
- const config = await readConfig(cwd);
75
- const selected = await selectBlock(config.blocks);
76
- if (!selected)
509
+ if (!ruleArg) {
510
+ if (!process.stdout.isTTY || !process.stdin.isTTY) {
511
+ ui.error('No rule specified', 'Usage: devw add <category>/<rule>');
512
+ process.exitCode = 1;
77
513
  return;
78
- blockId = selected;
514
+ }
515
+ await runInteractive(cwd, options);
516
+ return;
79
517
  }
80
- const block = await loadBlock(blockId);
81
- if (!block) {
82
- ui.error(`Block "${blockId}" not found`, 'Run devw add --list to see available blocks');
518
+ if (!ruleArg.includes('/')) {
519
+ ui.error('Block format is no longer supported', 'Use: devw add <category>/<rule>. Run devw add --list to browse.');
83
520
  process.exitCode = 1;
84
521
  return;
85
522
  }
86
- const rulesAdded = await installBlock(cwd, block);
87
- ui.success(`Added ${block.id} (${String(rulesAdded)} rules)`);
88
- if (!options.noCompile) {
89
- // Dynamic import to avoid circular dependency
523
+ const parsed = validateInput(ruleArg);
524
+ if (!parsed) {
525
+ ui.error(`Invalid rule path "${ruleArg}"`, 'Format: <category>/<rule> — both must be kebab-case (e.g., typescript/strict)');
526
+ process.exitCode = 1;
527
+ return;
528
+ }
529
+ const { category, name } = parsed;
530
+ if (category === 'preset') {
531
+ const anyAdded = await installPreset(cwd, name, options);
532
+ if (anyAdded && !options.noCompile) {
533
+ const { runCompileFromAdd } = await import('./compile.js');
534
+ await runCompileFromAdd();
535
+ }
536
+ return;
537
+ }
538
+ if (isAssetType(category)) {
539
+ const added = await downloadAndInstallAsset(cwd, category, name, options);
540
+ if (added && !options.noCompile) {
541
+ const { runCompileFromAdd } = await import('./compile.js');
542
+ await runCompileFromAdd();
543
+ }
544
+ return;
545
+ }
546
+ const added = await downloadAndInstall(cwd, category, name, options);
547
+ if (added && !options.noCompile) {
90
548
  const { runCompileFromAdd } = await import('./compile.js');
91
549
  await runCompileFromAdd();
92
550
  }
@@ -94,10 +552,12 @@ async function runAdd(blockId, options) {
94
552
  export function registerAddCommand(program) {
95
553
  program
96
554
  .command('add')
97
- .argument('[block]', 'Block ID to install')
98
- .description('Install a prebuilt rule block')
99
- .option('--list', 'List all available blocks')
555
+ .argument('[rule]', 'Rule path: <category>/<rule>')
556
+ .description('Add rules from the dev-workflows registry')
557
+ .option('--list', 'List available rules')
100
558
  .option('--no-compile', 'Skip auto-compile after adding')
101
- .action((blockId, options) => runAdd(blockId, options));
559
+ .option('--force', 'Overwrite without asking')
560
+ .option('--dry-run', 'Show output without writing files')
561
+ .action((rule, options) => runAdd(rule, options));
102
562
  }
103
563
  //# sourceMappingURL=add.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}