dev-workflows 0.3.0 → 0.4.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/dist/bridges/types.d.ts +7 -0
- package/dist/bridges/types.d.ts.map +1 -1
- package/dist/commands/add.d.ts +23 -0
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +356 -57
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/doctor.d.ts +2 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +25 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.js +2 -2
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +13 -13
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/remove.d.ts.map +1 -1
- package/dist/commands/remove.js +85 -22
- package/dist/commands/remove.js.map +1 -1
- package/dist/core/converter.d.ts +18 -0
- package/dist/core/converter.d.ts.map +1 -0
- package/dist/core/converter.js +113 -0
- package/dist/core/converter.js.map +1 -0
- package/dist/core/parser.d.ts.map +1 -1
- package/dist/core/parser.js +13 -0
- package/dist/core/parser.js.map +1 -1
- package/dist/utils/cache.d.ts +10 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +43 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/github.d.ts +11 -0
- package/dist/utils/github.d.ts.map +1 -0
- package/dist/utils/github.js +68 -0
- package/dist/utils/github.js.map +1 -0
- package/package.json +2 -2
- package/content/blocks/nextjs-approuter.yml +0 -37
- package/content/blocks/react-conventions.yml +0 -36
- package/content/blocks/supabase-rls.yml +0 -30
- package/content/blocks/tailwind.yml +0 -28
- package/content/blocks/testing-basics.yml +0 -36
- package/content/blocks/typescript-strict.yml +0 -33
- package/dist/blocks/installer.d.ts +0 -4
- package/dist/blocks/installer.d.ts.map +0 -1
- package/dist/blocks/installer.js +0 -119
- package/dist/blocks/installer.js.map +0 -1
- package/dist/blocks/registry.d.ts +0 -18
- package/dist/blocks/registry.d.ts.map +0 -1
- package/dist/blocks/registry.js +0 -85
- package/dist/blocks/registry.js.map +0 -1
package/dist/bridges/types.d.ts
CHANGED
|
@@ -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,7 @@ export interface ProjectConfig {
|
|
|
16
22
|
tools: string[];
|
|
17
23
|
mode: 'copy' | 'link';
|
|
18
24
|
blocks: string[];
|
|
25
|
+
pulled: PulledEntry[];
|
|
19
26
|
}
|
|
20
27
|
export interface Bridge {
|
|
21
28
|
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;
|
|
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;CACvB;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"}
|
package/dist/commands/add.d.ts
CHANGED
|
@@ -1,7 +1,30 @@
|
|
|
1
1
|
import type { Command } from 'commander';
|
|
2
|
+
import { convert } from '../core/converter.js';
|
|
3
|
+
import type { PulledEntry } 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>;
|
|
6
28
|
export declare function registerAddCommand(program: Command): void;
|
|
29
|
+
export {};
|
|
7
30
|
//# sourceMappingURL=add.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"
|
|
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;AAM/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAIvD,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;AAuRD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAUzD"}
|
package/dist/commands/add.js
CHANGED
|
@@ -1,67 +1,358 @@
|
|
|
1
1
|
import { join } from 'node:path';
|
|
2
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
2
3
|
import chalk from 'chalk';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
4
|
+
import { stringify, parse } from 'yaml';
|
|
5
|
+
import { select, checkbox, confirm } from '@inquirer/prompts';
|
|
6
|
+
import { fetchRawContent, listDirectory } from '../utils/github.js';
|
|
7
|
+
import { convert } from '../core/converter.js';
|
|
6
8
|
import { fileExists } from '../utils/fs.js';
|
|
7
9
|
import { readConfig } from '../core/parser.js';
|
|
10
|
+
import * as cache from '../utils/cache.js';
|
|
8
11
|
import * as ui from '../utils/ui.js';
|
|
9
12
|
import { ICONS } from '../utils/ui.js';
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
const KEBAB_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
14
|
+
export const BACK_VALUE = '__back__';
|
|
15
|
+
export function pluralRules(count) {
|
|
16
|
+
return count === 1 ? '1 rule' : `${String(count)} rules`;
|
|
17
|
+
}
|
|
18
|
+
export function validateInput(input) {
|
|
19
|
+
const parts = input.split('/');
|
|
20
|
+
if (parts.length !== 2)
|
|
21
|
+
return null;
|
|
22
|
+
const category = parts[0];
|
|
23
|
+
const name = parts[1];
|
|
24
|
+
if (!category || !name)
|
|
25
|
+
return null;
|
|
26
|
+
if (!KEBAB_RE.test(category) || !KEBAB_RE.test(name))
|
|
27
|
+
return null;
|
|
28
|
+
return { category, name };
|
|
29
|
+
}
|
|
30
|
+
export async function fetchRegistry(cwd) {
|
|
31
|
+
const cached = await cache.getFromDisk(cwd, 'registry');
|
|
32
|
+
if (cached)
|
|
33
|
+
return cached;
|
|
34
|
+
ui.info('Fetching available rules from GitHub...');
|
|
35
|
+
ui.newline();
|
|
36
|
+
let topLevel;
|
|
37
|
+
try {
|
|
38
|
+
topLevel = await listDirectory();
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
42
|
+
ui.error(`Could not fetch rule registry: ${msg}`);
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
const categories = [];
|
|
46
|
+
for (const entry of topLevel) {
|
|
47
|
+
if (entry.type !== 'dir')
|
|
48
|
+
continue;
|
|
49
|
+
try {
|
|
50
|
+
const files = await listDirectory(entry.name);
|
|
51
|
+
const rules = [];
|
|
52
|
+
for (const file of files) {
|
|
53
|
+
if (file.type !== 'file')
|
|
54
|
+
continue;
|
|
55
|
+
try {
|
|
56
|
+
const content = await fetchRawContent(`${entry.name}/${file.name}`);
|
|
57
|
+
const fmMatch = /^---\n([\s\S]*?)\n---/.exec(content);
|
|
58
|
+
if (fmMatch?.[1]) {
|
|
59
|
+
const fm = parse(fmMatch[1]);
|
|
60
|
+
const description = typeof fm['description'] === 'string' ? fm['description'] : '';
|
|
61
|
+
rules.push({ name: file.name, description });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
rules.push({ name: file.name, description: '' });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (rules.length > 0) {
|
|
69
|
+
categories.push({ name: entry.name, rules });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// Skip categories that fail to list
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const registry = { categories };
|
|
77
|
+
await cache.set(cwd, 'registry', registry);
|
|
78
|
+
return registry;
|
|
79
|
+
}
|
|
80
|
+
async function runList(categoryFilter) {
|
|
81
|
+
const cwd = process.cwd();
|
|
82
|
+
const registry = await fetchRegistry(cwd);
|
|
83
|
+
if (!registry) {
|
|
84
|
+
process.exitCode = 1;
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const displayCategories = categoryFilter
|
|
88
|
+
? registry.categories.filter((c) => c.name === categoryFilter)
|
|
89
|
+
: registry.categories;
|
|
90
|
+
if (displayCategories.length === 0) {
|
|
91
|
+
if (categoryFilter) {
|
|
92
|
+
ui.warn(`Category "${categoryFilter}" not found`);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
ui.warn('No rules available');
|
|
96
|
+
}
|
|
14
97
|
return;
|
|
15
98
|
}
|
|
16
|
-
|
|
17
|
-
|
|
99
|
+
ui.header('Available rules');
|
|
100
|
+
ui.newline();
|
|
101
|
+
for (const category of displayCategories) {
|
|
102
|
+
console.log(` ${chalk.cyan(`${category.name}/`)}`);
|
|
103
|
+
for (const rule of category.rules) {
|
|
104
|
+
const desc = rule.description ? chalk.dim(` ${rule.description}`) : '';
|
|
105
|
+
console.log(` ${chalk.white(rule.name.padEnd(20))}${desc}`);
|
|
106
|
+
}
|
|
107
|
+
ui.newline();
|
|
108
|
+
}
|
|
109
|
+
console.log(` ${chalk.dim(`Add a rule: devw add <category>/<rule>`)}`);
|
|
110
|
+
}
|
|
111
|
+
export function generateYamlOutput(category, name, result, pulledAt) {
|
|
112
|
+
const source = `${category}/${name}`;
|
|
113
|
+
const githubUrl = `https://github.com/gpolanco/dev-workflows/blob/main/content/rules/${source}.md`;
|
|
114
|
+
const header = [
|
|
115
|
+
`# Pulled from: ${source} (v${result.version})`,
|
|
116
|
+
`# Source: ${githubUrl}`,
|
|
117
|
+
`# Do not edit manually — changes will be overwritten on next pull.`,
|
|
118
|
+
'',
|
|
119
|
+
].join('\n');
|
|
120
|
+
const doc = {
|
|
121
|
+
source: {
|
|
122
|
+
registry: 'dev-workflows',
|
|
123
|
+
path: source,
|
|
124
|
+
version: result.version,
|
|
125
|
+
pulled_at: pulledAt,
|
|
126
|
+
},
|
|
127
|
+
scope: result.scope,
|
|
128
|
+
rules: result.rules.map((r) => ({
|
|
129
|
+
id: r.id,
|
|
130
|
+
severity: r.severity,
|
|
131
|
+
content: r.content,
|
|
132
|
+
tags: r.tags,
|
|
133
|
+
source: r.source,
|
|
134
|
+
})),
|
|
135
|
+
};
|
|
136
|
+
return header + stringify(doc, { lineWidth: 0 });
|
|
137
|
+
}
|
|
138
|
+
export async function updateConfig(cwd, entry) {
|
|
139
|
+
const configPath = join(cwd, '.dwf', 'config.yml');
|
|
140
|
+
const raw = await readFile(configPath, 'utf-8');
|
|
141
|
+
const doc = parse(raw);
|
|
142
|
+
const pulled = Array.isArray(doc['pulled']) ? doc['pulled'] : [];
|
|
143
|
+
const existingIdx = pulled.findIndex((p) => p.path === entry.path);
|
|
144
|
+
if (existingIdx >= 0) {
|
|
145
|
+
pulled[existingIdx] = entry;
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
pulled.push(entry);
|
|
149
|
+
}
|
|
150
|
+
doc['pulled'] = pulled;
|
|
151
|
+
await writeFile(configPath, stringify(doc, { lineWidth: 0 }), 'utf-8');
|
|
152
|
+
}
|
|
153
|
+
async function downloadAndInstall(cwd, category, name, options) {
|
|
154
|
+
const source = `${category}/${name}`;
|
|
155
|
+
const fileName = `pulled-${category}-${name}.yml`;
|
|
156
|
+
const filePath = join(cwd, '.dwf', 'rules', fileName);
|
|
157
|
+
ui.info(`Downloading ${source}...`);
|
|
158
|
+
let markdown;
|
|
18
159
|
try {
|
|
19
|
-
|
|
20
|
-
installedBlocks = config.blocks;
|
|
160
|
+
markdown = await fetchRawContent(source);
|
|
21
161
|
}
|
|
22
|
-
catch {
|
|
23
|
-
|
|
162
|
+
catch (err) {
|
|
163
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
164
|
+
ui.error(msg);
|
|
165
|
+
process.exitCode = 1;
|
|
166
|
+
return false;
|
|
24
167
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
168
|
+
let result;
|
|
169
|
+
try {
|
|
170
|
+
result = convert(markdown, category, name);
|
|
171
|
+
}
|
|
172
|
+
catch (err) {
|
|
173
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
174
|
+
ui.error(`Conversion failed: ${msg}`);
|
|
175
|
+
process.exitCode = 1;
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
if (await fileExists(filePath)) {
|
|
179
|
+
try {
|
|
180
|
+
const existingRaw = await readFile(filePath, 'utf-8');
|
|
181
|
+
const existingDoc = parse(existingRaw);
|
|
182
|
+
const existingSource = existingDoc['source'];
|
|
183
|
+
const existingVersion = typeof existingSource?.['version'] === 'string' ? existingSource['version'] : '';
|
|
184
|
+
if (existingVersion === result.version) {
|
|
185
|
+
ui.success(`Already up to date (${source} v${result.version})`);
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
if (!options.force) {
|
|
189
|
+
ui.newline();
|
|
190
|
+
ui.info(`${source} already exists locally (v${existingVersion} ${ICONS.arrow} v${result.version})`);
|
|
191
|
+
try {
|
|
192
|
+
const shouldOverwrite = await confirm({
|
|
193
|
+
message: 'Overwrite with new version?',
|
|
194
|
+
default: true,
|
|
195
|
+
});
|
|
196
|
+
if (!shouldOverwrite) {
|
|
197
|
+
ui.error('Cancelled');
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
ui.error('Cancelled');
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
// Can't parse existing file — overwrite
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
const pulledAt = new Date().toISOString();
|
|
212
|
+
const yamlOutput = generateYamlOutput(category, name, result, pulledAt);
|
|
213
|
+
if (options.dryRun) {
|
|
214
|
+
ui.newline();
|
|
215
|
+
ui.header('Dry run — would write:');
|
|
31
216
|
ui.newline();
|
|
217
|
+
console.log(chalk.dim(` ${fileName}`));
|
|
218
|
+
ui.newline();
|
|
219
|
+
console.log(yamlOutput);
|
|
220
|
+
return false;
|
|
32
221
|
}
|
|
222
|
+
await mkdir(join(cwd, '.dwf', 'rules'), { recursive: true });
|
|
223
|
+
await writeFile(filePath, yamlOutput, 'utf-8');
|
|
224
|
+
const entry = {
|
|
225
|
+
path: source,
|
|
226
|
+
version: result.version,
|
|
227
|
+
pulled_at: pulledAt,
|
|
228
|
+
};
|
|
229
|
+
await updateConfig(cwd, entry);
|
|
230
|
+
ui.success(`Added ${source} (${pluralRules(result.rules.length)})`);
|
|
231
|
+
return true;
|
|
33
232
|
}
|
|
34
|
-
async function
|
|
35
|
-
const
|
|
36
|
-
if (
|
|
37
|
-
|
|
38
|
-
return
|
|
233
|
+
async function runInteractive(cwd, options) {
|
|
234
|
+
const registry = await fetchRegistry(cwd);
|
|
235
|
+
if (!registry) {
|
|
236
|
+
process.exitCode = 1;
|
|
237
|
+
return;
|
|
39
238
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
return undefined;
|
|
239
|
+
if (registry.categories.length === 0) {
|
|
240
|
+
ui.warn('No rules available');
|
|
241
|
+
return;
|
|
44
242
|
}
|
|
243
|
+
let installedPaths;
|
|
45
244
|
try {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
245
|
+
const config = await readConfig(cwd);
|
|
246
|
+
installedPaths = new Set(config.pulled.map((p) => p.path));
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
installedPaths = new Set();
|
|
250
|
+
}
|
|
251
|
+
const allSelected = [];
|
|
252
|
+
const processedCategories = new Set();
|
|
253
|
+
try {
|
|
254
|
+
for (;;) {
|
|
255
|
+
const availableCategories = registry.categories.filter((c) => !processedCategories.has(c.name));
|
|
256
|
+
if (availableCategories.length === 0)
|
|
257
|
+
break;
|
|
258
|
+
const selectedCategoryName = await select({
|
|
259
|
+
message: 'Choose a category',
|
|
260
|
+
choices: availableCategories.map((c) => {
|
|
261
|
+
const allInstalled = c.rules.every((r) => installedPaths.has(`${c.name}/${r.name}`));
|
|
262
|
+
const label = `${c.name} (${pluralRules(c.rules.length)})`;
|
|
263
|
+
return {
|
|
264
|
+
name: allInstalled ? `${label} ${chalk.dim('(all installed)')}` : label,
|
|
265
|
+
value: c.name,
|
|
266
|
+
};
|
|
267
|
+
}),
|
|
268
|
+
});
|
|
269
|
+
const category = registry.categories.find((c) => c.name === selectedCategoryName);
|
|
270
|
+
if (!category)
|
|
271
|
+
break;
|
|
272
|
+
const selected = await checkbox({
|
|
273
|
+
message: 'Select rules to add',
|
|
274
|
+
choices: [
|
|
275
|
+
{ name: '\u2190 Back to categories', value: BACK_VALUE },
|
|
276
|
+
...category.rules.map((r) => {
|
|
277
|
+
const path = `${category.name}/${r.name}`;
|
|
278
|
+
const installed = installedPaths.has(path);
|
|
279
|
+
const desc = r.description ? ` ${ICONS.dash} ${r.description}` : '';
|
|
280
|
+
const suffix = installed ? chalk.dim(' (already installed)') : '';
|
|
281
|
+
return {
|
|
282
|
+
name: `${r.name}${desc}${suffix}`,
|
|
283
|
+
value: r.name,
|
|
284
|
+
};
|
|
285
|
+
}),
|
|
286
|
+
],
|
|
287
|
+
});
|
|
288
|
+
const realRules = selected.filter((v) => v !== BACK_VALUE);
|
|
289
|
+
if (realRules.length === 0) {
|
|
290
|
+
if (selected.includes(BACK_VALUE))
|
|
291
|
+
continue;
|
|
292
|
+
ui.warn('No rules selected');
|
|
293
|
+
continue;
|
|
294
|
+
}
|
|
295
|
+
for (const ruleName of realRules) {
|
|
296
|
+
const ruleInfo = category.rules.find((r) => r.name === ruleName);
|
|
297
|
+
allSelected.push({
|
|
298
|
+
category: category.name,
|
|
299
|
+
name: ruleName,
|
|
300
|
+
description: ruleInfo?.description ?? '',
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
processedCategories.add(category.name);
|
|
304
|
+
const remaining = registry.categories.filter((c) => !processedCategories.has(c.name));
|
|
305
|
+
if (remaining.length === 0)
|
|
306
|
+
break;
|
|
307
|
+
const addMore = await confirm({
|
|
308
|
+
message: 'Add rules from another category?',
|
|
309
|
+
default: true,
|
|
310
|
+
});
|
|
311
|
+
if (!addMore)
|
|
312
|
+
break;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
catch {
|
|
316
|
+
ui.error('Cancelled');
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
if (allSelected.length === 0)
|
|
320
|
+
return;
|
|
321
|
+
ui.newline();
|
|
322
|
+
ui.header('Rules to install:');
|
|
323
|
+
for (const rule of allSelected) {
|
|
324
|
+
const desc = rule.description ? chalk.dim(` ${ICONS.dash} ${rule.description}`) : '';
|
|
325
|
+
console.log(` ${rule.category}/${rule.name}${desc}`);
|
|
326
|
+
}
|
|
327
|
+
ui.newline();
|
|
328
|
+
try {
|
|
329
|
+
const shouldProceed = await confirm({
|
|
330
|
+
message: `Install ${pluralRules(allSelected.length)}?`,
|
|
331
|
+
default: true,
|
|
56
332
|
});
|
|
333
|
+
if (!shouldProceed) {
|
|
334
|
+
ui.error('Cancelled');
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
57
337
|
}
|
|
58
338
|
catch {
|
|
59
|
-
|
|
339
|
+
ui.error('Cancelled');
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
let anyAdded = false;
|
|
343
|
+
for (const rule of allSelected) {
|
|
344
|
+
const added = await downloadAndInstall(cwd, rule.category, rule.name, options);
|
|
345
|
+
if (added)
|
|
346
|
+
anyAdded = true;
|
|
347
|
+
}
|
|
348
|
+
if (anyAdded && !options.noCompile) {
|
|
349
|
+
const { runCompileFromAdd } = await import('./compile.js');
|
|
350
|
+
await runCompileFromAdd();
|
|
60
351
|
}
|
|
61
352
|
}
|
|
62
|
-
async function runAdd(
|
|
353
|
+
async function runAdd(ruleArg, options) {
|
|
63
354
|
if (options.list) {
|
|
64
|
-
await
|
|
355
|
+
await runList(ruleArg);
|
|
65
356
|
return;
|
|
66
357
|
}
|
|
67
358
|
const cwd = process.cwd();
|
|
@@ -70,23 +361,29 @@ async function runAdd(blockId, options) {
|
|
|
70
361
|
process.exitCode = 1;
|
|
71
362
|
return;
|
|
72
363
|
}
|
|
73
|
-
if (!
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
364
|
+
if (!ruleArg) {
|
|
365
|
+
if (!process.stdout.isTTY || !process.stdin.isTTY) {
|
|
366
|
+
ui.error('No rule specified', 'Usage: devw add <category>/<rule>');
|
|
367
|
+
process.exitCode = 1;
|
|
77
368
|
return;
|
|
78
|
-
|
|
369
|
+
}
|
|
370
|
+
await runInteractive(cwd, options);
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
if (!ruleArg.includes('/')) {
|
|
374
|
+
ui.error('Block format is no longer supported', 'Use: devw add <category>/<rule>. Run devw add --list to browse.');
|
|
375
|
+
process.exitCode = 1;
|
|
376
|
+
return;
|
|
79
377
|
}
|
|
80
|
-
const
|
|
81
|
-
if (!
|
|
82
|
-
ui.error(`
|
|
378
|
+
const parsed = validateInput(ruleArg);
|
|
379
|
+
if (!parsed) {
|
|
380
|
+
ui.error(`Invalid rule path "${ruleArg}"`, 'Format: <category>/<rule> — both must be kebab-case (e.g., typescript/strict)');
|
|
83
381
|
process.exitCode = 1;
|
|
84
382
|
return;
|
|
85
383
|
}
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
if (!options.noCompile) {
|
|
89
|
-
// Dynamic import to avoid circular dependency
|
|
384
|
+
const { category, name } = parsed;
|
|
385
|
+
const added = await downloadAndInstall(cwd, category, name, options);
|
|
386
|
+
if (added && !options.noCompile) {
|
|
90
387
|
const { runCompileFromAdd } = await import('./compile.js');
|
|
91
388
|
await runCompileFromAdd();
|
|
92
389
|
}
|
|
@@ -94,10 +391,12 @@ async function runAdd(blockId, options) {
|
|
|
94
391
|
export function registerAddCommand(program) {
|
|
95
392
|
program
|
|
96
393
|
.command('add')
|
|
97
|
-
.argument('[
|
|
98
|
-
.description('
|
|
99
|
-
.option('--list', 'List
|
|
394
|
+
.argument('[rule]', 'Rule path: <category>/<rule>')
|
|
395
|
+
.description('Add rules from the dev-workflows registry')
|
|
396
|
+
.option('--list', 'List available rules')
|
|
100
397
|
.option('--no-compile', 'Skip auto-compile after adding')
|
|
101
|
-
.
|
|
398
|
+
.option('--force', 'Overwrite without asking')
|
|
399
|
+
.option('--dry-run', 'Show output without writing files')
|
|
400
|
+
.action((rule, options) => runAdd(rule, options));
|
|
102
401
|
}
|
|
103
402
|
//# sourceMappingURL=add.js.map
|
package/dist/commands/add.js.map
CHANGED
|
@@ -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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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Command } from 'commander';
|
|
2
|
-
import type { ProjectConfig, Rule } from '../bridges/types.js';
|
|
2
|
+
import type { ProjectConfig, PulledEntry, Rule } from '../bridges/types.js';
|
|
3
3
|
export interface CheckResult {
|
|
4
4
|
passed: boolean;
|
|
5
5
|
message: string;
|
|
@@ -12,6 +12,7 @@ export declare function checkDuplicateIds(rules: Rule[]): CheckResult;
|
|
|
12
12
|
export declare function checkScopeFormat(rules: Rule[]): CheckResult;
|
|
13
13
|
export declare function checkBridgesAvailable(config: ProjectConfig): CheckResult;
|
|
14
14
|
export declare function checkSymlinks(cwd: string, config: ProjectConfig): Promise<CheckResult>;
|
|
15
|
+
export declare function checkPulledFilesExist(cwd: string, pulled: PulledEntry[]): Promise<CheckResult>;
|
|
15
16
|
export declare function checkHashSync(cwd: string, rules: Rule[]): Promise<CheckResult>;
|
|
16
17
|
export declare function registerDoctorCommand(program: Command): void;
|
|
17
18
|
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,OAAO,KAAK,EAAU,aAAa,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,OAAO,KAAK,EAAU,aAAa,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAQpF,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAKzE;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAQxE;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA2CvE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,WAAW,CA2B5D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,WAAW,CAmB3D;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,CAWxE;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,CAkC5F;AAED,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAwBpG;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAmBpF;AAsGD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAK5D"}
|
package/dist/commands/doctor.js
CHANGED
|
@@ -153,6 +153,27 @@ export async function checkSymlinks(cwd, config) {
|
|
|
153
153
|
}
|
|
154
154
|
return { passed: true, message: 'Symlinks are valid' };
|
|
155
155
|
}
|
|
156
|
+
export async function checkPulledFilesExist(cwd, pulled) {
|
|
157
|
+
if (pulled.length === 0) {
|
|
158
|
+
return { passed: true, message: 'Pulled files check skipped (no pulled rules)', skipped: true };
|
|
159
|
+
}
|
|
160
|
+
const missing = [];
|
|
161
|
+
for (const entry of pulled) {
|
|
162
|
+
const slug = entry.path.replace(/\//g, '-');
|
|
163
|
+
const fileName = `pulled-${slug}.yml`;
|
|
164
|
+
const filePath = join(cwd, '.dwf', 'rules', fileName);
|
|
165
|
+
if (!(await fileExists(filePath))) {
|
|
166
|
+
missing.push(fileName);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (missing.length > 0) {
|
|
170
|
+
return {
|
|
171
|
+
passed: false,
|
|
172
|
+
message: `Missing pulled rule files: ${missing.join(', ')}`,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
return { passed: true, message: `Pulled rule files exist (${String(pulled.length)} entries)` };
|
|
176
|
+
}
|
|
156
177
|
export async function checkHashSync(cwd, rules) {
|
|
157
178
|
const storedHash = await readStoredHash(cwd);
|
|
158
179
|
if (storedHash === null) {
|
|
@@ -230,7 +251,10 @@ async function runDoctor() {
|
|
|
230
251
|
// Check 7: Symlinks valid (conditional on mode)
|
|
231
252
|
const symlinkResult = await checkSymlinks(cwd, config);
|
|
232
253
|
results.push(symlinkResult);
|
|
233
|
-
// Check 8:
|
|
254
|
+
// Check 8: Pulled files exist
|
|
255
|
+
const pulledResult = await checkPulledFilesExist(cwd, config.pulled);
|
|
256
|
+
results.push(pulledResult);
|
|
257
|
+
// Check 9: Hash sync (conditional on compiled files existing)
|
|
234
258
|
const hashResult = await checkHashSync(cwd, rules);
|
|
235
259
|
results.push(hashResult);
|
|
236
260
|
// Output
|