code-ai-installer 1.1.3 → 1.1.5
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 +9 -0
- package/dist/banner.d.ts +4 -0
- package/dist/banner.js +35 -0
- package/dist/index.js +39 -0
- package/dist/platforms/adapters.js +123 -4
- package/dist/sourceResolver.d.ts +2 -0
- package/dist/sourceResolver.js +27 -5
- package/dist/types.d.ts +1 -0
- package/locales/en/.agents/a11y_baseline/SKILL.md +41 -0
- package/locales/en/.agents/adr_log/SKILL.md +69 -0
- package/locales/en/.agents/api_contract_compliance_review/SKILL.md +18 -0
- package/locales/en/.agents/api_contracts/SKILL.md +42 -0
- package/locales/en/.agents/architecture_compliance_review/SKILL.md +17 -0
- package/locales/en/.agents/architecture_doc/SKILL.md +92 -0
- package/locales/en/.agents/board/SKILL.md +43 -0
- package/locales/en/.agents/cloud_infrastructure_security/SKILL.md +68 -0
- package/locales/en/.agents/code_review_checklist/SKILL.md +47 -0
- package/locales/en/.agents/current_state_analysis/SKILL.md +44 -0
- package/locales/en/.agents/data_model/SKILL.md +40 -0
- package/locales/en/.agents/dependency_supply_chain_review/SKILL.md +20 -0
- package/locales/en/.agents/deployment_ci_plan/SKILL.md +51 -0
- package/locales/en/.agents/design_intake/SKILL.md +71 -0
- package/locales/en/.agents/design_parity_review/SKILL.md +73 -0
- package/locales/en/.agents/design_systems/SKILL.md +15 -0
- package/locales/en/.agents/dev_reference_snippets/SKILL.md +397 -0
- package/locales/en/.agents/docker_kubernetes_architecture/SKILL.md +144 -0
- package/locales/en/.agents/es2025_beast_practices/SKILL.md +15 -0
- package/locales/en/.agents/gates/SKILL.md +35 -0
- package/locales/en/.agents/go_beast_practices/SKILL.md +23 -0
- package/locales/en/.agents/handoff/SKILL.md +52 -0
- package/locales/en/.agents/k8s_manifests_conventions/SKILL.md +175 -0
- package/locales/en/.agents/memory/SKILL.md +29 -0
- package/locales/en/.agents/mongodb_mongoose_best_practices/SKILL.md +233 -0
- package/locales/en/.agents/node_express_beast_practices/SKILL.md +30 -0
- package/locales/en/.agents/observability_logging/SKILL.md +16 -0
- package/locales/en/.agents/observability_plan/SKILL.md +38 -0
- package/locales/en/.agents/observability_review/SKILL.md +20 -0
- package/locales/en/.agents/performance_review_baseline/SKILL.md +17 -0
- package/locales/en/.agents/pm_backlog/SKILL.md +32 -0
- package/locales/en/.agents/pm_interview/SKILL.md +56 -0
- package/locales/en/.agents/pm_prd/SKILL.md +56 -0
- package/locales/en/.agents/qa_api_contract_tests/SKILL.md +16 -0
- package/locales/en/.agents/qa_e2e_playwright/SKILL.md +0 -0
- package/locales/en/.agents/qa_manual_run/SKILL.md +16 -0
- package/locales/en/.agents/qa_security_smoke_tests/SKILL.md +14 -0
- package/locales/en/.agents/qa_test_plan/SKILL.md +20 -0
- package/locales/en/.agents/qa_ui_a11y_smoke/SKILL.md +12 -0
- package/locales/en/.agents/react_15_3_wix_iframe/SKILL.md +20 -0
- package/locales/en/.agents/react_beast_practices/SKILL.md +29 -0
- package/locales/en/.agents/release_gate/SKILL.md +77 -0
- package/locales/en/.agents/release_gate_checklist_template/SKILL.md +68 -0
- package/locales/en/.agents/review_reference_snippets/SKILL.md +436 -0
- package/locales/en/.agents/security_baseline_dev/SKILL.md +16 -0
- package/locales/en/.agents/security_review/SKILL.md +55 -0
- package/locales/en/.agents/security_review_baseline/SKILL.md +25 -0
- package/locales/en/.agents/state_rtk_beast_practices/SKILL.md +15 -0
- package/locales/en/.agents/state_zustand_beast_practices/SKILL.md +11 -0
- package/locales/en/.agents/styling_css_stack/SKILL.md +12 -0
- package/locales/en/.agents/system_design_checklist/SKILL.md +48 -0
- package/locales/en/.agents/tanstack_beast_practices/SKILL.md +19 -0
- package/locales/en/.agents/tdd_workflow/SKILL.md +34 -0
- package/locales/en/.agents/testing_strategy_js/SKILL.md +30 -0
- package/locales/en/.agents/tests_quality_review/SKILL.md +18 -0
- package/locales/en/.agents/threat_model_baseline/SKILL.md +57 -0
- package/locales/en/.agents/tooling_bun_biome/SKILL.md +17 -0
- package/locales/en/.agents/typescript_beast_practices/SKILL.md +15 -0
- package/locales/en/.agents/ui_a11y_smoke_review/SKILL.md +15 -0
- package/locales/en/.agents/ui_inventory/SKILL.md +50 -0
- package/locales/en/.agents/ux_discovery/SKILL.md +48 -0
- package/locales/en/.agents/ux_spec/SKILL.md +56 -0
- package/locales/en/.agents/wix_self_hosted_embedded_script/SKILL.md +88 -0
- package/locales/en/AGENTS.md +120 -0
- package/locales/en/agents/architect.md +239 -0
- package/locales/en/agents/conductor.md +205 -0
- package/locales/en/agents/product_manager.md +119 -0
- package/locales/en/agents/reviewer.md +200 -0
- package/locales/en/agents/senior_full_stack.md +216 -0
- package/locales/en/agents/tester.md +186 -0
- package/locales/en/agents/ux_ui_designer.md +144 -0
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -47,12 +47,15 @@ code-ai targets
|
|
|
47
47
|
|
|
48
48
|
# list available agents and skills from current repository
|
|
49
49
|
code-ai list
|
|
50
|
+
code-ai list --lang en
|
|
50
51
|
|
|
51
52
|
# health checks
|
|
52
53
|
code-ai doctor --target claude
|
|
54
|
+
code-ai doctor --target claude --lang en
|
|
53
55
|
|
|
54
56
|
# dry-run install (default)
|
|
55
57
|
code-ai install --target claude --agents conductor,reviewer --skills board,security_review
|
|
58
|
+
code-ai install --target claude --lang en --agents conductor,reviewer --skills board,security_review
|
|
56
59
|
|
|
57
60
|
# install into a newly created folder under current directory
|
|
58
61
|
code-ai install --target gpt-codex --create-dir my-new-project --agents all --skills all --apply
|
|
@@ -80,6 +83,11 @@ code-ai uninstall --target claude --apply
|
|
|
80
83
|
- Google Antugravity: `GEMINI.md`
|
|
81
84
|
- Agent files copied to target-specific agents directory.
|
|
82
85
|
- Skill files copied to target-specific skills directory.
|
|
86
|
+
- For `gpt-codex`, assets are installed to `agents/` and `.agents/` for native Codex discovery.
|
|
87
|
+
- For `google-antugravity`, assets are installed in antugravity-friendly structure:
|
|
88
|
+
- agents: `.gemini/agents/<agent>/prompt.md` and `.gemini/agents/<agent>/config.json`
|
|
89
|
+
- skills: `.gemini/skills/<skill>.md` and `.gemini/skills/<skill>.py`
|
|
90
|
+
- For `qwen-3.5`, installer also generates `.qwen/settings.json` with model/context defaults.
|
|
83
91
|
- Markdown content is normalized per target (model-specific hint comments like `codex:` are transformed).
|
|
84
92
|
- `codex reasoning` is mapped to target-native hints (`copilot reasoning`, `claude thinking`, `qwen reasoning_effort`, `gemini reasoning`).
|
|
85
93
|
|
|
@@ -94,3 +102,4 @@ code-ai uninstall --target claude --apply
|
|
|
94
102
|
- Target aliases are accepted: `copilot`, `codex`, `claude`, `qwen`, `google`, `antigravity`.
|
|
95
103
|
- If your AI tool requires a custom location, pass `--destination <path>`.
|
|
96
104
|
- Source templates are resolved automatically: current directory first, bundled package templates second.
|
|
105
|
+
- Template language is selectable via `--lang ru|en` (default: `ru`).
|
package/dist/banner.d.ts
ADDED
package/dist/banner.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
const CODE_AI_ASCII = [
|
|
3
|
+
" ██████╗ ██████╗ ██████╗ ███████╗ █████╗ ██╗",
|
|
4
|
+
" ██╔════╝██╔═══██╗██╔══██╗██╔════╝ ██╔══██╗██║",
|
|
5
|
+
" ██║ ██║ ██║██║ ██║█████╗ ███████║██║",
|
|
6
|
+
" ██║ ██║ ██║██║ ██║██╔══╝ ██╔══██║██║",
|
|
7
|
+
" ╚██████╗╚██████╔╝██████╔╝███████╗ ██║ ██║██║",
|
|
8
|
+
" ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝ ╚═╝ ╚═╝╚═╝",
|
|
9
|
+
];
|
|
10
|
+
/**
|
|
11
|
+
* Prints CODE-AI startup banner with green gradient.
|
|
12
|
+
*/
|
|
13
|
+
export function printBanner() {
|
|
14
|
+
const width = Math.max(...CODE_AI_ASCII.map((line) => line.length));
|
|
15
|
+
const start = { r: 64, g: 224, b: 128 };
|
|
16
|
+
const end = { r: 16, g: 120, b: 72 };
|
|
17
|
+
for (let row = 0; row < CODE_AI_ASCII.length; row += 1) {
|
|
18
|
+
const line = CODE_AI_ASCII[row];
|
|
19
|
+
let out = "";
|
|
20
|
+
for (let i = 0; i < line.length; i += 1) {
|
|
21
|
+
const ch = line[i];
|
|
22
|
+
if (ch === " ") {
|
|
23
|
+
out += ch;
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
const t = width <= 1 ? 0 : i / (width - 1);
|
|
27
|
+
const r = Math.round(start.r + (end.r - start.r) * t);
|
|
28
|
+
const g = Math.round(start.g + (end.g - start.g) * t);
|
|
29
|
+
const b = Math.round(start.b + (end.b - start.b) * t);
|
|
30
|
+
out += chalk.rgb(r, g, b)(ch);
|
|
31
|
+
}
|
|
32
|
+
process.stdout.write(`${out}\n`);
|
|
33
|
+
}
|
|
34
|
+
process.stdout.write(`${chalk.green("Code-AI installer wizard")}\n\n`);
|
|
35
|
+
}
|
package/dist/index.js
CHANGED
|
@@ -9,6 +9,7 @@ import { runInstall, runUninstall } from "./installer.js";
|
|
|
9
9
|
import { error, info, success, warn } from "./logger.js";
|
|
10
10
|
import { getPlatformAdapters } from "./platforms/adapters.js";
|
|
11
11
|
import { resolveSourceRoot } from "./sourceResolver.js";
|
|
12
|
+
import { printBanner } from "./banner.js";
|
|
12
13
|
const program = new Command();
|
|
13
14
|
const packageRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
|
|
14
15
|
program
|
|
@@ -29,12 +30,15 @@ program
|
|
|
29
30
|
.command("list")
|
|
30
31
|
.description("List available bundled agents and skills")
|
|
31
32
|
.option("--project-dir <path>", "Optional custom source root path")
|
|
33
|
+
.option("--lang <lang>", "Template language: ru | en", "ru")
|
|
32
34
|
.action(async (options) => {
|
|
33
35
|
try {
|
|
36
|
+
const language = normalizeLanguage(options.lang);
|
|
34
37
|
const projectDir = await resolveSourceRoot({
|
|
35
38
|
projectDirOption: options.projectDir,
|
|
36
39
|
cwd: process.cwd(),
|
|
37
40
|
packageRoot,
|
|
41
|
+
language,
|
|
38
42
|
});
|
|
39
43
|
const catalog = await loadSourceCatalog(projectDir);
|
|
40
44
|
const agents = listAgentNames(catalog);
|
|
@@ -54,13 +58,16 @@ program
|
|
|
54
58
|
.requiredOption("--target <id>", "Target AI id")
|
|
55
59
|
.option("--project-dir <path>", "Optional custom source root path")
|
|
56
60
|
.option("--destination <path>", "Destination root (default: current directory)")
|
|
61
|
+
.option("--lang <lang>", "Template language: ru | en", "ru")
|
|
57
62
|
.action(async (options) => {
|
|
58
63
|
try {
|
|
59
64
|
const target = normalizeTarget(options.target);
|
|
65
|
+
const language = normalizeLanguage(options.lang);
|
|
60
66
|
const projectDir = await resolveSourceRoot({
|
|
61
67
|
projectDirOption: options.projectDir,
|
|
62
68
|
cwd: process.cwd(),
|
|
63
69
|
packageRoot,
|
|
70
|
+
language,
|
|
64
71
|
});
|
|
65
72
|
const destinationDir = path.resolve(options.destination ?? process.cwd());
|
|
66
73
|
const report = await runDoctor(projectDir, destinationDir, target);
|
|
@@ -93,6 +100,7 @@ program
|
|
|
93
100
|
.option("--project-dir <path>", "Optional custom source root path")
|
|
94
101
|
.option("--destination <path>", "Destination root (default: current directory)")
|
|
95
102
|
.option("--create-dir <name>", "Create child folder in current directory and install there")
|
|
103
|
+
.option("--lang <lang>", "Template language: ru | en", "ru")
|
|
96
104
|
.option("--agents <list>", "Comma list of agents or 'all'", "all")
|
|
97
105
|
.option("--skills <list>", "Comma list of skills or 'all'", "all")
|
|
98
106
|
.option("--overwrite", "Overwrite existing files", false)
|
|
@@ -101,10 +109,12 @@ program
|
|
|
101
109
|
.action(async (options) => {
|
|
102
110
|
try {
|
|
103
111
|
const target = normalizeTarget(options.target);
|
|
112
|
+
const language = normalizeLanguage(options.lang);
|
|
104
113
|
const projectDir = await resolveSourceRoot({
|
|
105
114
|
projectDirOption: options.projectDir,
|
|
106
115
|
cwd: process.cwd(),
|
|
107
116
|
packageRoot,
|
|
117
|
+
language,
|
|
108
118
|
});
|
|
109
119
|
const baseDestination = path.resolve(options.destination ?? process.cwd());
|
|
110
120
|
const destinationDir = options.createDir ? path.join(baseDestination, options.createDir) : baseDestination;
|
|
@@ -185,9 +195,26 @@ program
|
|
|
185
195
|
* Runs interactive installer workflow when no subcommand is provided.
|
|
186
196
|
*/
|
|
187
197
|
async function runInteractiveWizard() {
|
|
198
|
+
printBanner();
|
|
199
|
+
const languageAnswer = await prompts({
|
|
200
|
+
type: "select",
|
|
201
|
+
name: "language",
|
|
202
|
+
message: "Выбери язык шаблонов:",
|
|
203
|
+
choices: [
|
|
204
|
+
{ title: "Русский (ru)", value: "ru" },
|
|
205
|
+
{ title: "English (en)", value: "en" },
|
|
206
|
+
],
|
|
207
|
+
initial: 0,
|
|
208
|
+
});
|
|
209
|
+
if (!languageAnswer.language) {
|
|
210
|
+
warn("Установка отменена.");
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
const language = normalizeLanguage(languageAnswer.language);
|
|
188
214
|
const sourceRoot = await resolveSourceRoot({
|
|
189
215
|
cwd: process.cwd(),
|
|
190
216
|
packageRoot,
|
|
217
|
+
language,
|
|
191
218
|
});
|
|
192
219
|
const catalog = await loadSourceCatalog(sourceRoot);
|
|
193
220
|
const adapters = getPlatformAdapters();
|
|
@@ -358,6 +385,18 @@ function normalizeTarget(rawTarget) {
|
|
|
358
385
|
}
|
|
359
386
|
return normalized;
|
|
360
387
|
}
|
|
388
|
+
/**
|
|
389
|
+
* Normalizes template language code.
|
|
390
|
+
* @param rawLanguage Raw language value.
|
|
391
|
+
* @returns Normalized template language.
|
|
392
|
+
*/
|
|
393
|
+
function normalizeLanguage(rawLanguage) {
|
|
394
|
+
const value = rawLanguage.trim().toLowerCase();
|
|
395
|
+
if (value === "ru" || value === "en") {
|
|
396
|
+
return value;
|
|
397
|
+
}
|
|
398
|
+
throw new Error(`Unsupported language '${rawLanguage}'. Use 'ru' or 'en'.`);
|
|
399
|
+
}
|
|
361
400
|
if (process.argv.length <= 2) {
|
|
362
401
|
runInteractiveWizard().catch((err) => {
|
|
363
402
|
error(err.message);
|
|
@@ -26,14 +26,14 @@ const targetLayouts = {
|
|
|
26
26
|
orchestratorMirrorFile: "AGENTS.md",
|
|
27
27
|
agentsDir: ".gemini/agents",
|
|
28
28
|
skillsDir: ".gemini/skills",
|
|
29
|
-
notes: "Uses GEMINI.md
|
|
29
|
+
notes: "Uses GEMINI.md and antugravity-style layout with per-agent folders and script-oriented skills.",
|
|
30
30
|
},
|
|
31
31
|
"gpt-codex": {
|
|
32
32
|
instructionFile: "CODEX.md",
|
|
33
33
|
orchestratorMirrorFile: "AGENTS.md",
|
|
34
|
-
agentsDir: "
|
|
35
|
-
skillsDir: ".
|
|
36
|
-
notes: "Uses
|
|
34
|
+
agentsDir: "agents",
|
|
35
|
+
skillsDir: ".agents",
|
|
36
|
+
notes: "Uses AGENTS.md/agents/.agents layout compatible with Codex agent and skills discovery.",
|
|
37
37
|
},
|
|
38
38
|
};
|
|
39
39
|
/**
|
|
@@ -100,6 +100,9 @@ function buildAdapter(id, label) {
|
|
|
100
100
|
* @returns Planned operations list.
|
|
101
101
|
*/
|
|
102
102
|
function planForLayout(layout, catalog, destinationDir, selectedAgents, selectedSkills, target) {
|
|
103
|
+
if (target === "google-antugravity") {
|
|
104
|
+
return planForGeminiLayout(layout, catalog, destinationDir, selectedAgents, selectedSkills, target);
|
|
105
|
+
}
|
|
103
106
|
const operations = [];
|
|
104
107
|
operations.push({
|
|
105
108
|
sourcePath: catalog.orchestratorPath,
|
|
@@ -117,6 +120,14 @@ function planForLayout(layout, catalog, destinationDir, selectedAgents, selected
|
|
|
117
120
|
generated: true,
|
|
118
121
|
content: instructionContent,
|
|
119
122
|
});
|
|
123
|
+
if (target === "qwen-3.5") {
|
|
124
|
+
operations.push({
|
|
125
|
+
sourcePath: "<generated>",
|
|
126
|
+
destinationPath: path.join(destinationDir, ".qwen", "settings.json"),
|
|
127
|
+
generated: true,
|
|
128
|
+
content: renderQwenSettings(),
|
|
129
|
+
});
|
|
130
|
+
}
|
|
120
131
|
for (const agentName of selectedAgents) {
|
|
121
132
|
const sourcePath = catalog.agentFiles[agentName];
|
|
122
133
|
if (!sourcePath) {
|
|
@@ -149,6 +160,78 @@ function planForLayout(layout, catalog, destinationDir, selectedAgents, selected
|
|
|
149
160
|
}
|
|
150
161
|
return operations;
|
|
151
162
|
}
|
|
163
|
+
/**
|
|
164
|
+
* Plans google-antugravity specific layout with per-agent folders and script-first skills.
|
|
165
|
+
* @param layout Platform layout.
|
|
166
|
+
* @param catalog Source catalog.
|
|
167
|
+
* @param destinationDir Destination root.
|
|
168
|
+
* @param selectedAgents Selected agent names.
|
|
169
|
+
* @param selectedSkills Selected skill names.
|
|
170
|
+
* @param target Target id.
|
|
171
|
+
* @returns Planned operations list.
|
|
172
|
+
*/
|
|
173
|
+
function planForGeminiLayout(layout, catalog, destinationDir, selectedAgents, selectedSkills, target) {
|
|
174
|
+
const operations = [];
|
|
175
|
+
operations.push({
|
|
176
|
+
sourcePath: catalog.orchestratorPath,
|
|
177
|
+
destinationPath: path.join(destinationDir, layout.orchestratorMirrorFile),
|
|
178
|
+
generated: false,
|
|
179
|
+
transform: {
|
|
180
|
+
target,
|
|
181
|
+
assetType: "orchestrator",
|
|
182
|
+
},
|
|
183
|
+
});
|
|
184
|
+
const instructionContent = renderInstructionFile(target, selectedAgents, selectedSkills);
|
|
185
|
+
operations.push({
|
|
186
|
+
sourcePath: "<generated>",
|
|
187
|
+
destinationPath: path.join(destinationDir, layout.instructionFile),
|
|
188
|
+
generated: true,
|
|
189
|
+
content: instructionContent,
|
|
190
|
+
});
|
|
191
|
+
for (const agentName of selectedAgents) {
|
|
192
|
+
const sourcePath = catalog.agentFiles[agentName];
|
|
193
|
+
if (!sourcePath) {
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
operations.push({
|
|
197
|
+
sourcePath,
|
|
198
|
+
destinationPath: path.join(destinationDir, layout.agentsDir, agentName, "prompt.md"),
|
|
199
|
+
generated: false,
|
|
200
|
+
transform: {
|
|
201
|
+
target,
|
|
202
|
+
assetType: "agent",
|
|
203
|
+
},
|
|
204
|
+
});
|
|
205
|
+
operations.push({
|
|
206
|
+
sourcePath: "<generated>",
|
|
207
|
+
destinationPath: path.join(destinationDir, layout.agentsDir, agentName, "config.json"),
|
|
208
|
+
generated: true,
|
|
209
|
+
content: renderGeminiAgentConfig(agentName),
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
for (const skillName of selectedSkills) {
|
|
213
|
+
const sourcePath = catalog.skillFiles[skillName];
|
|
214
|
+
if (!sourcePath) {
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
operations.push({
|
|
218
|
+
sourcePath,
|
|
219
|
+
destinationPath: path.join(destinationDir, layout.skillsDir, `${skillName}.md`),
|
|
220
|
+
generated: false,
|
|
221
|
+
transform: {
|
|
222
|
+
target,
|
|
223
|
+
assetType: "skill",
|
|
224
|
+
},
|
|
225
|
+
});
|
|
226
|
+
operations.push({
|
|
227
|
+
sourcePath: "<generated>",
|
|
228
|
+
destinationPath: path.join(destinationDir, layout.skillsDir, `${skillName}.py`),
|
|
229
|
+
generated: true,
|
|
230
|
+
content: renderGeminiSkillStub(skillName),
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
return operations;
|
|
234
|
+
}
|
|
152
235
|
/**
|
|
153
236
|
* Renders a platform-level instruction file with selected assets.
|
|
154
237
|
* @param target Target id.
|
|
@@ -178,3 +261,39 @@ function renderInstructionFile(target, selectedAgents, selectedSkills) {
|
|
|
178
261
|
lines.push("- Skills: see platform-specific skills directory.");
|
|
179
262
|
return `${lines.join("\n")}\n`;
|
|
180
263
|
}
|
|
264
|
+
/**
|
|
265
|
+
* Renders default antugravity agent config file.
|
|
266
|
+
* @param agentName Agent identifier.
|
|
267
|
+
* @returns Config JSON.
|
|
268
|
+
*/
|
|
269
|
+
function renderGeminiAgentConfig(agentName) {
|
|
270
|
+
return `${JSON.stringify({
|
|
271
|
+
name: agentName,
|
|
272
|
+
model: "gemini-2.5-pro",
|
|
273
|
+
promptFile: "prompt.md",
|
|
274
|
+
reasoning: "medium",
|
|
275
|
+
temperature: 0.2,
|
|
276
|
+
}, null, 2)}\n`;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Renders python stub for gemini skill file.
|
|
280
|
+
* @param skillName Skill identifier.
|
|
281
|
+
* @returns Python source code.
|
|
282
|
+
*/
|
|
283
|
+
function renderGeminiSkillStub(skillName) {
|
|
284
|
+
return `\"\"\"Auto-generated skill stub for ${skillName}.\\nSee ${skillName}.md for behavior details.\"\"\"\\n\\n\\ndef run(input_text: str) -> str:\\n \"\"\"Execute ${skillName} skill logic.\"\"\"\\n return f\"${skillName}: {input_text}\"\\n`;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Renders default Qwen settings.json.
|
|
288
|
+
* @returns Qwen settings JSON.
|
|
289
|
+
*/
|
|
290
|
+
function renderQwenSettings() {
|
|
291
|
+
return `${JSON.stringify({
|
|
292
|
+
model: {
|
|
293
|
+
name: "qwen3-coder-plus",
|
|
294
|
+
},
|
|
295
|
+
context: {
|
|
296
|
+
fileName: ["QWEN.md", "AGENTS.md"],
|
|
297
|
+
},
|
|
298
|
+
}, null, 2)}\n`;
|
|
299
|
+
}
|
package/dist/sourceResolver.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { TemplateLanguage } from "./types.js";
|
|
1
2
|
/**
|
|
2
3
|
* Resolves source root with agent templates.
|
|
3
4
|
* @param args Resolution arguments.
|
|
@@ -7,4 +8,5 @@ export declare function resolveSourceRoot(args: {
|
|
|
7
8
|
projectDirOption?: string;
|
|
8
9
|
cwd: string;
|
|
9
10
|
packageRoot: string;
|
|
11
|
+
language: TemplateLanguage;
|
|
10
12
|
}): Promise<string>;
|
package/dist/sourceResolver.js
CHANGED
|
@@ -13,13 +13,23 @@ export async function resolveSourceRoot(args) {
|
|
|
13
13
|
}
|
|
14
14
|
throw new Error(`Invalid --project-dir: ${explicitPath}. Required: AGENTS.md, agents/, and .agents/.`);
|
|
15
15
|
}
|
|
16
|
+
const bundledPath = getBundledPath(args.packageRoot, args.language);
|
|
16
17
|
const cwdPath = path.resolve(args.cwd);
|
|
17
|
-
if (
|
|
18
|
-
|
|
18
|
+
if (args.language === "en") {
|
|
19
|
+
if (await isValidSourceRoot(bundledPath)) {
|
|
20
|
+
return bundledPath;
|
|
21
|
+
}
|
|
22
|
+
if (await isValidSourceRoot(cwdPath)) {
|
|
23
|
+
return cwdPath;
|
|
24
|
+
}
|
|
19
25
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
26
|
+
else {
|
|
27
|
+
if (await isValidSourceRoot(cwdPath)) {
|
|
28
|
+
return cwdPath;
|
|
29
|
+
}
|
|
30
|
+
if (await isValidSourceRoot(bundledPath)) {
|
|
31
|
+
return bundledPath;
|
|
32
|
+
}
|
|
23
33
|
}
|
|
24
34
|
throw new Error(`Could not find source templates in current directory or bundled package. Checked: ${cwdPath} and ${bundledPath}`);
|
|
25
35
|
}
|
|
@@ -34,3 +44,15 @@ async function isValidSourceRoot(rootDir) {
|
|
|
34
44
|
const dotAgentsDir = path.join(rootDir, ".agents");
|
|
35
45
|
return (await fs.pathExists(orchestratorPath)) && (await fs.pathExists(agentsDir)) && (await fs.pathExists(dotAgentsDir));
|
|
36
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Returns bundled templates root for selected language.
|
|
49
|
+
* @param packageRoot Installed package root.
|
|
50
|
+
* @param language Template language.
|
|
51
|
+
* @returns Absolute bundled source path.
|
|
52
|
+
*/
|
|
53
|
+
function getBundledPath(packageRoot, language) {
|
|
54
|
+
if (language === "en") {
|
|
55
|
+
return path.resolve(packageRoot, "locales", "en");
|
|
56
|
+
}
|
|
57
|
+
return path.resolve(packageRoot);
|
|
58
|
+
}
|
package/dist/types.d.ts
CHANGED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: a11y_baseline
|
|
3
|
+
description: Minimum baseline accessibility for web UI: keyboard navigation, focus management, form labels, ARIA for interactive components, error messages.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
#Skill: A11y Baseline (minimum)
|
|
7
|
+
|
|
8
|
+
## Goal
|
|
9
|
+
Set minimum accessibility requirements that can be tested and implemented in the MVP.
|
|
10
|
+
|
|
11
|
+
## Exit
|
|
12
|
+
List of a11y requirements for the project + notes on key components.
|
|
13
|
+
|
|
14
|
+
## Minimum Requirements (MVP)
|
|
15
|
+
1) **Keyboard navigation**
|
|
16
|
+
- All interactive elements are accessible from the keyboard
|
|
17
|
+
- Tab order is logical
|
|
18
|
+
- No trick traps
|
|
19
|
+
|
|
20
|
+
2) **Focus states**
|
|
21
|
+
- Visible focus for all interactive elements
|
|
22
|
+
- In modals: focus moves inside and returns back when closed
|
|
23
|
+
|
|
24
|
+
3) **Forms**
|
|
25
|
+
- Each field has a label (visible or aria-label)
|
|
26
|
+
- Errors are assigned to a field (the error description is read by assistive technologies)
|
|
27
|
+
- Required fields are marked and clear
|
|
28
|
+
|
|
29
|
+
4) **ARIA (where needed)**
|
|
30
|
+
- Dialog: role="dialog" + aria-modal
|
|
31
|
+
- Tabs, dropdowns, comboboxes - correct roles/attributes (if we use custom ones)
|
|
32
|
+
|
|
33
|
+
5) **Error messaging**
|
|
34
|
+
- Errors are clear, without “unknown error”
|
|
35
|
+
- There are actions: retry/close/fix
|
|
36
|
+
|
|
37
|
+
## Receipt for tester
|
|
38
|
+
- You can go through key flows without a mouse
|
|
39
|
+
- In modal, focus does not leak
|
|
40
|
+
- Forms announce label/errors
|
|
41
|
+
- Custom components have ARIA and work with assistive technologies
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
name:adr_log
|
|
3
|
+
description: Record key architectural decisions (ADR) with trade-offs: Pros/Cons/Alternatives/Decision, status and date.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
#Skill: ADR Log
|
|
7
|
+
|
|
8
|
+
## Goal
|
|
9
|
+
Don’t lose track of “why we did this” and simplify review/support.
|
|
10
|
+
|
|
11
|
+
## When to use
|
|
12
|
+
- For every non-trivial choice: database, auth, cache, module structure, API format, error strategy, queues, search, deployment, integrations, etc.
|
|
13
|
+
|
|
14
|
+
## ADR format (required)
|
|
15
|
+
# ADR-XXX: <Name>
|
|
16
|
+
|
|
17
|
+
## Context
|
|
18
|
+
<why is this necessary, what are the limitations, what hurts>
|
|
19
|
+
|
|
20
|
+
##Decision
|
|
21
|
+
<what you chose and how exactly>
|
|
22
|
+
|
|
23
|
+
## Consequences
|
|
24
|
+
### Positive
|
|
25
|
+
- ...
|
|
26
|
+
###Negative
|
|
27
|
+
- ...
|
|
28
|
+
|
|
29
|
+
## Alternatives Considered
|
|
30
|
+
- **A**: ...
|
|
31
|
+
- **B**: ...
|
|
32
|
+
|
|
33
|
+
##Status
|
|
34
|
+
Proposed / Accepted / Deprecated
|
|
35
|
+
|
|
36
|
+
##Date
|
|
37
|
+
YYYY-MM-DD
|
|
38
|
+
|
|
39
|
+
## Requirements (strict)
|
|
40
|
+
- For each ADR there must be explicit Pros/Cons/Alternatives and rationale of choice.
|
|
41
|
+
- If the decision affects security/data/cost, be sure to describe the consequences.
|
|
42
|
+
- ADR should be short and specific: without water, but with key arguments.
|
|
43
|
+
|
|
44
|
+
## Example (short)
|
|
45
|
+
# ADR-001: Selecting the main database
|
|
46
|
+
|
|
47
|
+
##Context
|
|
48
|
+
You need to store users/sessions/orders. Transactions and complex queries are needed. Expected growth to 100K users.
|
|
49
|
+
|
|
50
|
+
##Decision
|
|
51
|
+
We use PostgreSQL as the main database.
|
|
52
|
+
|
|
53
|
+
## Consequences
|
|
54
|
+
### Positive
|
|
55
|
+
- ACID transactions
|
|
56
|
+
- Rich queries and indexing
|
|
57
|
+
###Negative
|
|
58
|
+
- Possible need for scaling during growth
|
|
59
|
+
- Operational costs for administration
|
|
60
|
+
|
|
61
|
+
## Alternatives Considered
|
|
62
|
+
- **MongoDB**: weaker in transactional/complex join scenarios
|
|
63
|
+
- **DynamoDB**: vendor lock-in, more difficult to test locally
|
|
64
|
+
|
|
65
|
+
##Status
|
|
66
|
+
Accepted
|
|
67
|
+
|
|
68
|
+
##Date
|
|
69
|
+
2025-01-15
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: api_contract_compliance_review
|
|
3
|
+
description: Checking the compliance of the API implementation with contracts: schemes, error codes, validation, authorization, idempotency, pagination.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Skill: API Contract Compliance Review
|
|
7
|
+
|
|
8
|
+
## Check
|
|
9
|
+
- Endpoints correspond to API Contracts (method/path/request/response)
|
|
10
|
+
- Errors: status + error_code + safe message
|
|
11
|
+
- Border Validation (422 or accepted policy)
|
|
12
|
+
- 401 vs 403 correct
|
|
13
|
+
- Pagination/filters/sorting are implemented if UX is required
|
|
14
|
+
- Idempotency for risky operations (if it was in the contract/ADR)
|
|
15
|
+
|
|
16
|
+
## Exit
|
|
17
|
+
- Inconsistencies for each endpoint
|
|
18
|
+
- Recommendations (pointwise)
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: api_contracts
|
|
3
|
+
description: API contracts for UX flows: endpoints, schemas, errors, validation, authorization, perf/scalability considerations, idempotency and integration patterns.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Skill: API Contracts
|
|
7
|
+
|
|
8
|
+
## Goal
|
|
9
|
+
Make the API predictable, safe and efficient for the client and tests.
|
|
10
|
+
|
|
11
|
+
## Inputs
|
|
12
|
+
- UX Spec (screens/actions/states)
|
|
13
|
+
- PRD (acceptance criteria)
|
|
14
|
+
- Roles/permissions
|
|
15
|
+
|
|
16
|
+
## Exit
|
|
17
|
+
### General rules
|
|
18
|
+
- Unified error format (error_code, message, details)
|
|
19
|
+
- 401 vs 403 distinguish
|
|
20
|
+
- Validation at boundaries
|
|
21
|
+
- Pagination/filters/sorting - if the UI requires
|
|
22
|
+
- Idempotency for create/risk operations (where needed)
|
|
23
|
+
- Versioning (if the public API is expected to grow)
|
|
24
|
+
|
|
25
|
+
### For each endpoint
|
|
26
|
+
- Method + Path
|
|
27
|
+
- AuthN/AuthZ: required? roles?
|
|
28
|
+
- Request schema (types + restrictions)
|
|
29
|
+
- Response schema
|
|
30
|
+
- Errors:
|
|
31
|
+
- status
|
|
32
|
+
- error_code
|
|
33
|
+
- safe message
|
|
34
|
+
- Perf/scalability notes:
|
|
35
|
+
- limits, pagination, batch, round-trips minimization
|
|
36
|
+
|
|
37
|
+
### Integrations
|
|
38
|
+
- Webhooks/external APIs: retry/backoff, signature/verification, idempotency
|
|
39
|
+
- Async if justified (event-driven)
|
|
40
|
+
|
|
41
|
+
## Trade-offs
|
|
42
|
+
If there are controversial areas (for example, CQRS/async), record them as ADR.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: architecture_compliance_review
|
|
3
|
+
description: Checking code compliance with architecture/ADR: module boundaries, layers, dependencies, conventions, red flags.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
#Skill: Architecture Compliance Review
|
|
7
|
+
|
|
8
|
+
## Check
|
|
9
|
+
- Compliance with modular boundaries (controller/service/repo or similar)
|
|
10
|
+
- Direction of dependencies (UI does not pull data directly, etc.)
|
|
11
|
+
- Lack of red flags: Big Ball of Mud, God Object, Tight Coupling, Magic
|
|
12
|
+
- New “solutions” are issued ADR (if they affect the database/cache/auth/contracts/integrations)
|
|
13
|
+
|
|
14
|
+
## Exit
|
|
15
|
+
- Findings (P0/P1/P2)
|
|
16
|
+
- Recommendations for refactoring (pointwise)
|
|
17
|
+
- Is ADR required? (yes/no what to describe)
|