@hivehub/rulebook 5.5.2 → 5.7.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/.claude/commands/rulebook-learn-capture.md +41 -48
- package/.claude/commands/rulebook-learn-list.md +13 -13
- package/README.md +332 -394
- package/dist/cli/commands/context-intelligence.d.ts +0 -1
- package/dist/cli/commands/context-intelligence.d.ts.map +1 -1
- package/dist/cli/commands/context-intelligence.js +12 -33
- package/dist/cli/commands/context-intelligence.js.map +1 -1
- package/dist/cli/commands/index.d.ts +4 -7
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +4 -7
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +40 -81
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/mcp.d.ts +0 -1
- package/dist/cli/commands/mcp.d.ts.map +1 -1
- package/dist/cli/commands/mcp.js +1 -7
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/memory.d.ts +7 -1
- package/dist/cli/commands/memory.d.ts.map +1 -1
- package/dist/cli/commands/memory.js +51 -57
- package/dist/cli/commands/memory.js.map +1 -1
- package/dist/cli/commands/misc.d.ts +1 -15
- package/dist/cli/commands/misc.d.ts.map +1 -1
- package/dist/cli/commands/misc.js +36 -215
- package/dist/cli/commands/misc.js.map +1 -1
- package/dist/cli/commands/plans.d.ts +0 -6
- package/dist/cli/commands/plans.d.ts.map +1 -1
- package/dist/cli/commands/plans.js +9 -77
- package/dist/cli/commands/plans.js.map +1 -1
- package/dist/cli/commands/skills.js +6 -6
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/commands/task.js +4 -4
- package/dist/cli/commands/task.js.map +1 -1
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +122 -52
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/prompts.d.ts.map +1 -1
- package/dist/cli/prompts.js +1 -78
- package/dist/cli/prompts.js.map +1 -1
- package/dist/core/claude/claude-mcp.d.ts +59 -0
- package/dist/core/claude/claude-mcp.d.ts.map +1 -0
- package/dist/core/claude/claude-mcp.js +220 -0
- package/dist/core/claude/claude-mcp.js.map +1 -0
- package/dist/core/claude/claude-md-generator.d.ts +52 -0
- package/dist/core/claude/claude-md-generator.d.ts.map +1 -0
- package/dist/core/claude/claude-md-generator.js +104 -0
- package/dist/core/claude/claude-md-generator.js.map +1 -0
- package/dist/core/claude/claude-settings-manager.d.ts +44 -0
- package/dist/core/claude/claude-settings-manager.d.ts.map +1 -0
- package/dist/core/claude/claude-settings-manager.js +194 -0
- package/dist/core/claude/claude-settings-manager.js.map +1 -0
- package/dist/core/console/cli-bridge.d.ts +113 -0
- package/dist/core/console/cli-bridge.d.ts.map +1 -0
- package/dist/core/console/cli-bridge.js +1094 -0
- package/dist/core/console/cli-bridge.js.map +1 -0
- package/dist/core/detect/detector.d.ts +35 -0
- package/dist/core/detect/detector.d.ts.map +1 -0
- package/dist/core/detect/detector.js +541 -0
- package/dist/core/detect/detector.js.map +1 -0
- package/dist/core/docs/docs-generator.d.ts +9 -0
- package/dist/core/docs/docs-generator.d.ts.map +1 -0
- package/dist/core/docs/docs-generator.js +531 -0
- package/dist/core/docs/docs-generator.js.map +1 -0
- package/dist/core/docs/mcp-reference-generator.d.ts +13 -0
- package/dist/core/docs/mcp-reference-generator.d.ts.map +1 -0
- package/dist/core/docs/mcp-reference-generator.js +66 -0
- package/dist/core/docs/mcp-reference-generator.js.map +1 -0
- package/dist/core/generators/generator.d.ts +54 -0
- package/dist/core/generators/generator.d.ts.map +1 -0
- package/dist/core/generators/generator.js +1041 -0
- package/dist/core/generators/generator.js.map +1 -0
- package/dist/core/generators/gitignore-generator.d.ts +13 -0
- package/dist/core/generators/gitignore-generator.d.ts.map +1 -0
- package/dist/core/generators/gitignore-generator.js +307 -0
- package/dist/core/generators/gitignore-generator.js.map +1 -0
- package/dist/core/generators/minimal-scaffolder.d.ts +8 -0
- package/dist/core/generators/minimal-scaffolder.d.ts.map +1 -0
- package/dist/core/generators/minimal-scaffolder.js +51 -0
- package/dist/core/generators/minimal-scaffolder.js.map +1 -0
- package/dist/core/generators/rules-generator.d.ts +73 -0
- package/dist/core/generators/rules-generator.d.ts.map +1 -0
- package/dist/core/generators/rules-generator.js +202 -0
- package/dist/core/generators/rules-generator.js.map +1 -0
- package/dist/core/generators/workflow-generator.d.ts +15 -0
- package/dist/core/generators/workflow-generator.d.ts.map +1 -0
- package/dist/core/generators/workflow-generator.js +390 -0
- package/dist/core/generators/workflow-generator.js.map +1 -0
- package/dist/core/ide/multi-tool-generator.d.ts +59 -0
- package/dist/core/ide/multi-tool-generator.d.ts.map +1 -0
- package/dist/core/ide/multi-tool-generator.js +157 -0
- package/dist/core/ide/multi-tool-generator.js.map +1 -0
- package/dist/core/ide/opencode-generator.d.ts +72 -0
- package/dist/core/ide/opencode-generator.d.ts.map +1 -0
- package/dist/core/ide/opencode-generator.js +450 -0
- package/dist/core/ide/opencode-generator.js.map +1 -0
- package/dist/core/merger.d.ts +1 -1
- package/dist/core/merger.d.ts.map +1 -1
- package/dist/core/merger.js +5 -5
- package/dist/core/merger.js.map +1 -1
- package/dist/core/migrator.d.ts +0 -1
- package/dist/core/migrator.d.ts.map +1 -1
- package/dist/core/migrator.js +4 -29
- package/dist/core/migrator.js.map +1 -1
- package/dist/core/quality/coverage-checker.d.ts +14 -0
- package/dist/core/quality/coverage-checker.d.ts.map +1 -0
- package/dist/core/quality/coverage-checker.js +176 -0
- package/dist/core/quality/coverage-checker.js.map +1 -0
- package/dist/core/quality/dependency-checker.d.ts +21 -0
- package/dist/core/quality/dependency-checker.d.ts.map +1 -0
- package/dist/core/quality/dependency-checker.js +247 -0
- package/dist/core/quality/dependency-checker.js.map +1 -0
- package/dist/core/quality/doctor.d.ts +19 -0
- package/dist/core/quality/doctor.d.ts.map +1 -0
- package/dist/core/quality/doctor.js +163 -0
- package/dist/core/quality/doctor.js.map +1 -0
- package/dist/core/quality/validator.d.ts +21 -0
- package/dist/core/quality/validator.d.ts.map +1 -0
- package/dist/core/quality/validator.js +177 -0
- package/dist/core/quality/validator.js.map +1 -0
- package/dist/core/skills/skills-manager.d.ts +126 -0
- package/dist/core/skills/skills-manager.d.ts.map +1 -0
- package/dist/core/skills/skills-manager.js +630 -0
- package/dist/core/skills/skills-manager.js.map +1 -0
- package/dist/core/state/config-manager.d.ts +86 -0
- package/dist/core/state/config-manager.d.ts.map +1 -0
- package/dist/core/state/config-manager.js +562 -0
- package/dist/core/state/config-manager.js.map +1 -0
- package/dist/core/state/override-manager.d.ts +23 -0
- package/dist/core/state/override-manager.d.ts.map +1 -0
- package/dist/core/state/override-manager.js +82 -0
- package/dist/core/state/override-manager.js.map +1 -0
- package/dist/core/state/state-writer.d.ts +34 -0
- package/dist/core/state/state-writer.d.ts.map +1 -0
- package/dist/core/state/state-writer.js +78 -0
- package/dist/core/state/state-writer.js.map +1 -0
- package/dist/core/state/version-bumper.d.ts +19 -0
- package/dist/core/state/version-bumper.d.ts.map +1 -0
- package/dist/core/state/version-bumper.js +180 -0
- package/dist/core/state/version-bumper.js.map +1 -0
- package/dist/core/tasks/decision-manager.d.ts +25 -0
- package/dist/core/tasks/decision-manager.d.ts.map +1 -0
- package/dist/core/tasks/decision-manager.js +183 -0
- package/dist/core/tasks/decision-manager.js.map +1 -0
- package/dist/core/tasks/knowledge-manager.d.ts +24 -0
- package/dist/core/tasks/knowledge-manager.d.ts.map +1 -0
- package/dist/core/tasks/knowledge-manager.js +173 -0
- package/dist/core/tasks/knowledge-manager.js.map +1 -0
- package/dist/core/tasks/learn-manager.d.ts +27 -0
- package/dist/core/tasks/learn-manager.d.ts.map +1 -0
- package/dist/core/tasks/learn-manager.js +121 -0
- package/dist/core/tasks/learn-manager.js.map +1 -0
- package/dist/core/tasks/plans-manager.d.ts +46 -0
- package/dist/core/tasks/plans-manager.d.ts.map +1 -0
- package/dist/core/tasks/plans-manager.js +158 -0
- package/dist/core/tasks/plans-manager.js.map +1 -0
- package/dist/core/tasks/task-manager.d.ts +127 -0
- package/dist/core/tasks/task-manager.d.ts.map +1 -0
- package/dist/core/tasks/task-manager.js +607 -0
- package/dist/core/tasks/task-manager.js.map +1 -0
- package/dist/core/workspace/project-worker.d.ts +6 -6
- package/dist/core/workspace/project-worker.d.ts.map +1 -1
- package/dist/core/workspace/project-worker.js +6 -6
- package/dist/core/workspace/project-worker.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -176
- package/dist/index.js.map +1 -1
- package/dist/mcp/rulebook-server.d.ts.map +1 -1
- package/dist/mcp/rulebook-server.js +16 -960
- package/dist/mcp/rulebook-server.js.map +1 -1
- package/dist/memory/file-search.d.ts +43 -0
- package/dist/memory/file-search.d.ts.map +1 -0
- package/dist/memory/file-search.js +228 -0
- package/dist/memory/file-search.js.map +1 -0
- package/dist/memory/file-store.d.ts +99 -0
- package/dist/memory/file-store.d.ts.map +1 -0
- package/dist/memory/file-store.js +615 -0
- package/dist/memory/file-store.js.map +1 -0
- package/dist/memory/legacy-migrator.d.ts +27 -0
- package/dist/memory/legacy-migrator.d.ts.map +1 -0
- package/dist/memory/legacy-migrator.js +185 -0
- package/dist/memory/legacy-migrator.js.map +1 -0
- package/dist/memory/memory-manager.d.ts +25 -24
- package/dist/memory/memory-manager.d.ts.map +1 -1
- package/dist/memory/memory-manager.js +97 -140
- package/dist/memory/memory-manager.js.map +1 -1
- package/dist/memory/memory-types.d.ts +1 -1
- package/dist/memory/memory-types.d.ts.map +1 -1
- package/dist/types.d.ts +8 -119
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -6
- package/templates/agents/context-intelligence.md +50 -52
- package/templates/cli/OPENCODE.md +85 -18
- package/templates/commands/rulebook-learn-capture.md +41 -48
- package/templates/commands/rulebook-learn-list.md +13 -13
- package/templates/core/AGENTS_LEAN.md +0 -14
- package/templates/hooks/check-context-and-handoff.sh +8 -10
- package/templates/hooks/enforce-pre-tool.sh +70 -0
- package/templates/hooks/terse-mode-tracker.sh +146 -143
- package/templates/ides/OPENCODE.md +63 -0
- package/templates/skills/cli/opencode/SKILL.md +82 -28
- package/.claude/commands/ralph-config.md +0 -112
- package/.claude/commands/ralph-history.md +0 -110
- package/.claude/commands/ralph-init.md +0 -72
- package/.claude/commands/ralph-pause-resume.md +0 -105
- package/.claude/commands/ralph-run.md +0 -101
- package/.claude/commands/ralph-status.md +0 -76
- package/templates/core/RALPH.md +0 -471
- package/templates/frameworks/ANGULAR.md +0 -36
- package/templates/frameworks/DJANGO.md +0 -83
- package/templates/frameworks/ELECTRON.md +0 -147
- package/templates/frameworks/FLASK.md +0 -38
- package/templates/frameworks/FLUTTER.md +0 -55
- package/templates/frameworks/JQUERY.md +0 -32
- package/templates/frameworks/LARAVEL.md +0 -38
- package/templates/frameworks/NESTJS.md +0 -43
- package/templates/frameworks/NEXTJS.md +0 -127
- package/templates/frameworks/NUXT.md +0 -40
- package/templates/frameworks/RAILS.md +0 -66
- package/templates/frameworks/REACT.md +0 -38
- package/templates/frameworks/REACT_NATIVE.md +0 -47
- package/templates/frameworks/SPRING.md +0 -39
- package/templates/frameworks/SYMFONY.md +0 -36
- package/templates/frameworks/VUE.md +0 -36
- package/templates/frameworks/ZEND.md +0 -35
- package/templates/hooks/enforce-mcp-for-tasks.sh +0 -31
- package/templates/hooks/enforce-no-deferred.sh +0 -21
- package/templates/hooks/enforce-no-shortcuts.sh +0 -31
- package/templates/ides/COPILOT.md +0 -37
- package/templates/ides/CURSOR.md +0 -43
- package/templates/ides/JETBRAINS_AI.md +0 -35
- package/templates/ides/REPLIT.md +0 -36
- package/templates/ides/TABNINE.md +0 -29
- package/templates/ides/VSCODE.md +0 -40
- package/templates/ides/WINDSURF.md +0 -36
- package/templates/ides/ZED.md +0 -32
- package/templates/ides/cursor-mdc/go.mdc +0 -24
- package/templates/ides/cursor-mdc/python.mdc +0 -24
- package/templates/ides/cursor-mdc/quality.mdc +0 -25
- package/templates/ides/cursor-mdc/ralph.mdc +0 -39
- package/templates/ides/cursor-mdc/rulebook.mdc +0 -38
- package/templates/ides/cursor-mdc/rust.mdc +0 -24
- package/templates/ides/cursor-mdc/typescript.mdc +0 -25
- package/templates/ralph/ralph-history.bat +0 -4
- package/templates/ralph/ralph-history.sh +0 -5
- package/templates/ralph/ralph-init.bat +0 -5
- package/templates/ralph/ralph-init.sh +0 -5
- package/templates/ralph/ralph-pause.bat +0 -5
- package/templates/ralph/ralph-pause.sh +0 -5
- package/templates/ralph/ralph-run.bat +0 -5
- package/templates/ralph/ralph-run.sh +0 -5
- package/templates/ralph/ralph-status.bat +0 -4
- package/templates/ralph/ralph-status.sh +0 -5
- package/templates/services/AZURE_BLOB.md +0 -184
- package/templates/services/CASSANDRA.md +0 -239
- package/templates/services/DATADOG.md +0 -26
- package/templates/services/DOCKER.md +0 -124
- package/templates/services/DOCKER_COMPOSE.md +0 -168
- package/templates/services/DYNAMODB.md +0 -308
- package/templates/services/ELASTICSEARCH.md +0 -347
- package/templates/services/GCS.md +0 -178
- package/templates/services/HELM.md +0 -194
- package/templates/services/INFLUXDB.md +0 -265
- package/templates/services/KAFKA.md +0 -341
- package/templates/services/KUBERNETES.md +0 -208
- package/templates/services/MARIADB.md +0 -183
- package/templates/services/MEMCACHED.md +0 -242
- package/templates/services/MINIO.md +0 -201
- package/templates/services/MONGODB.md +0 -268
- package/templates/services/MYSQL.md +0 -358
- package/templates/services/NEO4J.md +0 -247
- package/templates/services/OPENTELEMETRY.md +0 -25
- package/templates/services/ORACLE.md +0 -290
- package/templates/services/PINO.md +0 -24
- package/templates/services/POSTGRESQL.md +0 -326
- package/templates/services/PROMETHEUS.md +0 -33
- package/templates/services/RABBITMQ.md +0 -286
- package/templates/services/REDIS.md +0 -292
- package/templates/services/S3.md +0 -298
- package/templates/services/SENTRY.md +0 -23
- package/templates/services/SQLITE.md +0 -294
- package/templates/services/SQLSERVER.md +0 -294
- package/templates/services/WINSTON.md +0 -30
- package/templates/skills/frameworks/angular/SKILL.md +0 -46
- package/templates/skills/frameworks/django/SKILL.md +0 -93
- package/templates/skills/frameworks/electron/SKILL.md +0 -157
- package/templates/skills/frameworks/flask/SKILL.md +0 -48
- package/templates/skills/frameworks/flutter/SKILL.md +0 -65
- package/templates/skills/frameworks/jquery/SKILL.md +0 -42
- package/templates/skills/frameworks/laravel/SKILL.md +0 -48
- package/templates/skills/frameworks/nestjs/SKILL.md +0 -53
- package/templates/skills/frameworks/nextjs/SKILL.md +0 -137
- package/templates/skills/frameworks/nuxt/SKILL.md +0 -50
- package/templates/skills/frameworks/rails/SKILL.md +0 -76
- package/templates/skills/frameworks/react/SKILL.md +0 -48
- package/templates/skills/frameworks/react-native/SKILL.md +0 -57
- package/templates/skills/frameworks/spring/SKILL.md +0 -49
- package/templates/skills/frameworks/symfony/SKILL.md +0 -46
- package/templates/skills/frameworks/vue/SKILL.md +0 -46
- package/templates/skills/frameworks/zend/SKILL.md +0 -45
- package/templates/skills/services/azure-blob/SKILL.md +0 -194
- package/templates/skills/services/cassandra/SKILL.md +0 -249
- package/templates/skills/services/dynamodb/SKILL.md +0 -318
- package/templates/skills/services/elasticsearch/SKILL.md +0 -357
- package/templates/skills/services/gcs/SKILL.md +0 -188
- package/templates/skills/services/influxdb/SKILL.md +0 -275
- package/templates/skills/services/kafka/SKILL.md +0 -351
- package/templates/skills/services/mariadb/SKILL.md +0 -193
- package/templates/skills/services/memcached/SKILL.md +0 -252
- package/templates/skills/services/minio/SKILL.md +0 -211
- package/templates/skills/services/mongodb/SKILL.md +0 -278
- package/templates/skills/services/mysql/SKILL.md +0 -368
- package/templates/skills/services/neo4j/SKILL.md +0 -257
- package/templates/skills/services/oracle/SKILL.md +0 -300
- package/templates/skills/services/postgresql/SKILL.md +0 -336
- package/templates/skills/services/rabbitmq/SKILL.md +0 -296
- package/templates/skills/services/redis/SKILL.md +0 -302
- package/templates/skills/services/s3/SKILL.md +0 -308
- package/templates/skills/services/sqlite/SKILL.md +0 -304
- package/templates/skills/services/sqlserver/SKILL.md +0 -304
- package/templates/skills/workflows/ralph/SETUP.md +0 -228
- package/templates/skills/workflows/ralph/SKILL.md +0 -309
- package/templates/skills/workflows/ralph/install.sh +0 -87
- package/templates/skills/workflows/ralph/manifest.json +0 -158
|
@@ -0,0 +1,450 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode Integration Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates the OpenCode-specific surface area for a Rulebook-managed project:
|
|
5
|
+
* - opencode.json with $schema, mcp.rulebook, and instructions
|
|
6
|
+
* - .opencode/commands/<name>.md mirroring user-invocable Rulebook slash commands
|
|
7
|
+
* - .opencode/agents/<role>.md mirroring Rulebook role agents
|
|
8
|
+
* - .opencode/skills/<name>/SKILL.md normalized to OpenCode's frontmatter schema
|
|
9
|
+
* - .opencode/.rulebook-managed.json listing managed keys for safe future updates
|
|
10
|
+
*
|
|
11
|
+
* Idempotency: every generator preserves user-owned files. A managed file is
|
|
12
|
+
* identified by either the `<!-- RULEBOOK:START -->` marker (markdown) or by
|
|
13
|
+
* the `_rulebook_managed: true` JSON key (managed-keys file).
|
|
14
|
+
*/
|
|
15
|
+
import path, { dirname } from 'path';
|
|
16
|
+
import { existsSync } from 'fs';
|
|
17
|
+
import { readdir, readFile, writeFile, mkdir, rm, stat } from 'fs/promises';
|
|
18
|
+
import { fileURLToPath } from 'url';
|
|
19
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
20
|
+
const __dirname = dirname(__filename);
|
|
21
|
+
const RULEBOOK_MARKER = '<!-- RULEBOOK:START -->';
|
|
22
|
+
const RULEBOOK_END_MARKER = '<!-- RULEBOOK:END -->';
|
|
23
|
+
const MANAGED_KEYS_FILE = '.rulebook-managed.json';
|
|
24
|
+
const SCHEMA_URL = 'https://opencode.ai/config.json';
|
|
25
|
+
const MANAGED_TOP_LEVEL_KEYS = ['$schema', 'instructions'];
|
|
26
|
+
const MANAGED_MCP_KEY = 'rulebook';
|
|
27
|
+
const MODEL_TIER_MAP = {
|
|
28
|
+
haiku: 'anthropic/claude-haiku-4-5',
|
|
29
|
+
sonnet: 'anthropic/claude-sonnet-4-6',
|
|
30
|
+
opus: 'anthropic/claude-opus-4-7',
|
|
31
|
+
};
|
|
32
|
+
const READ_ONLY_AGENTS = new Set([
|
|
33
|
+
'researcher',
|
|
34
|
+
'code-reviewer',
|
|
35
|
+
'security-reviewer',
|
|
36
|
+
'accessibility-reviewer',
|
|
37
|
+
'ux-reviewer',
|
|
38
|
+
'performance-engineer',
|
|
39
|
+
]);
|
|
40
|
+
/**
|
|
41
|
+
* Find the templates/ root directory (relative to dist/ at runtime).
|
|
42
|
+
*/
|
|
43
|
+
function getTemplatesDir() {
|
|
44
|
+
return path.join(__dirname, '..', '..', '..', 'templates');
|
|
45
|
+
}
|
|
46
|
+
async function readJson(p) {
|
|
47
|
+
if (!existsSync(p))
|
|
48
|
+
return null;
|
|
49
|
+
try {
|
|
50
|
+
return JSON.parse(await readFile(p, 'utf-8'));
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async function writeJson(p, data) {
|
|
57
|
+
const dir = path.dirname(p);
|
|
58
|
+
if (!existsSync(dir))
|
|
59
|
+
await mkdir(dir, { recursive: true });
|
|
60
|
+
await writeFile(p, JSON.stringify(data, null, 2) + '\n', 'utf-8');
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Discover rule files that should be appended to the OpenCode `instructions`
|
|
64
|
+
* array. These are lazy-loaded by OpenCode when the model is consulted.
|
|
65
|
+
*/
|
|
66
|
+
async function discoverInstructionPaths(projectRoot) {
|
|
67
|
+
const instructions = [];
|
|
68
|
+
for (const candidate of ['AGENTS.md', 'AGENTS.override.md', 'CLAUDE.md']) {
|
|
69
|
+
if (existsSync(path.join(projectRoot, candidate))) {
|
|
70
|
+
instructions.push(candidate);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const specsDir = path.join(projectRoot, '.rulebook', 'specs');
|
|
74
|
+
if (existsSync(specsDir)) {
|
|
75
|
+
try {
|
|
76
|
+
const files = await readdir(specsDir);
|
|
77
|
+
for (const file of files.sort()) {
|
|
78
|
+
if (file.endsWith('.md')) {
|
|
79
|
+
instructions.push(`.rulebook/specs/${file}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// ignore
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return instructions;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Build the rulebook MCP server entry for opencode.json. Mirrors `.mcp.json`
|
|
91
|
+
* if it declares a `rulebook` server; otherwise falls back to the published
|
|
92
|
+
* npm command. The fallback uses `npx -y @hivellm/rulebook-mcp` per the
|
|
93
|
+
* proposal — if that package name has not been published yet, projects can
|
|
94
|
+
* override the entry by editing opencode.json directly.
|
|
95
|
+
*/
|
|
96
|
+
async function buildMcpRulebookEntry(projectRoot) {
|
|
97
|
+
const mcpJsonPath = path.join(projectRoot, '.mcp.json');
|
|
98
|
+
const existing = await readJson(mcpJsonPath);
|
|
99
|
+
const declared = existing?.mcpServers?.rulebook;
|
|
100
|
+
if (declared && declared.command) {
|
|
101
|
+
const cmd = [declared.command, ...(declared.args ?? [])];
|
|
102
|
+
const entry = {
|
|
103
|
+
type: 'local',
|
|
104
|
+
command: cmd,
|
|
105
|
+
enabled: true,
|
|
106
|
+
};
|
|
107
|
+
if (declared.env && Object.keys(declared.env).length > 0) {
|
|
108
|
+
entry.environment = declared.env;
|
|
109
|
+
}
|
|
110
|
+
return entry;
|
|
111
|
+
}
|
|
112
|
+
// Fallback: published name is `@hivehub/rulebook` with `mcp-server` subcommand
|
|
113
|
+
// (mirrors src/core/claude/claude-mcp.ts). The legacy `@hivellm/rulebook-mcp`
|
|
114
|
+
// name in the original proposal is not published — using the real one.
|
|
115
|
+
return {
|
|
116
|
+
type: 'local',
|
|
117
|
+
command: ['npx', '-y', '@hivehub/rulebook@latest', 'mcp-server'],
|
|
118
|
+
enabled: true,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Generate or update opencode.json with $schema, mcp.rulebook, and
|
|
123
|
+
* instructions. Preserves all unrelated user keys. Writes a sibling
|
|
124
|
+
* .opencode/.rulebook-managed.json listing the managed keys so future runs
|
|
125
|
+
* know what may be safely refreshed.
|
|
126
|
+
*/
|
|
127
|
+
export async function generateOpencodeConfig(projectRoot, _detection) {
|
|
128
|
+
const jsoncPath = path.join(projectRoot, 'opencode.jsonc');
|
|
129
|
+
const jsonPath = path.join(projectRoot, 'opencode.json');
|
|
130
|
+
const configPath = existsSync(jsoncPath) ? jsoncPath : jsonPath;
|
|
131
|
+
const existing = (await readJson(configPath)) ?? {};
|
|
132
|
+
existing.$schema = SCHEMA_URL;
|
|
133
|
+
const mcpEntry = await buildMcpRulebookEntry(projectRoot);
|
|
134
|
+
existing.mcp = { ...(existing.mcp ?? {}) };
|
|
135
|
+
existing.mcp[MANAGED_MCP_KEY] = mcpEntry;
|
|
136
|
+
const newInstructions = await discoverInstructionPaths(projectRoot);
|
|
137
|
+
const existingInstructions = Array.isArray(existing.instructions)
|
|
138
|
+
? existing.instructions
|
|
139
|
+
: [];
|
|
140
|
+
const seen = new Set();
|
|
141
|
+
const merged = [];
|
|
142
|
+
for (const entry of [...existingInstructions, ...newInstructions]) {
|
|
143
|
+
if (typeof entry !== 'string')
|
|
144
|
+
continue;
|
|
145
|
+
if (seen.has(entry))
|
|
146
|
+
continue;
|
|
147
|
+
seen.add(entry);
|
|
148
|
+
merged.push(entry);
|
|
149
|
+
}
|
|
150
|
+
existing.instructions = merged;
|
|
151
|
+
await writeJson(configPath, existing);
|
|
152
|
+
const managedKeys = {
|
|
153
|
+
_rulebook_managed: true,
|
|
154
|
+
version: 1,
|
|
155
|
+
topLevel: [...MANAGED_TOP_LEVEL_KEYS],
|
|
156
|
+
mcpServers: [MANAGED_MCP_KEY],
|
|
157
|
+
instructions: newInstructions,
|
|
158
|
+
};
|
|
159
|
+
const managedKeysPath = path.join(projectRoot, '.opencode', MANAGED_KEYS_FILE);
|
|
160
|
+
await writeJson(managedKeysPath, managedKeys);
|
|
161
|
+
return { configPath, managedKeysPath };
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Write a markdown file idempotently: only overwrite when the existing file
|
|
165
|
+
* already carries the rulebook marker.
|
|
166
|
+
*
|
|
167
|
+
* @returns 'written' | 'preserved'
|
|
168
|
+
*/
|
|
169
|
+
async function writeManagedMarkdown(destPath, body) {
|
|
170
|
+
const content = body.includes(RULEBOOK_MARKER)
|
|
171
|
+
? body
|
|
172
|
+
: `${RULEBOOK_MARKER}\n${body.trimEnd()}\n${RULEBOOK_END_MARKER}\n`;
|
|
173
|
+
if (existsSync(destPath)) {
|
|
174
|
+
const existing = await readFile(destPath, 'utf-8');
|
|
175
|
+
if (!existing.includes(RULEBOOK_MARKER)) {
|
|
176
|
+
return 'preserved';
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
const parent = path.dirname(destPath);
|
|
180
|
+
if (!existsSync(parent))
|
|
181
|
+
await mkdir(parent, { recursive: true });
|
|
182
|
+
await writeFile(destPath, content, 'utf-8');
|
|
183
|
+
return 'written';
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Parse YAML-ish frontmatter at the top of a markdown file. The parser is
|
|
187
|
+
* deliberately minimal: it handles the simple `key: value` and `key: [a, b]`
|
|
188
|
+
* forms used by Rulebook templates, not arbitrary YAML.
|
|
189
|
+
*/
|
|
190
|
+
function parseFrontmatter(text) {
|
|
191
|
+
// Normalize line endings so CRLF-formatted templates (Windows) parse
|
|
192
|
+
// identically to LF.
|
|
193
|
+
const norm = text.replace(/\r\n/g, '\n');
|
|
194
|
+
if (!norm.startsWith('---\n')) {
|
|
195
|
+
return { meta: {}, body: norm };
|
|
196
|
+
}
|
|
197
|
+
const end = norm.indexOf('\n---', 4);
|
|
198
|
+
if (end < 0) {
|
|
199
|
+
return { meta: {}, body: norm };
|
|
200
|
+
}
|
|
201
|
+
const block = norm.slice(4, end);
|
|
202
|
+
const body = norm.slice(end + 4).replace(/^\n/, '');
|
|
203
|
+
const meta = {};
|
|
204
|
+
for (const rawLine of block.split('\n')) {
|
|
205
|
+
const line = rawLine.trim();
|
|
206
|
+
if (!line || line.startsWith('#'))
|
|
207
|
+
continue;
|
|
208
|
+
const idx = line.indexOf(':');
|
|
209
|
+
if (idx < 0)
|
|
210
|
+
continue;
|
|
211
|
+
const key = line.slice(0, idx).trim();
|
|
212
|
+
let value = line.slice(idx + 1).trim();
|
|
213
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
214
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
215
|
+
value = value.slice(1, -1);
|
|
216
|
+
}
|
|
217
|
+
meta[key] = value;
|
|
218
|
+
}
|
|
219
|
+
return { meta, body };
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Serialize a small key/value object back into YAML frontmatter.
|
|
223
|
+
*/
|
|
224
|
+
function serializeFrontmatter(meta) {
|
|
225
|
+
const lines = ['---'];
|
|
226
|
+
for (const [k, v] of Object.entries(meta)) {
|
|
227
|
+
if (Array.isArray(v)) {
|
|
228
|
+
lines.push(`${k}: [${v.map((x) => `"${String(x).replace(/"/g, '\\"')}"`).join(', ')}]`);
|
|
229
|
+
}
|
|
230
|
+
else if (typeof v === 'object' && v !== null) {
|
|
231
|
+
lines.push(`${k}:`);
|
|
232
|
+
for (const [k2, v2] of Object.entries(v)) {
|
|
233
|
+
lines.push(` ${k2}: ${typeof v2 === 'string' ? `"${v2}"` : String(v2)}`);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
else if (typeof v === 'string' && (v.includes(':') || v.includes('#'))) {
|
|
237
|
+
lines.push(`${k}: "${v.replace(/"/g, '\\"')}"`);
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
lines.push(`${k}: ${v}`);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
lines.push('---');
|
|
244
|
+
return lines.join('\n') + '\n';
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Generate .opencode/commands/<name>.md from each user-invocable Rulebook
|
|
248
|
+
* slash-command template under templates/commands/.
|
|
249
|
+
*/
|
|
250
|
+
export async function generateOpencodeCommands(projectRoot) {
|
|
251
|
+
const sourceDir = path.join(getTemplatesDir(), 'commands');
|
|
252
|
+
const targetDir = path.join(projectRoot, '.opencode', 'commands');
|
|
253
|
+
const written = [];
|
|
254
|
+
const preserved = [];
|
|
255
|
+
if (!existsSync(sourceDir)) {
|
|
256
|
+
return { written, preserved };
|
|
257
|
+
}
|
|
258
|
+
await mkdir(targetDir, { recursive: true });
|
|
259
|
+
const entries = await readdir(sourceDir);
|
|
260
|
+
for (const entry of entries) {
|
|
261
|
+
if (!entry.endsWith('.md'))
|
|
262
|
+
continue;
|
|
263
|
+
const sourcePath = path.join(sourceDir, entry);
|
|
264
|
+
const targetPath = path.join(targetDir, entry);
|
|
265
|
+
const raw = await readFile(sourcePath, 'utf-8');
|
|
266
|
+
const { meta, body } = parseFrontmatter(raw);
|
|
267
|
+
const description = (meta.description || meta.id || entry.replace(/\.md$/, '')).slice(0, 1024);
|
|
268
|
+
const opencodeFm = serializeFrontmatter({
|
|
269
|
+
description,
|
|
270
|
+
});
|
|
271
|
+
const newBody = `${opencodeFm}${RULEBOOK_MARKER}\n${body.trimEnd()}\n${RULEBOOK_END_MARKER}\n`;
|
|
272
|
+
const result = await writeManagedMarkdown(targetPath, newBody);
|
|
273
|
+
if (result === 'written')
|
|
274
|
+
written.push(targetPath);
|
|
275
|
+
else
|
|
276
|
+
preserved.push(targetPath);
|
|
277
|
+
}
|
|
278
|
+
return { written, preserved };
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Translate a Rulebook role-agent definition to the OpenCode agent schema.
|
|
282
|
+
*/
|
|
283
|
+
function buildOpencodeAgentBody(meta, body, name) {
|
|
284
|
+
const description = (meta.description || `${name} role agent`).slice(0, 1024);
|
|
285
|
+
const tier = (meta.model || 'sonnet').toLowerCase();
|
|
286
|
+
const model = MODEL_TIER_MAP[tier] || MODEL_TIER_MAP.sonnet;
|
|
287
|
+
const isReadOnly = READ_ONLY_AGENTS.has(name);
|
|
288
|
+
const mode = name === 'team-lead' ? 'primary' : 'subagent';
|
|
289
|
+
const fm = [
|
|
290
|
+
'---',
|
|
291
|
+
`description: "${description.replace(/"/g, '\\"')}"`,
|
|
292
|
+
`mode: ${mode}`,
|
|
293
|
+
`model: ${model}`,
|
|
294
|
+
'permission:',
|
|
295
|
+
` edit: ${isReadOnly ? 'deny' : 'allow'}`,
|
|
296
|
+
` bash: ${isReadOnly ? 'ask' : 'allow'}`,
|
|
297
|
+
' webfetch: allow',
|
|
298
|
+
'---',
|
|
299
|
+
'',
|
|
300
|
+
].join('\n');
|
|
301
|
+
return `${fm}${RULEBOOK_MARKER}\n${body.trimEnd()}\n${RULEBOOK_END_MARKER}\n`;
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Generate .opencode/agents/<role>.md from each Rulebook role agent.
|
|
305
|
+
* Sources are templates/agents/<role>.md; we emit one OpenCode agent per
|
|
306
|
+
* source role.
|
|
307
|
+
*/
|
|
308
|
+
export async function generateOpencodeAgents(projectRoot) {
|
|
309
|
+
const sourceDir = path.join(getTemplatesDir(), 'agents');
|
|
310
|
+
const targetDir = path.join(projectRoot, '.opencode', 'agents');
|
|
311
|
+
const written = [];
|
|
312
|
+
const preserved = [];
|
|
313
|
+
if (!existsSync(sourceDir)) {
|
|
314
|
+
return { written, preserved };
|
|
315
|
+
}
|
|
316
|
+
await mkdir(targetDir, { recursive: true });
|
|
317
|
+
const entries = await readdir(sourceDir);
|
|
318
|
+
for (const entry of entries) {
|
|
319
|
+
if (!entry.endsWith('.md'))
|
|
320
|
+
continue;
|
|
321
|
+
const name = entry.replace(/\.md$/, '');
|
|
322
|
+
const sourcePath = path.join(sourceDir, entry);
|
|
323
|
+
const sourceStat = await stat(sourcePath);
|
|
324
|
+
if (!sourceStat.isFile())
|
|
325
|
+
continue;
|
|
326
|
+
const raw = await readFile(sourcePath, 'utf-8');
|
|
327
|
+
const { meta, body } = parseFrontmatter(raw);
|
|
328
|
+
const newContent = buildOpencodeAgentBody(meta, body, name);
|
|
329
|
+
const targetPath = path.join(targetDir, entry);
|
|
330
|
+
const result = await writeManagedMarkdown(targetPath, newContent);
|
|
331
|
+
if (result === 'written')
|
|
332
|
+
written.push(targetPath);
|
|
333
|
+
else
|
|
334
|
+
preserved.push(targetPath);
|
|
335
|
+
}
|
|
336
|
+
return { written, preserved };
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Normalize a skill name to OpenCode's regex `[a-z0-9](-[a-z0-9])*` with a
|
|
340
|
+
* 64-char limit. Sequences of non-alphanumerics collapse into single hyphens
|
|
341
|
+
* and any leading/trailing hyphens are stripped.
|
|
342
|
+
*/
|
|
343
|
+
export function normalizeOpencodeSkillName(raw) {
|
|
344
|
+
const lower = raw.toLowerCase();
|
|
345
|
+
const collapsed = lower.replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
|
|
346
|
+
const truncated = collapsed.slice(0, 64).replace(/-+$/g, '');
|
|
347
|
+
return truncated || 'skill';
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Bound description to OpenCode's [1, 1024]-char range.
|
|
351
|
+
*/
|
|
352
|
+
function clampDescription(raw, fallback) {
|
|
353
|
+
const text = (raw && raw.trim()) || fallback;
|
|
354
|
+
if (text.length <= 1024)
|
|
355
|
+
return text;
|
|
356
|
+
return text.slice(0, 1021).trimEnd() + '...';
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Generate .opencode/skills/<normalized-name>/SKILL.md for every dev skill
|
|
360
|
+
* under templates/skills/dev/. Throws on a name collision so two source
|
|
361
|
+
* skills never silently overwrite each other.
|
|
362
|
+
*/
|
|
363
|
+
export async function generateOpencodeSkills(projectRoot) {
|
|
364
|
+
const sourceDir = path.join(getTemplatesDir(), 'skills', 'dev');
|
|
365
|
+
const targetDir = path.join(projectRoot, '.opencode', 'skills');
|
|
366
|
+
const written = [];
|
|
367
|
+
const preserved = [];
|
|
368
|
+
const orphaned = [];
|
|
369
|
+
if (!existsSync(sourceDir)) {
|
|
370
|
+
return { written, preserved, orphaned };
|
|
371
|
+
}
|
|
372
|
+
await mkdir(targetDir, { recursive: true });
|
|
373
|
+
const entries = await readdir(sourceDir, { withFileTypes: true });
|
|
374
|
+
const collisions = new Map();
|
|
375
|
+
const sourceNames = new Set();
|
|
376
|
+
for (const entry of entries) {
|
|
377
|
+
if (!entry.isDirectory())
|
|
378
|
+
continue;
|
|
379
|
+
const skillFile = path.join(sourceDir, entry.name, 'SKILL.md');
|
|
380
|
+
if (!existsSync(skillFile))
|
|
381
|
+
continue;
|
|
382
|
+
const raw = await readFile(skillFile, 'utf-8');
|
|
383
|
+
const { meta, body } = parseFrontmatter(raw);
|
|
384
|
+
const sourceName = meta.name || entry.name;
|
|
385
|
+
const normalized = normalizeOpencodeSkillName(sourceName);
|
|
386
|
+
if (!collisions.has(normalized))
|
|
387
|
+
collisions.set(normalized, []);
|
|
388
|
+
collisions.get(normalized).push(entry.name);
|
|
389
|
+
if (collisions.get(normalized).length > 1) {
|
|
390
|
+
throw new Error(`OpenCode skill name collision: source skills [${collisions
|
|
391
|
+
.get(normalized)
|
|
392
|
+
.join(', ')}] all normalize to "${normalized}"`);
|
|
393
|
+
}
|
|
394
|
+
sourceNames.add(normalized);
|
|
395
|
+
const description = clampDescription(meta.description, `${normalized} skill`);
|
|
396
|
+
const fm = serializeFrontmatter({ name: normalized, description });
|
|
397
|
+
const newBody = `${fm}${RULEBOOK_MARKER}\n${body.trimEnd()}\n${RULEBOOK_END_MARKER}\n`;
|
|
398
|
+
const targetPath = path.join(targetDir, normalized, 'SKILL.md');
|
|
399
|
+
const result = await writeManagedMarkdown(targetPath, newBody);
|
|
400
|
+
if (result === 'written')
|
|
401
|
+
written.push(targetPath);
|
|
402
|
+
else
|
|
403
|
+
preserved.push(targetPath);
|
|
404
|
+
}
|
|
405
|
+
// Cleanup: remove managed skill dirs whose source no longer exists.
|
|
406
|
+
if (existsSync(targetDir)) {
|
|
407
|
+
const existing = await readdir(targetDir, { withFileTypes: true });
|
|
408
|
+
for (const dirent of existing) {
|
|
409
|
+
if (!dirent.isDirectory())
|
|
410
|
+
continue;
|
|
411
|
+
if (sourceNames.has(dirent.name))
|
|
412
|
+
continue;
|
|
413
|
+
const skillPath = path.join(targetDir, dirent.name, 'SKILL.md');
|
|
414
|
+
if (!existsSync(skillPath))
|
|
415
|
+
continue;
|
|
416
|
+
const content = await readFile(skillPath, 'utf-8');
|
|
417
|
+
if (!content.includes(RULEBOOK_MARKER))
|
|
418
|
+
continue;
|
|
419
|
+
await rm(path.join(targetDir, dirent.name), { recursive: true, force: true });
|
|
420
|
+
orphaned.push(path.join(targetDir, dirent.name));
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
return { written, preserved, orphaned };
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Run all four OpenCode generators in sequence and aggregate the results.
|
|
427
|
+
* This is the entry point used by `init` and `update`.
|
|
428
|
+
*/
|
|
429
|
+
export async function generateOpencodeIntegration(projectRoot, detection) {
|
|
430
|
+
const result = {
|
|
431
|
+
commands: [],
|
|
432
|
+
agents: [],
|
|
433
|
+
skills: [],
|
|
434
|
+
preserved: [],
|
|
435
|
+
};
|
|
436
|
+
const cfg = await generateOpencodeConfig(projectRoot, detection);
|
|
437
|
+
result.configPath = cfg.configPath;
|
|
438
|
+
result.managedKeysPath = cfg.managedKeysPath;
|
|
439
|
+
const cmds = await generateOpencodeCommands(projectRoot);
|
|
440
|
+
result.commands = cmds.written;
|
|
441
|
+
result.preserved.push(...cmds.preserved);
|
|
442
|
+
const agents = await generateOpencodeAgents(projectRoot);
|
|
443
|
+
result.agents = agents.written;
|
|
444
|
+
result.preserved.push(...agents.preserved);
|
|
445
|
+
const skills = await generateOpencodeSkills(projectRoot);
|
|
446
|
+
result.skills = skills.written;
|
|
447
|
+
result.preserved.push(...skills.preserved);
|
|
448
|
+
return result;
|
|
449
|
+
}
|
|
450
|
+
//# sourceMappingURL=opencode-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-generator.js","sourceRoot":"","sources":["../../../src/core/ide/opencode-generator.ts"],"names":[],"mappings":"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"}
|
package/dist/core/merger.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ExistingAgentsInfo, ProjectConfig } from '../types.js';
|
|
2
|
-
import { CLAUDE_MD_SENTINEL_END } from './claude-md-generator.js';
|
|
2
|
+
import { CLAUDE_MD_SENTINEL_END } from './claude/claude-md-generator.js';
|
|
3
3
|
export declare function mergeAgents(existing: ExistingAgentsInfo, config: ProjectConfig): Promise<string>;
|
|
4
4
|
export declare function mergeLanguageRules(existing: ExistingAgentsInfo, language: string): Promise<string>;
|
|
5
5
|
export declare function mergeModuleRules(existing: ExistingAgentsInfo, module: string): Promise<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merger.d.ts","sourceRoot":"","sources":["../../src/core/merger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAc,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"merger.d.ts","sourceRoot":"","sources":["../../src/core/merger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAc,MAAM,aAAa,CAAC;AAWjF,OAAO,EAKL,sBAAsB,EACvB,MAAM,iCAAiC,CAAC;AAIzC,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,kBAAkB,EAC5B,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,MAAM,CAAC,CAgBjB;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,kBAAkB,EAC5B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAgBjB;AAED,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,kBAAkB,EAC5B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAgBjB;AAED,wBAAsB,eAAe,CACnC,QAAQ,EAAE,kBAAkB,EAC5B,MAAM,EAAE,aAAa,EACrB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,CAgEjB;AAED,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAEjE,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,EAAE,iBAAiB,CAAC;IACxB;;;OAGG;IACH,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAkCrF;AA0ED,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
|
package/dist/core/merger.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { generateAgentsContent, generateLanguageRules, generateModuleRules } from './generator.js';
|
|
1
|
+
import { generateAgentsContent, generateLanguageRules, generateModuleRules, } from './generators/generator.js';
|
|
2
2
|
import { hasEmbeddedTemplates, migrateEmbeddedTemplates, replaceEmbeddedWithReferences, } from './migrator.js';
|
|
3
|
-
import { generateClaudeMd, getClaudeMdPath, hasV2Sentinels, writeClaudeMd, CLAUDE_MD_SENTINEL_END, } from './claude-md-generator.js';
|
|
3
|
+
import { generateClaudeMd, getClaudeMdPath, hasV2Sentinels, writeClaudeMd, CLAUDE_MD_SENTINEL_END, } from './claude/claude-md-generator.js';
|
|
4
4
|
import { fileExists, readFile, writeFile } from '../utils/file-system.js';
|
|
5
|
-
import { getOverridePath, initOverride } from './override-manager.js';
|
|
5
|
+
import { getOverridePath, initOverride } from './state/override-manager.js';
|
|
6
6
|
export async function mergeAgents(existing, config) {
|
|
7
7
|
const lines = existing.content.split('\n');
|
|
8
8
|
const rulebookBlock = existing.blocks.find((b) => b.name === 'RULEBOOK');
|
|
@@ -54,7 +54,7 @@ export async function mergeModuleRules(existing, module) {
|
|
|
54
54
|
export async function mergeFullAgents(existing, config, projectRoot) {
|
|
55
55
|
// Always use lean template — the procedural 6k-line output is deprecated.
|
|
56
56
|
if (projectRoot) {
|
|
57
|
-
const { generateLeanAgents } = await import('./generator.js');
|
|
57
|
+
const { generateLeanAgents } = await import('./generators/generator.js');
|
|
58
58
|
return await generateLeanAgents(config, projectRoot);
|
|
59
59
|
}
|
|
60
60
|
// Check if we need to migrate from embedded to modular
|
|
@@ -79,7 +79,7 @@ export async function mergeFullAgents(existing, config, projectRoot) {
|
|
|
79
79
|
};
|
|
80
80
|
// If modular mode, use generateModularAgents instead of merging blocks
|
|
81
81
|
if (config.modular !== false && projectRoot) {
|
|
82
|
-
const { generateModularAgents } = await import('./generator.js');
|
|
82
|
+
const { generateModularAgents } = await import('./generators/generator.js');
|
|
83
83
|
return await generateModularAgents(config, projectRoot);
|
|
84
84
|
}
|
|
85
85
|
// Legacy: Merge language rules (embedded)
|
package/dist/core/merger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merger.js","sourceRoot":"","sources":["../../src/core/merger.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"merger.js","sourceRoot":"","sources":["../../src/core/merger.ts"],"names":[],"mappings":"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"}
|
package/dist/core/migrator.d.ts
CHANGED
|
@@ -9,7 +9,6 @@ export declare function hasEmbeddedTemplates(existing: ExistingAgentsInfo): bool
|
|
|
9
9
|
export declare function migrateEmbeddedTemplates(existing: ExistingAgentsInfo, config: ProjectConfig, projectRoot: string): Promise<{
|
|
10
10
|
extractedLanguages: string[];
|
|
11
11
|
extractedModules: string[];
|
|
12
|
-
extractedFrameworks: string[];
|
|
13
12
|
}>;
|
|
14
13
|
/**
|
|
15
14
|
* Replace embedded templates with references in AGENTS.md
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrator.d.ts","sourceRoot":"","sources":["../../src/core/migrator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"migrator.d.ts","sourceRoot":"","sources":["../../src/core/migrator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAQrE;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAc1E;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,kBAAkB,EAC5B,MAAM,EAAE,aAAa,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IACT,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B,CAAC,CAsDD;AAED;;;GAGG;AACH,wBAAsB,6BAA6B,CACjD,MAAM,EAAE,aAAa,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CAIjB;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,WAAW,GAAE,MAAoB,GAChC,OAAO,CAAC,OAAO,CAAC,CAuBlB;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,WAAW,GAAE,MAAoB,GAChC,OAAO,CAAC;IAAE,aAAa,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAsCtC"}
|
package/dist/core/migrator.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import path from 'path';
|
|
2
2
|
import { writeFile, ensureDir, fileExists, readFile } from '../utils/file-system.js';
|
|
3
|
-
import { generateLanguageRules, generateModuleRules,
|
|
3
|
+
import { generateLanguageRules, generateModuleRules, generateModularAgents, } from './generators/generator.js';
|
|
4
4
|
import fs from 'fs/promises';
|
|
5
5
|
/**
|
|
6
6
|
* Detect if AGENTS.md contains embedded templates (legacy mode)
|
|
@@ -12,11 +12,7 @@ export function hasEmbeddedTemplates(existing) {
|
|
|
12
12
|
const embeddedLanguagePattern = /<!--\s*(TYPESCRIPT|RUST|PYTHON|JAVASCRIPT|GO|JAVA|ELIXIR|CSHARP|PHP|SWIFT|KOTLIN|CPP|C|SOLIDITY|ZIG|ERLANG|DART|RUBY|SCALA|R|HASKELL|JULIA|LUA|ADA|SAS|LISP|OBJECTIVEC|SQL):START\s*-->/i;
|
|
13
13
|
// Check for embedded module blocks (e.g., <!-- VECTORIZER:START -->)
|
|
14
14
|
const embeddedModulePattern = /<!--\s*(VECTORIZER|SYNAP|CONTEXT7|GITHUB|PLAYWRIGHT|SUPABASE|NOTION|ATLASSIAN|SERENA|FIGMA|GRAFANA|AGENT_AUTOMATION):START\s*-->/i;
|
|
15
|
-
|
|
16
|
-
const embeddedFrameworkPattern = /<!--\s*(NESTJS|SPRING|LARAVEL|ANGULAR|REACT|VUE|NUXT|NEXTJS|DJANGO|RAILS|FLASK|SYMFONY|ZEND|JQUERY|REACTNATIVE|FLUTTER|ELECTRON):START\s*-->/i;
|
|
17
|
-
return (embeddedLanguagePattern.test(existing.content) ||
|
|
18
|
-
embeddedModulePattern.test(existing.content) ||
|
|
19
|
-
embeddedFrameworkPattern.test(existing.content));
|
|
15
|
+
return (embeddedLanguagePattern.test(existing.content) || embeddedModulePattern.test(existing.content));
|
|
20
16
|
}
|
|
21
17
|
/**
|
|
22
18
|
* Extract embedded template content and write to /rulebook/ directory
|
|
@@ -29,9 +25,8 @@ export async function migrateEmbeddedTemplates(existing, config, projectRoot) {
|
|
|
29
25
|
// This is intentional for migration - existing modular files take precedence
|
|
30
26
|
const extractedLanguages = [];
|
|
31
27
|
const extractedModules = [];
|
|
32
|
-
const extractedFrameworks = [];
|
|
33
28
|
if (!existing.content) {
|
|
34
|
-
return { extractedLanguages, extractedModules
|
|
29
|
+
return { extractedLanguages, extractedModules };
|
|
35
30
|
}
|
|
36
31
|
// Extract language blocks
|
|
37
32
|
for (const language of config.languages) {
|
|
@@ -69,27 +64,7 @@ export async function migrateEmbeddedTemplates(existing, config, projectRoot) {
|
|
|
69
64
|
extractedModules.push(module);
|
|
70
65
|
}
|
|
71
66
|
}
|
|
72
|
-
|
|
73
|
-
if (config.frameworks) {
|
|
74
|
-
for (const framework of config.frameworks) {
|
|
75
|
-
const blockName = framework.toUpperCase();
|
|
76
|
-
const frameworkBlock = existing.blocks.find((b) => b.name === blockName);
|
|
77
|
-
if (frameworkBlock && frameworkBlock.content) {
|
|
78
|
-
// Write extracted content to /rulebook/[FRAMEWORK].md
|
|
79
|
-
const filePath = path.join(specsPath, `${blockName}.md`);
|
|
80
|
-
await writeFile(filePath, frameworkBlock.content);
|
|
81
|
-
extractedFrameworks.push(framework);
|
|
82
|
-
}
|
|
83
|
-
else {
|
|
84
|
-
// Generate new template if not found
|
|
85
|
-
const frameworkRules = await generateFrameworkRules(framework);
|
|
86
|
-
const filePath = path.join(specsPath, `${blockName}.md`);
|
|
87
|
-
await writeFile(filePath, frameworkRules);
|
|
88
|
-
extractedFrameworks.push(framework);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
return { extractedLanguages, extractedModules, extractedFrameworks };
|
|
67
|
+
return { extractedLanguages, extractedModules };
|
|
93
68
|
}
|
|
94
69
|
/**
|
|
95
70
|
* Replace embedded templates with references in AGENTS.md
|