@everydaydevopsio/ballast 3.2.0 → 4.0.3
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/agents/common/cicd/content.md +162 -0
- package/agents/{local-dev → common/local-dev}/content-env.md +74 -7
- package/agents/go/linting/content.md +13 -0
- package/agents/go/linting/templates/claude-header.md +5 -0
- package/agents/go/linting/templates/codex-header.md +5 -0
- package/agents/go/linting/templates/cursor-frontmatter.yaml +7 -0
- package/agents/go/linting/templates/opencode-frontmatter.yaml +17 -0
- package/agents/go/logging/content.md +8 -0
- package/agents/go/logging/templates/claude-header.md +5 -0
- package/agents/go/logging/templates/codex-header.md +5 -0
- package/agents/go/logging/templates/cursor-frontmatter.yaml +6 -0
- package/agents/go/logging/templates/opencode-frontmatter.yaml +17 -0
- package/agents/go/testing/content.md +13 -0
- package/agents/go/testing/templates/claude-header.md +5 -0
- package/agents/go/testing/templates/codex-header.md +5 -0
- package/agents/go/testing/templates/cursor-frontmatter.yaml +6 -0
- package/agents/go/testing/templates/opencode-frontmatter.yaml +17 -0
- package/agents/python/linting/content.md +21 -0
- package/agents/python/linting/templates/claude-header.md +5 -0
- package/agents/python/linting/templates/codex-header.md +5 -0
- package/agents/python/linting/templates/cursor-frontmatter.yaml +8 -0
- package/agents/python/linting/templates/opencode-frontmatter.yaml +17 -0
- package/agents/python/logging/content.md +9 -0
- package/agents/python/logging/templates/claude-header.md +5 -0
- package/agents/python/logging/templates/codex-header.md +5 -0
- package/agents/python/logging/templates/cursor-frontmatter.yaml +6 -0
- package/agents/python/logging/templates/opencode-frontmatter.yaml +17 -0
- package/agents/python/testing/content.md +13 -0
- package/agents/python/testing/templates/claude-header.md +5 -0
- package/agents/python/testing/templates/codex-header.md +5 -0
- package/agents/python/testing/templates/cursor-frontmatter.yaml +8 -0
- package/agents/python/testing/templates/opencode-frontmatter.yaml +17 -0
- package/agents/{linting → typescript/linting}/content.md +35 -3
- package/agents/{logging → typescript/logging}/content.md +8 -81
- package/agents/typescript/testing/content.md +122 -0
- package/agents/typescript/testing/templates/claude-header.md +5 -0
- package/agents/typescript/testing/templates/codex-header.md +7 -0
- package/agents/typescript/testing/templates/cursor-frontmatter.yaml +15 -0
- package/agents/typescript/testing/templates/opencode-frontmatter.yaml +22 -0
- package/dist/agents.d.ts +9 -5
- package/dist/agents.d.ts.map +1 -1
- package/dist/agents.js +42 -16
- package/dist/agents.js.map +1 -1
- package/dist/build.d.ts +11 -10
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +32 -31
- package/dist/build.js.map +1 -1
- package/dist/cli.d.ts +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +19 -3
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +7 -6
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +29 -11
- package/dist/config.js.map +1 -1
- package/dist/install.d.ts +5 -1
- package/dist/install.d.ts.map +1 -1
- package/dist/install.js +37 -19
- package/dist/install.js.map +1 -1
- package/package.json +18 -15
- package/LICENSE +0 -21
- package/README.md +0 -169
- package/agents/cicd/content.md +0 -17
- /package/agents/{cicd → common/cicd}/templates/claude-header.md +0 -0
- /package/agents/{cicd → common/cicd}/templates/codex-header.md +0 -0
- /package/agents/{cicd → common/cicd}/templates/cursor-frontmatter.yaml +0 -0
- /package/agents/{cicd → common/cicd}/templates/opencode-frontmatter.yaml +0 -0
- /package/agents/{local-dev → common/local-dev}/content-badges.md +0 -0
- /package/agents/{local-dev → common/local-dev}/content-license.md +0 -0
- /package/agents/{local-dev → common/local-dev}/content-mcp.md +0 -0
- /package/agents/{local-dev → common/local-dev}/templates/claude-header-badges.md +0 -0
- /package/agents/{local-dev → common/local-dev}/templates/claude-header-license.md +0 -0
- /package/agents/{local-dev → common/local-dev}/templates/claude-header-mcp.md +0 -0
- /package/agents/{local-dev → common/local-dev}/templates/claude-header.md +0 -0
- /package/agents/{local-dev → common/local-dev}/templates/codex-header-badges.md +0 -0
- /package/agents/{local-dev → common/local-dev}/templates/codex-header-license.md +0 -0
- /package/agents/{local-dev → common/local-dev}/templates/codex-header-mcp.md +0 -0
- /package/agents/{local-dev → common/local-dev}/templates/codex-header.md +0 -0
- /package/agents/{local-dev → common/local-dev}/templates/cursor-frontmatter-badges.yaml +0 -0
- /package/agents/{local-dev → common/local-dev}/templates/cursor-frontmatter-env.yaml +0 -0
- /package/agents/{local-dev → common/local-dev}/templates/cursor-frontmatter-license.yaml +0 -0
- /package/agents/{local-dev → common/local-dev}/templates/cursor-frontmatter-mcp.yaml +0 -0
- /package/agents/{local-dev → common/local-dev}/templates/cursor-frontmatter.yaml +0 -0
- /package/agents/{local-dev → common/local-dev}/templates/opencode-frontmatter-badges.yaml +0 -0
- /package/agents/{local-dev → common/local-dev}/templates/opencode-frontmatter-license.yaml +0 -0
- /package/agents/{local-dev → common/local-dev}/templates/opencode-frontmatter-mcp.yaml +0 -0
- /package/agents/{local-dev → common/local-dev}/templates/opencode-frontmatter.yaml +0 -0
- /package/agents/{observability → common/observability}/content.md +0 -0
- /package/agents/{observability → common/observability}/templates/claude-header.md +0 -0
- /package/agents/{observability → common/observability}/templates/codex-header.md +0 -0
- /package/agents/{observability → common/observability}/templates/cursor-frontmatter.yaml +0 -0
- /package/agents/{observability → common/observability}/templates/opencode-frontmatter.yaml +0 -0
- /package/agents/{linting → typescript/linting}/templates/claude-header.md +0 -0
- /package/agents/{linting → typescript/linting}/templates/codex-header.md +0 -0
- /package/agents/{linting → typescript/linting}/templates/cursor-frontmatter.yaml +0 -0
- /package/agents/{linting → typescript/linting}/templates/opencode-frontmatter.yaml +0 -0
- /package/agents/{logging → typescript/logging}/templates/claude-header.md +0 -0
- /package/agents/{logging → typescript/logging}/templates/codex-header.md +0 -0
- /package/agents/{logging → typescript/logging}/templates/cursor-frontmatter.yaml +0 -0
- /package/agents/{logging → typescript/logging}/templates/opencode-frontmatter.yaml +0 -0
package/dist/build.js
CHANGED
|
@@ -29,8 +29,8 @@ const CONTENT_MAIN = `${CONTENT_PREFIX}.md`;
|
|
|
29
29
|
* List rule suffixes for an agent. content.md → suffix ''; content-<suffix>.md → suffix.
|
|
30
30
|
* At least one of content.md or content-*.md must exist.
|
|
31
31
|
*/
|
|
32
|
-
function listRuleSuffixes(agentId) {
|
|
33
|
-
const dir = (0, agents_1.getAgentDir)(agentId);
|
|
32
|
+
function listRuleSuffixes(agentId, language = 'typescript') {
|
|
33
|
+
const dir = (0, agents_1.getAgentDir)(agentId, language);
|
|
34
34
|
if (!fs_1.default.existsSync(dir)) {
|
|
35
35
|
throw new Error(`Agent "${agentId}" has no content.md or content-*.md`);
|
|
36
36
|
}
|
|
@@ -57,8 +57,8 @@ function listRuleSuffixes(agentId) {
|
|
|
57
57
|
/**
|
|
58
58
|
* Read agent content for a rule. ruleSuffix '' or undefined = content.md; else content-<suffix>.md.
|
|
59
59
|
*/
|
|
60
|
-
function getContent(agentId, ruleSuffix) {
|
|
61
|
-
const dir = (0, agents_1.getAgentDir)(agentId);
|
|
60
|
+
function getContent(agentId, ruleSuffix, language = 'typescript') {
|
|
61
|
+
const dir = (0, agents_1.getAgentDir)(agentId, language);
|
|
62
62
|
const basename = ruleSuffix
|
|
63
63
|
? `${CONTENT_PREFIX}-${ruleSuffix}.md`
|
|
64
64
|
: CONTENT_MAIN;
|
|
@@ -71,8 +71,8 @@ function getContent(agentId, ruleSuffix) {
|
|
|
71
71
|
/**
|
|
72
72
|
* Read agent template file. Tries rule-specific template first (e.g. cursor-frontmatter-mcp.yaml).
|
|
73
73
|
*/
|
|
74
|
-
function getTemplate(agentId, filename, ruleSuffix) {
|
|
75
|
-
const dir = (0, agents_1.getAgentDir)(agentId);
|
|
74
|
+
function getTemplate(agentId, filename, ruleSuffix, language = 'typescript') {
|
|
75
|
+
const dir = (0, agents_1.getAgentDir)(agentId, language);
|
|
76
76
|
const base = filename.replace(/\.[^.]+$/, '');
|
|
77
77
|
const ext = path_1.default.extname(filename);
|
|
78
78
|
if (ruleSuffix) {
|
|
@@ -90,37 +90,37 @@ function getTemplate(agentId, filename, ruleSuffix) {
|
|
|
90
90
|
/**
|
|
91
91
|
* Build content for Cursor (.mdc = frontmatter + content)
|
|
92
92
|
*/
|
|
93
|
-
function buildCursorFormat(agentId, ruleSuffix) {
|
|
94
|
-
const frontmatter = getTemplate(agentId, 'cursor-frontmatter.yaml', ruleSuffix);
|
|
95
|
-
const content = getContent(agentId, ruleSuffix);
|
|
93
|
+
function buildCursorFormat(agentId, ruleSuffix, language = 'typescript') {
|
|
94
|
+
const frontmatter = getTemplate(agentId, 'cursor-frontmatter.yaml', ruleSuffix, language);
|
|
95
|
+
const content = getContent(agentId, ruleSuffix, language);
|
|
96
96
|
return frontmatter + '\n' + content;
|
|
97
97
|
}
|
|
98
98
|
/**
|
|
99
99
|
* Build content for Claude (header + content)
|
|
100
100
|
*/
|
|
101
|
-
function buildClaudeFormat(agentId, ruleSuffix) {
|
|
102
|
-
const header = getTemplate(agentId, 'claude-header.md', ruleSuffix);
|
|
103
|
-
const content = getContent(agentId, ruleSuffix);
|
|
101
|
+
function buildClaudeFormat(agentId, ruleSuffix, language = 'typescript') {
|
|
102
|
+
const header = getTemplate(agentId, 'claude-header.md', ruleSuffix, language);
|
|
103
|
+
const content = getContent(agentId, ruleSuffix, language);
|
|
104
104
|
return header + content;
|
|
105
105
|
}
|
|
106
106
|
/**
|
|
107
107
|
* Build content for OpenCode (YAML frontmatter + content)
|
|
108
108
|
*/
|
|
109
|
-
function buildOpenCodeFormat(agentId, ruleSuffix) {
|
|
110
|
-
const frontmatter = getTemplate(agentId, 'opencode-frontmatter.yaml', ruleSuffix);
|
|
111
|
-
const content = getContent(agentId, ruleSuffix);
|
|
109
|
+
function buildOpenCodeFormat(agentId, ruleSuffix, language = 'typescript') {
|
|
110
|
+
const frontmatter = getTemplate(agentId, 'opencode-frontmatter.yaml', ruleSuffix, language);
|
|
111
|
+
const content = getContent(agentId, ruleSuffix, language);
|
|
112
112
|
return frontmatter + '\n' + content;
|
|
113
113
|
}
|
|
114
|
-
function getCodexHeader(agentId, ruleSuffix) {
|
|
114
|
+
function getCodexHeader(agentId, ruleSuffix, language = 'typescript') {
|
|
115
115
|
let codexError;
|
|
116
116
|
try {
|
|
117
|
-
return getTemplate(agentId, 'codex-header.md', ruleSuffix);
|
|
117
|
+
return getTemplate(agentId, 'codex-header.md', ruleSuffix, language);
|
|
118
118
|
}
|
|
119
119
|
catch (err) {
|
|
120
120
|
codexError = err;
|
|
121
121
|
}
|
|
122
122
|
try {
|
|
123
|
-
return getTemplate(agentId, 'claude-header.md', ruleSuffix);
|
|
123
|
+
return getTemplate(agentId, 'claude-header.md', ruleSuffix, language);
|
|
124
124
|
}
|
|
125
125
|
catch (claudeError) {
|
|
126
126
|
const codexMsg = codexError instanceof Error ? codexError.message : String(codexError);
|
|
@@ -131,9 +131,9 @@ function getCodexHeader(agentId, ruleSuffix) {
|
|
|
131
131
|
/**
|
|
132
132
|
* Build content for Codex (header + content)
|
|
133
133
|
*/
|
|
134
|
-
function buildCodexFormat(agentId, ruleSuffix) {
|
|
135
|
-
const header = getCodexHeader(agentId, ruleSuffix);
|
|
136
|
-
const content = getContent(agentId, ruleSuffix);
|
|
134
|
+
function buildCodexFormat(agentId, ruleSuffix, language = 'typescript') {
|
|
135
|
+
const header = getCodexHeader(agentId, ruleSuffix, language);
|
|
136
|
+
const content = getContent(agentId, ruleSuffix, language);
|
|
137
137
|
return header + content;
|
|
138
138
|
}
|
|
139
139
|
function extractDescriptionFromFrontmatter(frontmatter) {
|
|
@@ -153,16 +153,16 @@ function extractDescriptionFromFrontmatter(frontmatter) {
|
|
|
153
153
|
return null;
|
|
154
154
|
}
|
|
155
155
|
}
|
|
156
|
-
function getCodexRuleDescription(agentId, ruleSuffix) {
|
|
156
|
+
function getCodexRuleDescription(agentId, ruleSuffix, language = 'typescript') {
|
|
157
157
|
try {
|
|
158
|
-
const frontmatter = getTemplate(agentId, 'cursor-frontmatter.yaml', ruleSuffix);
|
|
158
|
+
const frontmatter = getTemplate(agentId, 'cursor-frontmatter.yaml', ruleSuffix, language);
|
|
159
159
|
return extractDescriptionFromFrontmatter(frontmatter);
|
|
160
160
|
}
|
|
161
161
|
catch {
|
|
162
162
|
return null;
|
|
163
163
|
}
|
|
164
164
|
}
|
|
165
|
-
function buildCodexAgentsMd(agents) {
|
|
165
|
+
function buildCodexAgentsMd(agents, language = 'typescript') {
|
|
166
166
|
const lines = [];
|
|
167
167
|
lines.push('# AGENTS.md');
|
|
168
168
|
lines.push('');
|
|
@@ -173,10 +173,11 @@ function buildCodexAgentsMd(agents) {
|
|
|
173
173
|
lines.push('Read and follow these rule files in `.codex/rules/` when they apply:');
|
|
174
174
|
lines.push('');
|
|
175
175
|
for (const agentId of agents) {
|
|
176
|
-
const suffixes = listRuleSuffixes(agentId);
|
|
176
|
+
const suffixes = listRuleSuffixes(agentId, language);
|
|
177
177
|
for (const ruleSuffix of suffixes) {
|
|
178
178
|
const basename = ruleSuffix ? `${agentId}-${ruleSuffix}` : agentId;
|
|
179
|
-
const description = getCodexRuleDescription(agentId, ruleSuffix) ??
|
|
179
|
+
const description = getCodexRuleDescription(agentId, ruleSuffix, language) ??
|
|
180
|
+
`Rules for ${basename}`;
|
|
180
181
|
lines.push(`- \`.codex/rules/${basename}.md\` — ${description}`);
|
|
181
182
|
}
|
|
182
183
|
}
|
|
@@ -186,16 +187,16 @@ function buildCodexAgentsMd(agents) {
|
|
|
186
187
|
/**
|
|
187
188
|
* Build content for the given agent, target, and optional rule suffix
|
|
188
189
|
*/
|
|
189
|
-
function buildContent(agentId, target, ruleSuffix) {
|
|
190
|
+
function buildContent(agentId, target, ruleSuffix, language = 'typescript') {
|
|
190
191
|
switch (target) {
|
|
191
192
|
case 'cursor':
|
|
192
|
-
return buildCursorFormat(agentId, ruleSuffix);
|
|
193
|
+
return buildCursorFormat(agentId, ruleSuffix, language);
|
|
193
194
|
case 'claude':
|
|
194
|
-
return buildClaudeFormat(agentId, ruleSuffix);
|
|
195
|
+
return buildClaudeFormat(agentId, ruleSuffix, language);
|
|
195
196
|
case 'opencode':
|
|
196
|
-
return buildOpenCodeFormat(agentId, ruleSuffix);
|
|
197
|
+
return buildOpenCodeFormat(agentId, ruleSuffix, language);
|
|
197
198
|
case 'codex':
|
|
198
|
-
return buildCodexFormat(agentId, ruleSuffix);
|
|
199
|
+
return buildCodexFormat(agentId, ruleSuffix, language);
|
|
199
200
|
default:
|
|
200
201
|
throw new Error(`Unknown target: ${target}`);
|
|
201
202
|
}
|
package/dist/build.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
CHANGED
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAKA,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,OAAO,CAAC;CACd;AAED,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,IAAI,CAAA;CAAE,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -2,11 +2,13 @@
|
|
|
2
2
|
"use strict";
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
const install_1 = require("./install");
|
|
5
|
+
const agents_1 = require("./agents");
|
|
5
6
|
function parseArgs(argv) {
|
|
6
7
|
const args = argv.slice(2);
|
|
7
8
|
const options = {
|
|
8
9
|
target: undefined,
|
|
9
10
|
agents: [],
|
|
11
|
+
language: 'typescript',
|
|
10
12
|
all: false,
|
|
11
13
|
force: false,
|
|
12
14
|
yes: false
|
|
@@ -27,6 +29,13 @@ function parseArgs(argv) {
|
|
|
27
29
|
i++;
|
|
28
30
|
continue;
|
|
29
31
|
}
|
|
32
|
+
if (arg === '--language' || arg === '-l') {
|
|
33
|
+
const value = args[++i];
|
|
34
|
+
if (value)
|
|
35
|
+
options.language = value.trim().toLowerCase();
|
|
36
|
+
i++;
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
30
39
|
if (arg === '--all') {
|
|
31
40
|
options.all = true;
|
|
32
41
|
i++;
|
|
@@ -64,16 +73,18 @@ Commands:
|
|
|
64
73
|
|
|
65
74
|
Options:
|
|
66
75
|
--target, -t <platform> AI platform: cursor, claude, opencode, codex
|
|
67
|
-
--
|
|
76
|
+
--language, -l <lang> Language profile: ${agents_1.LANGUAGES.join(', ')} (default: typescript)
|
|
77
|
+
--agent, -a <agents> Agent(s): linting, local-dev, cicd, observability, logging, testing (comma-separated)
|
|
68
78
|
--all Install all agents
|
|
69
79
|
--force, -f Overwrite existing rule files
|
|
70
|
-
--yes, -y Non-interactive; require --target and --agent/--all if no .rulesrc.json
|
|
80
|
+
--yes, -y Non-interactive; require --target and --agent/--all if no .rulesrc.ts.json
|
|
71
81
|
--help, -h Show this help
|
|
72
82
|
--version, -v Show version
|
|
73
83
|
|
|
74
84
|
Examples:
|
|
75
85
|
ballast install
|
|
76
86
|
ballast install --target cursor --agent linting
|
|
87
|
+
ballast install --language python --target cursor --all
|
|
77
88
|
ballast install --target claude --all --force
|
|
78
89
|
ballast install --yes --target cursor --all
|
|
79
90
|
`);
|
|
@@ -108,7 +119,12 @@ async function main() {
|
|
|
108
119
|
printVersion();
|
|
109
120
|
process.exit(0);
|
|
110
121
|
}
|
|
111
|
-
const
|
|
122
|
+
const cliOptions = options;
|
|
123
|
+
if (!agents_1.LANGUAGES.includes(cliOptions.language)) {
|
|
124
|
+
console.error(`Invalid language: ${cliOptions.language}. Choose one of: ${agents_1.LANGUAGES.join(', ')}`);
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
const exitCode = await (0, install_1.runInstall)(cliOptions);
|
|
112
128
|
process.exit(exitCode);
|
|
113
129
|
}
|
|
114
130
|
main().catch((err) => {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AAEA,uCAAuC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -1,21 +1,22 @@
|
|
|
1
|
-
declare const RULESRC_FILENAME = ".rulesrc.json";
|
|
1
|
+
declare const RULESRC_FILENAME = ".rulesrc.ts.json";
|
|
2
2
|
export type Target = 'cursor' | 'claude' | 'opencode' | 'codex';
|
|
3
3
|
export interface RulesConfig {
|
|
4
4
|
target: Target;
|
|
5
5
|
agents: string[];
|
|
6
6
|
}
|
|
7
|
+
export declare function getRulesrcFilename(language?: string): string;
|
|
7
8
|
/**
|
|
8
|
-
* Find project root (directory containing
|
|
9
|
+
* Find project root (directory containing rules config or package.json)
|
|
9
10
|
*/
|
|
10
11
|
export declare function findProjectRoot(cwd?: string): string;
|
|
11
12
|
/**
|
|
12
|
-
* Load
|
|
13
|
+
* Load rules config from project root
|
|
13
14
|
*/
|
|
14
|
-
export declare function loadConfig(projectRoot?: string): RulesConfig | null;
|
|
15
|
+
export declare function loadConfig(projectRoot?: string, language?: string): RulesConfig | null;
|
|
15
16
|
/**
|
|
16
|
-
* Save
|
|
17
|
+
* Save rules config to project root
|
|
17
18
|
*/
|
|
18
|
-
export declare function saveConfig(config: RulesConfig, projectRoot?: string): void;
|
|
19
|
+
export declare function saveConfig(config: RulesConfig, projectRoot?: string, language?: string): void;
|
|
19
20
|
/**
|
|
20
21
|
* Detect if running in CI (non-interactive) mode
|
|
21
22
|
*/
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,gBAAgB,qBAAqB,CAAC;AAG5C,MAAM,MAAM,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;AAEhE,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,GAAE,MAAqB,GAAG,MAAM,CAG1E;AAaD;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,CAUnE;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,WAAW,CAAC,EAAE,MAAM,EACpB,QAAQ,GAAE,MAAqB,GAC9B,WAAW,GAAG,IAAI,CA2BpB;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,WAAW,EACnB,WAAW,CAAC,EAAE,MAAM,EACpB,QAAQ,GAAE,MAAqB,GAC9B,IAAI,CAQN;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,OAAO,CAQlC;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|
package/dist/config.js
CHANGED
|
@@ -4,23 +4,36 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.RULESRC_FILENAME = void 0;
|
|
7
|
+
exports.getRulesrcFilename = getRulesrcFilename;
|
|
7
8
|
exports.findProjectRoot = findProjectRoot;
|
|
8
9
|
exports.loadConfig = loadConfig;
|
|
9
10
|
exports.saveConfig = saveConfig;
|
|
10
11
|
exports.isCiMode = isCiMode;
|
|
11
12
|
const fs_1 = __importDefault(require("fs"));
|
|
12
13
|
const path_1 = __importDefault(require("path"));
|
|
13
|
-
const
|
|
14
|
+
const agents_1 = require("./agents");
|
|
15
|
+
const RULESRC_FILENAME = '.rulesrc.ts.json';
|
|
14
16
|
exports.RULESRC_FILENAME = RULESRC_FILENAME;
|
|
17
|
+
const LEGACY_RULESRC_FILENAME = '.rulesrc.json';
|
|
18
|
+
function getRulesrcFilename(language = 'typescript') {
|
|
19
|
+
if (language === 'typescript')
|
|
20
|
+
return RULESRC_FILENAME;
|
|
21
|
+
return `.rulesrc.${language}.json`;
|
|
22
|
+
}
|
|
23
|
+
function hasConfigFile(dir) {
|
|
24
|
+
if (fs_1.default.existsSync(path_1.default.join(dir, RULESRC_FILENAME)) ||
|
|
25
|
+
fs_1.default.existsSync(path_1.default.join(dir, LEGACY_RULESRC_FILENAME)))
|
|
26
|
+
return true;
|
|
27
|
+
return agents_1.LANGUAGES.some((language) => fs_1.default.existsSync(path_1.default.join(dir, getRulesrcFilename(language))));
|
|
28
|
+
}
|
|
15
29
|
/**
|
|
16
|
-
* Find project root (directory containing
|
|
30
|
+
* Find project root (directory containing rules config or package.json)
|
|
17
31
|
*/
|
|
18
32
|
function findProjectRoot(cwd = process.cwd()) {
|
|
19
33
|
let dir = path_1.default.resolve(cwd);
|
|
20
34
|
const root = path_1.default.parse(dir).root;
|
|
21
35
|
while (dir !== root) {
|
|
22
|
-
if (fs_1.default.existsSync(path_1.default.join(dir,
|
|
23
|
-
fs_1.default.existsSync(path_1.default.join(dir, 'package.json'))) {
|
|
36
|
+
if (hasConfigFile(dir) || fs_1.default.existsSync(path_1.default.join(dir, 'package.json'))) {
|
|
24
37
|
return dir;
|
|
25
38
|
}
|
|
26
39
|
dir = path_1.default.dirname(dir);
|
|
@@ -28,12 +41,17 @@ function findProjectRoot(cwd = process.cwd()) {
|
|
|
28
41
|
return cwd;
|
|
29
42
|
}
|
|
30
43
|
/**
|
|
31
|
-
* Load
|
|
44
|
+
* Load rules config from project root
|
|
32
45
|
*/
|
|
33
|
-
function loadConfig(projectRoot) {
|
|
46
|
+
function loadConfig(projectRoot, language = 'typescript') {
|
|
34
47
|
const root = projectRoot ?? findProjectRoot();
|
|
35
|
-
const
|
|
36
|
-
|
|
48
|
+
const fileCandidates = language === 'typescript'
|
|
49
|
+
? [getRulesrcFilename(language), LEGACY_RULESRC_FILENAME]
|
|
50
|
+
: [getRulesrcFilename(language)];
|
|
51
|
+
const filePath = fileCandidates
|
|
52
|
+
.map((name) => path_1.default.join(root, name))
|
|
53
|
+
.find((candidate) => fs_1.default.existsSync(candidate));
|
|
54
|
+
if (!filePath)
|
|
37
55
|
return null;
|
|
38
56
|
try {
|
|
39
57
|
const raw = fs_1.default.readFileSync(filePath, 'utf8');
|
|
@@ -53,11 +71,11 @@ function loadConfig(projectRoot) {
|
|
|
53
71
|
}
|
|
54
72
|
}
|
|
55
73
|
/**
|
|
56
|
-
* Save
|
|
74
|
+
* Save rules config to project root
|
|
57
75
|
*/
|
|
58
|
-
function saveConfig(config, projectRoot) {
|
|
76
|
+
function saveConfig(config, projectRoot, language = 'typescript') {
|
|
59
77
|
const root = projectRoot ?? findProjectRoot();
|
|
60
|
-
const filePath = path_1.default.join(root,
|
|
78
|
+
const filePath = path_1.default.join(root, getRulesrcFilename(language));
|
|
61
79
|
fs_1.default.writeFileSync(filePath, JSON.stringify({ target: config.target, agents: config.agents }, null, 2), 'utf8');
|
|
62
80
|
}
|
|
63
81
|
/**
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/install.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { type Language } from './agents';
|
|
1
2
|
import type { Target } from './config';
|
|
2
3
|
export interface ResolveTargetAndAgentsOptions {
|
|
3
4
|
projectRoot?: string;
|
|
4
5
|
target?: string;
|
|
5
6
|
agents?: string | string[];
|
|
6
7
|
yes?: boolean;
|
|
8
|
+
language?: Language;
|
|
7
9
|
}
|
|
8
10
|
/**
|
|
9
11
|
* Resolve target and agents from config + flags; in CI with no config, return null and caller should exit with error
|
|
@@ -16,6 +18,7 @@ export interface InstallOptions {
|
|
|
16
18
|
projectRoot: string;
|
|
17
19
|
target: Target;
|
|
18
20
|
agents: string[];
|
|
21
|
+
language?: Language;
|
|
19
22
|
force?: boolean;
|
|
20
23
|
saveConfig?: boolean;
|
|
21
24
|
}
|
|
@@ -43,12 +46,13 @@ export interface RunInstallOptions {
|
|
|
43
46
|
target?: string;
|
|
44
47
|
agents?: string[];
|
|
45
48
|
all?: boolean;
|
|
49
|
+
language?: Language;
|
|
46
50
|
force?: boolean;
|
|
47
51
|
yes?: boolean;
|
|
48
52
|
}
|
|
49
53
|
/**
|
|
50
54
|
* Run install flow: resolve target/agents (interactive or from config/flags), then install.
|
|
51
|
-
* In CI mode with no .rulesrc.json, --target and (--agent X or --all) are required.
|
|
55
|
+
* In CI mode with no .rulesrc.ts.json, --target and (--agent X or --all) are required.
|
|
52
56
|
*/
|
|
53
57
|
export declare function runInstall(options?: RunInstallOptions): Promise<number>;
|
|
54
58
|
//# sourceMappingURL=install.d.ts.map
|
package/dist/install.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAUA,OAAO,EAIL,KAAK,QAAQ,EACd,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAoDvC,MAAM,WAAW,6BAA6B;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC3B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,GAAE,6BAAkC,GAC1C,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAAC,CA8BtD;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,oFAAoF;IACpF,cAAc,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/D,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjD;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa,CAiG9D;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,MAAM,CAAC,CA+EjB"}
|
package/dist/install.js
CHANGED
|
@@ -38,18 +38,18 @@ async function promptTarget() {
|
|
|
38
38
|
/**
|
|
39
39
|
* Interactive: ask for agents (comma-separated or "all")
|
|
40
40
|
*/
|
|
41
|
-
async function promptAgents() {
|
|
42
|
-
const agents = (0, agents_1.listAgents)();
|
|
41
|
+
async function promptAgents(language = 'typescript') {
|
|
42
|
+
const agents = (0, agents_1.listAgents)(language);
|
|
43
43
|
const line = await prompt(`Agents (comma-separated or "all") [${agents.join(', ')}]: `);
|
|
44
44
|
if (!line)
|
|
45
45
|
return agents;
|
|
46
46
|
const list = line.toLowerCase() === 'all'
|
|
47
47
|
? ['all']
|
|
48
48
|
: line.split(',').map((s) => s.trim());
|
|
49
|
-
const resolved = (0, agents_1.resolveAgents)(list);
|
|
49
|
+
const resolved = (0, agents_1.resolveAgents)(list, language);
|
|
50
50
|
if (resolved.length === 0) {
|
|
51
51
|
console.error(`Invalid agents. Use "all" or comma-separated: ${agents.join(', ')}`);
|
|
52
|
-
return promptAgents();
|
|
52
|
+
return promptAgents(language);
|
|
53
53
|
}
|
|
54
54
|
return resolved;
|
|
55
55
|
}
|
|
@@ -58,7 +58,8 @@ async function promptAgents() {
|
|
|
58
58
|
*/
|
|
59
59
|
async function resolveTargetAndAgents(options = {}) {
|
|
60
60
|
const projectRoot = options.projectRoot ?? (0, config_1.findProjectRoot)();
|
|
61
|
-
const
|
|
61
|
+
const language = options.language ?? 'typescript';
|
|
62
|
+
const config = (0, config_1.loadConfig)(projectRoot, language);
|
|
62
63
|
const ci = (0, config_1.isCiMode)() || options.yes;
|
|
63
64
|
const targetFromFlag = options.target;
|
|
64
65
|
const agentsFromFlag = options.agents;
|
|
@@ -66,7 +67,9 @@ async function resolveTargetAndAgents(options = {}) {
|
|
|
66
67
|
return { target: config.target, agents: config.agents };
|
|
67
68
|
}
|
|
68
69
|
const target = targetFromFlag ?? config?.target;
|
|
69
|
-
const agents = agentsFromFlag != null
|
|
70
|
+
const agents = agentsFromFlag != null
|
|
71
|
+
? (0, agents_1.resolveAgents)(agentsFromFlag, language)
|
|
72
|
+
: config?.agents;
|
|
70
73
|
if (target && agents && agents.length > 0) {
|
|
71
74
|
return { target: target, agents };
|
|
72
75
|
}
|
|
@@ -74,14 +77,14 @@ async function resolveTargetAndAgents(options = {}) {
|
|
|
74
77
|
return null;
|
|
75
78
|
}
|
|
76
79
|
const resolvedTarget = (target ?? (await promptTarget()));
|
|
77
|
-
const resolvedAgents = agents?.length ? agents : await promptAgents();
|
|
80
|
+
const resolvedAgents = agents?.length ? agents : await promptAgents(language);
|
|
78
81
|
return { target: resolvedTarget, agents: resolvedAgents };
|
|
79
82
|
}
|
|
80
83
|
/**
|
|
81
84
|
* Install agents for the given target into projectRoot. Single policy: do not overwrite unless force.
|
|
82
85
|
*/
|
|
83
86
|
function install(options) {
|
|
84
|
-
const { projectRoot, target, agents, force = false, saveConfig: persist } = options;
|
|
87
|
+
const { projectRoot, target, agents, language = 'typescript', force = false, saveConfig: persist } = options;
|
|
85
88
|
const installed = [];
|
|
86
89
|
const installedRules = [];
|
|
87
90
|
const installedSupportFiles = [];
|
|
@@ -90,32 +93,36 @@ function install(options) {
|
|
|
90
93
|
const errors = [];
|
|
91
94
|
const processedAgentIds = new Set();
|
|
92
95
|
if (persist) {
|
|
93
|
-
(0, config_1.saveConfig)({ target, agents }, projectRoot);
|
|
96
|
+
(0, config_1.saveConfig)({ target, agents }, projectRoot, language);
|
|
94
97
|
}
|
|
95
98
|
for (const agentId of agents) {
|
|
96
|
-
if (!(0, agents_1.isValidAgent)(agentId)) {
|
|
99
|
+
if (!(0, agents_1.isValidAgent)(agentId, language)) {
|
|
97
100
|
errors.push({ agent: agentId, error: 'Unknown agent' });
|
|
98
101
|
continue;
|
|
99
102
|
}
|
|
100
|
-
processedAgentIds.add(agentId);
|
|
101
103
|
let agentInstalled = false;
|
|
102
104
|
let agentSkipped = false;
|
|
105
|
+
let agentProcessed = false;
|
|
103
106
|
try {
|
|
104
|
-
const suffixes = (0, build_1.listRuleSuffixes)(agentId);
|
|
107
|
+
const suffixes = (0, build_1.listRuleSuffixes)(agentId, language);
|
|
105
108
|
for (const ruleSuffix of suffixes) {
|
|
106
109
|
const { dir, file } = (0, build_1.getDestination)(agentId, target, projectRoot, ruleSuffix || undefined);
|
|
107
110
|
if (fs_1.default.existsSync(file) && !force) {
|
|
108
111
|
agentSkipped = true;
|
|
112
|
+
agentProcessed = true;
|
|
109
113
|
continue;
|
|
110
114
|
}
|
|
111
115
|
if (!fs_1.default.existsSync(dir)) {
|
|
112
116
|
fs_1.default.mkdirSync(dir, { recursive: true });
|
|
113
117
|
}
|
|
114
|
-
const content = (0, build_1.buildContent)(agentId, target, ruleSuffix || undefined);
|
|
118
|
+
const content = (0, build_1.buildContent)(agentId, target, ruleSuffix || undefined, language);
|
|
115
119
|
fs_1.default.writeFileSync(file, content, 'utf8');
|
|
116
120
|
installedRules.push({ agentId, ruleSuffix: ruleSuffix || '' });
|
|
117
121
|
agentInstalled = true;
|
|
122
|
+
agentProcessed = true;
|
|
118
123
|
}
|
|
124
|
+
if (agentProcessed)
|
|
125
|
+
processedAgentIds.add(agentId);
|
|
119
126
|
if (agentInstalled)
|
|
120
127
|
installed.push(agentId);
|
|
121
128
|
if (agentSkipped && !agentInstalled)
|
|
@@ -134,9 +141,17 @@ function install(options) {
|
|
|
134
141
|
skippedSupportFiles.push(agentsMdPath);
|
|
135
142
|
}
|
|
136
143
|
else {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
144
|
+
try {
|
|
145
|
+
const content = (0, build_1.buildCodexAgentsMd)(Array.from(processedAgentIds), language);
|
|
146
|
+
fs_1.default.writeFileSync(agentsMdPath, content, 'utf8');
|
|
147
|
+
installedSupportFiles.push(agentsMdPath);
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
errors.push({
|
|
151
|
+
agent: 'codex',
|
|
152
|
+
error: err instanceof Error ? err.message : String(err)
|
|
153
|
+
});
|
|
154
|
+
}
|
|
140
155
|
}
|
|
141
156
|
}
|
|
142
157
|
return {
|
|
@@ -150,19 +165,21 @@ function install(options) {
|
|
|
150
165
|
}
|
|
151
166
|
/**
|
|
152
167
|
* Run install flow: resolve target/agents (interactive or from config/flags), then install.
|
|
153
|
-
* In CI mode with no .rulesrc.json, --target and (--agent X or --all) are required.
|
|
168
|
+
* In CI mode with no .rulesrc.ts.json, --target and (--agent X or --all) are required.
|
|
154
169
|
*/
|
|
155
170
|
async function runInstall(options = {}) {
|
|
156
171
|
const projectRoot = options.projectRoot ?? (0, config_1.findProjectRoot)();
|
|
172
|
+
const language = options.language ?? 'typescript';
|
|
157
173
|
const agentsFromFlag = options.all ? 'all' : options.agents;
|
|
158
174
|
const resolved = await resolveTargetAndAgents({
|
|
159
175
|
projectRoot,
|
|
160
176
|
target: options.target,
|
|
161
177
|
agents: agentsFromFlag,
|
|
162
|
-
yes: options.yes
|
|
178
|
+
yes: options.yes,
|
|
179
|
+
language
|
|
163
180
|
});
|
|
164
181
|
if (!resolved) {
|
|
165
|
-
console.error('In CI/non-interactive mode (--yes or CI env), --target and --agent (or --all) are required when .rulesrc.json is missing.');
|
|
182
|
+
console.error('In CI/non-interactive mode (--yes or CI env), --target and --agent (or --all) are required when .rulesrc.ts.json is missing.');
|
|
166
183
|
console.error('Example: ballast install --yes --target cursor --agent linting');
|
|
167
184
|
return 1;
|
|
168
185
|
}
|
|
@@ -172,6 +189,7 @@ async function runInstall(options = {}) {
|
|
|
172
189
|
projectRoot,
|
|
173
190
|
target,
|
|
174
191
|
agents,
|
|
192
|
+
language,
|
|
175
193
|
force: options.force ?? false,
|
|
176
194
|
saveConfig: persist
|
|
177
195
|
});
|