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.
- package/README.md +68 -21
- package/dist/bridges/types.d.ts +20 -0
- package/dist/bridges/types.d.ts.map +1 -1
- package/dist/bridges/types.js +5 -1
- package/dist/bridges/types.js.map +1 -1
- package/dist/commands/add.d.ts +26 -0
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +517 -57
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/compile.d.ts +1 -0
- package/dist/commands/compile.d.ts.map +1 -1
- package/dist/commands/compile.js +8 -3
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/doctor.d.ts +3 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +49 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +15 -3
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +51 -17
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/remove.d.ts.map +1 -1
- package/dist/commands/remove.js +111 -22
- package/dist/commands/remove.js.map +1 -1
- package/dist/commands/watch.js +1 -1
- package/dist/commands/watch.js.map +1 -1
- package/dist/core/assets.d.ts +28 -0
- package/dist/core/assets.d.ts.map +1 -0
- package/dist/core/assets.js +169 -0
- package/dist/core/assets.js.map +1 -0
- 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 +28 -0
- package/dist/core/parser.js.map +1 -1
- package/dist/core/settings-merge.d.ts +6 -0
- package/dist/core/settings-merge.d.ts.map +1 -0
- package/dist/core/settings-merge.js +41 -0
- package/dist/core/settings-merge.js.map +1 -0
- 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 +13 -0
- package/dist/utils/github.d.ts.map +1 -0
- package/dist/utils/github.js +76 -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/commands/remove.js
CHANGED
|
@@ -1,53 +1,142 @@
|
|
|
1
1
|
import { join } from 'node:path';
|
|
2
|
-
import {
|
|
2
|
+
import { readFile, writeFile, unlink } from 'node:fs/promises';
|
|
3
|
+
import { parse, stringify } from 'yaml';
|
|
4
|
+
import { checkbox, confirm } from '@inquirer/prompts';
|
|
3
5
|
import { readConfig } from '../core/parser.js';
|
|
4
|
-
import { uninstallBlock } from '../blocks/installer.js';
|
|
5
6
|
import { fileExists } from '../utils/fs.js';
|
|
7
|
+
import { isAssetType, removeAsset } from '../core/assets.js';
|
|
8
|
+
import { validateInput } from './add.js';
|
|
6
9
|
import * as ui from '../utils/ui.js';
|
|
7
|
-
function
|
|
8
|
-
|
|
10
|
+
async function removePulledEntry(cwd, path) {
|
|
11
|
+
const configPath = join(cwd, '.dwf', 'config.yml');
|
|
12
|
+
const raw = await readFile(configPath, 'utf-8');
|
|
13
|
+
const doc = parse(raw);
|
|
14
|
+
const pulled = Array.isArray(doc['pulled']) ? doc['pulled'] : [];
|
|
15
|
+
doc['pulled'] = pulled.filter((p) => p.path !== path);
|
|
16
|
+
await writeFile(configPath, stringify(doc, { lineWidth: 0 }), 'utf-8');
|
|
9
17
|
}
|
|
10
|
-
async function
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
18
|
+
async function removeAssetEntry(cwd, type, name) {
|
|
19
|
+
const configPath = join(cwd, '.dwf', 'config.yml');
|
|
20
|
+
const raw = await readFile(configPath, 'utf-8');
|
|
21
|
+
const doc = parse(raw);
|
|
22
|
+
const assets = Array.isArray(doc['assets']) ? doc['assets'] : [];
|
|
23
|
+
doc['assets'] = assets.filter((a) => !(a.type === type && a.name === name));
|
|
24
|
+
await writeFile(configPath, stringify(doc, { lineWidth: 0 }), 'utf-8');
|
|
15
25
|
}
|
|
16
|
-
async function
|
|
26
|
+
async function removeRule(cwd, path) {
|
|
27
|
+
const parts = path.split('/');
|
|
28
|
+
if (parts.length !== 2)
|
|
29
|
+
return false;
|
|
30
|
+
const category = parts[0];
|
|
31
|
+
const name = parts[1];
|
|
32
|
+
if (!category || !name)
|
|
33
|
+
return false;
|
|
34
|
+
const fileName = `pulled-${category}-${name}.yml`;
|
|
35
|
+
const filePath = join(cwd, '.dwf', 'rules', fileName);
|
|
36
|
+
if (await fileExists(filePath)) {
|
|
37
|
+
await unlink(filePath);
|
|
38
|
+
}
|
|
39
|
+
await removePulledEntry(cwd, path);
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
async function runRemove(ruleArg) {
|
|
17
43
|
const cwd = process.cwd();
|
|
18
|
-
if (!(await
|
|
44
|
+
if (!(await fileExists(join(cwd, '.dwf', 'config.yml')))) {
|
|
19
45
|
ui.error('.dwf/config.yml not found', 'Run devw init to initialize the project');
|
|
20
46
|
process.exitCode = 1;
|
|
21
47
|
return;
|
|
22
48
|
}
|
|
23
49
|
const config = await readConfig(cwd);
|
|
24
|
-
if (!
|
|
25
|
-
if (config.
|
|
26
|
-
ui.warn('No
|
|
50
|
+
if (!ruleArg) {
|
|
51
|
+
if (config.pulled.length === 0) {
|
|
52
|
+
ui.warn('No rules installed');
|
|
27
53
|
return;
|
|
28
54
|
}
|
|
55
|
+
let selectedRules;
|
|
29
56
|
try {
|
|
30
|
-
|
|
57
|
+
selectedRules = await checkbox({
|
|
58
|
+
message: 'Which rules to remove?',
|
|
59
|
+
choices: config.pulled.map((p) => ({
|
|
60
|
+
name: `${p.path} (v${p.version})`,
|
|
61
|
+
value: p.path,
|
|
62
|
+
})),
|
|
63
|
+
});
|
|
31
64
|
}
|
|
32
65
|
catch {
|
|
33
66
|
return;
|
|
34
67
|
}
|
|
68
|
+
if (selectedRules.length === 0) {
|
|
69
|
+
ui.warn('No rules selected');
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
const shouldProceed = await confirm({
|
|
74
|
+
message: `Remove ${String(selectedRules.length)} rule(s)?`,
|
|
75
|
+
default: true,
|
|
76
|
+
});
|
|
77
|
+
if (!shouldProceed) {
|
|
78
|
+
ui.info('Remove cancelled');
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
for (const path of selectedRules) {
|
|
86
|
+
await removeRule(cwd, path);
|
|
87
|
+
ui.success(`Removed ${path}`);
|
|
88
|
+
}
|
|
89
|
+
const { runCompileFromAdd } = await import('./compile.js');
|
|
90
|
+
await runCompileFromAdd();
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
if (!ruleArg.includes('/')) {
|
|
94
|
+
ui.error('Block format is no longer supported', 'Use: devw remove <category>/<rule>');
|
|
95
|
+
process.exitCode = 1;
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const parsed = validateInput(ruleArg);
|
|
99
|
+
if (!parsed) {
|
|
100
|
+
ui.error(`Invalid rule path "${ruleArg}"`, 'Format: <category>/<rule> — both must be kebab-case (e.g., typescript/strict)');
|
|
101
|
+
process.exitCode = 1;
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const { category, name } = parsed;
|
|
105
|
+
if (isAssetType(category)) {
|
|
106
|
+
const installed = config.assets.find((a) => a.type === category && a.name === name);
|
|
107
|
+
if (!installed) {
|
|
108
|
+
ui.error(`Asset "${category}/${name}" is not installed`, config.assets.length > 0
|
|
109
|
+
? `Installed assets: ${config.assets.map((a) => `${a.type}/${a.name}`).join(', ')}`
|
|
110
|
+
: 'No assets installed');
|
|
111
|
+
process.exitCode = 1;
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
await removeAsset(cwd, category, name);
|
|
115
|
+
await removeAssetEntry(cwd, category, name);
|
|
116
|
+
ui.success(`Removed ${category}/${name}`);
|
|
117
|
+
const { runCompileFromAdd } = await import('./compile.js');
|
|
118
|
+
await runCompileFromAdd();
|
|
119
|
+
return;
|
|
35
120
|
}
|
|
36
|
-
|
|
37
|
-
|
|
121
|
+
const source = `${category}/${name}`;
|
|
122
|
+
const installed = config.pulled.find((p) => p.path === source);
|
|
123
|
+
if (!installed) {
|
|
124
|
+
ui.error(`Rule "${source}" is not installed`, config.pulled.length > 0
|
|
125
|
+
? `Installed rules: ${config.pulled.map((p) => p.path).join(', ')}`
|
|
126
|
+
: 'No rules installed');
|
|
38
127
|
process.exitCode = 1;
|
|
39
128
|
return;
|
|
40
129
|
}
|
|
41
|
-
|
|
42
|
-
ui.success(`Removed ${
|
|
130
|
+
await removeRule(cwd, source);
|
|
131
|
+
ui.success(`Removed ${source}`);
|
|
43
132
|
const { runCompileFromAdd } = await import('./compile.js');
|
|
44
133
|
await runCompileFromAdd();
|
|
45
134
|
}
|
|
46
135
|
export function registerRemoveCommand(program) {
|
|
47
136
|
program
|
|
48
137
|
.command('remove')
|
|
49
|
-
.argument('[
|
|
50
|
-
.description('Remove an installed rule
|
|
51
|
-
.action((
|
|
138
|
+
.argument('[rule]', 'Rule path: <category>/<rule>')
|
|
139
|
+
.description('Remove an installed rule')
|
|
140
|
+
.action((rule) => runRemove(rule));
|
|
52
141
|
}
|
|
53
142
|
//# sourceMappingURL=remove.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remove.js","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"remove.js","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/watch.js
CHANGED
|
@@ -34,7 +34,7 @@ async function runWatch(options) {
|
|
|
34
34
|
process.exitCode = 1;
|
|
35
35
|
return;
|
|
36
36
|
}
|
|
37
|
-
const watcher = chokidar.watch(['**/*.yml', '**/*.yaml'], {
|
|
37
|
+
const watcher = chokidar.watch(['**/*.yml', '**/*.yaml', 'assets/**/*.md', 'assets/**/*.json'], {
|
|
38
38
|
cwd: dwfDir,
|
|
39
39
|
ignoreInitial: true,
|
|
40
40
|
awaitWriteFinish: { stabilityThreshold: 100, pollInterval: 50 },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAMvC,MAAM,WAAW,GAAG,GAAG,CAAC;AAExB,SAAS,kBAAkB,CAAC,MAAqB;IAC/C,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAChC,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;YACf,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC;QAC1E,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,IAAI,wBAAwB,EAAE,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC;IACD,EAAE,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,YAAY,CAAC,QAAQ,GAAG,KAAK;IACpC,EAAE,CAAC,OAAO,EAAE,CAAC;IACb,IAAI,QAAQ,EAAE,CAAC;QACb,EAAE,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IACrD,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACpC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,OAAqB;IAC3C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAEjC,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,EAAE,CAAC,KAAK,CAAC,iBAAiB,EAAE,yCAAyC,CAAC,CAAC;QACvE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { AssetType, ProjectConfig } from '../bridges/types.js';
|
|
2
|
+
export declare function isAssetType(category: string): category is AssetType;
|
|
3
|
+
export interface AssetFrontmatter {
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
version: string;
|
|
7
|
+
tool?: string;
|
|
8
|
+
output_path?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function parseAssetFrontmatter(content: string): {
|
|
11
|
+
frontmatter: AssetFrontmatter;
|
|
12
|
+
body: string;
|
|
13
|
+
};
|
|
14
|
+
export interface AssetFile {
|
|
15
|
+
type: AssetType;
|
|
16
|
+
name: string;
|
|
17
|
+
content: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function readAssets(cwd: string): Promise<AssetFile[]>;
|
|
20
|
+
export interface DeployResult {
|
|
21
|
+
deployed: string[];
|
|
22
|
+
}
|
|
23
|
+
export declare function deployCommands(cwd: string, _config: ProjectConfig): Promise<DeployResult>;
|
|
24
|
+
export declare function deployTemplates(cwd: string, _config: ProjectConfig): Promise<DeployResult>;
|
|
25
|
+
export declare function deployHooks(cwd: string, _config: ProjectConfig): Promise<DeployResult>;
|
|
26
|
+
export declare function deployAssets(cwd: string, config: ProjectConfig): Promise<DeployResult>;
|
|
27
|
+
export declare function removeAsset(cwd: string, type: AssetType, name: string): Promise<boolean>;
|
|
28
|
+
//# sourceMappingURL=assets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../src/core/assets.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAOpE,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,IAAI,SAAS,CAEnE;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,WAAW,EAAE,gBAAgB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CA+BtG;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CA4BlE;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CA0B/F;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAyBhG;AAED,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAiC5F;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAa5F;AAED,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ9F"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { readFile, writeFile, readdir, mkdir, unlink } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { parse as parseYaml } from 'yaml';
|
|
4
|
+
import { ASSET_TYPE } from '../bridges/types.js';
|
|
5
|
+
import { fileExists } from '../utils/fs.js';
|
|
6
|
+
import { mergeSettingsFile } from './settings-merge.js';
|
|
7
|
+
const ASSET_TYPE_VALUES = new Set(Object.values(ASSET_TYPE));
|
|
8
|
+
export function isAssetType(category) {
|
|
9
|
+
return ASSET_TYPE_VALUES.has(category);
|
|
10
|
+
}
|
|
11
|
+
export function parseAssetFrontmatter(content) {
|
|
12
|
+
const fmRegex = /^---\n([\s\S]*?)\n---\n?([\s\S]*)$/;
|
|
13
|
+
const match = fmRegex.exec(content);
|
|
14
|
+
if (!match?.[1]) {
|
|
15
|
+
return {
|
|
16
|
+
frontmatter: { name: '', description: '', version: '0.1.0' },
|
|
17
|
+
body: content,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
const raw = parseYaml(match[1]);
|
|
21
|
+
if (!raw || typeof raw !== 'object') {
|
|
22
|
+
return {
|
|
23
|
+
frontmatter: { name: '', description: '', version: '0.1.0' },
|
|
24
|
+
body: match[2] ?? '',
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
const fm = raw;
|
|
28
|
+
return {
|
|
29
|
+
frontmatter: {
|
|
30
|
+
name: typeof fm['name'] === 'string' ? fm['name'] : '',
|
|
31
|
+
description: typeof fm['description'] === 'string' ? fm['description'] : '',
|
|
32
|
+
version: typeof fm['version'] === 'string' ? fm['version'] : '0.1.0',
|
|
33
|
+
tool: typeof fm['tool'] === 'string' ? fm['tool'] : undefined,
|
|
34
|
+
output_path: typeof fm['output_path'] === 'string' ? fm['output_path'] : undefined,
|
|
35
|
+
},
|
|
36
|
+
body: match[2] ?? '',
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export async function readAssets(cwd) {
|
|
40
|
+
const assetsDir = join(cwd, '.dwf', 'assets');
|
|
41
|
+
const assets = [];
|
|
42
|
+
for (const type of Object.values(ASSET_TYPE)) {
|
|
43
|
+
const typeDir = join(assetsDir, `${type}s`);
|
|
44
|
+
if (!(await fileExists(typeDir)))
|
|
45
|
+
continue;
|
|
46
|
+
let entries;
|
|
47
|
+
try {
|
|
48
|
+
entries = await readdir(typeDir);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
for (const file of entries) {
|
|
54
|
+
const filePath = join(typeDir, file);
|
|
55
|
+
try {
|
|
56
|
+
const content = await readFile(filePath, 'utf-8');
|
|
57
|
+
const name = file.replace(/\.(md|json|yml|yaml)$/, '');
|
|
58
|
+
assets.push({ type, name, content });
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// Skip unreadable files
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return assets;
|
|
66
|
+
}
|
|
67
|
+
export async function deployCommands(cwd, _config) {
|
|
68
|
+
const commandsDir = join(cwd, '.dwf', 'assets', 'commands');
|
|
69
|
+
const outputDir = join(cwd, '.claude', 'commands');
|
|
70
|
+
const deployed = [];
|
|
71
|
+
if (!(await fileExists(commandsDir)))
|
|
72
|
+
return { deployed };
|
|
73
|
+
let entries;
|
|
74
|
+
try {
|
|
75
|
+
entries = await readdir(commandsDir);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return { deployed };
|
|
79
|
+
}
|
|
80
|
+
await mkdir(outputDir, { recursive: true });
|
|
81
|
+
for (const file of entries) {
|
|
82
|
+
if (!file.endsWith('.md'))
|
|
83
|
+
continue;
|
|
84
|
+
const content = await readFile(join(commandsDir, file), 'utf-8');
|
|
85
|
+
const { body } = parseAssetFrontmatter(content);
|
|
86
|
+
const outputPath = join(outputDir, file);
|
|
87
|
+
await writeFile(outputPath, body.trimStart(), 'utf-8');
|
|
88
|
+
deployed.push(`.claude/commands/${file}`);
|
|
89
|
+
}
|
|
90
|
+
return { deployed };
|
|
91
|
+
}
|
|
92
|
+
export async function deployTemplates(cwd, _config) {
|
|
93
|
+
const templatesDir = join(cwd, '.dwf', 'assets', 'templates');
|
|
94
|
+
const deployed = [];
|
|
95
|
+
if (!(await fileExists(templatesDir)))
|
|
96
|
+
return { deployed };
|
|
97
|
+
let entries;
|
|
98
|
+
try {
|
|
99
|
+
entries = await readdir(templatesDir);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return { deployed };
|
|
103
|
+
}
|
|
104
|
+
for (const file of entries) {
|
|
105
|
+
if (!file.endsWith('.md'))
|
|
106
|
+
continue;
|
|
107
|
+
const content = await readFile(join(templatesDir, file), 'utf-8');
|
|
108
|
+
const { frontmatter, body } = parseAssetFrontmatter(content);
|
|
109
|
+
const outputPath = frontmatter.output_path ?? 'docs/specs';
|
|
110
|
+
const outputDir = join(cwd, outputPath);
|
|
111
|
+
await mkdir(outputDir, { recursive: true });
|
|
112
|
+
await writeFile(join(outputDir, file), body.trimStart(), 'utf-8');
|
|
113
|
+
deployed.push(`${outputPath}/${file}`);
|
|
114
|
+
}
|
|
115
|
+
return { deployed };
|
|
116
|
+
}
|
|
117
|
+
export async function deployHooks(cwd, _config) {
|
|
118
|
+
const hooksDir = join(cwd, '.dwf', 'assets', 'hooks');
|
|
119
|
+
const deployed = [];
|
|
120
|
+
if (!(await fileExists(hooksDir)))
|
|
121
|
+
return { deployed };
|
|
122
|
+
let entries;
|
|
123
|
+
try {
|
|
124
|
+
entries = await readdir(hooksDir);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
return { deployed };
|
|
128
|
+
}
|
|
129
|
+
for (const file of entries) {
|
|
130
|
+
if (!file.endsWith('.json'))
|
|
131
|
+
continue;
|
|
132
|
+
const content = await readFile(join(hooksDir, file), 'utf-8');
|
|
133
|
+
let parsed;
|
|
134
|
+
try {
|
|
135
|
+
parsed = JSON.parse(content);
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
if (!parsed || typeof parsed !== 'object')
|
|
141
|
+
continue;
|
|
142
|
+
const hookDoc = parsed;
|
|
143
|
+
const settings = hookDoc['settings'];
|
|
144
|
+
if (!settings || typeof settings !== 'object' || Array.isArray(settings))
|
|
145
|
+
continue;
|
|
146
|
+
await mergeSettingsFile(cwd, settings);
|
|
147
|
+
deployed.push('.claude/settings.local.json');
|
|
148
|
+
}
|
|
149
|
+
return { deployed: [...new Set(deployed)] };
|
|
150
|
+
}
|
|
151
|
+
export async function deployAssets(cwd, config) {
|
|
152
|
+
const allDeployed = [];
|
|
153
|
+
const commandResult = await deployCommands(cwd, config);
|
|
154
|
+
allDeployed.push(...commandResult.deployed);
|
|
155
|
+
const templateResult = await deployTemplates(cwd, config);
|
|
156
|
+
allDeployed.push(...templateResult.deployed);
|
|
157
|
+
const hookResult = await deployHooks(cwd, config);
|
|
158
|
+
allDeployed.push(...hookResult.deployed);
|
|
159
|
+
return { deployed: allDeployed };
|
|
160
|
+
}
|
|
161
|
+
export async function removeAsset(cwd, type, name) {
|
|
162
|
+
const ext = type === 'hook' ? 'json' : 'md';
|
|
163
|
+
const filePath = join(cwd, '.dwf', 'assets', `${type}s`, `${name}.${ext}`);
|
|
164
|
+
if (!(await fileExists(filePath)))
|
|
165
|
+
return false;
|
|
166
|
+
await unlink(filePath);
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=assets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assets.js","sourceRoot":"","sources":["../../src/core/assets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAkB,MAAM,qBAAqB,CAAC;AAExE,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAS,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;AAErE,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,OAAO,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACzC,CAAC;AAUD,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,MAAM,OAAO,GAAG,oCAAoC,CAAC;IACrD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEpC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChB,OAAO;YACL,WAAW,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE;YAC5D,IAAI,EAAE,OAAO;SACd,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAY,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO;YACL,WAAW,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE;YAC5D,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;SACrB,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,GAAG,GAA8B,CAAC;IAE1C,OAAO;QACL,WAAW,EAAE;YACX,IAAI,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;YACtD,WAAW,EAAE,OAAO,EAAE,CAAC,aAAa,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE;YAC3E,OAAO,EAAE,OAAO,EAAE,CAAC,SAAS,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO;YACpE,IAAI,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;YAC7D,WAAW,EAAE,OAAO,EAAE,CAAC,aAAa,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS;SACnF;QACD,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;KACrB,CAAC;AACJ,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW;IAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAgB,EAAE,CAAC;IAE/B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,GAAG,CAAC,CAAC;QAC5C,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;YAAE,SAAS;QAE3C,IAAI,OAAiB,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACrC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAClD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;gBACvD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACvC,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAW,EAAE,OAAsB;IACtE,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;QAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAE1D,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,QAAQ,EAAE,CAAC;IACtB,CAAC;IAED,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5C,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QACpC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QACjE,MAAM,EAAE,IAAI,EAAE,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAChD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACzC,MAAM,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;QACvD,QAAQ,CAAC,IAAI,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW,EAAE,OAAsB;IACvE,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,YAAY,CAAC,CAAC;QAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAE3D,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,QAAQ,EAAE,CAAC;IACtB,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QACpC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QAClE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAC7D,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,IAAI,YAAY,CAAC;QAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QACxC,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,MAAM,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;QAClE,QAAQ,CAAC,IAAI,CAAC,GAAG,UAAU,IAAI,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,OAAsB;IACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;QAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAEvD,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,QAAQ,EAAE,CAAC;IACtB,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAS;QACtC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QAC9D,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,SAAS;QACpD,MAAM,OAAO,GAAG,MAAiC,CAAC;QAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACrC,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;YAAE,SAAS;QAEnF,MAAM,iBAAiB,CAAC,GAAG,EAAE,QAAqC,CAAC,CAAC;QACpE,QAAQ,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,MAAqB;IACnE,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,MAAM,aAAa,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACxD,WAAW,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAE5C,MAAM,cAAc,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC1D,WAAW,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAE7C,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAClD,WAAW,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAEzC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,IAAe,EAAE,IAAY;IAC1E,MAAM,GAAG,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;IAE3E,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAEhD,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;IACvB,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface ConvertedRule {
|
|
2
|
+
id: string;
|
|
3
|
+
scope: string;
|
|
4
|
+
severity: 'error';
|
|
5
|
+
content: string;
|
|
6
|
+
tags: string[];
|
|
7
|
+
source: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ConvertResult {
|
|
10
|
+
name: string;
|
|
11
|
+
description: string;
|
|
12
|
+
version: string;
|
|
13
|
+
scope: string;
|
|
14
|
+
tags: string[];
|
|
15
|
+
rules: ConvertedRule[];
|
|
16
|
+
}
|
|
17
|
+
export declare function convert(markdown: string, category: string, name: string): ConvertResult;
|
|
18
|
+
//# sourceMappingURL=converter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"converter.d.ts","sourceRoot":"","sources":["../../src/core/converter.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB;AAqHD,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CA2BvF"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { parse as parseYaml } from 'yaml';
|
|
2
|
+
import { isValidScope } from './schema.js';
|
|
3
|
+
function parseFrontmatter(markdown) {
|
|
4
|
+
const fmRegex = /^---\n([\s\S]*?)\n---\n?([\s\S]*)$/;
|
|
5
|
+
const match = fmRegex.exec(markdown);
|
|
6
|
+
if (!match?.[1]) {
|
|
7
|
+
throw new Error('Invalid rule file: missing YAML frontmatter');
|
|
8
|
+
}
|
|
9
|
+
const raw = parseYaml(match[1]);
|
|
10
|
+
if (!raw || typeof raw !== 'object') {
|
|
11
|
+
throw new Error('Invalid rule file: frontmatter is not an object');
|
|
12
|
+
}
|
|
13
|
+
const fm = raw;
|
|
14
|
+
const name = typeof fm['name'] === 'string' ? fm['name'] : '';
|
|
15
|
+
const description = typeof fm['description'] === 'string' ? fm['description'] : '';
|
|
16
|
+
const version = typeof fm['version'] === 'string' ? fm['version'] : '0.1.0';
|
|
17
|
+
const scope = typeof fm['scope'] === 'string' ? fm['scope'] : 'conventions';
|
|
18
|
+
const tags = Array.isArray(fm['tags'])
|
|
19
|
+
? fm['tags'].filter((t) => typeof t === 'string')
|
|
20
|
+
: [];
|
|
21
|
+
if (!name) {
|
|
22
|
+
throw new Error('Invalid rule file: missing "name" in frontmatter');
|
|
23
|
+
}
|
|
24
|
+
if (!description) {
|
|
25
|
+
throw new Error('Invalid rule file: missing "description" in frontmatter');
|
|
26
|
+
}
|
|
27
|
+
if (!isValidScope(scope)) {
|
|
28
|
+
throw new Error(`Invalid rule file: invalid scope "${scope}"`);
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
frontmatter: { name, description, version, scope, tags },
|
|
32
|
+
body: match[2] ?? '',
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function toKebabCase(text) {
|
|
36
|
+
return text
|
|
37
|
+
.toLowerCase()
|
|
38
|
+
.replace(/[^a-z0-9\s-]/g, '')
|
|
39
|
+
.replace(/\s+/g, '-')
|
|
40
|
+
.replace(/-+/g, '-')
|
|
41
|
+
.replace(/^-|-$/g, '');
|
|
42
|
+
}
|
|
43
|
+
function parseBullets(body) {
|
|
44
|
+
const lines = body.split('\n');
|
|
45
|
+
const bullets = [];
|
|
46
|
+
let currentHeading = null;
|
|
47
|
+
let headingIndex = 0;
|
|
48
|
+
let currentBullet = null;
|
|
49
|
+
function flushBullet() {
|
|
50
|
+
if (currentBullet !== null) {
|
|
51
|
+
bullets.push({
|
|
52
|
+
heading: currentHeading,
|
|
53
|
+
content: currentBullet.trimEnd(),
|
|
54
|
+
index: headingIndex++,
|
|
55
|
+
});
|
|
56
|
+
currentBullet = null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
for (const line of lines) {
|
|
60
|
+
if (line.startsWith('## ')) {
|
|
61
|
+
flushBullet();
|
|
62
|
+
currentHeading = toKebabCase(line.slice(3).trim());
|
|
63
|
+
headingIndex = 0;
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (line.startsWith('- ')) {
|
|
67
|
+
flushBullet();
|
|
68
|
+
currentBullet = line.slice(2);
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
// Indented continuation (2+ spaces) of a bullet
|
|
72
|
+
if (currentBullet !== null && line.length > 0 && /^\s{2,}/.test(line)) {
|
|
73
|
+
currentBullet += '\n' + line.trimStart();
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
// Empty line — might be between bullets, keep accumulating
|
|
77
|
+
if (currentBullet !== null && line.trim() === '') {
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
// Non-bullet, non-heading content — flush if we had a bullet
|
|
81
|
+
if (currentBullet !== null && line.trim() !== '') {
|
|
82
|
+
flushBullet();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
flushBullet();
|
|
86
|
+
return bullets;
|
|
87
|
+
}
|
|
88
|
+
export function convert(markdown, category, name) {
|
|
89
|
+
const { frontmatter, body } = parseFrontmatter(markdown);
|
|
90
|
+
const bullets = parseBullets(body);
|
|
91
|
+
const source = `${category}/${name}`;
|
|
92
|
+
const rules = bullets.map((bullet) => {
|
|
93
|
+
const headingPart = bullet.heading ? `-${bullet.heading}` : '';
|
|
94
|
+
const id = `pulled-${category}-${name}${headingPart}-${String(bullet.index)}`;
|
|
95
|
+
return {
|
|
96
|
+
id,
|
|
97
|
+
scope: frontmatter.scope,
|
|
98
|
+
severity: 'error',
|
|
99
|
+
content: bullet.content,
|
|
100
|
+
tags: [...frontmatter.tags],
|
|
101
|
+
source,
|
|
102
|
+
};
|
|
103
|
+
});
|
|
104
|
+
return {
|
|
105
|
+
name: frontmatter.name,
|
|
106
|
+
description: frontmatter.description,
|
|
107
|
+
version: frontmatter.version,
|
|
108
|
+
scope: frontmatter.scope,
|
|
109
|
+
tags: frontmatter.tags,
|
|
110
|
+
rules,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=converter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"converter.js","sourceRoot":"","sources":["../../src/core/converter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/core/parser.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/core/parser.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,aAAa,EAAsC,MAAM,qBAAqB,CAAC;AAmBnG,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAwEpE;AAsBD,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CA+B5D"}
|
package/dist/core/parser.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { readFile, readdir } from 'node:fs/promises';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { parse } from 'yaml';
|
|
4
|
+
import { ASSET_TYPE } from '../bridges/types.js';
|
|
4
5
|
import { isValidScope } from './schema.js';
|
|
5
6
|
export async function readConfig(cwd) {
|
|
6
7
|
const configPath = join(cwd, '.dwf', 'config.yml');
|
|
@@ -31,12 +32,38 @@ export async function readConfig(cwd) {
|
|
|
31
32
|
const blocks = Array.isArray(blocksRaw)
|
|
32
33
|
? blocksRaw.filter((b) => typeof b === 'string')
|
|
33
34
|
: [];
|
|
35
|
+
const pulledRaw = doc['pulled'];
|
|
36
|
+
const pulled = Array.isArray(pulledRaw)
|
|
37
|
+
? pulledRaw
|
|
38
|
+
.filter((p) => p !== null && typeof p === 'object')
|
|
39
|
+
.map((p) => ({
|
|
40
|
+
path: typeof p['path'] === 'string' ? p['path'] : '',
|
|
41
|
+
version: typeof p['version'] === 'string' ? p['version'] : '',
|
|
42
|
+
pulled_at: typeof p['pulled_at'] === 'string' ? p['pulled_at'] : '',
|
|
43
|
+
}))
|
|
44
|
+
.filter((p) => p.path !== '')
|
|
45
|
+
: [];
|
|
46
|
+
const assetTypeValues = new Set(Object.values(ASSET_TYPE));
|
|
47
|
+
const assetsRaw = doc['assets'];
|
|
48
|
+
const assets = Array.isArray(assetsRaw)
|
|
49
|
+
? assetsRaw
|
|
50
|
+
.filter((a) => a !== null && typeof a === 'object')
|
|
51
|
+
.map((a) => ({
|
|
52
|
+
type: (typeof a['type'] === 'string' ? a['type'] : ''),
|
|
53
|
+
name: typeof a['name'] === 'string' ? a['name'] : '',
|
|
54
|
+
version: typeof a['version'] === 'string' ? a['version'] : '',
|
|
55
|
+
installed_at: typeof a['installed_at'] === 'string' ? a['installed_at'] : '',
|
|
56
|
+
}))
|
|
57
|
+
.filter((a) => a.name !== '' && assetTypeValues.has(a.type))
|
|
58
|
+
: [];
|
|
34
59
|
return {
|
|
35
60
|
version,
|
|
36
61
|
project: { name: projectName, description: projectDescription },
|
|
37
62
|
tools,
|
|
38
63
|
mode: modeRaw,
|
|
39
64
|
blocks,
|
|
65
|
+
pulled,
|
|
66
|
+
assets,
|
|
40
67
|
};
|
|
41
68
|
}
|
|
42
69
|
function normalizeRule(raw, scope) {
|
|
@@ -54,6 +81,7 @@ function normalizeRule(raw, scope) {
|
|
|
54
81
|
tags: raw.tags,
|
|
55
82
|
enabled,
|
|
56
83
|
sourceBlock: raw.sourceBlock,
|
|
84
|
+
source: raw.source,
|
|
57
85
|
};
|
|
58
86
|
}
|
|
59
87
|
export async function readRules(cwd) {
|