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.
Files changed (80) hide show
  1. package/README.md +9 -0
  2. package/dist/banner.d.ts +4 -0
  3. package/dist/banner.js +35 -0
  4. package/dist/index.js +39 -0
  5. package/dist/platforms/adapters.js +123 -4
  6. package/dist/sourceResolver.d.ts +2 -0
  7. package/dist/sourceResolver.js +27 -5
  8. package/dist/types.d.ts +1 -0
  9. package/locales/en/.agents/a11y_baseline/SKILL.md +41 -0
  10. package/locales/en/.agents/adr_log/SKILL.md +69 -0
  11. package/locales/en/.agents/api_contract_compliance_review/SKILL.md +18 -0
  12. package/locales/en/.agents/api_contracts/SKILL.md +42 -0
  13. package/locales/en/.agents/architecture_compliance_review/SKILL.md +17 -0
  14. package/locales/en/.agents/architecture_doc/SKILL.md +92 -0
  15. package/locales/en/.agents/board/SKILL.md +43 -0
  16. package/locales/en/.agents/cloud_infrastructure_security/SKILL.md +68 -0
  17. package/locales/en/.agents/code_review_checklist/SKILL.md +47 -0
  18. package/locales/en/.agents/current_state_analysis/SKILL.md +44 -0
  19. package/locales/en/.agents/data_model/SKILL.md +40 -0
  20. package/locales/en/.agents/dependency_supply_chain_review/SKILL.md +20 -0
  21. package/locales/en/.agents/deployment_ci_plan/SKILL.md +51 -0
  22. package/locales/en/.agents/design_intake/SKILL.md +71 -0
  23. package/locales/en/.agents/design_parity_review/SKILL.md +73 -0
  24. package/locales/en/.agents/design_systems/SKILL.md +15 -0
  25. package/locales/en/.agents/dev_reference_snippets/SKILL.md +397 -0
  26. package/locales/en/.agents/docker_kubernetes_architecture/SKILL.md +144 -0
  27. package/locales/en/.agents/es2025_beast_practices/SKILL.md +15 -0
  28. package/locales/en/.agents/gates/SKILL.md +35 -0
  29. package/locales/en/.agents/go_beast_practices/SKILL.md +23 -0
  30. package/locales/en/.agents/handoff/SKILL.md +52 -0
  31. package/locales/en/.agents/k8s_manifests_conventions/SKILL.md +175 -0
  32. package/locales/en/.agents/memory/SKILL.md +29 -0
  33. package/locales/en/.agents/mongodb_mongoose_best_practices/SKILL.md +233 -0
  34. package/locales/en/.agents/node_express_beast_practices/SKILL.md +30 -0
  35. package/locales/en/.agents/observability_logging/SKILL.md +16 -0
  36. package/locales/en/.agents/observability_plan/SKILL.md +38 -0
  37. package/locales/en/.agents/observability_review/SKILL.md +20 -0
  38. package/locales/en/.agents/performance_review_baseline/SKILL.md +17 -0
  39. package/locales/en/.agents/pm_backlog/SKILL.md +32 -0
  40. package/locales/en/.agents/pm_interview/SKILL.md +56 -0
  41. package/locales/en/.agents/pm_prd/SKILL.md +56 -0
  42. package/locales/en/.agents/qa_api_contract_tests/SKILL.md +16 -0
  43. package/locales/en/.agents/qa_e2e_playwright/SKILL.md +0 -0
  44. package/locales/en/.agents/qa_manual_run/SKILL.md +16 -0
  45. package/locales/en/.agents/qa_security_smoke_tests/SKILL.md +14 -0
  46. package/locales/en/.agents/qa_test_plan/SKILL.md +20 -0
  47. package/locales/en/.agents/qa_ui_a11y_smoke/SKILL.md +12 -0
  48. package/locales/en/.agents/react_15_3_wix_iframe/SKILL.md +20 -0
  49. package/locales/en/.agents/react_beast_practices/SKILL.md +29 -0
  50. package/locales/en/.agents/release_gate/SKILL.md +77 -0
  51. package/locales/en/.agents/release_gate_checklist_template/SKILL.md +68 -0
  52. package/locales/en/.agents/review_reference_snippets/SKILL.md +436 -0
  53. package/locales/en/.agents/security_baseline_dev/SKILL.md +16 -0
  54. package/locales/en/.agents/security_review/SKILL.md +55 -0
  55. package/locales/en/.agents/security_review_baseline/SKILL.md +25 -0
  56. package/locales/en/.agents/state_rtk_beast_practices/SKILL.md +15 -0
  57. package/locales/en/.agents/state_zustand_beast_practices/SKILL.md +11 -0
  58. package/locales/en/.agents/styling_css_stack/SKILL.md +12 -0
  59. package/locales/en/.agents/system_design_checklist/SKILL.md +48 -0
  60. package/locales/en/.agents/tanstack_beast_practices/SKILL.md +19 -0
  61. package/locales/en/.agents/tdd_workflow/SKILL.md +34 -0
  62. package/locales/en/.agents/testing_strategy_js/SKILL.md +30 -0
  63. package/locales/en/.agents/tests_quality_review/SKILL.md +18 -0
  64. package/locales/en/.agents/threat_model_baseline/SKILL.md +57 -0
  65. package/locales/en/.agents/tooling_bun_biome/SKILL.md +17 -0
  66. package/locales/en/.agents/typescript_beast_practices/SKILL.md +15 -0
  67. package/locales/en/.agents/ui_a11y_smoke_review/SKILL.md +15 -0
  68. package/locales/en/.agents/ui_inventory/SKILL.md +50 -0
  69. package/locales/en/.agents/ux_discovery/SKILL.md +48 -0
  70. package/locales/en/.agents/ux_spec/SKILL.md +56 -0
  71. package/locales/en/.agents/wix_self_hosted_embedded_script/SKILL.md +88 -0
  72. package/locales/en/AGENTS.md +120 -0
  73. package/locales/en/agents/architect.md +239 -0
  74. package/locales/en/agents/conductor.md +205 -0
  75. package/locales/en/agents/product_manager.md +119 -0
  76. package/locales/en/agents/reviewer.md +200 -0
  77. package/locales/en/agents/senior_full_stack.md +216 -0
  78. package/locales/en/agents/tester.md +186 -0
  79. package/locales/en/agents/ux_ui_designer.md +144 -0
  80. 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`).
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Prints CODE-AI startup banner with green gradient.
3
+ */
4
+ export declare function printBanner(): void;
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 convention and .gemini folder for role/skill docs.",
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: ".codex/agents",
35
- skillsDir: ".codex/skills",
36
- notes: "Uses CODEX.md and .codex folder for role/skill docs.",
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
+ }
@@ -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>;
@@ -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 (await isValidSourceRoot(cwdPath)) {
18
- return cwdPath;
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
- const bundledPath = path.resolve(args.packageRoot);
21
- if (await isValidSourceRoot(bundledPath)) {
22
- return bundledPath;
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
@@ -2,6 +2,7 @@
2
2
  * Supported AI target identifiers.
3
3
  */
4
4
  export type TargetId = "vscode-copilot" | "claude" | "qwen-3.5" | "google-antugravity" | "gpt-codex";
5
+ export type TemplateLanguage = "ru" | "en";
5
6
  /**
6
7
  * Defines one source file and destination path copy action.
7
8
  */
@@ -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)