dev-workflows 0.1.3 → 0.2.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 +11 -0
- package/dist/bridges/claude.d.ts.map +1 -1
- package/dist/bridges/claude.js +5 -21
- 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 -21
- package/dist/bridges/cursor.js.map +1 -1
- package/dist/bridges/gemini.d.ts.map +1 -1
- package/dist/bridges/gemini.js +5 -21
- 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 +1 -10
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/compile.d.ts.map +1 -1
- package/dist/commands/compile.js +7 -14
- 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 +44 -22
- 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 +97 -0
- package/dist/commands/explain.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +35 -41
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +1 -10
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/remove.d.ts.map +1 -1
- package/dist/commands/remove.js +1 -10
- package/dist/commands/remove.js.map +1 -1
- package/dist/core/helpers.d.ts +6 -0
- package/dist/core/helpers.d.ts.map +1 -0
- package/dist/core/helpers.js +41 -0
- package/dist/core/helpers.js.map +1 -0
- 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 +5 -12
- package/dist/utils/detect-tools.js.map +1 -1
- package/dist/utils/fs.d.ts +2 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +11 -0
- package/dist/utils/fs.js.map +1 -0
- package/package.json +4 -4
- package/dist/utils/prompt.d.ts +0 -3
- package/dist/utils/prompt.d.ts.map +0 -1
- package/dist/utils/prompt.js +0 -21
- package/dist/utils/prompt.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
# dev-workflows
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/dev-workflows)
|
|
4
|
+
[](./LICENSE)
|
|
5
|
+
[](https://docs.dev-workflows.com)
|
|
6
|
+
|
|
7
|
+
|
|
3
8
|
> Define AI coding rules once. Compile to CLAUDE.md, .cursor/rules, GEMINI.md.
|
|
4
9
|
|
|
5
10
|
AI coding tools (Claude Code, Cursor, Gemini CLI) each use different config files for project rules. dev-workflows lets you define rules once in YAML and compile them to each tool's native format. No duplication, no drift.
|
|
@@ -8,6 +13,8 @@ AI coding tools (Claude Code, Cursor, Gemini CLI) each use different config file
|
|
|
8
13
|
|
|
9
14
|
```bash
|
|
10
15
|
npx dev-workflows init
|
|
16
|
+
devw add typescript-strict
|
|
17
|
+
devw compile
|
|
11
18
|
```
|
|
12
19
|
|
|
13
20
|
Requires Node.js >= 22.
|
|
@@ -56,6 +63,10 @@ Content outside the markers is preserved — your manual notes stay intact.
|
|
|
56
63
|
| `devw list` | List available blocks and rules |
|
|
57
64
|
| `devw doctor` | Validate configuration |
|
|
58
65
|
|
|
66
|
+
## Contributing
|
|
67
|
+
|
|
68
|
+
See [CONTRIBUTING.md](./CONTRIBUTING.md) for guidelines.
|
|
69
|
+
|
|
59
70
|
## License
|
|
60
71
|
|
|
61
72
|
MIT
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/bridges/claude.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAuB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/bridges/claude.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAuB,MAAM,YAAY,CAAC;AAiC9D,eAAO,MAAM,YAAY,EAAE,MAU1B,CAAC"}
|
package/dist/bridges/claude.js
CHANGED
|
@@ -1,22 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
return rules.filter((r) => r.enabled && r.severity !== 'info');
|
|
3
|
-
}
|
|
4
|
-
function groupByScope(rules) {
|
|
5
|
-
const groups = new Map();
|
|
6
|
-
for (const rule of rules) {
|
|
7
|
-
const existing = groups.get(rule.scope);
|
|
8
|
-
if (existing) {
|
|
9
|
-
existing.push(rule);
|
|
10
|
-
}
|
|
11
|
-
else {
|
|
12
|
-
groups.set(rule.scope, [rule]);
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
return groups;
|
|
16
|
-
}
|
|
17
|
-
function capitalize(s) {
|
|
18
|
-
return s.charAt(0).toUpperCase() + s.slice(1);
|
|
19
|
-
}
|
|
1
|
+
import { filterRules, groupByScope, formatScopeHeading } from '../core/helpers.js';
|
|
20
2
|
function buildMarkdown(rules) {
|
|
21
3
|
const lines = [
|
|
22
4
|
'# Project Rules',
|
|
@@ -24,12 +6,13 @@ function buildMarkdown(rules) {
|
|
|
24
6
|
const filtered = filterRules(rules);
|
|
25
7
|
const grouped = groupByScope(filtered);
|
|
26
8
|
for (const [scope, scopeRules] of grouped) {
|
|
27
|
-
lines.push('', `## ${
|
|
9
|
+
lines.push('', `## ${formatScopeHeading(scope)}`);
|
|
10
|
+
lines.push('');
|
|
28
11
|
for (const rule of scopeRules) {
|
|
29
12
|
const contentLines = rule.content.split('\n');
|
|
30
13
|
const first = contentLines[0];
|
|
31
14
|
if (first !== undefined) {
|
|
32
|
-
lines.push(
|
|
15
|
+
lines.push(`- ${first}`);
|
|
33
16
|
}
|
|
34
17
|
for (let i = 1; i < contentLines.length; i++) {
|
|
35
18
|
const line = contentLines[i];
|
|
@@ -45,6 +28,7 @@ function buildMarkdown(rules) {
|
|
|
45
28
|
export const claudeBridge = {
|
|
46
29
|
id: 'claude',
|
|
47
30
|
outputPaths: ['CLAUDE.md'],
|
|
31
|
+
usesMarkers: true,
|
|
48
32
|
compile(rules, _config) {
|
|
49
33
|
const output = new Map();
|
|
50
34
|
output.set('CLAUDE.md', buildMarkdown(rules));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/bridges/claude.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/bridges/claude.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAEnF,SAAS,aAAa,CAAC,KAAa;IAClC,MAAM,KAAK,GAAa;QACtB,iBAAiB;KAClB,CAAC;IAEF,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAEvC,KAAK,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,OAAO,EAAE,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;YAC3B,CAAC;YACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7C,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;gBAC7B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBACvB,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAW;IAClC,EAAE,EAAE,QAAQ;IACZ,WAAW,EAAE,CAAC,WAAW,CAAC;IAC1B,WAAW,EAAE,IAAI;IAEjB,OAAO,CAAC,KAAa,EAAE,OAAsB;QAC3C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9C,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copilot.d.ts","sourceRoot":"","sources":["../../src/bridges/copilot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAuB,MAAM,YAAY,CAAC;AAiC9D,eAAO,MAAM,aAAa,EAAE,MAU3B,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { filterRules, groupByScope, formatScopeHeading } from '../core/helpers.js';
|
|
2
|
+
function buildMarkdown(rules) {
|
|
3
|
+
const lines = [
|
|
4
|
+
'# Project Rules',
|
|
5
|
+
];
|
|
6
|
+
const filtered = filterRules(rules);
|
|
7
|
+
const grouped = groupByScope(filtered);
|
|
8
|
+
for (const [scope, scopeRules] of grouped) {
|
|
9
|
+
lines.push('', `## ${formatScopeHeading(scope)}`);
|
|
10
|
+
lines.push('');
|
|
11
|
+
for (const rule of scopeRules) {
|
|
12
|
+
const contentLines = rule.content.split('\n');
|
|
13
|
+
const first = contentLines[0];
|
|
14
|
+
if (first !== undefined) {
|
|
15
|
+
lines.push(`- ${first}`);
|
|
16
|
+
}
|
|
17
|
+
for (let i = 1; i < contentLines.length; i++) {
|
|
18
|
+
const line = contentLines[i];
|
|
19
|
+
if (line !== undefined) {
|
|
20
|
+
lines.push(` ${line}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
lines.push('');
|
|
26
|
+
return lines.join('\n');
|
|
27
|
+
}
|
|
28
|
+
export const copilotBridge = {
|
|
29
|
+
id: 'copilot',
|
|
30
|
+
outputPaths: ['.github/copilot-instructions.md'],
|
|
31
|
+
usesMarkers: true,
|
|
32
|
+
compile(rules, _config) {
|
|
33
|
+
const output = new Map();
|
|
34
|
+
output.set('.github/copilot-instructions.md', buildMarkdown(rules));
|
|
35
|
+
return output;
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=copilot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copilot.js","sourceRoot":"","sources":["../../src/bridges/copilot.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAEnF,SAAS,aAAa,CAAC,KAAa;IAClC,MAAM,KAAK,GAAa;QACtB,iBAAiB;KAClB,CAAC;IAEF,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAEvC,KAAK,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,OAAO,EAAE,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;YAC3B,CAAC;YACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7C,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;gBAC7B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBACvB,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAW;IACnC,EAAE,EAAE,SAAS;IACb,WAAW,EAAE,CAAC,iCAAiC,CAAC;IAChD,WAAW,EAAE,IAAI;IAEjB,OAAO,CAAC,KAAa,EAAE,OAAsB;QAC3C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,iCAAiC,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QACpE,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/bridges/cursor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAuB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/bridges/cursor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAuB,MAAM,YAAY,CAAC;AAyC9D,eAAO,MAAM,YAAY,EAAE,MAU1B,CAAC"}
|
package/dist/bridges/cursor.js
CHANGED
|
@@ -1,22 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
return rules.filter((r) => r.enabled && r.severity !== 'info');
|
|
3
|
-
}
|
|
4
|
-
function groupByScope(rules) {
|
|
5
|
-
const groups = new Map();
|
|
6
|
-
for (const rule of rules) {
|
|
7
|
-
const existing = groups.get(rule.scope);
|
|
8
|
-
if (existing) {
|
|
9
|
-
existing.push(rule);
|
|
10
|
-
}
|
|
11
|
-
else {
|
|
12
|
-
groups.set(rule.scope, [rule]);
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
return groups;
|
|
16
|
-
}
|
|
17
|
-
function capitalize(s) {
|
|
18
|
-
return s.charAt(0).toUpperCase() + s.slice(1);
|
|
19
|
-
}
|
|
1
|
+
import { filterRules, groupByScope, formatScopeHeading } from '../core/helpers.js';
|
|
20
2
|
const FRONTMATTER = `---
|
|
21
3
|
description: Project rules generated by dev-workflows
|
|
22
4
|
globs:
|
|
@@ -31,12 +13,13 @@ function buildMdc(rules) {
|
|
|
31
13
|
const filtered = filterRules(rules);
|
|
32
14
|
const grouped = groupByScope(filtered);
|
|
33
15
|
for (const [scope, scopeRules] of grouped) {
|
|
34
|
-
lines.push('', `## ${
|
|
16
|
+
lines.push('', `## ${formatScopeHeading(scope)}`);
|
|
17
|
+
lines.push('');
|
|
35
18
|
for (const rule of scopeRules) {
|
|
36
19
|
const contentLines = rule.content.split('\n');
|
|
37
20
|
const first = contentLines[0];
|
|
38
21
|
if (first !== undefined) {
|
|
39
|
-
lines.push(
|
|
22
|
+
lines.push(`- ${first}`);
|
|
40
23
|
}
|
|
41
24
|
for (let i = 1; i < contentLines.length; i++) {
|
|
42
25
|
const line = contentLines[i];
|
|
@@ -52,6 +35,7 @@ function buildMdc(rules) {
|
|
|
52
35
|
export const cursorBridge = {
|
|
53
36
|
id: 'cursor',
|
|
54
37
|
outputPaths: ['.cursor/rules/devworkflows.mdc'],
|
|
38
|
+
usesMarkers: false,
|
|
55
39
|
compile(rules, _config) {
|
|
56
40
|
const output = new Map();
|
|
57
41
|
output.set('.cursor/rules/devworkflows.mdc', buildMdc(rules));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/bridges/cursor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/bridges/cursor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAEnF,MAAM,WAAW,GAAG;;;;IAIhB,CAAC;AAEL,SAAS,QAAQ,CAAC,KAAa;IAC7B,MAAM,KAAK,GAAa;QACtB,WAAW;QACX,EAAE;QACF,4DAA4D;KAC7D,CAAC;IAEF,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAEvC,KAAK,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,OAAO,EAAE,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;YAC3B,CAAC;YACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7C,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;gBAC7B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBACvB,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAW;IAClC,EAAE,EAAE,QAAQ;IACZ,WAAW,EAAE,CAAC,gCAAgC,CAAC;IAC/C,WAAW,EAAE,KAAK;IAElB,OAAO,CAAC,KAAa,EAAE,OAAsB;QAC3C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,gCAAgC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9D,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/bridges/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAuB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/bridges/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAuB,MAAM,YAAY,CAAC;AAiC9D,eAAO,MAAM,YAAY,EAAE,MAU1B,CAAC"}
|
package/dist/bridges/gemini.js
CHANGED
|
@@ -1,22 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
return rules.filter((r) => r.enabled && r.severity !== 'info');
|
|
3
|
-
}
|
|
4
|
-
function groupByScope(rules) {
|
|
5
|
-
const groups = new Map();
|
|
6
|
-
for (const rule of rules) {
|
|
7
|
-
const existing = groups.get(rule.scope);
|
|
8
|
-
if (existing) {
|
|
9
|
-
existing.push(rule);
|
|
10
|
-
}
|
|
11
|
-
else {
|
|
12
|
-
groups.set(rule.scope, [rule]);
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
return groups;
|
|
16
|
-
}
|
|
17
|
-
function capitalize(s) {
|
|
18
|
-
return s.charAt(0).toUpperCase() + s.slice(1);
|
|
19
|
-
}
|
|
1
|
+
import { filterRules, groupByScope, formatScopeHeading } from '../core/helpers.js';
|
|
20
2
|
function buildMarkdown(rules) {
|
|
21
3
|
const lines = [
|
|
22
4
|
'# Project Rules',
|
|
@@ -24,12 +6,13 @@ function buildMarkdown(rules) {
|
|
|
24
6
|
const filtered = filterRules(rules);
|
|
25
7
|
const grouped = groupByScope(filtered);
|
|
26
8
|
for (const [scope, scopeRules] of grouped) {
|
|
27
|
-
lines.push('', `## ${
|
|
9
|
+
lines.push('', `## ${formatScopeHeading(scope)}`);
|
|
10
|
+
lines.push('');
|
|
28
11
|
for (const rule of scopeRules) {
|
|
29
12
|
const contentLines = rule.content.split('\n');
|
|
30
13
|
const first = contentLines[0];
|
|
31
14
|
if (first !== undefined) {
|
|
32
|
-
lines.push(
|
|
15
|
+
lines.push(`- ${first}`);
|
|
33
16
|
}
|
|
34
17
|
for (let i = 1; i < contentLines.length; i++) {
|
|
35
18
|
const line = contentLines[i];
|
|
@@ -45,6 +28,7 @@ function buildMarkdown(rules) {
|
|
|
45
28
|
export const geminiBridge = {
|
|
46
29
|
id: 'gemini',
|
|
47
30
|
outputPaths: ['GEMINI.md'],
|
|
31
|
+
usesMarkers: true,
|
|
48
32
|
compile(rules, _config) {
|
|
49
33
|
const output = new Map();
|
|
50
34
|
output.set('GEMINI.md', buildMarkdown(rules));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/bridges/gemini.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/bridges/gemini.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAEnF,SAAS,aAAa,CAAC,KAAa;IAClC,MAAM,KAAK,GAAa;QACtB,iBAAiB;KAClB,CAAC;IAEF,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAEvC,KAAK,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,OAAO,EAAE,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;YAC3B,CAAC;YACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7C,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;gBAC7B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBACvB,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAW;IAClC,EAAE,EAAE,QAAQ;IACZ,WAAW,EAAE,CAAC,WAAW,CAAC;IAC1B,WAAW,EAAE,IAAI;IAEjB,OAAO,CAAC,KAAa,EAAE,OAAsB;QAC3C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9C,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAC"}
|
package/dist/bridges/types.d.ts
CHANGED
|
@@ -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;CACtB;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;CAClB;AAED,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpE"}
|
|
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;CACtB;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;CAClB;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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"windsurf.d.ts","sourceRoot":"","sources":["../../src/bridges/windsurf.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAuB,MAAM,YAAY,CAAC;AA6C9D,eAAO,MAAM,cAAc,EAAE,MAU5B,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { filterRules, groupByScope, formatScopeHeading } from '../core/helpers.js';
|
|
2
|
+
const WINDSURF_CHAR_LIMIT = 6000;
|
|
3
|
+
function buildMarkdown(rules) {
|
|
4
|
+
const lines = [
|
|
5
|
+
'<!-- Generated by dev-workflows. Do not edit manually. -->',
|
|
6
|
+
'',
|
|
7
|
+
'# Project Rules',
|
|
8
|
+
];
|
|
9
|
+
const filtered = filterRules(rules);
|
|
10
|
+
const grouped = groupByScope(filtered);
|
|
11
|
+
for (const [scope, scopeRules] of grouped) {
|
|
12
|
+
lines.push('', `## ${formatScopeHeading(scope)}`);
|
|
13
|
+
lines.push('');
|
|
14
|
+
for (const rule of scopeRules) {
|
|
15
|
+
const contentLines = rule.content.split('\n');
|
|
16
|
+
const first = contentLines[0];
|
|
17
|
+
if (first !== undefined) {
|
|
18
|
+
lines.push(`- ${first}`);
|
|
19
|
+
}
|
|
20
|
+
for (let i = 1; i < contentLines.length; i++) {
|
|
21
|
+
const line = contentLines[i];
|
|
22
|
+
if (line !== undefined) {
|
|
23
|
+
lines.push(` ${line}`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
lines.push('');
|
|
29
|
+
const content = lines.join('\n');
|
|
30
|
+
if (content.length > WINDSURF_CHAR_LIMIT) {
|
|
31
|
+
console.warn(`Warning: Windsurf output is ${String(content.length)} chars (limit: ${String(WINDSURF_CHAR_LIMIT)}). Windsurf may truncate the content.`);
|
|
32
|
+
}
|
|
33
|
+
return content;
|
|
34
|
+
}
|
|
35
|
+
export const windsurfBridge = {
|
|
36
|
+
id: 'windsurf',
|
|
37
|
+
outputPaths: ['.windsurf/rules/devworkflows.md'],
|
|
38
|
+
usesMarkers: false,
|
|
39
|
+
compile(rules, _config) {
|
|
40
|
+
const output = new Map();
|
|
41
|
+
output.set('.windsurf/rules/devworkflows.md', buildMarkdown(rules));
|
|
42
|
+
return output;
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=windsurf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"windsurf.js","sourceRoot":"","sources":["../../src/bridges/windsurf.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAEnF,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAEjC,SAAS,aAAa,CAAC,KAAa;IAClC,MAAM,KAAK,GAAa;QACtB,4DAA4D;QAC5D,EAAE;QACF,iBAAiB;KAClB,CAAC;IAEF,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAEvC,KAAK,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,OAAO,EAAE,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;YAC3B,CAAC;YACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7C,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;gBAC7B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBACvB,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEjC,IAAI,OAAO,CAAC,MAAM,GAAG,mBAAmB,EAAE,CAAC;QACzC,OAAO,CAAC,IAAI,CACV,+BAA+B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,kBAAkB,MAAM,CAAC,mBAAmB,CAAC,uCAAuC,CAC1I,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAW;IACpC,EAAE,EAAE,UAAU;IACd,WAAW,EAAE,CAAC,iCAAiC,CAAC;IAChD,WAAW,EAAE,KAAK;IAElB,OAAO,CAAC,KAAa,EAAE,OAAsB;QAC3C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,iCAAiC,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QACpE,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAC"}
|
|
@@ -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":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAmDD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAQzD"}
|
package/dist/commands/add.js
CHANGED
|
@@ -1,17 +1,8 @@
|
|
|
1
|
-
import { access } from 'node:fs/promises';
|
|
2
1
|
import { join } from 'node:path';
|
|
3
2
|
import chalk from 'chalk';
|
|
4
3
|
import { loadAllBlocks, loadBlock } from '../blocks/registry.js';
|
|
5
4
|
import { installBlock } from '../blocks/installer.js';
|
|
6
|
-
|
|
7
|
-
try {
|
|
8
|
-
await access(filePath);
|
|
9
|
-
return true;
|
|
10
|
-
}
|
|
11
|
-
catch {
|
|
12
|
-
return false;
|
|
13
|
-
}
|
|
14
|
-
}
|
|
5
|
+
import { fileExists } from '../utils/fs.js';
|
|
15
6
|
async function listAvailableBlocks() {
|
|
16
7
|
const blocks = await loadAllBlocks();
|
|
17
8
|
if (blocks.length === 0) {
|
package/dist/commands/add.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAuHD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAEvD;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAQ7D"}
|
package/dist/commands/compile.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { mkdir, writeFile, readFile, symlink, unlink
|
|
1
|
+
import { mkdir, writeFile, readFile, symlink, unlink } from 'node:fs/promises';
|
|
2
2
|
import { join, dirname } from 'node:path';
|
|
3
3
|
import chalk from 'chalk';
|
|
4
4
|
import { readConfig, readRules } from '../core/parser.js';
|
|
@@ -6,20 +6,14 @@ import { computeRulesHash, writeHash } from '../core/hash.js';
|
|
|
6
6
|
import { claudeBridge } from '../bridges/claude.js';
|
|
7
7
|
import { cursorBridge } from '../bridges/cursor.js';
|
|
8
8
|
import { geminiBridge } from '../bridges/gemini.js';
|
|
9
|
+
import { windsurfBridge } from '../bridges/windsurf.js';
|
|
10
|
+
import { copilotBridge } from '../bridges/copilot.js';
|
|
9
11
|
import { mergeMarkedContent } from '../core/markers.js';
|
|
10
|
-
|
|
12
|
+
import { fileExists } from '../utils/fs.js';
|
|
13
|
+
const BRIDGES = [claudeBridge, cursorBridge, geminiBridge, windsurfBridge, copilotBridge];
|
|
11
14
|
function getBridge(id) {
|
|
12
15
|
return BRIDGES.find((b) => b.id === id);
|
|
13
16
|
}
|
|
14
|
-
async function fileExists(filePath) {
|
|
15
|
-
try {
|
|
16
|
-
await access(filePath);
|
|
17
|
-
return true;
|
|
18
|
-
}
|
|
19
|
-
catch {
|
|
20
|
-
return false;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
17
|
async function runCompile(options) {
|
|
24
18
|
const cwd = process.cwd();
|
|
25
19
|
if (!(await fileExists(join(cwd, '.dwf', 'config.yml')))) {
|
|
@@ -62,9 +56,8 @@ async function runCompile(options) {
|
|
|
62
56
|
}
|
|
63
57
|
const outputs = bridge.compile(rules, config);
|
|
64
58
|
for (const [relativePath, rawContent] of outputs) {
|
|
65
|
-
const isMarkdownBridge = rawContent.startsWith('# Project Rules');
|
|
66
59
|
let content = rawContent;
|
|
67
|
-
if (
|
|
60
|
+
if (bridge.usesMarkers) {
|
|
68
61
|
const absoluteCheck = join(cwd, relativePath);
|
|
69
62
|
let existing = null;
|
|
70
63
|
try {
|
|
@@ -122,7 +115,7 @@ export function registerCompileCommand(program) {
|
|
|
122
115
|
program
|
|
123
116
|
.command('compile')
|
|
124
117
|
.description('Compile .dwf/ rules into editor-specific config files')
|
|
125
|
-
.option('--tool <tool>', 'Compile only a specific bridge (claude, cursor, gemini)')
|
|
118
|
+
.option('--tool <tool>', 'Compile only a specific bridge (claude, cursor, gemini, windsurf, copilot)')
|
|
126
119
|
.option('--dry-run', 'Show output without writing files')
|
|
127
120
|
.option('--verbose', 'Show detailed output')
|
|
128
121
|
.action((options) => runCompile(options));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ export declare function checkConfigExists(cwd: string): Promise<CheckResult>;
|
|
|
9
9
|
export declare function checkConfigValid(cwd: string): Promise<CheckResult>;
|
|
10
10
|
export declare function checkRulesValid(cwd: string): Promise<CheckResult>;
|
|
11
11
|
export declare function checkDuplicateIds(rules: Rule[]): CheckResult;
|
|
12
|
+
export declare function checkScopeFormat(rules: Rule[]): CheckResult;
|
|
12
13
|
export declare function checkBridgesAvailable(config: ProjectConfig): CheckResult;
|
|
13
14
|
export declare function checkSymlinks(cwd: string, config: ProjectConfig): Promise<CheckResult>;
|
|
14
15
|
export declare function checkHashSync(cwd: string, rules: Rule[]): Promise<CheckResult>;
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC,OAAO,KAAK,EAAU,aAAa,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAOvE,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,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAmBpF;AAqFD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAK5D"}
|
package/dist/commands/doctor.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { lstat, readFile, readdir } from 'node:fs/promises';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import chalk from 'chalk';
|
|
4
4
|
import { parse } from 'yaml';
|
|
@@ -7,17 +7,12 @@ import { computeRulesHash, readStoredHash } from '../core/hash.js';
|
|
|
7
7
|
import { claudeBridge } from '../bridges/claude.js';
|
|
8
8
|
import { cursorBridge } from '../bridges/cursor.js';
|
|
9
9
|
import { geminiBridge } from '../bridges/gemini.js';
|
|
10
|
-
|
|
10
|
+
import { windsurfBridge } from '../bridges/windsurf.js';
|
|
11
|
+
import { copilotBridge } from '../bridges/copilot.js';
|
|
12
|
+
import { fileExists } from '../utils/fs.js';
|
|
13
|
+
import { isValidScope } from '../core/schema.js';
|
|
14
|
+
const BRIDGES = [claudeBridge, cursorBridge, geminiBridge, windsurfBridge, copilotBridge];
|
|
11
15
|
const BRIDGE_IDS = new Set(BRIDGES.map((b) => b.id));
|
|
12
|
-
async function fileExists(filePath) {
|
|
13
|
-
try {
|
|
14
|
-
await access(filePath);
|
|
15
|
-
return true;
|
|
16
|
-
}
|
|
17
|
-
catch {
|
|
18
|
-
return false;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
16
|
export async function checkConfigExists(cwd) {
|
|
22
17
|
const exists = await fileExists(join(cwd, '.dwf', 'config.yml'));
|
|
23
18
|
return exists
|
|
@@ -76,22 +71,46 @@ export async function checkRulesValid(cwd) {
|
|
|
76
71
|
};
|
|
77
72
|
}
|
|
78
73
|
export function checkDuplicateIds(rules) {
|
|
79
|
-
const
|
|
80
|
-
const duplicates = new Set();
|
|
74
|
+
const scopesById = new Map();
|
|
81
75
|
for (const rule of rules) {
|
|
82
|
-
|
|
83
|
-
|
|
76
|
+
const scopes = scopesById.get(rule.id);
|
|
77
|
+
if (scopes) {
|
|
78
|
+
scopes.push(rule.scope);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
scopesById.set(rule.id, [rule.scope]);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
const duplicates = [];
|
|
85
|
+
for (const [id, scopes] of scopesById) {
|
|
86
|
+
if (scopes.length > 1) {
|
|
87
|
+
duplicates.push(`${id} (${scopes.join(', ')})`);
|
|
84
88
|
}
|
|
85
|
-
seen.add(rule.id);
|
|
86
89
|
}
|
|
87
|
-
if (duplicates.
|
|
90
|
+
if (duplicates.length > 0) {
|
|
88
91
|
return {
|
|
89
92
|
passed: false,
|
|
90
|
-
message: `Duplicate rule IDs found: ${
|
|
93
|
+
message: `Duplicate rule IDs found: ${duplicates.join(', ')}`,
|
|
91
94
|
};
|
|
92
95
|
}
|
|
93
96
|
return { passed: true, message: 'No duplicate rule IDs' };
|
|
94
97
|
}
|
|
98
|
+
export function checkScopeFormat(rules) {
|
|
99
|
+
const invalidScopes = [];
|
|
100
|
+
for (const rule of rules) {
|
|
101
|
+
if (!isValidScope(rule.scope)) {
|
|
102
|
+
invalidScopes.push(rule.scope);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
const unique = [...new Set(invalidScopes)];
|
|
106
|
+
if (unique.length > 0) {
|
|
107
|
+
return {
|
|
108
|
+
passed: false,
|
|
109
|
+
message: `Invalid scope format: ${unique.join(', ')}`,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
return { passed: true, message: 'All scopes have valid format' };
|
|
113
|
+
}
|
|
95
114
|
export function checkBridgesAvailable(config) {
|
|
96
115
|
const missing = config.tools.filter((t) => !BRIDGE_IDS.has(t));
|
|
97
116
|
if (missing.length > 0) {
|
|
@@ -156,7 +175,7 @@ function formatResult(result) {
|
|
|
156
175
|
if (result.skipped) {
|
|
157
176
|
return `${chalk.dim('-')} ${chalk.dim(result.message)}`;
|
|
158
177
|
}
|
|
159
|
-
const icon = result.passed ? chalk.green('
|
|
178
|
+
const icon = result.passed ? chalk.green('\u2713') : chalk.red('\u2717');
|
|
160
179
|
const text = result.passed ? result.message : chalk.red(result.message);
|
|
161
180
|
return `${icon} ${text}`;
|
|
162
181
|
}
|
|
@@ -200,14 +219,17 @@ async function runDoctor() {
|
|
|
200
219
|
// Check 4: No duplicate rule IDs
|
|
201
220
|
const dupResult = checkDuplicateIds(rules);
|
|
202
221
|
results.push(dupResult);
|
|
203
|
-
// Check 5:
|
|
222
|
+
// Check 5: Scope format valid
|
|
223
|
+
const scopeResult = checkScopeFormat(rules);
|
|
224
|
+
results.push(scopeResult);
|
|
225
|
+
// Check 6: Tools have bridges
|
|
204
226
|
// config is guaranteed non-null here since configValidResult.passed
|
|
205
227
|
const bridgeResult = checkBridgesAvailable(config);
|
|
206
228
|
results.push(bridgeResult);
|
|
207
|
-
// Check
|
|
229
|
+
// Check 7: Symlinks valid (conditional on mode)
|
|
208
230
|
const symlinkResult = await checkSymlinks(cwd, config);
|
|
209
231
|
results.push(symlinkResult);
|
|
210
|
-
// Check
|
|
232
|
+
// Check 8: Hash sync (conditional on compiled files existing)
|
|
211
233
|
const hashResult = await checkHashSync(cwd, rules);
|
|
212
234
|
results.push(hashResult);
|
|
213
235
|
// Output
|