contextos-agents 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/AGENTS.md +421 -0
- package/.agents/adapters/aider/export.js +137 -0
- package/.agents/adapters/claude/export.js +55 -0
- package/.agents/adapters/copilot/export.js +107 -0
- package/.agents/adapters/cursor/export.js +210 -0
- package/.agents/adapters/gemini/export.js +115 -0
- package/.agents/adapters/shared.js +119 -0
- package/.agents/adapters/zed/export.js +111 -0
- package/.agents/core/profiles/backend.yaml +47 -0
- package/.agents/core/profiles/enterprise.yaml +46 -0
- package/.agents/core/profiles/frontend.yaml +46 -0
- package/.agents/core/profiles/hackathon.yaml +45 -0
- package/.agents/core/profiles/mvp.yaml +43 -0
- package/.agents/core/profiles/startup.yaml +48 -0
- package/.agents/core/skills/adapters/EXAMPLES.md +19 -0
- package/.agents/core/skills/adapters/SKILL.md +105 -0
- package/.agents/core/skills/adapters/TROUBLESHOOTING.md +7 -0
- package/.agents/core/skills/adapters/VALIDATION.json +12 -0
- package/.agents/core/skills/adapters/skill.yaml +10 -0
- package/.agents/core/skills/architecture-diagrams/SKILL.md +108 -0
- package/.agents/core/skills/architecture-diagrams/VALIDATION.json +12 -0
- package/.agents/core/skills/architecture-diagrams/skill.yaml +8 -0
- package/.agents/core/skills/brutalist-design/SKILL.md +150 -0
- package/.agents/core/skills/brutalist-design/VALIDATION.json +12 -0
- package/.agents/core/skills/brutalist-design/skill.yaml +8 -0
- package/.agents/core/skills/context-manager/EXAMPLES.md +19 -0
- package/.agents/core/skills/context-manager/SKILL.md +126 -0
- package/.agents/core/skills/context-manager/TROUBLESHOOTING.md +7 -0
- package/.agents/core/skills/context-manager/VALIDATION.json +12 -0
- package/.agents/core/skills/context-manager/skill.yaml +10 -0
- package/.agents/core/skills/context-os/EXAMPLES.md +21 -0
- package/.agents/core/skills/context-os/SKILL.md +169 -0
- package/.agents/core/skills/context-os/TROUBLESHOOTING.md +7 -0
- package/.agents/core/skills/context-os/VALIDATION.json +12 -0
- package/.agents/core/skills/context-os/packs.yaml +59 -0
- package/.agents/core/skills/context-os/references/context-rules.md +68 -0
- package/.agents/core/skills/context-os/references/pipeline.md +119 -0
- package/.agents/core/skills/context-os/references/project-graph.md +103 -0
- package/.agents/core/skills/context-os/rules.yaml +135 -0
- package/.agents/core/skills/context-os/skill.yaml +10 -0
- package/.agents/core/skills/database/EXAMPLES.md +74 -0
- package/.agents/core/skills/database/SKILL.md +101 -0
- package/.agents/core/skills/database/TROUBLESHOOTING.md +18 -0
- package/.agents/core/skills/database/VALIDATION.json +11 -0
- package/.agents/core/skills/database/skill.yaml +25 -0
- package/.agents/core/skills/ddd/EXAMPLES.md +42 -0
- package/.agents/core/skills/ddd/SKILL.md +247 -0
- package/.agents/core/skills/ddd/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/ddd/VALIDATION.json +12 -0
- package/.agents/core/skills/ddd/ddd.md +178 -0
- package/.agents/core/skills/ddd/skill.yaml +10 -0
- package/.agents/core/skills/decisions/EXAMPLES.md +35 -0
- package/.agents/core/skills/decisions/SKILL.md +90 -0
- package/.agents/core/skills/decisions/TROUBLESHOOTING.md +13 -0
- package/.agents/core/skills/decisions/VALIDATION.json +12 -0
- package/.agents/core/skills/decisions/skill.yaml +10 -0
- package/.agents/core/skills/docker/EXAMPLES.md +56 -0
- package/.agents/core/skills/docker/SKILL.md +63 -0
- package/.agents/core/skills/docker/TROUBLESHOOTING.md +18 -0
- package/.agents/core/skills/docker/VALIDATION.json +11 -0
- package/.agents/core/skills/docker/skill.yaml +23 -0
- package/.agents/core/skills/engineering-workflow/EXAMPLES.md +57 -0
- package/.agents/core/skills/engineering-workflow/SKILL.md +343 -0
- package/.agents/core/skills/engineering-workflow/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/engineering-workflow/VALIDATION.json +12 -0
- package/.agents/core/skills/engineering-workflow/skill.yaml +13 -0
- package/.agents/core/skills/fastapi/EXAMPLES.md +36 -0
- package/.agents/core/skills/fastapi/SKILL.md +148 -0
- package/.agents/core/skills/fastapi/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/fastapi/VALIDATION.json +12 -0
- package/.agents/core/skills/fastapi/fastapi.md +112 -0
- package/.agents/core/skills/fastapi/skill.yaml +10 -0
- package/.agents/core/skills/gemini-precision/SKILL.md +169 -0
- package/.agents/core/skills/gemini-precision/VALIDATION.json +12 -0
- package/.agents/core/skills/gemini-precision/skill.yaml +9 -0
- package/.agents/core/skills/generators/EXAMPLES.md +19 -0
- package/.agents/core/skills/generators/SKILL.md +112 -0
- package/.agents/core/skills/generators/TROUBLESHOOTING.md +7 -0
- package/.agents/core/skills/generators/VALIDATION.json +12 -0
- package/.agents/core/skills/generators/skill.yaml +10 -0
- package/.agents/core/skills/generators/templates/API.md +77 -0
- package/.agents/core/skills/generators/templates/ARCHITECTURE.md +70 -0
- package/.agents/core/skills/generators/templates/DATABASE.md +42 -0
- package/.agents/core/skills/generators/templates/DECISION.md +46 -0
- package/.agents/core/skills/generators/templates/PRD.md +67 -0
- package/.agents/core/skills/generators/templates/PROJECT_GRAPH.md +56 -0
- package/.agents/core/skills/generators/templates/ROADMAP.md +51 -0
- package/.agents/core/skills/generators/templates/TASKS.md +43 -0
- package/.agents/core/skills/generators/templates/UI.md +73 -0
- package/.agents/core/skills/graphify/EXAMPLES.md +73 -0
- package/.agents/core/skills/graphify/SKILL.md +130 -0
- package/.agents/core/skills/graphify/VALIDATION.json +12 -0
- package/.agents/core/skills/graphify/skill.yaml +13 -0
- package/.agents/core/skills/gstack-roles/EXAMPLES.md +23 -0
- package/.agents/core/skills/gstack-roles/SKILL.md +152 -0
- package/.agents/core/skills/gstack-roles/TROUBLESHOOTING.md +13 -0
- package/.agents/core/skills/gstack-roles/VALIDATION.json +12 -0
- package/.agents/core/skills/gstack-roles/skill.yaml +12 -0
- package/.agents/core/skills/impeccable-design/EXAMPLES.md +26 -0
- package/.agents/core/skills/impeccable-design/SKILL.md +201 -0
- package/.agents/core/skills/impeccable-design/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/impeccable-design/VALIDATION.json +12 -0
- package/.agents/core/skills/impeccable-design/skill.yaml +14 -0
- package/.agents/core/skills/interview-me/SKILL.md +97 -0
- package/.agents/core/skills/interview-me/VALIDATION.json +12 -0
- package/.agents/core/skills/interview-me/skill.yaml +8 -0
- package/.agents/core/skills/microservices/EXAMPLES.md +38 -0
- package/.agents/core/skills/microservices/SKILL.md +164 -0
- package/.agents/core/skills/microservices/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/microservices/VALIDATION.json +12 -0
- package/.agents/core/skills/microservices/microservices.md +119 -0
- package/.agents/core/skills/microservices/skill.yaml +10 -0
- package/.agents/core/skills/minimalist-design/SKILL.md +113 -0
- package/.agents/core/skills/minimalist-design/VALIDATION.json +12 -0
- package/.agents/core/skills/minimalist-design/skill.yaml +8 -0
- package/.agents/core/skills/nestjs/EXAMPLES.md +40 -0
- package/.agents/core/skills/nestjs/SKILL.md +139 -0
- package/.agents/core/skills/nestjs/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/nestjs/VALIDATION.json +12 -0
- package/.agents/core/skills/nestjs/nestjs.md +103 -0
- package/.agents/core/skills/nestjs/skill.yaml +10 -0
- package/.agents/core/skills/nextjs/EXAMPLES.md +40 -0
- package/.agents/core/skills/nextjs/SKILL.md +163 -0
- package/.agents/core/skills/nextjs/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/nextjs/VALIDATION.json +12 -0
- package/.agents/core/skills/nextjs/nextjs.md +67 -0
- package/.agents/core/skills/nextjs/skill.yaml +10 -0
- package/.agents/core/skills/node/EXAMPLES.md +80 -0
- package/.agents/core/skills/node/SKILL.md +128 -0
- package/.agents/core/skills/node/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/node/VALIDATION.json +12 -0
- package/.agents/core/skills/node/node.md +87 -0
- package/.agents/core/skills/node/skill.yaml +10 -0
- package/.agents/core/skills/performance/EXAMPLES.md +30 -0
- package/.agents/core/skills/performance/SKILL.md +75 -0
- package/.agents/core/skills/performance/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/performance/VALIDATION.json +12 -0
- package/.agents/core/skills/performance/performance.md +52 -0
- package/.agents/core/skills/performance/skill.yaml +10 -0
- package/.agents/core/skills/ponytail-mindset/EXAMPLES.md +45 -0
- package/.agents/core/skills/ponytail-mindset/SKILL.md +193 -0
- package/.agents/core/skills/ponytail-mindset/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/ponytail-mindset/VALIDATION.json +12 -0
- package/.agents/core/skills/ponytail-mindset/skill.yaml +14 -0
- package/.agents/core/skills/react/EXAMPLES.md +79 -0
- package/.agents/core/skills/react/SKILL.md +132 -0
- package/.agents/core/skills/react/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/react/VALIDATION.json +12 -0
- package/.agents/core/skills/react/react.md +93 -0
- package/.agents/core/skills/react/skill.yaml +10 -0
- package/.agents/core/skills/react-best-practices/SKILL.md +155 -0
- package/.agents/core/skills/react-best-practices/VALIDATION.json +12 -0
- package/.agents/core/skills/react-best-practices/skill.yaml +10 -0
- package/.agents/core/skills/redesign-audit/SKILL.md +117 -0
- package/.agents/core/skills/redesign-audit/VALIDATION.json +12 -0
- package/.agents/core/skills/redesign-audit/skill.yaml +8 -0
- package/.agents/core/skills/security/EXAMPLES.md +64 -0
- package/.agents/core/skills/security/SKILL.md +158 -0
- package/.agents/core/skills/security/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/security/VALIDATION.json +12 -0
- package/.agents/core/skills/security/security.md +106 -0
- package/.agents/core/skills/security/skill.yaml +10 -0
- package/.agents/core/skills/soft-design/SKILL.md +108 -0
- package/.agents/core/skills/soft-design/VALIDATION.json +12 -0
- package/.agents/core/skills/soft-design/skill.yaml +8 -0
- package/.agents/core/skills/state-management/EXAMPLES.md +56 -0
- package/.agents/core/skills/state-management/SKILL.md +48 -0
- package/.agents/core/skills/state-management/TROUBLESHOOTING.md +18 -0
- package/.agents/core/skills/state-management/VALIDATION.json +11 -0
- package/.agents/core/skills/state-management/skill.yaml +22 -0
- package/.agents/core/skills/subagent-orchestrator/SKILL.md +100 -0
- package/.agents/core/skills/subagent-orchestrator/VALIDATION.json +12 -0
- package/.agents/core/skills/subagent-orchestrator/skill.yaml +8 -0
- package/.agents/core/skills/system-design/EXAMPLES.md +75 -0
- package/.agents/core/skills/system-design/SKILL.md +419 -0
- package/.agents/core/skills/system-design/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/system-design/VALIDATION.json +12 -0
- package/.agents/core/skills/system-design/skill.yaml +13 -0
- package/.agents/core/skills/system-design/system-design.md +112 -0
- package/.agents/core/skills/testing/EXAMPLES.md +71 -0
- package/.agents/core/skills/testing/SKILL.md +70 -0
- package/.agents/core/skills/testing/TROUBLESHOOTING.md +18 -0
- package/.agents/core/skills/testing/VALIDATION.json +11 -0
- package/.agents/core/skills/testing/skill.yaml +26 -0
- package/.agents/core/skills/typescript/EXAMPLES.md +64 -0
- package/.agents/core/skills/typescript/SKILL.md +112 -0
- package/.agents/core/skills/typescript/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/typescript/VALIDATION.json +12 -0
- package/.agents/core/skills/typescript/skill.yaml +10 -0
- package/.agents/core/skills/typescript/typescript.md +71 -0
- package/.agents/core/skills/ui-design/EXAMPLES.md +21 -0
- package/.agents/core/skills/ui-design/SKILL.md +124 -0
- package/.agents/core/skills/ui-design/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/ui-design/VALIDATION.json +12 -0
- package/.agents/core/skills/ui-design/skill.yaml +10 -0
- package/.agents/core/skills/ui-design/ui.md +88 -0
- package/.agents/core/skills/ui-ux-pro/EXAMPLES.md +62 -0
- package/.agents/core/skills/ui-ux-pro/SKILL.md +375 -0
- package/.agents/core/skills/ui-ux-pro/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/ui-ux-pro/VALIDATION.json +12 -0
- package/.agents/core/skills/ui-ux-pro/skill.yaml +13 -0
- package/.agents/core/skills/ux-design/EXAMPLES.md +36 -0
- package/.agents/core/skills/ux-design/SKILL.md +116 -0
- package/.agents/core/skills/ux-design/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/ux-design/VALIDATION.json +12 -0
- package/.agents/core/skills/ux-design/skill.yaml +10 -0
- package/.agents/core/skills/ux-design/ux.md +80 -0
- package/.agents/core/skills/vercel-optimize/SKILL.md +83 -0
- package/.agents/core/skills/vercel-optimize/VALIDATION.json +12 -0
- package/.agents/core/skills/vercel-optimize/skill.yaml +10 -0
- package/.agents/core/skills/web-accessibility/EXAMPLES.md +39 -0
- package/.agents/core/skills/web-accessibility/SKILL.md +170 -0
- package/.agents/core/skills/web-accessibility/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/web-accessibility/VALIDATION.json +12 -0
- package/.agents/core/skills/web-accessibility/accessibility.md +63 -0
- package/.agents/core/skills/web-accessibility/skill.yaml +10 -0
- package/.agents/ctx.js +370 -0
- package/.agents/generated/claude/skills/adapters/SKILL.md +126 -0
- package/.agents/generated/claude/skills/architecture-diagrams/SKILL.md +101 -0
- package/.agents/generated/claude/skills/brutalist-design/SKILL.md +145 -0
- package/.agents/generated/claude/skills/context-manager/SKILL.md +147 -0
- package/.agents/generated/claude/skills/context-os/SKILL.md +191 -0
- package/.agents/generated/claude/skills/database/SKILL.md +191 -0
- package/.agents/generated/claude/skills/ddd/SKILL.md +305 -0
- package/.agents/generated/claude/skills/decisions/SKILL.md +134 -0
- package/.agents/generated/claude/skills/docker/SKILL.md +135 -0
- package/.agents/generated/claude/skills/engineering-workflow/SKILL.md +414 -0
- package/.agents/generated/claude/skills/fastapi/SKILL.md +200 -0
- package/.agents/generated/claude/skills/gemini-precision/SKILL.md +161 -0
- package/.agents/generated/claude/skills/generators/SKILL.md +133 -0
- package/.agents/generated/claude/skills/graphify/SKILL.md +198 -0
- package/.agents/generated/claude/skills/gstack-roles/SKILL.md +184 -0
- package/.agents/generated/claude/skills/impeccable-design/SKILL.md +241 -0
- package/.agents/generated/claude/skills/interview-me/SKILL.md +90 -0
- package/.agents/generated/claude/skills/microservices/SKILL.md +218 -0
- package/.agents/generated/claude/skills/minimalist-design/SKILL.md +108 -0
- package/.agents/generated/claude/skills/nestjs/SKILL.md +195 -0
- package/.agents/generated/claude/skills/nextjs/SKILL.md +219 -0
- package/.agents/generated/claude/skills/node/SKILL.md +224 -0
- package/.agents/generated/claude/skills/performance/SKILL.md +121 -0
- package/.agents/generated/claude/skills/ponytail-mindset/SKILL.md +252 -0
- package/.agents/generated/claude/skills/react/SKILL.md +227 -0
- package/.agents/generated/claude/skills/react-best-practices/SKILL.md +146 -0
- package/.agents/generated/claude/skills/redesign-audit/SKILL.md +112 -0
- package/.agents/generated/claude/skills/security/SKILL.md +237 -0
- package/.agents/generated/claude/skills/soft-design/SKILL.md +103 -0
- package/.agents/generated/claude/skills/state-management/SKILL.md +120 -0
- package/.agents/generated/claude/skills/subagent-orchestrator/SKILL.md +93 -0
- package/.agents/generated/claude/skills/system-design/SKILL.md +507 -0
- package/.agents/generated/claude/skills/testing/SKILL.md +157 -0
- package/.agents/generated/claude/skills/typescript/SKILL.md +192 -0
- package/.agents/generated/claude/skills/ui-design/SKILL.md +161 -0
- package/.agents/generated/claude/skills/ui-ux-pro/SKILL.md +451 -0
- package/.agents/generated/claude/skills/ux-design/SKILL.md +168 -0
- package/.agents/generated/claude/skills/vercel-optimize/SKILL.md +76 -0
- package/.agents/generated/claude/skills/web-accessibility/SKILL.md +225 -0
- package/.agents/generated/gemini/skills/adapters/SKILL.md +135 -0
- package/.agents/generated/gemini/skills/architecture-diagrams/SKILL.md +107 -0
- package/.agents/generated/gemini/skills/brutalist-design/SKILL.md +151 -0
- package/.agents/generated/gemini/skills/context-manager/SKILL.md +156 -0
- package/.agents/generated/gemini/skills/context-os/SKILL.md +200 -0
- package/.agents/generated/gemini/skills/database/SKILL.md +200 -0
- package/.agents/generated/gemini/skills/ddd/SKILL.md +314 -0
- package/.agents/generated/gemini/skills/decisions/SKILL.md +143 -0
- package/.agents/generated/gemini/skills/docker/SKILL.md +144 -0
- package/.agents/generated/gemini/skills/engineering-workflow/SKILL.md +423 -0
- package/.agents/generated/gemini/skills/fastapi/SKILL.md +209 -0
- package/.agents/generated/gemini/skills/gemini-precision/SKILL.md +167 -0
- package/.agents/generated/gemini/skills/generators/SKILL.md +142 -0
- package/.agents/generated/gemini/skills/graphify/SKILL.md +205 -0
- package/.agents/generated/gemini/skills/gstack-roles/SKILL.md +193 -0
- package/.agents/generated/gemini/skills/impeccable-design/SKILL.md +250 -0
- package/.agents/generated/gemini/skills/interview-me/SKILL.md +96 -0
- package/.agents/generated/gemini/skills/microservices/SKILL.md +227 -0
- package/.agents/generated/gemini/skills/minimalist-design/SKILL.md +114 -0
- package/.agents/generated/gemini/skills/nestjs/SKILL.md +204 -0
- package/.agents/generated/gemini/skills/nextjs/SKILL.md +298 -0
- package/.agents/generated/gemini/skills/node/SKILL.md +323 -0
- package/.agents/generated/gemini/skills/performance/SKILL.md +185 -0
- package/.agents/generated/gemini/skills/ponytail-mindset/SKILL.md +261 -0
- package/.agents/generated/gemini/skills/react/SKILL.md +332 -0
- package/.agents/generated/gemini/skills/react-best-practices/SKILL.md +152 -0
- package/.agents/generated/gemini/skills/redesign-audit/SKILL.md +118 -0
- package/.agents/generated/gemini/skills/security/SKILL.md +355 -0
- package/.agents/generated/gemini/skills/soft-design/SKILL.md +109 -0
- package/.agents/generated/gemini/skills/state-management/SKILL.md +129 -0
- package/.agents/generated/gemini/skills/subagent-orchestrator/SKILL.md +99 -0
- package/.agents/generated/gemini/skills/system-design/SKILL.md +631 -0
- package/.agents/generated/gemini/skills/testing/SKILL.md +166 -0
- package/.agents/generated/gemini/skills/typescript/SKILL.md +275 -0
- package/.agents/generated/gemini/skills/ui-design/SKILL.md +170 -0
- package/.agents/generated/gemini/skills/ui-ux-pro/SKILL.md +460 -0
- package/.agents/generated/gemini/skills/ux-design/SKILL.md +177 -0
- package/.agents/generated/gemini/skills/vercel-optimize/SKILL.md +82 -0
- package/.agents/generated/gemini/skills/web-accessibility/SKILL.md +300 -0
- package/.agents/mcp/runtime.py +454 -0
- package/.agents/mcp/server.mjs +189373 -0
- package/.agents/plugins.js +574 -0
- package/.agents/profiles.js +267 -0
- package/.agents/resolver.js +336 -0
- package/.agents/skills-index.json +200 -0
- package/.agents/skills.json +6 -0
- package/.agents/validate.js +500 -0
- package/LICENSE +21 -0
- package/README.md +415 -0
- package/benchmarks/gemini-issues.js +533 -0
- package/bin/index.js +458 -0
- package/package.json +70 -0
- package/registry.json +53 -0
- package/registry.schema.json +32 -0
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* .agents/profiles.js
|
|
3
|
+
* ContextOS — Project Profile & Stack Detection Engine
|
|
4
|
+
*
|
|
5
|
+
* Provides:
|
|
6
|
+
* 1. Profile management (mvp, startup, enterprise, hackathon, frontend, backend)
|
|
7
|
+
* 2. Tech stack auto-detection from project files
|
|
8
|
+
* 3. Active profile resolution for adapters and skill compiler
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
'use strict';
|
|
12
|
+
|
|
13
|
+
const fs = require('fs');
|
|
14
|
+
const path = require('path');
|
|
15
|
+
|
|
16
|
+
const AGENTS_DIR = path.join(__dirname);
|
|
17
|
+
const PROFILES_DIR = path.join(AGENTS_DIR, 'core', 'profiles');
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @typedef {Object} ProfileConfig
|
|
21
|
+
* @property {string} id - Profile unique slug
|
|
22
|
+
* @property {string} name - Human-readable profile title
|
|
23
|
+
* @property {string} description - Summary of the profile's purpose
|
|
24
|
+
* @property {string[]} prefer_skills - Priority skills favored by this profile
|
|
25
|
+
* @property {string[]} exclude_skills - Skills filtered out for this profile
|
|
26
|
+
* @property {string[]} generate_docs - Documentation templates to generate
|
|
27
|
+
* @property {string[]} skip_docs - Documentation to skip
|
|
28
|
+
* @property {Object} enforce - Invariant rules to enforce
|
|
29
|
+
* @property {Object} defaults - Default parameters
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Parses a profile YAML string into a structured ProfileConfig object.
|
|
34
|
+
*
|
|
35
|
+
* @param {string} text - Raw YAML profile file content
|
|
36
|
+
* @returns {ProfileConfig} Structured profile configuration
|
|
37
|
+
*/
|
|
38
|
+
function parseYamlProfile(text) {
|
|
39
|
+
const result = {
|
|
40
|
+
id: '',
|
|
41
|
+
name: '',
|
|
42
|
+
description: '',
|
|
43
|
+
prefer_skills: [],
|
|
44
|
+
exclude_skills: [],
|
|
45
|
+
generate_docs: [],
|
|
46
|
+
skip_docs: [],
|
|
47
|
+
enforce: {},
|
|
48
|
+
defaults: {},
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
const idMatch = text.match(/^id:\s*(.+)$/m);
|
|
52
|
+
if (idMatch) result.id = idMatch[1].trim().replace(/^['"]|['"]$/g, '');
|
|
53
|
+
|
|
54
|
+
const nameMatch = text.match(/^name:\s*(.+)$/m);
|
|
55
|
+
if (nameMatch) result.name = nameMatch[1].trim().replace(/^['"]|['"]$/g, '');
|
|
56
|
+
|
|
57
|
+
const descMatch = text.match(/^description:\s*(.+)$/m);
|
|
58
|
+
if (descMatch) result.description = descMatch[1].trim().replace(/^['"]|['"]$/g, '');
|
|
59
|
+
|
|
60
|
+
function parseList(field) {
|
|
61
|
+
const blockRegex = new RegExp(`^${field}:\\s*\\n((?:[ \\t]+-[^\\n]*\\n?)+)`, 'm');
|
|
62
|
+
const match = text.match(blockRegex);
|
|
63
|
+
if (!match) {
|
|
64
|
+
const inlineRegex = new RegExp(`^${field}:\\s*\\[([^\\]]*)]`, 'm');
|
|
65
|
+
const inlineMatch = text.match(inlineRegex);
|
|
66
|
+
if (!inlineMatch || !inlineMatch[1].trim()) return [];
|
|
67
|
+
return inlineMatch[1].split(',').map(s => s.trim().replace(/^['"]|['"]$/g, '')).filter(Boolean);
|
|
68
|
+
}
|
|
69
|
+
return match[1]
|
|
70
|
+
.split('\n')
|
|
71
|
+
.map(l => l.replace(/^[ \t]+-\s*/, '').replace(/#.*$/, '').trim().replace(/^['"]|['"]$/g, ''))
|
|
72
|
+
.filter(Boolean);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
result.prefer_skills = parseList('prefer_skills');
|
|
76
|
+
result.exclude_skills = parseList('exclude_skills');
|
|
77
|
+
result.generate_docs = parseList('generate_docs');
|
|
78
|
+
result.skip_docs = parseList('skip_docs');
|
|
79
|
+
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Lists all available project profiles defined in core/profiles.
|
|
85
|
+
*
|
|
86
|
+
* @returns {ProfileConfig[]} Array of profile configurations
|
|
87
|
+
*/
|
|
88
|
+
function listProfiles() {
|
|
89
|
+
if (!fs.existsSync(PROFILES_DIR)) return [];
|
|
90
|
+
const files = fs.readdirSync(PROFILES_DIR).filter(f => f.endsWith('.yaml') || f.endsWith('.yml'));
|
|
91
|
+
return files.map(file => {
|
|
92
|
+
const content = fs.readFileSync(path.join(PROFILES_DIR, file), 'utf8');
|
|
93
|
+
const parsed = parseYamlProfile(content);
|
|
94
|
+
if (!parsed.id) parsed.id = path.basename(file, path.extname(file));
|
|
95
|
+
if (!parsed.name) parsed.name = parsed.id;
|
|
96
|
+
return parsed;
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Finds a profile by its slug ID or title.
|
|
102
|
+
*
|
|
103
|
+
* @param {string} name - Profile identifier or name
|
|
104
|
+
* @returns {ProfileConfig|null} Found profile or null
|
|
105
|
+
*/
|
|
106
|
+
function getProfile(name) {
|
|
107
|
+
if (!name) return null;
|
|
108
|
+
const clean = name.toLowerCase().trim();
|
|
109
|
+
const all = listProfiles();
|
|
110
|
+
return all.find(p => p.id.toLowerCase() === clean || p.name.toLowerCase() === clean) || null;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function getProfileLockPath(projectDir = process.cwd()) {
|
|
114
|
+
return path.join(projectDir, '.agents', 'profile.json');
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function getActiveProfile(projectDir = process.cwd()) {
|
|
118
|
+
const lockPath = getProfileLockPath(projectDir);
|
|
119
|
+
if (!fs.existsSync(lockPath)) return null;
|
|
120
|
+
try {
|
|
121
|
+
const raw = fs.readFileSync(lockPath, 'utf8');
|
|
122
|
+
return JSON.parse(raw);
|
|
123
|
+
} catch {
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function applyProfile(profileName, projectDir = process.cwd()) {
|
|
129
|
+
const profile = getProfile(profileName);
|
|
130
|
+
if (!profile) {
|
|
131
|
+
throw new Error(`Profile '${profileName}' not found. Available profiles: ${listProfiles().map(p => p.id).join(', ')}`);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const lockPath = getProfileLockPath(projectDir);
|
|
135
|
+
fs.mkdirSync(path.dirname(lockPath), { recursive: true });
|
|
136
|
+
|
|
137
|
+
const lockData = {
|
|
138
|
+
profile: profile.id,
|
|
139
|
+
name: profile.name,
|
|
140
|
+
description: profile.description,
|
|
141
|
+
exclude_skills: profile.exclude_skills || [],
|
|
142
|
+
prefer_skills: profile.prefer_skills || [],
|
|
143
|
+
appliedAt: new Date().toISOString(),
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
fs.writeFileSync(lockPath, JSON.stringify(lockData, null, 2) + '\n');
|
|
147
|
+
return lockData;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function removeActiveProfile(projectDir = process.cwd()) {
|
|
151
|
+
const lockPath = getProfileLockPath(projectDir);
|
|
152
|
+
if (fs.existsSync(lockPath)) {
|
|
153
|
+
fs.unlinkSync(lockPath);
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* @typedef {Object} StackDetectionResult
|
|
161
|
+
* @property {string[]} detected - List of identified technologies and frameworks
|
|
162
|
+
* @property {string} recommendedProfile - Recommended profile identifier
|
|
163
|
+
* @property {string[]} recommendedSkills - Recommended skill IDs for the detected stack
|
|
164
|
+
*/
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Auto-detect tech stack from project files and suggest best profile and skills.
|
|
168
|
+
*
|
|
169
|
+
* @param {string} [projectDir=process.cwd()] - Target directory to inspect
|
|
170
|
+
* @returns {StackDetectionResult} Detected stack and recommendations
|
|
171
|
+
*/
|
|
172
|
+
function detectStack(projectDir = process.cwd()) {
|
|
173
|
+
const detected = [];
|
|
174
|
+
const recommendedSkills = new Set(['engineering-workflow', 'gstack-roles', 'ponytail-mindset', 'security']);
|
|
175
|
+
|
|
176
|
+
// Check package.json
|
|
177
|
+
const pkgPath = path.join(projectDir, 'package.json');
|
|
178
|
+
if (fs.existsSync(pkgPath)) {
|
|
179
|
+
try {
|
|
180
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
|
|
181
|
+
const deps = { ...(pkg.dependencies || {}), ...(pkg.devDependencies || {}) };
|
|
182
|
+
|
|
183
|
+
if (deps['next']) {
|
|
184
|
+
detected.push('Next.js');
|
|
185
|
+
recommendedSkills.add('nextjs');
|
|
186
|
+
recommendedSkills.add('react');
|
|
187
|
+
recommendedSkills.add('typescript');
|
|
188
|
+
recommendedSkills.add('ui-ux-pro');
|
|
189
|
+
recommendedSkills.add('impeccable-design');
|
|
190
|
+
} else if (deps['react']) {
|
|
191
|
+
detected.push('React');
|
|
192
|
+
recommendedSkills.add('react');
|
|
193
|
+
recommendedSkills.add('typescript');
|
|
194
|
+
recommendedSkills.add('ui-ux-pro');
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
if (deps['tailwindcss']) {
|
|
198
|
+
detected.push('Tailwind CSS');
|
|
199
|
+
recommendedSkills.add('ui-ux-pro');
|
|
200
|
+
recommendedSkills.add('ui-design');
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
if (deps['typescript'] || fs.existsSync(path.join(projectDir, 'tsconfig.json'))) {
|
|
204
|
+
detected.push('TypeScript');
|
|
205
|
+
recommendedSkills.add('typescript');
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
if (deps['@nestjs/core']) {
|
|
209
|
+
detected.push('NestJS');
|
|
210
|
+
recommendedSkills.add('nestjs');
|
|
211
|
+
recommendedSkills.add('system-design');
|
|
212
|
+
recommendedSkills.add('ddd');
|
|
213
|
+
} else if (deps['express'] || deps['fastify'] || deps['koa']) {
|
|
214
|
+
detected.push('Node.js Backend');
|
|
215
|
+
recommendedSkills.add('node');
|
|
216
|
+
recommendedSkills.add('system-design');
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
if (deps['@prisma/client'] || deps['prisma'] || deps['drizzle-orm'] || deps['typeorm'] || deps['pg']) {
|
|
220
|
+
detected.push('Relational DB / ORM');
|
|
221
|
+
recommendedSkills.add('system-design');
|
|
222
|
+
recommendedSkills.add('ddd');
|
|
223
|
+
}
|
|
224
|
+
} catch {
|
|
225
|
+
// ignore parse error
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// Check Python files
|
|
230
|
+
const hasPyFiles = fs.existsSync(path.join(projectDir, 'requirements.txt')) ||
|
|
231
|
+
fs.existsSync(path.join(projectDir, 'pyproject.toml')) ||
|
|
232
|
+
fs.existsSync(path.join(projectDir, 'Pipfile'));
|
|
233
|
+
if (hasPyFiles) {
|
|
234
|
+
detected.push('Python');
|
|
235
|
+
recommendedSkills.add('fastapi');
|
|
236
|
+
recommendedSkills.add('system-design');
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// Infer recommended profile
|
|
240
|
+
let recommendedProfile = 'startup';
|
|
241
|
+
const hasFrontend = detected.some(d => ['React', 'Next.js', 'Tailwind CSS'].includes(d));
|
|
242
|
+
const hasBackend = detected.some(d => ['Node.js Backend', 'NestJS', 'Python'].includes(d));
|
|
243
|
+
|
|
244
|
+
if (hasFrontend && !hasBackend) {
|
|
245
|
+
recommendedProfile = 'frontend';
|
|
246
|
+
} else if (!hasFrontend && hasBackend) {
|
|
247
|
+
recommendedProfile = 'backend';
|
|
248
|
+
} else if (hasFrontend && hasBackend) {
|
|
249
|
+
recommendedProfile = 'startup';
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
return {
|
|
253
|
+
detected,
|
|
254
|
+
recommendedProfile,
|
|
255
|
+
recommendedSkills: Array.from(recommendedSkills),
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
module.exports = {
|
|
260
|
+
listProfiles,
|
|
261
|
+
getProfile,
|
|
262
|
+
getActiveProfile,
|
|
263
|
+
applyProfile,
|
|
264
|
+
removeActiveProfile,
|
|
265
|
+
detectStack,
|
|
266
|
+
parseYamlProfile,
|
|
267
|
+
};
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* .agents/resolver.js
|
|
3
|
+
* ContextOS — Dynamic Skill Resolver & Progressive Index Engine
|
|
4
|
+
*
|
|
5
|
+
* Resolves the minimal set of skills required for a given task, file list, or prompt,
|
|
6
|
+
* keeping the LLM's active context lean and fast.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const fs = require('fs');
|
|
12
|
+
const path = require('path');
|
|
13
|
+
|
|
14
|
+
const AGENTS_DIR = path.join(__dirname);
|
|
15
|
+
const CORE_SKILLS_DIR = path.join(AGENTS_DIR, 'core', 'skills');
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Keyword & Regex matching rules for dynamic resolution.
|
|
19
|
+
*/
|
|
20
|
+
const SKILL_RULES = [
|
|
21
|
+
{
|
|
22
|
+
skill: 'nextjs',
|
|
23
|
+
strong: [/\bnext(?:\.js)?\b/i, /\bapp\s*router\b/i, /\bserver\s*actions?\b/i, /\brsc\b/i, /некст/i],
|
|
24
|
+
medium: [/\bpage\.tsx\b/i, /\blayout\.tsx\b/i],
|
|
25
|
+
weak: [],
|
|
26
|
+
fileGlobs: [/app\/.*\.(tsx|jsx|ts|js)$/, /next\.config\./],
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
skill: 'react',
|
|
30
|
+
strong: [/\breact\b/i, /\buseOptimistic\b/i, /компонент/i, /хук/i],
|
|
31
|
+
medium: [/\bcomponent\b/i, /\bhooks?\b/i, /\buseState\b/i, /\buseEffect\b/i, /\buseMemo\b/i, /\bprops\b/i, /модал\w*/i],
|
|
32
|
+
weak: [],
|
|
33
|
+
fileGlobs: [/\.(tsx|jsx)$/],
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
skill: 'typescript',
|
|
37
|
+
strong: [/\btypescript\b/i, /\btype-?safe\b/i, /\bgenerics?\b/i, /\binterface\b/i, /\btsconfig\b/i, /тайпскрипт/i, /типизац/i],
|
|
38
|
+
medium: [],
|
|
39
|
+
weak: [/\btypes?\b/i],
|
|
40
|
+
fileGlobs: [/\.tsx?$/, /tsconfig\.json$/],
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
skill: 'ui-ux-pro',
|
|
44
|
+
strong: [/\bui\b/i, /\bux\b/i, /\btailwind\b/i, /\bstyling\b/i, /дизайн/i, /верстк/i, /макет/i, /интерфейс/i],
|
|
45
|
+
medium: [/\bcss\b/i, /\btheme\b/i, /\bmodal\b/i, /\bbutton\b/i, /модал\w*/i, /кнопк/i],
|
|
46
|
+
weak: [/\bdesign\b/i],
|
|
47
|
+
fileGlobs: [/\.(css|scss|sass)$/, /tailwind\.config\./],
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
skill: 'web-accessibility',
|
|
51
|
+
strong: [/\baccessib\w*\b/i, /\ba11y\b/i, /\baria\b/i, /\bfocus\s*trap\b/i, /\bkeyboard\s*nav/i, /\bwcag\b/i, /\bscreen\s*reader\b/i, /доступност/i, /скринридер/i],
|
|
52
|
+
medium: [],
|
|
53
|
+
weak: [],
|
|
54
|
+
fileGlobs: [],
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
skill: 'impeccable-design',
|
|
58
|
+
strong: [/\bvisual\s*qa\b/i, /\bmicro-?animation\b/i, /\bglassmorphism\b/i, /\btypography\b/i, /анимац/i, /полировк/i],
|
|
59
|
+
medium: [/\bpolish\b/i],
|
|
60
|
+
weak: [],
|
|
61
|
+
fileGlobs: [],
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
skill: 'database',
|
|
65
|
+
strong: [/\bdatabase\b/i, /\bsql\b/i, /\bpostgres(?:ql)?\b/i, /\bprisma\b/i, /\bdrizzle\b/i, /\bmigration\b/i, /\borm\b/i, /баз.*данн/i, /миграц/i, /таблиц/i],
|
|
66
|
+
medium: [/\bschema\b/i],
|
|
67
|
+
weak: [/\bquery\b/i, /\bindex(?:ing)?\b/i],
|
|
68
|
+
fileGlobs: [/\.prisma$/, /drizzle\.config\./, /\bmigrations?\/.*\.sql$/],
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
skill: 'security',
|
|
72
|
+
strong: [/\bauth\b/i, /\bjwt\b/i, /\blogin\b/i, /\bcsrf\b/i, /\bxss\b/i, /\brate\s*limit\b/i, /авториз/i, /аутентифик/i, /парол/i, /безопасност/i],
|
|
73
|
+
medium: [/\bpermission\b/i, /\bsession\b/i, /\btoken\b/i, /токен/i],
|
|
74
|
+
weak: [],
|
|
75
|
+
fileGlobs: [/\bauth\b/, /\bsecurity\b/],
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
skill: 'performance',
|
|
79
|
+
strong: [/\bperformance\b/i, /\blatency\b/i, /\blcp\b/i, /\bcls\b/i, /\binp\b/i, /\bcore\s*web\s*vitals\b/i, /\bwaterfall\b/i, /\bbundle\s*size\b/i, /производительн/i, /ускор/i],
|
|
80
|
+
medium: [/\boptimize\b/i, /\bslow\b/i, /оптимиз/i, /медленн/i],
|
|
81
|
+
weak: [],
|
|
82
|
+
fileGlobs: [],
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
skill: 'testing',
|
|
86
|
+
strong: [/\bvitest\b/i, /\bjest\b/i, /\bplaywright\b/i, /\btdd\b/i, /\bbdd\b/i, /\be2e\b/i, /тестирован/i, /покрыти/i, /юнит/i],
|
|
87
|
+
medium: [/\btest(?:s|ing)?\b/i, /\bmock\b/i, /тест/i],
|
|
88
|
+
weak: [],
|
|
89
|
+
fileGlobs: [/\.(test|spec)\.(ts|js|tsx|jsx|py)$/, /vitest\.config\./, /playwright\.config\./],
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
skill: 'docker',
|
|
93
|
+
strong: [/\bdocker\b/i, /\bdockerfile\b/i, /\bcompose\b/i, /\bkubernetes\b/i, /\bk8s\b/i, /докер/i],
|
|
94
|
+
medium: [],
|
|
95
|
+
weak: [/\bcontainer\b/i, /контейнер/i],
|
|
96
|
+
fileGlobs: [/Dockerfile/, /docker-compose\./],
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
skill: 'fastapi',
|
|
100
|
+
strong: [/\bfastapi\b/i, /\bpydantic\b/i, /\buvicorn\b/i, /\bpytest\b/i, /питон/i],
|
|
101
|
+
medium: [/\bpython\b/i],
|
|
102
|
+
weak: [],
|
|
103
|
+
fileGlobs: [/\.py$/, /requirements\.txt$/, /pyproject\.toml$/],
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
skill: 'nestjs',
|
|
107
|
+
strong: [/\bnestjs\b/i, /\b@nestjs\b/i, /нест/i],
|
|
108
|
+
medium: [],
|
|
109
|
+
weak: [/\bmodule\b/i, /\bcontroller\b/i, /\binjectable\b/i],
|
|
110
|
+
fileGlobs: [/nest-cli\.json$/],
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
skill: 'node',
|
|
114
|
+
strong: [/\bnode(?:\.js)?\b/i, /\bexpress\b/i, /\bfastify\b/i],
|
|
115
|
+
medium: [/\bbackend\b/i, /\bapi\s*route\b/i, /бэкенд/i, /эндпоинт/i],
|
|
116
|
+
weak: [],
|
|
117
|
+
fileGlobs: [],
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
skill: 'ddd',
|
|
121
|
+
strong: [/\bddd\b/i, /\bdomain-?driven\b/i, /\baggregate\b/i, /\bvalue\s*object\b/i, /\bbounded\s*context\b/i],
|
|
122
|
+
medium: [/\bentity\b/i, /домен/i, /агрегат/i],
|
|
123
|
+
weak: [],
|
|
124
|
+
fileGlobs: [],
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
skill: 'microservices',
|
|
128
|
+
strong: [/\bmicroservices?\b/i, /\bevent-?driven\b/i, /\brabbitmq\b/i, /\bkafka\b/i, /\bgrpc\b/i, /микросервис/i],
|
|
129
|
+
medium: [/\bpub\/?sub\b/i, /очеред/i],
|
|
130
|
+
weak: [],
|
|
131
|
+
fileGlobs: [],
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
skill: 'system-design',
|
|
135
|
+
strong: [/\bsystem\s*design\b/i, /\bhigh\s*concurrency\b/i, /\bcircuit\s*breaker\b/i, /масштабируем/i],
|
|
136
|
+
medium: [/\barchitecture\b/i, /\bscalab(?:le|ility)\b/i, /архитектур/i],
|
|
137
|
+
weak: [],
|
|
138
|
+
fileGlobs: [],
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
skill: 'graphify',
|
|
142
|
+
strong: [/\bgraphify\b/i, /\bknowledge\s*graph\b/i, /\bcodebase\s*graph\b/i, /\bproject\s*graph\b/i, /\bblast\s*radius\b/i, /\bmap\s*(?:the\s*)?codebase\b/i, /граф\s*проект/i, /граф\s*зависимост/i],
|
|
143
|
+
medium: [],
|
|
144
|
+
weak: [],
|
|
145
|
+
fileGlobs: [/graph\.json$/, /GRAPH_REPORT\.md$/],
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
skill: 'architecture-diagrams',
|
|
149
|
+
strong: [/\bflowchart\b/i, /\bsequence\s*diagram\b/i],
|
|
150
|
+
medium: [/\bdiagrams?\b/i, /диаграмм/i, /схем/i, /нарисуй/i],
|
|
151
|
+
weak: [],
|
|
152
|
+
fileGlobs: [],
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
skill: 'subagent-orchestrator',
|
|
156
|
+
strong: [/\bsubagent\b/i, /\bparallel\s*tasks\b/i, /субагент/i, /распараллел/i],
|
|
157
|
+
medium: [/\bdelegate\b/i, /делегируй/i],
|
|
158
|
+
weak: [],
|
|
159
|
+
fileGlobs: [],
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
skill: 'interview-me',
|
|
163
|
+
strong: [/\binterview\b/i, /интервью/i, /расспроси/i],
|
|
164
|
+
medium: [/\bclarify\b/i, /\bquestions\b/i, /уточни\b/i],
|
|
165
|
+
weak: [],
|
|
166
|
+
fileGlobs: [],
|
|
167
|
+
},
|
|
168
|
+
];
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* @typedef {Object} SkillIndexItem
|
|
172
|
+
* @property {string} name - Skill unique identifier
|
|
173
|
+
* @property {string} description - Brief summary of the skill
|
|
174
|
+
* @property {string} path - Relative path to the skill markdown document
|
|
175
|
+
*/
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* @typedef {Object} ResolveSkillsOptions
|
|
179
|
+
* @property {string} [prompt] - Free-form prompt text describing the current task
|
|
180
|
+
* @property {string[]} [files] - List of file paths currently touched or opened
|
|
181
|
+
* @property {string} [phase] - Active lifecycle phase (Define, Plan, Build, Verify, Review, Ship)
|
|
182
|
+
* @property {string} [domain] - Engineering domain override (Frontend, Backend, Architecture, Full-Stack, DevOps)
|
|
183
|
+
*/
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* @typedef {Object} ResolvedSkillsResult
|
|
187
|
+
* @property {string} domain - Identified technical domain
|
|
188
|
+
* @property {string} phase - Current pipeline phase
|
|
189
|
+
* @property {string} role - Specialized GStack agent role
|
|
190
|
+
* @property {string[]} skills - Resolved list of minimal skill identifiers
|
|
191
|
+
*/
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Builds a compact, progressive index of all available skills.
|
|
195
|
+
*
|
|
196
|
+
* @param {string} [projectDir=process.cwd()] - Target root directory of the project
|
|
197
|
+
* @returns {SkillIndexItem[]} Array of indexed skill metadata objects
|
|
198
|
+
*/
|
|
199
|
+
function buildSkillIndex(projectDir = process.cwd()) {
|
|
200
|
+
const shared = require(path.join(AGENTS_DIR, 'adapters', 'shared.js'));
|
|
201
|
+
const skillDirs = shared.collectSkillDirectories();
|
|
202
|
+
const index = [];
|
|
203
|
+
|
|
204
|
+
for (const dir of skillDirs) {
|
|
205
|
+
const skillName = path.basename(dir);
|
|
206
|
+
const skillMdPath = path.join(dir, 'SKILL.md');
|
|
207
|
+
if (!fs.existsSync(skillMdPath)) continue;
|
|
208
|
+
|
|
209
|
+
const raw = fs.readFileSync(skillMdPath, 'utf8');
|
|
210
|
+
let description = '';
|
|
211
|
+
const descMatch = raw.match(/description:\s*(?:>)?\s*([^\n\r]+)/);
|
|
212
|
+
if (descMatch) {
|
|
213
|
+
description = descMatch[1].trim().replace(/^['"]|['"]$/g, '');
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
const relPath = path.relative(projectDir, skillMdPath).replace(/\\/g, '/');
|
|
217
|
+
|
|
218
|
+
index.push({
|
|
219
|
+
name: skillName,
|
|
220
|
+
description: description || `ContextOS skill for ${skillName}`,
|
|
221
|
+
path: relPath,
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
return index;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Resolves the minimal set of skills for a given prompt, file list, and phase.
|
|
230
|
+
*
|
|
231
|
+
* @param {ResolveSkillsOptions} [options={}] - Task context options
|
|
232
|
+
* @returns {ResolvedSkillsResult} Resolved domain, role, and activated skill names
|
|
233
|
+
*/
|
|
234
|
+
function resolveSkills({ prompt = '', files = [], phase = 'Build', domain = '' } = {}) {
|
|
235
|
+
const promptText = (prompt || '').toLowerCase();
|
|
236
|
+
const scores = new Map();
|
|
237
|
+
|
|
238
|
+
for (const rule of SKILL_RULES) {
|
|
239
|
+
let score = 0;
|
|
240
|
+
|
|
241
|
+
// Strong triggers (10 points each match)
|
|
242
|
+
for (const pat of rule.strong || []) {
|
|
243
|
+
if (pat.test(promptText)) score += 10;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// Medium triggers (5 points each match)
|
|
247
|
+
for (const pat of rule.medium || []) {
|
|
248
|
+
if (pat.test(promptText)) score += 5;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// Weak triggers (2 points each match)
|
|
252
|
+
for (const pat of rule.weak || []) {
|
|
253
|
+
if (pat.test(promptText)) score += 2;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// File matches (10 points per matching file)
|
|
257
|
+
for (const file of files) {
|
|
258
|
+
const normalized = file.replace(/\\/g, '/');
|
|
259
|
+
for (const pat of rule.fileGlobs || []) {
|
|
260
|
+
if (pat.test(normalized)) score += 10;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// Minimum score threshold for domain skill activation
|
|
265
|
+
if (score >= 5) {
|
|
266
|
+
scores.set(rule.skill, score);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// Sort matched domain skills by score descending
|
|
271
|
+
const sortedDomainSkills = Array.from(scores.entries())
|
|
272
|
+
.sort((a, b) => b[1] - a[1])
|
|
273
|
+
.map(([skill]) => skill);
|
|
274
|
+
|
|
275
|
+
// Cap domain skills to top 4 max to prevent context bloat
|
|
276
|
+
const MAX_DOMAIN_SKILLS = 4;
|
|
277
|
+
const topDomainSkills = sortedDomainSkills.slice(0, MAX_DOMAIN_SKILLS);
|
|
278
|
+
|
|
279
|
+
// Synergy rules (from AGENTS.md matrix)
|
|
280
|
+
const hasSynergyPrereq = topDomainSkills.includes('database') ||
|
|
281
|
+
topDomainSkills.includes('microservices') ||
|
|
282
|
+
topDomainSkills.includes('ddd') ||
|
|
283
|
+
topDomainSkills.includes('graphify');
|
|
284
|
+
|
|
285
|
+
if (hasSynergyPrereq && !topDomainSkills.includes('system-design')) {
|
|
286
|
+
if (topDomainSkills.length < MAX_DOMAIN_SKILLS + 1) {
|
|
287
|
+
topDomainSkills.push('system-design');
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// Foundational skills (always active)
|
|
292
|
+
const allSkills = ['ponytail-mindset', 'engineering-workflow', ...topDomainSkills];
|
|
293
|
+
const finalSkills = Array.from(new Set(allSkills));
|
|
294
|
+
|
|
295
|
+
// Infer Domain if not specified
|
|
296
|
+
let inferredDomain = domain;
|
|
297
|
+
if (!inferredDomain) {
|
|
298
|
+
const isFrontend = finalSkills.includes('react') || finalSkills.includes('nextjs') || finalSkills.includes('ui-ux-pro');
|
|
299
|
+
const isBackend = finalSkills.includes('database') || finalSkills.includes('fastapi') || finalSkills.includes('nestjs') || finalSkills.includes('node') || finalSkills.includes('system-design');
|
|
300
|
+
if (isFrontend && isBackend) inferredDomain = 'Full-Stack';
|
|
301
|
+
else if (isFrontend) inferredDomain = 'Frontend';
|
|
302
|
+
else if (isBackend) inferredDomain = 'Backend';
|
|
303
|
+
else inferredDomain = 'Architecture';
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// Infer Role
|
|
307
|
+
let inferredRole = 'Senior Developer';
|
|
308
|
+
if (phase.toLowerCase() === 'define') inferredRole = 'Product Manager';
|
|
309
|
+
else if (phase.toLowerCase() === 'plan') inferredRole = 'Architect';
|
|
310
|
+
else if (phase.toLowerCase() === 'review') inferredRole = inferredDomain === 'Frontend' ? 'Staff Engineer + Senior Designer' : 'Staff Engineer';
|
|
311
|
+
else if (phase.toLowerCase() === 'test') inferredRole = 'QA Lead';
|
|
312
|
+
else if (phase.toLowerCase() === 'ship') inferredRole = 'Release Engineer';
|
|
313
|
+
|
|
314
|
+
return {
|
|
315
|
+
domain: inferredDomain,
|
|
316
|
+
phase: phase,
|
|
317
|
+
role: inferredRole,
|
|
318
|
+
skills: finalSkills,
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Formats resolved skills into a clean ContextOS declaration string.
|
|
324
|
+
*
|
|
325
|
+
* @param {ResolvedSkillsResult} resolution - Resolution result from resolveSkills
|
|
326
|
+
* @returns {string} ContextOS formatted header string matching Step 0 format
|
|
327
|
+
*/
|
|
328
|
+
function formatDeclaration(resolution) {
|
|
329
|
+
return `[DOMAIN: ${resolution.domain}] [PHASE: ${resolution.phase}] [ROLE: ${resolution.role}]\nSkills loaded: ${resolution.skills.join(', ')}`;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
module.exports = {
|
|
333
|
+
buildSkillIndex,
|
|
334
|
+
resolveSkills,
|
|
335
|
+
formatDeclaration,
|
|
336
|
+
};
|