@hivehub/rulebook 4.4.1 → 5.1.1
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/.claude-plugin/plugin.json +1 -1
- package/README.md +68 -8
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +86 -0
- package/dist/cli/commands.js.map +1 -1
- package/dist/core/agent-template-engine.d.ts +51 -0
- package/dist/core/agent-template-engine.d.ts.map +1 -0
- package/dist/core/agent-template-engine.js +285 -0
- package/dist/core/agent-template-engine.js.map +1 -0
- package/dist/core/complexity-detector.d.ts +36 -0
- package/dist/core/complexity-detector.d.ts.map +1 -0
- package/dist/core/complexity-detector.js +254 -0
- package/dist/core/complexity-detector.js.map +1 -0
- package/dist/core/config-manager.d.ts.map +1 -1
- package/dist/core/config-manager.js +7 -8
- package/dist/core/config-manager.js.map +1 -1
- package/dist/core/generator.d.ts +1 -0
- package/dist/core/generator.d.ts.map +1 -1
- package/dist/core/generator.js +21 -3
- package/dist/core/generator.js.map +1 -1
- package/dist/core/indexer/background-indexer.d.ts +2 -2
- package/dist/core/indexer/background-indexer.d.ts.map +1 -1
- package/dist/core/indexer/background-indexer.js +55 -61
- package/dist/core/indexer/background-indexer.js.map +1 -1
- package/dist/core/rule-engine.d.ts +64 -0
- package/dist/core/rule-engine.d.ts.map +1 -0
- package/dist/core/rule-engine.js +333 -0
- package/dist/core/rule-engine.js.map +1 -0
- package/dist/core/task-manager.d.ts +4 -0
- package/dist/core/task-manager.d.ts.map +1 -1
- package/dist/core/task-manager.js +39 -24
- package/dist/core/task-manager.js.map +1 -1
- package/dist/index.js +182 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/rulebook-server.d.ts +6 -0
- package/dist/mcp/rulebook-server.d.ts.map +1 -1
- package/dist/mcp/rulebook-server.js +394 -49
- package/dist/mcp/rulebook-server.js.map +1 -1
- package/dist/memory/hnsw-index.d.ts +6 -1
- package/dist/memory/hnsw-index.d.ts.map +1 -1
- package/dist/memory/hnsw-index.js +133 -18
- package/dist/memory/hnsw-index.js.map +1 -1
- package/dist/memory/memory-manager.d.ts +2 -0
- package/dist/memory/memory-manager.d.ts.map +1 -1
- package/dist/memory/memory-manager.js +16 -7
- package/dist/memory/memory-manager.js.map +1 -1
- package/dist/memory/memory-store.d.ts +15 -3
- package/dist/memory/memory-store.d.ts.map +1 -1
- package/dist/memory/memory-store.js +327 -274
- package/dist/memory/memory-store.js.map +1 -1
- package/dist/types.d.ts +17 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +8 -3
- package/templates/agents/compiler/codegen-debugger.md +34 -0
- package/templates/agents/compiler/stdlib-engineer.md +28 -0
- package/templates/agents/compiler/test-coverage-guardian.md +31 -0
- package/templates/agents/game-engine/cpp-core-expert.md +35 -0
- package/templates/agents/game-engine/render-engineer.md +22 -0
- package/templates/agents/game-engine/shader-engineer.md +38 -0
- package/templates/agents/game-engine/systems-integration.md +43 -0
- package/templates/agents/generic/code-reviewer.md +41 -0
- package/templates/agents/generic/docs-writer.md +25 -0
- package/templates/agents/generic/project-manager.md +36 -0
- package/templates/agents/generic/researcher.md +34 -0
- package/templates/agents/generic/test-engineer.md +41 -0
- package/templates/agents/implementer.md +8 -4
- package/templates/agents/mobile/platform-specialist.md +22 -0
- package/templates/agents/mobile/ui-engineer.md +22 -0
- package/templates/agents/tester.md +7 -4
- package/templates/agents/web-app/api-designer.md +22 -0
- package/templates/agents/web-app/backend-engineer.md +30 -0
- package/templates/agents/web-app/database-engineer.md +22 -0
- package/templates/agents/web-app/frontend-engineer.md +29 -0
- package/templates/agents/web-app/security-reviewer.md +32 -0
- package/templates/core/AGENT_AUTOMATION.md +8 -0
- package/templates/core/RULEBOOK.md +12 -0
- package/templates/core/TIER1_PROHIBITIONS.md +154 -0
- package/templates/core/TOKEN_OPTIMIZATION.md +49 -0
- package/templates/git/GIT_WORKFLOW.md +35 -0
- package/templates/rules/follow-task-sequence.md +36 -0
- package/templates/rules/git-safety.md +29 -0
- package/templates/rules/incremental-implementation.md +56 -0
- package/templates/rules/incremental-tests.md +29 -0
- package/templates/rules/no-deferred.md +31 -0
- package/templates/rules/no-shortcuts.md +30 -0
- package/templates/rules/research-first.md +30 -0
- package/templates/rules/sequential-editing.md +21 -0
- package/templates/rules/session-workflow.md +24 -0
- package/templates/rules/task-decomposition.md +32 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Template Engine — v5.0 Adaptive Agent Framework
|
|
3
|
+
*
|
|
4
|
+
* Loads agent templates by project type and generates tool-specific
|
|
5
|
+
* agent definitions with graceful degradation:
|
|
6
|
+
*
|
|
7
|
+
* - Claude Code → full .claude/agents/*.md with memory directories
|
|
8
|
+
* - Cursor → contextual .cursor/rules/*.mdc activated by file globs
|
|
9
|
+
* - Gemini/Codex → inline conditional sections in directives file
|
|
10
|
+
*/
|
|
11
|
+
export type ProjectType = 'game-engine' | 'compiler' | 'web-app' | 'mobile' | 'generic';
|
|
12
|
+
export type ModelTier = 'core' | 'standard' | 'research';
|
|
13
|
+
export interface AgentTemplate {
|
|
14
|
+
name: string;
|
|
15
|
+
domain: string;
|
|
16
|
+
filePatterns: string[];
|
|
17
|
+
tier: ModelTier;
|
|
18
|
+
model: string;
|
|
19
|
+
description: string;
|
|
20
|
+
checklist: string[];
|
|
21
|
+
body: string;
|
|
22
|
+
}
|
|
23
|
+
export interface AgentGenerationResult {
|
|
24
|
+
claudeCode: string[];
|
|
25
|
+
cursor: string[];
|
|
26
|
+
inline: string[];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Load agent templates for a given project type.
|
|
30
|
+
* Always includes 'generic' templates + project-type-specific templates.
|
|
31
|
+
*/
|
|
32
|
+
export declare function loadAgentTemplates(projectType: ProjectType): Promise<AgentTemplate[]>;
|
|
33
|
+
export interface DetectedTools {
|
|
34
|
+
claudeCode?: boolean;
|
|
35
|
+
cursor?: boolean;
|
|
36
|
+
gemini?: boolean;
|
|
37
|
+
codex?: boolean;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Generate agent definitions for all detected tools.
|
|
41
|
+
* Claude Code gets full agents. Cursor gets contextual rules. Others get inline sections.
|
|
42
|
+
*/
|
|
43
|
+
export declare function generateAgents(projectRoot: string, projectType: ProjectType, detectedTools: DetectedTools): Promise<AgentGenerationResult>;
|
|
44
|
+
/**
|
|
45
|
+
* List available project types and their agent counts.
|
|
46
|
+
*/
|
|
47
|
+
export declare function listProjectTypes(): Promise<Array<{
|
|
48
|
+
type: ProjectType;
|
|
49
|
+
agentCount: number;
|
|
50
|
+
}>>;
|
|
51
|
+
//# sourceMappingURL=agent-template-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-template-engine.d.ts","sourceRoot":"","sources":["../../src/core/agent-template-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAaH,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AACxF,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;AAEzD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AA2DD;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAgB3F;AA4MD,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,aAAa,GAC3B,OAAO,CAAC,qBAAqB,CAAC,CAsBhC;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAUlG"}
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Template Engine — v5.0 Adaptive Agent Framework
|
|
3
|
+
*
|
|
4
|
+
* Loads agent templates by project type and generates tool-specific
|
|
5
|
+
* agent definitions with graceful degradation:
|
|
6
|
+
*
|
|
7
|
+
* - Claude Code → full .claude/agents/*.md with memory directories
|
|
8
|
+
* - Cursor → contextual .cursor/rules/*.mdc activated by file globs
|
|
9
|
+
* - Gemini/Codex → inline conditional sections in directives file
|
|
10
|
+
*/
|
|
11
|
+
import { existsSync } from 'fs';
|
|
12
|
+
import { readFile, writeFile, mkdir, readdir } from 'fs/promises';
|
|
13
|
+
import { join, basename } from 'path';
|
|
14
|
+
import { fileURLToPath } from 'url';
|
|
15
|
+
import { dirname } from 'path';
|
|
16
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
17
|
+
const __dirname = dirname(__filename);
|
|
18
|
+
// ── Frontmatter Parser (reuse pattern from rule-engine) ─────────────────
|
|
19
|
+
function parseFrontmatter(content) {
|
|
20
|
+
const fmMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);
|
|
21
|
+
if (!fmMatch)
|
|
22
|
+
return { meta: {}, body: content };
|
|
23
|
+
const meta = {};
|
|
24
|
+
const fmLines = fmMatch[1].split(/\r?\n/);
|
|
25
|
+
let currentKey = '';
|
|
26
|
+
let currentList = null;
|
|
27
|
+
for (const line of fmLines) {
|
|
28
|
+
// Check for YAML list item (continuation of previous key)
|
|
29
|
+
const listItem = line.match(/^\s+-\s+"?([^"]*)"?\s*$/);
|
|
30
|
+
if (listItem && currentKey && currentList !== null) {
|
|
31
|
+
currentList.push(listItem[1]);
|
|
32
|
+
meta[currentKey] = currentList;
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
// Flush any pending list
|
|
36
|
+
currentList = null;
|
|
37
|
+
const kv = line.match(/^(\w+)\s*:\s*(.*)$/);
|
|
38
|
+
if (!kv)
|
|
39
|
+
continue;
|
|
40
|
+
const key = kv[1];
|
|
41
|
+
let val = kv[2].trim();
|
|
42
|
+
// Empty value after colon = start of YAML list on next lines
|
|
43
|
+
if (val === '' || val === undefined) {
|
|
44
|
+
currentKey = key;
|
|
45
|
+
currentList = [];
|
|
46
|
+
meta[key] = currentList;
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
// Inline array: ["a", "b"]
|
|
50
|
+
if (typeof val === 'string' && val.startsWith('[') && val.endsWith(']')) {
|
|
51
|
+
val = val.slice(1, -1).split(',').map(s => s.trim().replace(/^["']|["']$/g, '')).filter(Boolean);
|
|
52
|
+
}
|
|
53
|
+
else if (val === 'true')
|
|
54
|
+
val = true;
|
|
55
|
+
else if (val === 'false')
|
|
56
|
+
val = false;
|
|
57
|
+
else if (typeof val === 'string')
|
|
58
|
+
val = val.replace(/^["']|["']$/g, '');
|
|
59
|
+
meta[key] = val;
|
|
60
|
+
currentKey = key;
|
|
61
|
+
}
|
|
62
|
+
return { meta, body: fmMatch[2] };
|
|
63
|
+
}
|
|
64
|
+
// ── Template Loading ────────────────────────────────────────────────────
|
|
65
|
+
function getAgentTemplatesDir() {
|
|
66
|
+
return join(__dirname, '..', '..', 'templates', 'agents');
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Load agent templates for a given project type.
|
|
70
|
+
* Always includes 'generic' templates + project-type-specific templates.
|
|
71
|
+
*/
|
|
72
|
+
export async function loadAgentTemplates(projectType) {
|
|
73
|
+
const baseDir = getAgentTemplatesDir();
|
|
74
|
+
const templates = [];
|
|
75
|
+
// Load generic agents (always included)
|
|
76
|
+
await loadFromDir(join(baseDir, 'generic'), templates);
|
|
77
|
+
// Load project-type-specific agents
|
|
78
|
+
if (projectType !== 'generic') {
|
|
79
|
+
const typeDir = join(baseDir, projectType);
|
|
80
|
+
if (existsSync(typeDir)) {
|
|
81
|
+
await loadFromDir(typeDir, templates);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return templates;
|
|
85
|
+
}
|
|
86
|
+
async function loadFromDir(dir, templates) {
|
|
87
|
+
if (!existsSync(dir))
|
|
88
|
+
return;
|
|
89
|
+
const files = await readdir(dir);
|
|
90
|
+
for (const file of files) {
|
|
91
|
+
if (!file.endsWith('.md'))
|
|
92
|
+
continue;
|
|
93
|
+
const content = await readFile(join(dir, file), 'utf-8');
|
|
94
|
+
const { meta, body } = parseFrontmatter(content);
|
|
95
|
+
templates.push({
|
|
96
|
+
name: meta.name || basename(file, '.md'),
|
|
97
|
+
domain: meta.domain || 'general',
|
|
98
|
+
filePatterns: Array.isArray(meta.filePatterns) ? meta.filePatterns : ['*'],
|
|
99
|
+
tier: meta.tier || 'standard',
|
|
100
|
+
model: meta.model || 'sonnet',
|
|
101
|
+
description: meta.description || '',
|
|
102
|
+
checklist: Array.isArray(meta.checklist) ? meta.checklist : [],
|
|
103
|
+
body: body.trim(),
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// ── Mandatory Sections ──────────────────────────────────────────────────
|
|
108
|
+
const MANDATORY_FOOTER = `
|
|
109
|
+
## Mandatory Rules (Injected by Rulebook)
|
|
110
|
+
|
|
111
|
+
### No Shortcuts — Quality Over Speed
|
|
112
|
+
NEVER simplify logic, add TODO/FIXME/HACK, create stubs, use placeholders, reduce scope,
|
|
113
|
+
skip edge cases, or deliver partial implementations. Quality is everything.
|
|
114
|
+
|
|
115
|
+
### Incremental Implementation — Step by Step
|
|
116
|
+
NEVER implement everything at once. Decompose into small steps, implement ONE step, test/verify
|
|
117
|
+
immediately, fix errors before proceeding. If stuck after 3 failed attempts on the same error:
|
|
118
|
+
STOP, record the failure as anti-pattern, remove broken code, restart from scratch with a
|
|
119
|
+
different approach. The line between persistence and stubbornness is thin.
|
|
120
|
+
|
|
121
|
+
### Knowledge Base — Check Before, Record After
|
|
122
|
+
BEFORE implementing: check \`.rulebook/knowledge/\` for existing patterns and anti-patterns.
|
|
123
|
+
AFTER implementing: record what worked (pattern) and what failed (anti-pattern).
|
|
124
|
+
After debugging: capture learnings with \`rulebook learn capture\`.
|
|
125
|
+
The knowledge base exists so you don't repeat mistakes across sessions.
|
|
126
|
+
|
|
127
|
+
### Update tasks.md After Every Completion
|
|
128
|
+
After completing ANY task, update the corresponding \`.rulebook/tasks/*/tasks.md\` file.
|
|
129
|
+
Change \`- [ ]\` to \`- [x]\` with a brief description. Do this BEFORE reporting completion.
|
|
130
|
+
|
|
131
|
+
### Never Mark Tasks as Deferred
|
|
132
|
+
If a task is in tasks.md, implement it. If it has a dependency, implement the dependency first.
|
|
133
|
+
|
|
134
|
+
### Research Before Implementing
|
|
135
|
+
NEVER guess. State what you know, what you don't know, research the unknown, then implement.
|
|
136
|
+
`;
|
|
137
|
+
// ── Claude Code Agent Generation ────────────────────────────────────────
|
|
138
|
+
/**
|
|
139
|
+
* Generate full Claude Code agent definitions with memory directories.
|
|
140
|
+
*/
|
|
141
|
+
async function generateClaudeCodeAgents(projectRoot, templates) {
|
|
142
|
+
const agentsDir = join(projectRoot, '.claude', 'agents');
|
|
143
|
+
if (!existsSync(agentsDir))
|
|
144
|
+
await mkdir(agentsDir, { recursive: true });
|
|
145
|
+
const written = [];
|
|
146
|
+
for (const tmpl of templates) {
|
|
147
|
+
const filePath = join(agentsDir, `${tmpl.name}.md`);
|
|
148
|
+
// Build Claude Code agent definition with frontmatter
|
|
149
|
+
let content = `---\n`;
|
|
150
|
+
content += `name: ${tmpl.name}\n`;
|
|
151
|
+
content += `description: "${tmpl.description}"\n`;
|
|
152
|
+
content += `model: ${tmpl.model}\n`;
|
|
153
|
+
content += `---\n\n`;
|
|
154
|
+
content += tmpl.body;
|
|
155
|
+
// Append pre-flight checklist if present
|
|
156
|
+
if (tmpl.checklist.length > 0) {
|
|
157
|
+
content += `\n\n## Pre-Flight Checklist (MANDATORY)\n\n`;
|
|
158
|
+
content += `Before returning code, answer ALL of these:\n\n`;
|
|
159
|
+
for (const q of tmpl.checklist) {
|
|
160
|
+
content += `- ${q}\n`;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Append mandatory rules
|
|
164
|
+
content += MANDATORY_FOOTER;
|
|
165
|
+
// Append memory instructions
|
|
166
|
+
content += `\n## Agent Memory\n\n`;
|
|
167
|
+
content += `You have a persistent memory directory at \`${projectRoot}/.claude/agent-memory/${tmpl.name}/\`.\n`;
|
|
168
|
+
content += `Record stable patterns, key decisions, and solutions to recurring problems.\n`;
|
|
169
|
+
await writeFile(filePath, content, 'utf-8');
|
|
170
|
+
written.push(filePath);
|
|
171
|
+
// Create memory directory
|
|
172
|
+
const memDir = join(projectRoot, '.claude', 'agent-memory', tmpl.name);
|
|
173
|
+
if (!existsSync(memDir)) {
|
|
174
|
+
await mkdir(memDir, { recursive: true });
|
|
175
|
+
// Create empty MEMORY.md index
|
|
176
|
+
const memoryMd = join(memDir, 'MEMORY.md');
|
|
177
|
+
if (!existsSync(memoryMd)) {
|
|
178
|
+
await writeFile(memoryMd, `# ${tmpl.name} Memory\n\nNo entries yet.\n`, 'utf-8');
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return written;
|
|
183
|
+
}
|
|
184
|
+
// ── Cursor Graceful Degradation ─────────────────────────────────────────
|
|
185
|
+
/**
|
|
186
|
+
* Generate Cursor contextual rules that simulate agent specialization.
|
|
187
|
+
* Each agent becomes a .mdc rule activated by file glob patterns.
|
|
188
|
+
*/
|
|
189
|
+
async function generateCursorAgentRules(projectRoot, templates) {
|
|
190
|
+
const rulesDir = join(projectRoot, '.cursor', 'rules');
|
|
191
|
+
if (!existsSync(rulesDir))
|
|
192
|
+
await mkdir(rulesDir, { recursive: true });
|
|
193
|
+
const written = [];
|
|
194
|
+
for (const tmpl of templates) {
|
|
195
|
+
// Skip generic agents that don't have meaningful file patterns
|
|
196
|
+
if (tmpl.filePatterns.length === 1 && tmpl.filePatterns[0] === '*' && tmpl.domain === 'research') {
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
const filePath = join(rulesDir, `agent-${tmpl.name}.mdc`);
|
|
200
|
+
let frontmatter = `---\n`;
|
|
201
|
+
frontmatter += `description: "${tmpl.description}"\n`;
|
|
202
|
+
if (tmpl.filePatterns.length === 1 && tmpl.filePatterns[0] === '*') {
|
|
203
|
+
frontmatter += `alwaysApply: true\n`;
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
frontmatter += `globs: ${JSON.stringify(tmpl.filePatterns)}\n`;
|
|
207
|
+
}
|
|
208
|
+
frontmatter += `---\n\n`;
|
|
209
|
+
let content = frontmatter;
|
|
210
|
+
content += tmpl.body;
|
|
211
|
+
if (tmpl.checklist.length > 0) {
|
|
212
|
+
content += `\n\n## Pre-Flight Checklist\n\n`;
|
|
213
|
+
for (const q of tmpl.checklist) {
|
|
214
|
+
content += `- ${q}\n`;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// Add condensed mandatory rules (Cursor has smaller context)
|
|
218
|
+
content += `\n\n## Rules\n`;
|
|
219
|
+
content += `- No stubs, TODOs, placeholders, or approximations\n`;
|
|
220
|
+
content += `- Update tasks.md after completion\n`;
|
|
221
|
+
content += `- Research before implementing — never guess\n`;
|
|
222
|
+
await writeFile(filePath, content, 'utf-8');
|
|
223
|
+
written.push(filePath);
|
|
224
|
+
}
|
|
225
|
+
return written;
|
|
226
|
+
}
|
|
227
|
+
// ── Inline Sections (Gemini/Codex) ──────────────────────────────────────
|
|
228
|
+
/**
|
|
229
|
+
* Generate inline conditional sections for tools without agent support.
|
|
230
|
+
* Returns an array of markdown sections to be embedded in the directives file.
|
|
231
|
+
*/
|
|
232
|
+
function generateInlineSections(templates) {
|
|
233
|
+
const sections = [];
|
|
234
|
+
for (const tmpl of templates) {
|
|
235
|
+
if (tmpl.filePatterns.length === 1 && tmpl.filePatterns[0] === '*')
|
|
236
|
+
continue;
|
|
237
|
+
const patterns = tmpl.filePatterns.join(', ');
|
|
238
|
+
sections.push(`### When Editing ${patterns}\n`);
|
|
239
|
+
sections.push(`**Role**: ${tmpl.description}\n`);
|
|
240
|
+
sections.push(tmpl.body);
|
|
241
|
+
if (tmpl.checklist.length > 0) {
|
|
242
|
+
sections.push(`\n**Checklist before returning code:**`);
|
|
243
|
+
for (const q of tmpl.checklist) {
|
|
244
|
+
sections.push(`- ${q}`);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
sections.push('');
|
|
248
|
+
}
|
|
249
|
+
return sections;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Generate agent definitions for all detected tools.
|
|
253
|
+
* Claude Code gets full agents. Cursor gets contextual rules. Others get inline sections.
|
|
254
|
+
*/
|
|
255
|
+
export async function generateAgents(projectRoot, projectType, detectedTools) {
|
|
256
|
+
const templates = await loadAgentTemplates(projectType);
|
|
257
|
+
const result = {
|
|
258
|
+
claudeCode: [],
|
|
259
|
+
cursor: [],
|
|
260
|
+
inline: [],
|
|
261
|
+
};
|
|
262
|
+
if (detectedTools.claudeCode) {
|
|
263
|
+
result.claudeCode = await generateClaudeCodeAgents(projectRoot, templates);
|
|
264
|
+
}
|
|
265
|
+
if (detectedTools.cursor) {
|
|
266
|
+
result.cursor = await generateCursorAgentRules(projectRoot, templates);
|
|
267
|
+
}
|
|
268
|
+
if (detectedTools.gemini || detectedTools.codex) {
|
|
269
|
+
result.inline = generateInlineSections(templates);
|
|
270
|
+
}
|
|
271
|
+
return result;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* List available project types and their agent counts.
|
|
275
|
+
*/
|
|
276
|
+
export async function listProjectTypes() {
|
|
277
|
+
const types = ['game-engine', 'compiler', 'web-app', 'mobile', 'generic'];
|
|
278
|
+
const result = [];
|
|
279
|
+
for (const type of types) {
|
|
280
|
+
const templates = await loadAgentTemplates(type);
|
|
281
|
+
result.push({ type, agentCount: templates.length });
|
|
282
|
+
}
|
|
283
|
+
return result;
|
|
284
|
+
}
|
|
285
|
+
//# sourceMappingURL=agent-template-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-template-engine.js","sourceRoot":"","sources":["../../src/core/agent-template-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project Complexity Detector — v5.0
|
|
3
|
+
*
|
|
4
|
+
* Assesses project complexity to calibrate rule generation.
|
|
5
|
+
* Complexity tiers determine which features are activated:
|
|
6
|
+
*
|
|
7
|
+
* - Small: < 10K LOC, 1 language → Tier 1 rules only
|
|
8
|
+
* - Medium: 10-50K LOC, 1-2 langs → + Tier 2 (decomposition, incremental tests)
|
|
9
|
+
* - Large: 50K+ LOC, 2+ langs → + Specialized agents, team coordination
|
|
10
|
+
* - Complex: 100K+ LOC, 3+ langs → + Reference workflow, blocker tracking, data-flow
|
|
11
|
+
*/
|
|
12
|
+
export type ComplexityTier = 'small' | 'medium' | 'large' | 'complex';
|
|
13
|
+
export interface ComplexityAssessment {
|
|
14
|
+
tier: ComplexityTier;
|
|
15
|
+
score: number;
|
|
16
|
+
metrics: {
|
|
17
|
+
estimatedLoc: number;
|
|
18
|
+
languageCount: number;
|
|
19
|
+
sourceDirectories: number;
|
|
20
|
+
hasMultipleBuildTargets: boolean;
|
|
21
|
+
hasCustomMcpServer: boolean;
|
|
22
|
+
hasReferenceSource: boolean;
|
|
23
|
+
};
|
|
24
|
+
recommendations: {
|
|
25
|
+
tier1Rules: boolean;
|
|
26
|
+
tier2Rules: boolean;
|
|
27
|
+
specializedAgents: boolean;
|
|
28
|
+
teamCoordination: boolean;
|
|
29
|
+
referenceWorkflow: boolean;
|
|
30
|
+
blockerTracking: boolean;
|
|
31
|
+
dataFlowPlanning: boolean;
|
|
32
|
+
};
|
|
33
|
+
detectedTools: string[];
|
|
34
|
+
}
|
|
35
|
+
export declare function assessComplexity(projectRoot: string): ComplexityAssessment;
|
|
36
|
+
//# sourceMappingURL=complexity-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complexity-detector.d.ts","sourceRoot":"","sources":["../../src/core/complexity-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AAEtE,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE;QACP,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,uBAAuB,EAAE,OAAO,CAAC;QACjC,kBAAkB,EAAE,OAAO,CAAC;QAC5B,kBAAkB,EAAE,OAAO,CAAC;KAC7B,CAAC;IACF,eAAe,EAAE;QACf,UAAU,EAAE,OAAO,CAAC;QACpB,UAAU,EAAE,OAAO,CAAC;QACpB,iBAAiB,EAAE,OAAO,CAAC;QAC3B,gBAAgB,EAAE,OAAO,CAAC;QAC1B,iBAAiB,EAAE,OAAO,CAAC;QAC3B,eAAe,EAAE,OAAO,CAAC;QACzB,gBAAgB,EAAE,OAAO,CAAC;KAC3B,CAAC;IACF,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAuLD,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,oBAAoB,CAmE1E"}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project Complexity Detector — v5.0
|
|
3
|
+
*
|
|
4
|
+
* Assesses project complexity to calibrate rule generation.
|
|
5
|
+
* Complexity tiers determine which features are activated:
|
|
6
|
+
*
|
|
7
|
+
* - Small: < 10K LOC, 1 language → Tier 1 rules only
|
|
8
|
+
* - Medium: 10-50K LOC, 1-2 langs → + Tier 2 (decomposition, incremental tests)
|
|
9
|
+
* - Large: 50K+ LOC, 2+ langs → + Specialized agents, team coordination
|
|
10
|
+
* - Complex: 100K+ LOC, 3+ langs → + Reference workflow, blocker tracking, data-flow
|
|
11
|
+
*/
|
|
12
|
+
import { existsSync, readdirSync, statSync, readFileSync } from 'fs';
|
|
13
|
+
import { join, extname } from 'path';
|
|
14
|
+
// ── LOC Estimation ──────────────────────────────────────────────────────
|
|
15
|
+
const CODE_EXTENSIONS = new Set([
|
|
16
|
+
'.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',
|
|
17
|
+
'.py', '.pyx',
|
|
18
|
+
'.rs',
|
|
19
|
+
'.go',
|
|
20
|
+
'.java', '.kt', '.scala',
|
|
21
|
+
'.cs',
|
|
22
|
+
'.cpp', '.cc', '.cxx', '.c', '.h', '.hpp',
|
|
23
|
+
'.swift', '.m', '.mm',
|
|
24
|
+
'.rb',
|
|
25
|
+
'.php',
|
|
26
|
+
'.ex', '.exs',
|
|
27
|
+
'.erl', '.hrl',
|
|
28
|
+
'.zig',
|
|
29
|
+
'.sol',
|
|
30
|
+
'.dart',
|
|
31
|
+
'.r', '.R',
|
|
32
|
+
'.hs',
|
|
33
|
+
'.lua',
|
|
34
|
+
'.hlsl', '.glsl', '.msl', '.wgsl',
|
|
35
|
+
'.sql',
|
|
36
|
+
'.sh', '.bash', '.zsh',
|
|
37
|
+
]);
|
|
38
|
+
const IGNORE_DIRS = new Set([
|
|
39
|
+
'node_modules', '.git', 'dist', 'build', 'out', '.next', '.nuxt',
|
|
40
|
+
'target', 'vendor', '__pycache__', '.venv', 'venv', 'env',
|
|
41
|
+
'.rulebook', '.claude', '.cursor', 'coverage', '.cache',
|
|
42
|
+
'zig-cache', 'zig-out', '.zig-cache',
|
|
43
|
+
]);
|
|
44
|
+
/**
|
|
45
|
+
* Estimate lines of code by sampling files. Scans up to maxFiles to avoid
|
|
46
|
+
* blocking on huge repos.
|
|
47
|
+
*/
|
|
48
|
+
function estimateLoc(projectRoot, maxFiles = 500) {
|
|
49
|
+
let totalLoc = 0;
|
|
50
|
+
let filesScanned = 0;
|
|
51
|
+
const languages = new Set();
|
|
52
|
+
function walk(dir, depth) {
|
|
53
|
+
if (depth > 8 || filesScanned >= maxFiles)
|
|
54
|
+
return;
|
|
55
|
+
let entries;
|
|
56
|
+
try {
|
|
57
|
+
entries = readdirSync(dir);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
for (const entry of entries) {
|
|
63
|
+
if (filesScanned >= maxFiles)
|
|
64
|
+
return;
|
|
65
|
+
if (IGNORE_DIRS.has(entry) || entry.startsWith('.'))
|
|
66
|
+
continue;
|
|
67
|
+
const fullPath = join(dir, entry);
|
|
68
|
+
let stat;
|
|
69
|
+
try {
|
|
70
|
+
stat = statSync(fullPath);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (stat.isDirectory()) {
|
|
76
|
+
walk(fullPath, depth + 1);
|
|
77
|
+
}
|
|
78
|
+
else if (stat.isFile()) {
|
|
79
|
+
const ext = extname(entry).toLowerCase();
|
|
80
|
+
if (CODE_EXTENSIONS.has(ext) && stat.size < 500000) {
|
|
81
|
+
try {
|
|
82
|
+
const content = readFileSync(fullPath, 'utf-8');
|
|
83
|
+
const lines = content.split('\n').length;
|
|
84
|
+
totalLoc += lines;
|
|
85
|
+
languages.add(ext);
|
|
86
|
+
filesScanned++;
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// Skip unreadable files
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
walk(projectRoot, 0);
|
|
96
|
+
// If we hit the sample limit, extrapolate
|
|
97
|
+
if (filesScanned >= maxFiles) {
|
|
98
|
+
// Rough extrapolation: count remaining code files
|
|
99
|
+
const totalCodeFiles = countCodeFiles(projectRoot, maxFiles * 3);
|
|
100
|
+
if (totalCodeFiles > filesScanned) {
|
|
101
|
+
const avgLocPerFile = totalLoc / filesScanned;
|
|
102
|
+
totalLoc = Math.round(avgLocPerFile * totalCodeFiles);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return { loc: totalLoc, languages };
|
|
106
|
+
}
|
|
107
|
+
function countCodeFiles(projectRoot, max) {
|
|
108
|
+
let count = 0;
|
|
109
|
+
function walk(dir, depth) {
|
|
110
|
+
if (depth > 8 || count >= max)
|
|
111
|
+
return;
|
|
112
|
+
let entries;
|
|
113
|
+
try {
|
|
114
|
+
entries = readdirSync(dir);
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
for (const entry of entries) {
|
|
120
|
+
if (count >= max)
|
|
121
|
+
return;
|
|
122
|
+
if (IGNORE_DIRS.has(entry) || entry.startsWith('.'))
|
|
123
|
+
continue;
|
|
124
|
+
const fullPath = join(dir, entry);
|
|
125
|
+
let stat;
|
|
126
|
+
try {
|
|
127
|
+
stat = statSync(fullPath);
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
if (stat.isDirectory()) {
|
|
133
|
+
walk(fullPath, depth + 1);
|
|
134
|
+
}
|
|
135
|
+
else if (stat.isFile()) {
|
|
136
|
+
const ext = extname(entry).toLowerCase();
|
|
137
|
+
if (CODE_EXTENSIONS.has(ext))
|
|
138
|
+
count++;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
walk(projectRoot, 0);
|
|
143
|
+
return count;
|
|
144
|
+
}
|
|
145
|
+
// ── Source Directory Count ───────────────────────────────────────────────
|
|
146
|
+
function countSourceDirs(projectRoot) {
|
|
147
|
+
const srcDirs = ['src', 'lib', 'app', 'pages', 'components', 'modules',
|
|
148
|
+
'packages', 'crates', 'cmd', 'pkg', 'internal', 'runtime',
|
|
149
|
+
'compiler', 'engine', 'core', 'server', 'client', 'api'];
|
|
150
|
+
let count = 0;
|
|
151
|
+
for (const dir of srcDirs) {
|
|
152
|
+
if (existsSync(join(projectRoot, dir)))
|
|
153
|
+
count++;
|
|
154
|
+
}
|
|
155
|
+
return count;
|
|
156
|
+
}
|
|
157
|
+
// ── Tool Detection ──────────────────────────────────────────────────────
|
|
158
|
+
function detectTools(projectRoot) {
|
|
159
|
+
const tools = [];
|
|
160
|
+
if (existsSync(join(projectRoot, '.claude')) || existsSync(join(projectRoot, 'CLAUDE.md')))
|
|
161
|
+
tools.push('claude-code');
|
|
162
|
+
if (existsSync(join(projectRoot, '.cursor')))
|
|
163
|
+
tools.push('cursor');
|
|
164
|
+
if (existsSync(join(projectRoot, 'GEMINI.md')))
|
|
165
|
+
tools.push('gemini');
|
|
166
|
+
if (existsSync(join(projectRoot, '.windsurf')) || existsSync(join(projectRoot, '.windsurfrules')))
|
|
167
|
+
tools.push('windsurf');
|
|
168
|
+
if (existsSync(join(projectRoot, '.github', 'copilot-instructions.md')))
|
|
169
|
+
tools.push('copilot');
|
|
170
|
+
if (existsSync(join(projectRoot, '.continue')))
|
|
171
|
+
tools.push('continue');
|
|
172
|
+
return tools;
|
|
173
|
+
}
|
|
174
|
+
// ── Main Assessment ─────────────────────────────────────────────────────
|
|
175
|
+
const EXT_TO_LANGUAGE = {
|
|
176
|
+
'.ts': 'TypeScript', '.tsx': 'TypeScript', '.js': 'JavaScript', '.jsx': 'JavaScript',
|
|
177
|
+
'.py': 'Python', '.rs': 'Rust', '.go': 'Go', '.java': 'Java', '.kt': 'Kotlin',
|
|
178
|
+
'.cs': 'C#', '.cpp': 'C++', '.c': 'C', '.h': 'C/C++', '.hpp': 'C++',
|
|
179
|
+
'.swift': 'Swift', '.rb': 'Ruby', '.php': 'PHP', '.dart': 'Dart',
|
|
180
|
+
'.hlsl': 'HLSL', '.glsl': 'GLSL', '.lua': 'Lua', '.zig': 'Zig',
|
|
181
|
+
'.ex': 'Elixir', '.erl': 'Erlang', '.sol': 'Solidity', '.hs': 'Haskell',
|
|
182
|
+
'.scala': 'Scala', '.r': 'R', '.R': 'R',
|
|
183
|
+
};
|
|
184
|
+
export function assessComplexity(projectRoot) {
|
|
185
|
+
const { loc, languages: langExts } = estimateLoc(projectRoot);
|
|
186
|
+
const uniqueLanguages = new Set();
|
|
187
|
+
for (const ext of langExts) {
|
|
188
|
+
const lang = EXT_TO_LANGUAGE[ext];
|
|
189
|
+
if (lang)
|
|
190
|
+
uniqueLanguages.add(lang);
|
|
191
|
+
}
|
|
192
|
+
const languageCount = uniqueLanguages.size;
|
|
193
|
+
const sourceDirectories = countSourceDirs(projectRoot);
|
|
194
|
+
const hasMultipleBuildTargets = existsSync(join(projectRoot, 'Cargo.toml')) && existsSync(join(projectRoot, 'package.json')) ||
|
|
195
|
+
existsSync(join(projectRoot, 'CMakeLists.txt')) && existsSync(join(projectRoot, 'package.json')) ||
|
|
196
|
+
existsSync(join(projectRoot, 'build.zig')) && existsSync(join(projectRoot, 'package.json'));
|
|
197
|
+
const hasCustomMcpServer = existsSync(join(projectRoot, '.mcp.json')) ||
|
|
198
|
+
existsSync(join(projectRoot, 'mcp.json'));
|
|
199
|
+
const hasReferenceSource = false; // Detected from config, not file system
|
|
200
|
+
const detectedTools = detectTools(projectRoot);
|
|
201
|
+
// Score calculation
|
|
202
|
+
let score = 0;
|
|
203
|
+
if (loc >= 100000)
|
|
204
|
+
score += 40;
|
|
205
|
+
else if (loc >= 50000)
|
|
206
|
+
score += 30;
|
|
207
|
+
else if (loc >= 10000)
|
|
208
|
+
score += 20;
|
|
209
|
+
else
|
|
210
|
+
score += 10;
|
|
211
|
+
score += Math.min(languageCount * 10, 30);
|
|
212
|
+
score += Math.min(sourceDirectories * 3, 15);
|
|
213
|
+
if (hasMultipleBuildTargets)
|
|
214
|
+
score += 10;
|
|
215
|
+
if (hasCustomMcpServer)
|
|
216
|
+
score += 5;
|
|
217
|
+
// Tier determination
|
|
218
|
+
let tier;
|
|
219
|
+
if (score >= 60 || (loc >= 100000 && languageCount >= 3)) {
|
|
220
|
+
tier = 'complex';
|
|
221
|
+
}
|
|
222
|
+
else if (score >= 40 || (loc >= 50000 && languageCount >= 2)) {
|
|
223
|
+
tier = 'large';
|
|
224
|
+
}
|
|
225
|
+
else if (score >= 25 || (loc >= 10000 && languageCount >= 2)) {
|
|
226
|
+
tier = 'medium';
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
tier = 'small';
|
|
230
|
+
}
|
|
231
|
+
return {
|
|
232
|
+
tier,
|
|
233
|
+
score,
|
|
234
|
+
metrics: {
|
|
235
|
+
estimatedLoc: loc,
|
|
236
|
+
languageCount,
|
|
237
|
+
sourceDirectories,
|
|
238
|
+
hasMultipleBuildTargets,
|
|
239
|
+
hasCustomMcpServer,
|
|
240
|
+
hasReferenceSource,
|
|
241
|
+
},
|
|
242
|
+
recommendations: {
|
|
243
|
+
tier1Rules: true, // Always
|
|
244
|
+
tier2Rules: tier !== 'small',
|
|
245
|
+
specializedAgents: tier === 'large' || tier === 'complex',
|
|
246
|
+
teamCoordination: tier === 'large' || tier === 'complex',
|
|
247
|
+
referenceWorkflow: tier === 'complex',
|
|
248
|
+
blockerTracking: tier === 'large' || tier === 'complex',
|
|
249
|
+
dataFlowPlanning: tier === 'complex',
|
|
250
|
+
},
|
|
251
|
+
detectedTools,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=complexity-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complexity-detector.js","sourceRoot":"","sources":["../../src/core/complexity-detector.ts"],"names":[],"mappings":"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"}
|