dev-workflows 0.1.4 → 0.2.1
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 +11 -0
- package/dist/bridges/claude.d.ts.map +1 -1
- package/dist/bridges/claude.js +5 -3
- package/dist/bridges/claude.js.map +1 -1
- package/dist/bridges/copilot.d.ts +3 -0
- package/dist/bridges/copilot.d.ts.map +1 -0
- package/dist/bridges/copilot.js +38 -0
- package/dist/bridges/copilot.js.map +1 -0
- package/dist/bridges/cursor.d.ts.map +1 -1
- package/dist/bridges/cursor.js +5 -3
- package/dist/bridges/cursor.js.map +1 -1
- package/dist/bridges/gemini.d.ts.map +1 -1
- package/dist/bridges/gemini.js +5 -3
- package/dist/bridges/gemini.js.map +1 -1
- package/dist/bridges/types.d.ts +1 -0
- package/dist/bridges/types.d.ts.map +1 -1
- package/dist/bridges/windsurf.d.ts +3 -0
- package/dist/bridges/windsurf.d.ts.map +1 -0
- package/dist/bridges/windsurf.js +45 -0
- package/dist/bridges/windsurf.js.map +1 -0
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +59 -11
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/compile.d.ts.map +1 -1
- package/dist/commands/compile.js +48 -30
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/doctor.d.ts +1 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +66 -25
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/explain.d.ts +6 -0
- package/dist/commands/explain.d.ts.map +1 -0
- package/dist/commands/explain.js +109 -0
- package/dist/commands/explain.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +19 -17
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +33 -19
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/remove.d.ts.map +1 -1
- package/dist/commands/remove.js +30 -8
- package/dist/commands/remove.js.map +1 -1
- package/dist/core/helpers.d.ts +1 -0
- package/dist/core/helpers.d.ts.map +1 -1
- package/dist/core/helpers.js +22 -1
- package/dist/core/helpers.js.map +1 -1
- package/dist/core/markers.d.ts +1 -0
- package/dist/core/markers.d.ts.map +1 -1
- package/dist/core/markers.js +12 -0
- package/dist/core/markers.js.map +1 -1
- package/dist/core/parser.d.ts.map +1 -1
- package/dist/core/parser.js +5 -0
- package/dist/core/parser.js.map +1 -1
- package/dist/core/schema.d.ts +8 -0
- package/dist/core/schema.d.ts.map +1 -0
- package/dist/core/schema.js +10 -0
- package/dist/core/schema.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/detect-tools.d.ts +1 -1
- package/dist/utils/detect-tools.d.ts.map +1 -1
- package/dist/utils/detect-tools.js +3 -1
- package/dist/utils/detect-tools.js.map +1 -1
- package/dist/utils/ui.d.ts +29 -0
- package/dist/utils/ui.d.ts.map +1 -0
- package/dist/utils/ui.js +84 -0
- package/dist/utils/ui.js.map +1 -0
- package/package.json +3 -4
package/dist/commands/remove.js
CHANGED
|
@@ -1,30 +1,52 @@
|
|
|
1
1
|
import { join } from 'node:path';
|
|
2
|
-
import
|
|
2
|
+
import { select } from '@inquirer/prompts';
|
|
3
3
|
import { readConfig } from '../core/parser.js';
|
|
4
4
|
import { uninstallBlock } from '../blocks/installer.js';
|
|
5
5
|
import { fileExists } from '../utils/fs.js';
|
|
6
|
+
import * as ui from '../utils/ui.js';
|
|
7
|
+
function ensureConfig(cwd) {
|
|
8
|
+
return fileExists(join(cwd, '.dwf', 'config.yml'));
|
|
9
|
+
}
|
|
10
|
+
async function selectBlock(blocks) {
|
|
11
|
+
return select({
|
|
12
|
+
message: 'Which block to remove?',
|
|
13
|
+
choices: blocks.map((id) => ({ name: id, value: id })),
|
|
14
|
+
});
|
|
15
|
+
}
|
|
6
16
|
async function runRemove(blockId) {
|
|
7
17
|
const cwd = process.cwd();
|
|
8
|
-
if (!(await
|
|
9
|
-
|
|
10
|
-
console.error('Run "devw init" first.');
|
|
18
|
+
if (!(await ensureConfig(cwd))) {
|
|
19
|
+
ui.error('.dwf/config.yml not found', 'Run devw init to initialize the project');
|
|
11
20
|
process.exitCode = 1;
|
|
12
21
|
return;
|
|
13
22
|
}
|
|
14
23
|
const config = await readConfig(cwd);
|
|
24
|
+
if (!blockId) {
|
|
25
|
+
if (config.blocks.length === 0) {
|
|
26
|
+
ui.warn('No blocks installed');
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
blockId = await selectBlock(config.blocks);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
15
36
|
if (!config.blocks.includes(blockId)) {
|
|
16
|
-
|
|
17
|
-
console.error(`Installed blocks: ${config.blocks.length > 0 ? config.blocks.join(', ') : '(none)'}`);
|
|
37
|
+
ui.error(`Block "${blockId}" is not installed`, `Installed blocks: ${config.blocks.length > 0 ? config.blocks.join(', ') : '(none)'}`);
|
|
18
38
|
process.exitCode = 1;
|
|
19
39
|
return;
|
|
20
40
|
}
|
|
21
41
|
const rulesRemoved = await uninstallBlock(cwd, blockId);
|
|
22
|
-
|
|
42
|
+
ui.success(`Removed ${blockId} (${String(rulesRemoved)} rules)`);
|
|
43
|
+
const { runCompileFromAdd } = await import('./compile.js');
|
|
44
|
+
await runCompileFromAdd();
|
|
23
45
|
}
|
|
24
46
|
export function registerRemoveCommand(program) {
|
|
25
47
|
program
|
|
26
48
|
.command('remove')
|
|
27
|
-
.argument('
|
|
49
|
+
.argument('[block]', 'Block ID to remove')
|
|
28
50
|
.description('Remove an installed rule block')
|
|
29
51
|
.action((blockId) => runRemove(blockId));
|
|
30
52
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remove.js","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,
|
|
1
|
+
{"version":3,"file":"remove.js","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAErC,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,MAAgB;IACzC,OAAO,MAAM,CAAS;QACpB,OAAO,EAAE,wBAAwB;QACjC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;KACvD,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,OAAgB;IACvC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAC/B,EAAE,CAAC,KAAK,CAAC,2BAA2B,EAAE,yCAAyC,CAAC,CAAC;QACjF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;IAErC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;IACH,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACrC,EAAE,CAAC,KAAK,CAAC,UAAU,OAAO,oBAAoB,EAAE,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;QACvI,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACxD,EAAE,CAAC,OAAO,CAAC,WAAW,OAAO,KAAK,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IAEjE,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;IAC3D,MAAM,iBAAiB,EAAE,CAAC;AAC5B,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,OAAgB,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;AACtD,CAAC"}
|
package/dist/core/helpers.d.ts
CHANGED
|
@@ -2,4 +2,5 @@ import type { Rule } from '../bridges/types.js';
|
|
|
2
2
|
export declare function filterRules(rules: Rule[]): Rule[];
|
|
3
3
|
export declare function groupByScope(rules: Rule[]): Map<string, Rule[]>;
|
|
4
4
|
export declare function capitalize(s: string): string;
|
|
5
|
+
export declare function formatScopeHeading(scope: string): string;
|
|
5
6
|
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/core/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/core/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAGhD,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAEjD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAgC/D;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExD"}
|
package/dist/core/helpers.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { BUILTIN_SCOPES, isBuiltinScope } from './schema.js';
|
|
1
2
|
export function filterRules(rules) {
|
|
2
3
|
return rules.filter((r) => r.enabled && r.severity !== 'info');
|
|
3
4
|
}
|
|
@@ -12,9 +13,29 @@ export function groupByScope(rules) {
|
|
|
12
13
|
groups.set(rule.scope, [rule]);
|
|
13
14
|
}
|
|
14
15
|
}
|
|
15
|
-
|
|
16
|
+
// Sort: built-in scopes first (in canonical order), then custom alphabetically
|
|
17
|
+
const sorted = new Map();
|
|
18
|
+
for (const builtin of BUILTIN_SCOPES) {
|
|
19
|
+
const entries = groups.get(builtin);
|
|
20
|
+
if (entries) {
|
|
21
|
+
sorted.set(builtin, entries);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const customScopes = [...groups.keys()]
|
|
25
|
+
.filter((s) => !isBuiltinScope(s))
|
|
26
|
+
.sort();
|
|
27
|
+
for (const scope of customScopes) {
|
|
28
|
+
const entries = groups.get(scope);
|
|
29
|
+
if (entries) {
|
|
30
|
+
sorted.set(scope, entries);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return sorted;
|
|
16
34
|
}
|
|
17
35
|
export function capitalize(s) {
|
|
18
36
|
return s.charAt(0).toUpperCase() + s.slice(1);
|
|
19
37
|
}
|
|
38
|
+
export function formatScopeHeading(scope) {
|
|
39
|
+
return isBuiltinScope(scope) ? capitalize(scope) : scope;
|
|
40
|
+
}
|
|
20
41
|
//# sourceMappingURL=helpers.js.map
|
package/dist/core/helpers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/core/helpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/core/helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7D,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,+EAA+E;IAC/E,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEzC,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;SACpC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;SACjC,IAAI,EAAE,CAAC;IACV,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,CAAS;IAClC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC3D,CAAC"}
|
package/dist/core/markers.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export declare const MARKER_BEGIN = "<!-- BEGIN dev-workflows -->";
|
|
2
2
|
export declare const MARKER_END = "<!-- END dev-workflows -->";
|
|
3
3
|
export declare function mergeMarkedContent(existingContent: string | null, newBlock: string): string;
|
|
4
|
+
export declare function removeMarkedBlock(existingContent: string): string;
|
|
4
5
|
//# sourceMappingURL=markers.d.ts.map
|
|
@@ -1 +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"}
|
|
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;AAED,wBAAgB,iBAAiB,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAcjE"}
|
package/dist/core/markers.js
CHANGED
|
@@ -15,4 +15,16 @@ export function mergeMarkedContent(existingContent, newBlock) {
|
|
|
15
15
|
}
|
|
16
16
|
return `${existingContent}\n${markedBlock}`;
|
|
17
17
|
}
|
|
18
|
+
export function removeMarkedBlock(existingContent) {
|
|
19
|
+
const beginIndex = existingContent.indexOf(MARKER_BEGIN);
|
|
20
|
+
const endIndex = existingContent.indexOf(MARKER_END);
|
|
21
|
+
if (beginIndex === -1 || endIndex === -1) {
|
|
22
|
+
return existingContent;
|
|
23
|
+
}
|
|
24
|
+
const before = existingContent.slice(0, beginIndex);
|
|
25
|
+
const afterEndLine = existingContent.indexOf('\n', endIndex);
|
|
26
|
+
const after = afterEndLine !== -1 ? existingContent.slice(afterEndLine + 1) : '';
|
|
27
|
+
const result = `${before}${after}`.replace(/\n{3,}/g, '\n\n').trim();
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
18
30
|
//# sourceMappingURL=markers.js.map
|
package/dist/core/markers.js.map
CHANGED
|
@@ -1 +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"}
|
|
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;AAED,MAAM,UAAU,iBAAiB,CAAC,eAAuB;IACvD,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,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACpD,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEjF,MAAM,MAAM,GAAG,GAAG,MAAM,GAAG,KAAK,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IACrE,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1 +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;
|
|
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;AAiB/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,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 { isValidScope } from './schema.js';
|
|
4
5
|
export async function readConfig(cwd) {
|
|
5
6
|
const configPath = join(cwd, '.dwf', 'config.yml');
|
|
6
7
|
const raw = await readFile(configPath, 'utf-8');
|
|
@@ -69,6 +70,10 @@ export async function readRules(cwd) {
|
|
|
69
70
|
const scope = doc.scope ?? file.replace(/\.ya?ml$/, '');
|
|
70
71
|
if (!Array.isArray(doc.rules))
|
|
71
72
|
continue;
|
|
73
|
+
if (!isValidScope(scope)) {
|
|
74
|
+
console.warn(`Warning: invalid scope "${scope}" in ${file}, skipping rules`);
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
72
77
|
for (const rawRule of doc.rules) {
|
|
73
78
|
if (!rawRule || typeof rawRule !== 'object')
|
|
74
79
|
continue;
|
package/dist/core/parser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/core/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/core/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const SCOPE_REGEX: RegExp;
|
|
2
|
+
export declare const BUILTIN_SCOPES: readonly ["architecture", "conventions", "security", "workflow", "testing"];
|
|
3
|
+
export type BuiltinScope = (typeof BUILTIN_SCOPES)[number];
|
|
4
|
+
export declare const VALID_TOOL_IDS: readonly ["claude", "cursor", "gemini", "windsurf", "copilot"];
|
|
5
|
+
export type ValidToolId = (typeof VALID_TOOL_IDS)[number];
|
|
6
|
+
export declare function isValidScope(scope: string): boolean;
|
|
7
|
+
export declare function isBuiltinScope(scope: string): scope is BuiltinScope;
|
|
8
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,QAA0C,CAAC;AAEnE,eAAO,MAAM,cAAc,6EAA8E,CAAC;AAC1G,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D,eAAO,MAAM,cAAc,gEAAiE,CAAC;AAC7F,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1D,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,YAAY,CAEnE"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export const SCOPE_REGEX = /^[a-z][a-z0-9]*(?::[a-z][a-z0-9-]*)?$/;
|
|
2
|
+
export const BUILTIN_SCOPES = ['architecture', 'conventions', 'security', 'workflow', 'testing'];
|
|
3
|
+
export const VALID_TOOL_IDS = ['claude', 'cursor', 'gemini', 'windsurf', 'copilot'];
|
|
4
|
+
export function isValidScope(scope) {
|
|
5
|
+
return SCOPE_REGEX.test(scope);
|
|
6
|
+
}
|
|
7
|
+
export function isBuiltinScope(scope) {
|
|
8
|
+
return BUILTIN_SCOPES.includes(scope);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,uCAAuC,CAAC;AAEnE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,cAAc,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,CAAU,CAAC;AAG1G,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAU,CAAC;AAG7F,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAQ,cAAoC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC/D,CAAC"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,QAAA,MAAM,OAAO,SAAgB,CAAC;AAiB9B,OAAO,EAAE,OAAO,EAAE,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -6,6 +6,7 @@ import { registerDoctorCommand } from './commands/doctor.js';
|
|
|
6
6
|
import { registerAddCommand } from './commands/add.js';
|
|
7
7
|
import { registerRemoveCommand } from './commands/remove.js';
|
|
8
8
|
import { registerListCommand } from './commands/list.js';
|
|
9
|
+
import { registerExplainCommand } from './commands/explain.js';
|
|
9
10
|
const require = createRequire(import.meta.url);
|
|
10
11
|
const pkg = require('../package.json');
|
|
11
12
|
const program = new Command();
|
|
@@ -19,6 +20,7 @@ registerDoctorCommand(program);
|
|
|
19
20
|
registerAddCommand(program);
|
|
20
21
|
registerRemoveCommand(program);
|
|
21
22
|
registerListCommand(program);
|
|
23
|
+
registerExplainCommand(program);
|
|
22
24
|
program.parse();
|
|
23
25
|
export { program };
|
|
24
26
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,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;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,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;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAE9D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,MAAM,CAAC;KACZ,WAAW,CAAC,2DAA2D,CAAC;KACxE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAExB,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;AAC7B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAEhC,OAAO,CAAC,KAAK,EAAE,CAAC;AAEhB,OAAO,EAAE,OAAO,EAAE,CAAC"}
|
|
@@ -1 +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;
|
|
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,GAAG,UAAU,GAAG,SAAS,CAAC;AAE7E,eAAO,MAAM,eAAe,EAAE,MAAM,EAA0D,CAAC;AAE/F,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,OAAO,CAAC;CACnB;AAUD,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAUtE"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { join } from 'node:path';
|
|
2
2
|
import { fileExists } from './fs.js';
|
|
3
|
-
export const SUPPORTED_TOOLS = ['claude', 'cursor', 'gemini'];
|
|
3
|
+
export const SUPPORTED_TOOLS = ['claude', 'cursor', 'gemini', 'windsurf', 'copilot'];
|
|
4
4
|
const TOOL_MARKERS = {
|
|
5
5
|
claude: 'CLAUDE.md',
|
|
6
6
|
cursor: '.cursor',
|
|
7
7
|
gemini: 'GEMINI.md',
|
|
8
|
+
windsurf: '.windsurf',
|
|
9
|
+
copilot: '.github/copilot-instructions.md',
|
|
8
10
|
};
|
|
9
11
|
export async function detectTools(cwd) {
|
|
10
12
|
const results = await Promise.all(SUPPORTED_TOOLS.map(async (id) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect-tools.js","sourceRoot":"","sources":["../../src/utils/detect-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAIrC,MAAM,CAAC,MAAM,eAAe,GAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"detect-tools.js","sourceRoot":"","sources":["../../src/utils/detect-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAIrC,MAAM,CAAC,MAAM,eAAe,GAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AAO/F,MAAM,YAAY,GAA2B;IAC3C,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,WAAW;IACnB,QAAQ,EAAE,WAAW;IACrB,OAAO,EAAE,iCAAiC;CAC3C,CAAC;AAEF,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,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;QACrD,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC;IAC1B,CAAC,CAAC,CACH,CAAC;IACF,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export declare const ICONS: {
|
|
2
|
+
readonly success: "✔";
|
|
3
|
+
readonly error: "✗";
|
|
4
|
+
readonly warn: "▲";
|
|
5
|
+
readonly skip: "–";
|
|
6
|
+
readonly bullet: "›";
|
|
7
|
+
readonly dot: "·";
|
|
8
|
+
readonly arrow: "→";
|
|
9
|
+
readonly dash: "—";
|
|
10
|
+
readonly separator: "─";
|
|
11
|
+
};
|
|
12
|
+
export declare function success(msg: string): void;
|
|
13
|
+
export declare function error(msg: string, hint?: string): void;
|
|
14
|
+
export declare function warn(msg: string): void;
|
|
15
|
+
export declare function info(msg: string): void;
|
|
16
|
+
export declare function log(msg: string): void;
|
|
17
|
+
export declare function header(title: string): void;
|
|
18
|
+
export declare function keyValue(label: string, value: string): void;
|
|
19
|
+
export declare function divider(): void;
|
|
20
|
+
export declare function newline(): void;
|
|
21
|
+
export declare function summary(counts: {
|
|
22
|
+
passed?: number;
|
|
23
|
+
failed?: number;
|
|
24
|
+
skipped?: number;
|
|
25
|
+
}): void;
|
|
26
|
+
export declare function timing(ms: number): string;
|
|
27
|
+
export declare function list(items: string[]): void;
|
|
28
|
+
export declare function check(passed: boolean, msg: string, skipped?: boolean): void;
|
|
29
|
+
//# sourceMappingURL=ui.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/utils/ui.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,KAAK;;;;;;;;;;CAUR,CAAC;AAOX,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEzC;AAED,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAKtD;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtC;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtC;AAED,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAErC;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAG3D;AAED,wBAAgB,OAAO,IAAI,IAAI,CAE9B;AAED,wBAAgB,OAAO,IAAI,IAAI,CAE9B;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAiB5F;AAED,wBAAgB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAI1C;AAED,wBAAgB,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAU3E"}
|
package/dist/utils/ui.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
export const ICONS = {
|
|
3
|
+
success: '\u2714',
|
|
4
|
+
error: '\u2717',
|
|
5
|
+
warn: '\u25B2',
|
|
6
|
+
skip: '\u2013',
|
|
7
|
+
bullet: '\u203A',
|
|
8
|
+
dot: '\u00B7',
|
|
9
|
+
arrow: '\u2192',
|
|
10
|
+
dash: '\u2014',
|
|
11
|
+
separator: '\u2500',
|
|
12
|
+
};
|
|
13
|
+
const INDENT = {
|
|
14
|
+
section: ' ',
|
|
15
|
+
detail: ' ',
|
|
16
|
+
};
|
|
17
|
+
export function success(msg) {
|
|
18
|
+
console.log(`${INDENT.section}${chalk.green(ICONS.success)} ${msg}`);
|
|
19
|
+
}
|
|
20
|
+
export function error(msg, hint) {
|
|
21
|
+
console.error(`${INDENT.section}${chalk.red(ICONS.error)} ${chalk.red(msg)}`);
|
|
22
|
+
if (hint) {
|
|
23
|
+
console.error(`${INDENT.detail}${chalk.dim(hint)}`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export function warn(msg) {
|
|
27
|
+
console.log(`${INDENT.section}${chalk.yellow(ICONS.warn)} ${chalk.yellow(msg)}`);
|
|
28
|
+
}
|
|
29
|
+
export function info(msg) {
|
|
30
|
+
console.log(`${INDENT.section}${chalk.dim(msg)}`);
|
|
31
|
+
}
|
|
32
|
+
export function log(msg) {
|
|
33
|
+
console.log(msg);
|
|
34
|
+
}
|
|
35
|
+
export function header(title) {
|
|
36
|
+
console.log(`${INDENT.section}${chalk.bold(title)}`);
|
|
37
|
+
}
|
|
38
|
+
export function keyValue(label, value) {
|
|
39
|
+
const padded = label.padEnd(10);
|
|
40
|
+
console.log(`${INDENT.detail}${chalk.dim(padded)}${value}`);
|
|
41
|
+
}
|
|
42
|
+
export function divider() {
|
|
43
|
+
console.log(`${INDENT.section}${chalk.dim(`${ICONS.separator}${ICONS.separator}`)}`);
|
|
44
|
+
}
|
|
45
|
+
export function newline() {
|
|
46
|
+
console.log('');
|
|
47
|
+
}
|
|
48
|
+
export function summary(counts) {
|
|
49
|
+
const parts = [];
|
|
50
|
+
const passed = counts.passed ?? 0;
|
|
51
|
+
const failed = counts.failed ?? 0;
|
|
52
|
+
const skipped = counts.skipped ?? 0;
|
|
53
|
+
if (passed > 0 || (failed === 0 && skipped === 0)) {
|
|
54
|
+
parts.push(chalk.green(`${String(passed)} passed`));
|
|
55
|
+
}
|
|
56
|
+
if (failed > 0 || (passed === 0 && skipped === 0)) {
|
|
57
|
+
parts.push(chalk.red(`${String(failed)} failed`));
|
|
58
|
+
}
|
|
59
|
+
if (skipped > 0) {
|
|
60
|
+
parts.push(chalk.dim(`${String(skipped)} skipped`));
|
|
61
|
+
}
|
|
62
|
+
console.log(`${INDENT.section}${parts.join(chalk.dim(` ${ICONS.dot} `))}`);
|
|
63
|
+
}
|
|
64
|
+
export function timing(ms) {
|
|
65
|
+
return chalk.dim(`(${String(Math.round(ms))}ms)`);
|
|
66
|
+
}
|
|
67
|
+
export function list(items) {
|
|
68
|
+
for (const item of items) {
|
|
69
|
+
console.log(`${INDENT.detail}${chalk.dim(ICONS.bullet)} ${item}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export function check(passed, msg, skipped) {
|
|
73
|
+
if (skipped) {
|
|
74
|
+
console.log(`${INDENT.section}${chalk.dim(ICONS.skip)} ${chalk.dim(msg)}`);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (passed) {
|
|
78
|
+
console.log(`${INDENT.section}${chalk.green(ICONS.success)} ${msg}`);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
console.log(`${INDENT.section}${chalk.red(ICONS.error)} ${chalk.red(msg)}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/utils/ui.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dev-workflows",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "CLI that compiles developer rules into editor-specific config files",
|
|
6
6
|
"license": "MIT",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"gemini"
|
|
22
22
|
],
|
|
23
23
|
"engines": {
|
|
24
|
-
"node": ">=
|
|
24
|
+
"node": ">=22.0.0"
|
|
25
25
|
},
|
|
26
26
|
"bin": {
|
|
27
27
|
"devw": "./bin/devw.js"
|
|
@@ -45,8 +45,7 @@
|
|
|
45
45
|
"@inquirer/prompts": "^7.0.0",
|
|
46
46
|
"commander": "^13.0.0",
|
|
47
47
|
"yaml": "^2.7.0",
|
|
48
|
-
"chalk": "^5.4.0"
|
|
49
|
-
"ora": "^8.0.0"
|
|
48
|
+
"chalk": "^5.4.0"
|
|
50
49
|
},
|
|
51
50
|
"devDependencies": {
|
|
52
51
|
"typescript": "^5.7.0",
|