@hivehub/rulebook 5.5.1 → 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/claude-settings-manager.d.ts.map +1 -1
- package/dist/core/claude-settings-manager.js +9 -3
- package/dist/core/claude-settings-manager.js.map +1 -1
- 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/ralph-scripts.d.ts.map +1 -1
- package/dist/core/ralph-scripts.js +7 -6
- package/dist/core/ralph-scripts.js.map +1 -1
- 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/dist/utils/file-system.d.ts +22 -0
- package/dist/utils/file-system.d.ts.map +1 -1
- package/dist/utils/file-system.js +31 -0
- package/dist/utils/file-system.js.map +1 -1
- package/dist/utils/git-hooks.d.ts.map +1 -1
- package/dist/utils/git-hooks.js +3 -2
- package/dist/utils/git-hooks.js.map +1 -1
- package/package.json +2 -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 +74 -76
- package/templates/hooks/enforce-pre-tool.sh +70 -0
- package/templates/hooks/enforce-team-for-background-agents.sh +55 -55
- package/templates/hooks/on-compact-reinject.sh +34 -34
- package/templates/hooks/resume-from-handoff.sh +61 -61
- package/templates/hooks/terse-activate.sh +197 -197
- package/templates/hooks/terse-mode-tracker.sh +190 -187
- 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,202 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { readFile, writeFile, fileExists, ensureDir } from '../../utils/file-system.js';
|
|
3
|
+
import { getTemplatesDir } from './generator.js';
|
|
4
|
+
/**
|
|
5
|
+
* v5.3.0 `.claude/rules/` generator.
|
|
6
|
+
*
|
|
7
|
+
* For every detected language that rulebook ships a template for, emit
|
|
8
|
+
* `.claude/rules/<language>.md` with YAML `paths:` frontmatter. These are
|
|
9
|
+
* Anthropic's path-scoped rules (loaded only when Claude reads a file
|
|
10
|
+
* matching the glob), so they cost zero context budget outside of the
|
|
11
|
+
* relevant file types.
|
|
12
|
+
*
|
|
13
|
+
* Files generated by rulebook carry a sentinel comment immediately after
|
|
14
|
+
* the frontmatter. On `rulebook update`, any `.claude/rules/*.md` without
|
|
15
|
+
* the sentinel is treated as user-authored and left alone. This lets users
|
|
16
|
+
* adopt a generated rule file as their own by simply deleting the sentinel
|
|
17
|
+
* comment line.
|
|
18
|
+
*/
|
|
19
|
+
export const RULES_DIR = '.claude/rules';
|
|
20
|
+
export const GENERATED_SENTINEL = 'Generated by @hivehub/rulebook v5.3.0';
|
|
21
|
+
/**
|
|
22
|
+
* Languages with shipped rule templates. Adding a new entry here requires a
|
|
23
|
+
* matching `templates/rules/<slug>.md` file.
|
|
24
|
+
*/
|
|
25
|
+
export const SUPPORTED_RULE_LANGUAGES = [
|
|
26
|
+
'typescript',
|
|
27
|
+
'javascript',
|
|
28
|
+
'rust',
|
|
29
|
+
'python',
|
|
30
|
+
'go',
|
|
31
|
+
'cpp',
|
|
32
|
+
'java',
|
|
33
|
+
'csharp',
|
|
34
|
+
];
|
|
35
|
+
/**
|
|
36
|
+
* Generic (non-language) rules shipped by rulebook v5.3.0.
|
|
37
|
+
* These are always emitted regardless of detection result.
|
|
38
|
+
*/
|
|
39
|
+
export const ALWAYS_ON_RULES = [
|
|
40
|
+
'full-task-no-questions',
|
|
41
|
+
'multi-agent-teams',
|
|
42
|
+
'consult-analysis-before-implementing',
|
|
43
|
+
'respect-handoff-trigger',
|
|
44
|
+
'diagnostic-first',
|
|
45
|
+
'fail-twice-escalate',
|
|
46
|
+
];
|
|
47
|
+
/**
|
|
48
|
+
* Detected languages from the `detector.ts` pipeline may use aliases
|
|
49
|
+
* (e.g. `"c"` — which rulebook treats as C/C++ and routes to the `cpp`
|
|
50
|
+
* template). Map them here.
|
|
51
|
+
*/
|
|
52
|
+
const LANGUAGE_ALIASES = {
|
|
53
|
+
c: 'cpp',
|
|
54
|
+
'c++': 'cpp',
|
|
55
|
+
cs: 'csharp',
|
|
56
|
+
'c#': 'csharp',
|
|
57
|
+
ts: 'typescript',
|
|
58
|
+
js: 'javascript',
|
|
59
|
+
py: 'python',
|
|
60
|
+
rs: 'rust',
|
|
61
|
+
};
|
|
62
|
+
export function getRulesDir(projectRoot) {
|
|
63
|
+
return path.join(projectRoot, RULES_DIR);
|
|
64
|
+
}
|
|
65
|
+
export function getRulePath(projectRoot, language) {
|
|
66
|
+
return path.join(getRulesDir(projectRoot), `${language}.md`);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Normalize a detected language string to a supported rule template slug.
|
|
70
|
+
* Returns null if rulebook does not ship a template for it.
|
|
71
|
+
*/
|
|
72
|
+
export function resolveRuleLanguage(detected) {
|
|
73
|
+
const lower = detected.toLowerCase().trim();
|
|
74
|
+
if (SUPPORTED_RULE_LANGUAGES.includes(lower)) {
|
|
75
|
+
return lower;
|
|
76
|
+
}
|
|
77
|
+
return LANGUAGE_ALIASES[lower] ?? null;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Read a language rule template from the package's `templates/rules/`
|
|
81
|
+
* directory.
|
|
82
|
+
*/
|
|
83
|
+
export async function readRuleTemplate(language) {
|
|
84
|
+
const templatePath = path.join(getTemplatesDir(), 'rules', `${language}.md`);
|
|
85
|
+
if (!(await fileExists(templatePath))) {
|
|
86
|
+
throw new Error(`Rule template not found at ${templatePath}`);
|
|
87
|
+
}
|
|
88
|
+
return await readFile(templatePath);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Check whether an existing rule file was generated by rulebook. Returns
|
|
92
|
+
* true only if the canonical sentinel comment is present. User files that
|
|
93
|
+
* the user "adopted" by deleting the sentinel return false and are
|
|
94
|
+
* preserved across updates.
|
|
95
|
+
*/
|
|
96
|
+
export function hasGeneratedSentinel(content) {
|
|
97
|
+
return content.includes(GENERATED_SENTINEL);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Generate `.claude/rules/<language>.md` for every detected language that
|
|
101
|
+
* has a shipped template. User-authored rules (no sentinel) are preserved.
|
|
102
|
+
*/
|
|
103
|
+
export async function generateRules(projectRoot, detection) {
|
|
104
|
+
const rulesDir = getRulesDir(projectRoot);
|
|
105
|
+
await ensureDir(rulesDir);
|
|
106
|
+
const result = {
|
|
107
|
+
written: [],
|
|
108
|
+
preserved: [],
|
|
109
|
+
unsupported: [],
|
|
110
|
+
};
|
|
111
|
+
// Deduplicate: a project might detect both "typescript" and "javascript";
|
|
112
|
+
// we emit both rules since both apply. But if two detection entries map
|
|
113
|
+
// to the same template slug, only write once.
|
|
114
|
+
const seen = new Set();
|
|
115
|
+
for (const entry of detection.languages) {
|
|
116
|
+
const slug = resolveRuleLanguage(entry.language);
|
|
117
|
+
if (!slug) {
|
|
118
|
+
result.unsupported.push(entry.language);
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
if (seen.has(slug))
|
|
122
|
+
continue;
|
|
123
|
+
seen.add(slug);
|
|
124
|
+
const targetPath = getRulePath(projectRoot, slug);
|
|
125
|
+
if (await fileExists(targetPath)) {
|
|
126
|
+
const existing = await readFile(targetPath);
|
|
127
|
+
if (!hasGeneratedSentinel(existing)) {
|
|
128
|
+
// User-owned file — never touch it.
|
|
129
|
+
result.preserved.push(targetPath);
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
const template = await readRuleTemplate(slug);
|
|
134
|
+
await writeFile(targetPath, template);
|
|
135
|
+
result.written.push(targetPath);
|
|
136
|
+
}
|
|
137
|
+
// Always-on rules (not language-scoped) — emit if sentinel-based skip allows
|
|
138
|
+
for (const ruleName of ALWAYS_ON_RULES) {
|
|
139
|
+
const targetPath = path.join(rulesDir, `${ruleName}.md`);
|
|
140
|
+
if (await fileExists(targetPath)) {
|
|
141
|
+
const existing = await readFile(targetPath);
|
|
142
|
+
if (!hasGeneratedSentinel(existing)) {
|
|
143
|
+
result.preserved.push(targetPath);
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
const templatePath = path.join(getTemplatesDir(), 'rules', `${ruleName}.md`);
|
|
148
|
+
if (await fileExists(templatePath)) {
|
|
149
|
+
const template = await readFile(templatePath);
|
|
150
|
+
await writeFile(targetPath, template);
|
|
151
|
+
result.written.push(targetPath);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return result;
|
|
155
|
+
}
|
|
156
|
+
export async function listRulesWithSource(projectRoot) {
|
|
157
|
+
const rulesDir = getRulesDir(projectRoot);
|
|
158
|
+
if (!(await fileExists(rulesDir)))
|
|
159
|
+
return [];
|
|
160
|
+
const { promises: fs } = await import('fs');
|
|
161
|
+
const entries = await fs.readdir(rulesDir, { withFileTypes: true });
|
|
162
|
+
const results = [];
|
|
163
|
+
for (const entry of entries) {
|
|
164
|
+
if (!entry.isFile() || !entry.name.endsWith('.md'))
|
|
165
|
+
continue;
|
|
166
|
+
const filePath = path.join(rulesDir, entry.name);
|
|
167
|
+
const content = await readFile(filePath);
|
|
168
|
+
const source = hasGeneratedSentinel(content) ? 'generated' : 'user';
|
|
169
|
+
results.push({
|
|
170
|
+
name: entry.name.replace(/\.md$/, ''),
|
|
171
|
+
path: filePath,
|
|
172
|
+
source,
|
|
173
|
+
paths: extractPathsFrontmatter(content),
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
results.sort((a, b) => a.name.localeCompare(b.name));
|
|
177
|
+
return results;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Extract the `paths:` field from a YAML frontmatter block at the top of a
|
|
181
|
+
* markdown file. Returns null if no frontmatter or no `paths:` field.
|
|
182
|
+
* Intentionally simple — handles the exact shape the shipped templates use,
|
|
183
|
+
* not arbitrary YAML. Callers that need full YAML support should use a real
|
|
184
|
+
* parser.
|
|
185
|
+
*/
|
|
186
|
+
function extractPathsFrontmatter(content) {
|
|
187
|
+
// Handle both LF and CRLF line endings (Windows writes CRLF)
|
|
188
|
+
const normalized = content.replace(/\r\n/g, '\n');
|
|
189
|
+
const match = normalized.match(/^---\n([\s\S]*?)\n---/);
|
|
190
|
+
if (!match)
|
|
191
|
+
return null;
|
|
192
|
+
const frontmatter = match[1];
|
|
193
|
+
const pathsMatch = frontmatter.match(/^paths:\s*\n((?:\s*-\s+.+\n?)+)/m);
|
|
194
|
+
if (!pathsMatch)
|
|
195
|
+
return null;
|
|
196
|
+
const lines = pathsMatch[1].split('\n').filter((l) => l.trim().startsWith('-'));
|
|
197
|
+
return lines.map((l) => l
|
|
198
|
+
.replace(/^\s*-\s+/, '')
|
|
199
|
+
.replace(/^["']|["']$/g, '')
|
|
200
|
+
.trim());
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=rules-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules-generator.js","sourceRoot":"","sources":["../../../src/core/generators/rules-generator.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAExF,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD;;;;;;;;;;;;;;GAcG;AAEH,MAAM,CAAC,MAAM,SAAS,GAAG,eAAe,CAAC;AACzC,MAAM,CAAC,MAAM,kBAAkB,GAAG,uCAAuC,CAAC;AAE1E;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,YAAY;IACZ,YAAY;IACZ,MAAM;IACN,QAAQ;IACR,IAAI;IACJ,KAAK;IACL,MAAM;IACN,QAAQ;CACA,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,wBAAwB;IACxB,mBAAmB;IACnB,sCAAsC;IACtC,yBAAyB;IACzB,kBAAkB;IAClB,qBAAqB;CACb,CAAC;AAIX;;;;GAIG;AACH,MAAM,gBAAgB,GAA0C;IAC9D,CAAC,EAAE,KAAK;IACR,KAAK,EAAE,KAAK;IACZ,EAAE,EAAE,QAAQ;IACZ,IAAI,EAAE,QAAQ;IACd,EAAE,EAAE,YAAY;IAChB,EAAE,EAAE,YAAY;IAChB,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,MAAM;CACX,CAAC;AAWF,MAAM,UAAU,WAAW,CAAC,WAAmB;IAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,WAAmB,EAAE,QAA+B;IAC9E,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,GAAG,QAAQ,KAAK,CAAC,CAAC;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAClD,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IAC5C,IAAI,wBAAwB,CAAC,QAAQ,CAAC,KAA8B,CAAC,EAAE,CAAC;QACtE,OAAO,KAA8B,CAAC;IACxC,CAAC;IACD,OAAO,gBAAgB,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;AACzC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAA+B;IACpE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,GAAG,QAAQ,KAAK,CAAC,CAAC;IAC7E,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,8BAA8B,YAAY,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,MAAM,QAAQ,CAAC,YAAY,CAAC,CAAC;AACtC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,OAAO,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,WAAmB,EACnB,SAA6C;IAE7C,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC;IAE1B,MAAM,MAAM,GAA0B;QACpC,OAAO,EAAE,EAAE;QACX,SAAS,EAAE,EAAE;QACb,WAAW,EAAE,EAAE;KAChB,CAAC;IAEF,0EAA0E;IAC1E,wEAAwE;IACxE,8CAA8C;IAC9C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAyB,CAAC;IAE9C,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACxC,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAC7B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAEf,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAElD,IAAI,MAAM,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC5C,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACpC,oCAAoC;gBACpC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAClC,SAAS;YACX,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,SAAS,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACtC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IAED,6EAA6E;IAC7E,KAAK,MAAM,QAAQ,IAAI,eAAe,EAAE,CAAC;QACvC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,QAAQ,KAAK,CAAC,CAAC;QACzD,IAAI,MAAM,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC5C,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACpC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAClC,SAAS;YACX,CAAC;QACH,CAAC;QACD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,GAAG,QAAQ,KAAK,CAAC,CAAC;QAC7E,IAAI,MAAM,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,CAAC;YAC9C,MAAM,SAAS,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YACtC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAaD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,WAAmB;IAC3D,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IAC1C,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAE7C,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,MAAM,OAAO,GAAiB,EAAE,CAAC;IAEjC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,MAAM,GAAyB,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;QAC1F,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YACrC,IAAI,EAAE,QAAQ;YACd,MAAM;YACN,KAAK,EAAE,uBAAuB,CAAC,OAAO,CAAC;SACxC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACrD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,uBAAuB,CAAC,OAAe;IAC9C,6DAA6D;IAC7D,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACxD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACzE,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAChF,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACrB,CAAC;SACE,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;SAC3B,IAAI,EAAE,CACV,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ProjectConfig } from '../../types.js';
|
|
2
|
+
export declare function generateWorkflows(config: ProjectConfig, targetDir?: string, options?: {
|
|
3
|
+
mode?: 'full' | 'minimal';
|
|
4
|
+
}): Promise<string[]>;
|
|
5
|
+
export declare function generateIDEFiles(config: ProjectConfig, targetDir?: string): Promise<string[]>;
|
|
6
|
+
/**
|
|
7
|
+
* Generate Cursor commands from templates
|
|
8
|
+
*/
|
|
9
|
+
export declare function generateCursorCommands(targetDir: string): Promise<string[]>;
|
|
10
|
+
/**
|
|
11
|
+
* Generate AI CLI configuration files (CLAUDE.md, CODEX.md, GEMINI.md, gemini-extension.json)
|
|
12
|
+
* These files help AI CLI tools understand project standards
|
|
13
|
+
*/
|
|
14
|
+
export declare function generateAICLIFiles(config: ProjectConfig, targetDir?: string): Promise<string[]>;
|
|
15
|
+
//# sourceMappingURL=workflow-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-generator.d.ts","sourceRoot":"","sources":["../../../src/core/generators/workflow-generator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAWpD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,aAAa,EACrB,SAAS,GAAE,MAAsB,EACjC,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAO,GAC1C,OAAO,CAAC,MAAM,EAAE,CAAC,CA4DnB;AAsBD,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,aAAa,EACrB,SAAS,GAAE,MAAsB,GAChC,OAAO,CAAC,MAAM,EAAE,CAAC,CAuBnB;AAsKD;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAmCjF;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,aAAa,EACrB,SAAS,GAAE,MAAsB,GAChC,OAAO,CAAC,MAAM,EAAE,CAAC,CA+BnB"}
|
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { readFile, writeFile, ensureDir, fileExists } from '../../utils/file-system.js';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
import { dirname } from 'path';
|
|
5
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = dirname(__filename);
|
|
7
|
+
function getTemplatesDir() {
|
|
8
|
+
return path.join(__dirname, '..', '..', '..', 'templates');
|
|
9
|
+
}
|
|
10
|
+
export async function generateWorkflows(config, targetDir = process.cwd(), options = {}) {
|
|
11
|
+
const generatedFiles = [];
|
|
12
|
+
const workflowsDir = path.join(targetDir, '.github', 'workflows');
|
|
13
|
+
await ensureDir(workflowsDir);
|
|
14
|
+
const templatesDir = path.join(getTemplatesDir(), 'workflows');
|
|
15
|
+
const mode = options.mode ?? 'full';
|
|
16
|
+
// Generate language-specific workflows
|
|
17
|
+
for (const language of config.languages) {
|
|
18
|
+
if (language === 'rust') {
|
|
19
|
+
// Copy Rust workflows
|
|
20
|
+
const rustTest = await copyWorkflow(templatesDir, 'rust-test.yml', workflowsDir);
|
|
21
|
+
generatedFiles.push(rustTest);
|
|
22
|
+
if (mode === 'full') {
|
|
23
|
+
const rustLint = await copyWorkflow(templatesDir, 'rust-lint.yml', workflowsDir);
|
|
24
|
+
generatedFiles.push(rustLint);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
else if (language === 'typescript') {
|
|
28
|
+
// Copy TypeScript workflows
|
|
29
|
+
const tsTest = await copyWorkflow(templatesDir, 'typescript-test.yml', workflowsDir);
|
|
30
|
+
generatedFiles.push(tsTest);
|
|
31
|
+
if (mode === 'full') {
|
|
32
|
+
const tsLint = await copyWorkflow(templatesDir, 'typescript-lint.yml', workflowsDir);
|
|
33
|
+
generatedFiles.push(tsLint);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
else if (language === 'python') {
|
|
37
|
+
// Copy Python workflows
|
|
38
|
+
const pyTest = await copyWorkflow(templatesDir, 'python-test.yml', workflowsDir);
|
|
39
|
+
generatedFiles.push(pyTest);
|
|
40
|
+
if (mode === 'full') {
|
|
41
|
+
const pyLint = await copyWorkflow(templatesDir, 'python-lint.yml', workflowsDir);
|
|
42
|
+
generatedFiles.push(pyLint);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else if (language === 'go') {
|
|
46
|
+
// Copy Go workflows
|
|
47
|
+
const goTest = await copyWorkflow(templatesDir, 'go-test.yml', workflowsDir);
|
|
48
|
+
generatedFiles.push(goTest);
|
|
49
|
+
if (mode === 'full') {
|
|
50
|
+
const goLint = await copyWorkflow(templatesDir, 'go-lint.yml', workflowsDir);
|
|
51
|
+
generatedFiles.push(goLint);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else if (language === 'java') {
|
|
55
|
+
// Copy Java workflows
|
|
56
|
+
const javaTest = await copyWorkflow(templatesDir, 'java-test.yml', workflowsDir);
|
|
57
|
+
generatedFiles.push(javaTest);
|
|
58
|
+
if (mode === 'full') {
|
|
59
|
+
const javaLint = await copyWorkflow(templatesDir, 'java-lint.yml', workflowsDir);
|
|
60
|
+
generatedFiles.push(javaLint);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (mode === 'full') {
|
|
65
|
+
// Always add codespell in full mode
|
|
66
|
+
const codespell = await copyWorkflow(templatesDir, 'codespell.yml', workflowsDir);
|
|
67
|
+
generatedFiles.push(codespell);
|
|
68
|
+
}
|
|
69
|
+
return generatedFiles;
|
|
70
|
+
}
|
|
71
|
+
async function copyWorkflow(templatesDir, workflowFile, targetDir) {
|
|
72
|
+
const sourcePath = path.join(templatesDir, workflowFile);
|
|
73
|
+
const targetPath = path.join(targetDir, workflowFile);
|
|
74
|
+
// Check if workflow already exists
|
|
75
|
+
if (await fileExists(targetPath)) {
|
|
76
|
+
// Skip if exists, don't overwrite
|
|
77
|
+
return targetPath;
|
|
78
|
+
}
|
|
79
|
+
const content = await readFile(sourcePath);
|
|
80
|
+
await writeFile(targetPath, content);
|
|
81
|
+
return targetPath;
|
|
82
|
+
}
|
|
83
|
+
export async function generateIDEFiles(config, targetDir = process.cwd()) {
|
|
84
|
+
const generatedFiles = [];
|
|
85
|
+
for (const ide of config.ides) {
|
|
86
|
+
if (ide === 'cursor') {
|
|
87
|
+
const cursorRulesPath = await generateCursorRules(config, targetDir);
|
|
88
|
+
if (cursorRulesPath)
|
|
89
|
+
generatedFiles.push(cursorRulesPath);
|
|
90
|
+
// Generate Cursor commands
|
|
91
|
+
const cursorCommands = await generateCursorCommands(targetDir);
|
|
92
|
+
generatedFiles.push(...cursorCommands);
|
|
93
|
+
}
|
|
94
|
+
else if (ide === 'windsurf') {
|
|
95
|
+
const windsurfRulesPath = await generateWindsurfRules(config, targetDir);
|
|
96
|
+
if (windsurfRulesPath)
|
|
97
|
+
generatedFiles.push(windsurfRulesPath);
|
|
98
|
+
}
|
|
99
|
+
else if (ide === 'vscode') {
|
|
100
|
+
const vscodeFiles = await generateVSCodeConfig(config, targetDir);
|
|
101
|
+
generatedFiles.push(...vscodeFiles);
|
|
102
|
+
}
|
|
103
|
+
else if (ide === 'copilot') {
|
|
104
|
+
const copilotPath = await generateCopilotInstructions(config, targetDir);
|
|
105
|
+
if (copilotPath)
|
|
106
|
+
generatedFiles.push(copilotPath);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return generatedFiles;
|
|
110
|
+
}
|
|
111
|
+
async function generateCursorRules(config, targetDir) {
|
|
112
|
+
const targetPath = path.join(targetDir, '.cursorrules');
|
|
113
|
+
// Don't overwrite if exists
|
|
114
|
+
if (await fileExists(targetPath)) {
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
const content = `This project uses @hivellm/rulebook standards.
|
|
118
|
+
|
|
119
|
+
CRITICAL RULES:
|
|
120
|
+
1. Always reference @AGENTS.md before coding
|
|
121
|
+
2. Write tests first (${config.coverageThreshold}%+ coverage required)
|
|
122
|
+
3. Run quality checks before committing:
|
|
123
|
+
- Type check / Compiler check
|
|
124
|
+
- Linter (no warnings allowed)
|
|
125
|
+
- All tests (100% pass rate)
|
|
126
|
+
- Coverage check
|
|
127
|
+
4. Update docs/ when implementing features
|
|
128
|
+
5. Follow strict documentation structure
|
|
129
|
+
|
|
130
|
+
Language-specific rules are in @AGENTS.md.
|
|
131
|
+
Module-specific patterns are in @AGENTS.md.
|
|
132
|
+
|
|
133
|
+
When in doubt, ask to review @AGENTS.md first.
|
|
134
|
+
`;
|
|
135
|
+
await writeFile(targetPath, content);
|
|
136
|
+
return targetPath;
|
|
137
|
+
}
|
|
138
|
+
async function generateWindsurfRules(config, targetDir) {
|
|
139
|
+
const targetPath = path.join(targetDir, '.windsurfrules');
|
|
140
|
+
if (await fileExists(targetPath)) {
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
const content = `# Project Standards
|
|
144
|
+
|
|
145
|
+
This project uses @hivellm/rulebook for standardization.
|
|
146
|
+
|
|
147
|
+
## Critical Rules
|
|
148
|
+
|
|
149
|
+
1. **Always check @AGENTS.md** before generating code
|
|
150
|
+
2. **Tests first**: Minimum ${config.coverageThreshold}% coverage required
|
|
151
|
+
3. **Quality gates**: All must pass before commit
|
|
152
|
+
- Type checking
|
|
153
|
+
- Linting (zero warnings)
|
|
154
|
+
- All tests (100% pass)
|
|
155
|
+
- Coverage verification
|
|
156
|
+
4. **Documentation**: Update /docs/ with all changes
|
|
157
|
+
5. **Structure**: Follow strict documentation layout
|
|
158
|
+
|
|
159
|
+
## Language Rules
|
|
160
|
+
|
|
161
|
+
See @AGENTS.md for:
|
|
162
|
+
${config.languages.map((lang) => `- ${lang.charAt(0).toUpperCase() + lang.slice(1)}: Language-specific standards`).join('\n')}
|
|
163
|
+
|
|
164
|
+
## Module Patterns
|
|
165
|
+
|
|
166
|
+
${config.modules.length > 0 ? `See @AGENTS.md for:\n${config.modules.map((mod) => `- ${mod.charAt(0).toUpperCase() + mod.slice(1)}: Module-specific patterns`).join('\n')}` : 'No modules configured'}
|
|
167
|
+
`;
|
|
168
|
+
await writeFile(targetPath, content);
|
|
169
|
+
return targetPath;
|
|
170
|
+
}
|
|
171
|
+
async function generateVSCodeConfig(config, targetDir) {
|
|
172
|
+
const vscodeDir = path.join(targetDir, '.vscode');
|
|
173
|
+
await ensureDir(vscodeDir);
|
|
174
|
+
const generatedFiles = [];
|
|
175
|
+
// Generate settings.json
|
|
176
|
+
const settingsPath = path.join(vscodeDir, 'settings.json');
|
|
177
|
+
if (!(await fileExists(settingsPath))) {
|
|
178
|
+
const settings = {
|
|
179
|
+
'editor.formatOnSave': true,
|
|
180
|
+
'editor.codeActionsOnSave': {
|
|
181
|
+
'source.fixAll.eslint': true,
|
|
182
|
+
'source.organizeImports': true,
|
|
183
|
+
},
|
|
184
|
+
'editor.rulers': [100],
|
|
185
|
+
'files.eol': '\n',
|
|
186
|
+
'github.copilot.enable': {
|
|
187
|
+
'*': true,
|
|
188
|
+
},
|
|
189
|
+
};
|
|
190
|
+
await writeFile(settingsPath, JSON.stringify(settings, null, 2));
|
|
191
|
+
generatedFiles.push(settingsPath);
|
|
192
|
+
}
|
|
193
|
+
// Generate copilot-instructions.md
|
|
194
|
+
const copilotPath = path.join(vscodeDir, 'copilot-instructions.md');
|
|
195
|
+
if (!(await fileExists(copilotPath))) {
|
|
196
|
+
const instructions = `# GitHub Copilot Instructions
|
|
197
|
+
|
|
198
|
+
This project follows @hivellm/rulebook standards defined in AGENTS.md.
|
|
199
|
+
|
|
200
|
+
Read and follow AGENTS.md for all code generation.
|
|
201
|
+
|
|
202
|
+
Minimum test coverage: ${config.coverageThreshold}%
|
|
203
|
+
`;
|
|
204
|
+
await writeFile(copilotPath, instructions);
|
|
205
|
+
generatedFiles.push(copilotPath);
|
|
206
|
+
}
|
|
207
|
+
return generatedFiles;
|
|
208
|
+
}
|
|
209
|
+
async function generateCopilotInstructions(config, targetDir) {
|
|
210
|
+
const githubDir = path.join(targetDir, '.github');
|
|
211
|
+
await ensureDir(githubDir);
|
|
212
|
+
const targetPath = path.join(githubDir, 'copilot-instructions.md');
|
|
213
|
+
if (await fileExists(targetPath)) {
|
|
214
|
+
return null;
|
|
215
|
+
}
|
|
216
|
+
const content = `# GitHub Copilot Instructions
|
|
217
|
+
|
|
218
|
+
This project follows @hivellm/rulebook standards defined in AGENTS.md.
|
|
219
|
+
|
|
220
|
+
## Code Generation Rules
|
|
221
|
+
|
|
222
|
+
1. **Always follow AGENTS.md** for all code generation
|
|
223
|
+
2. **Tests required**: Minimum ${config.coverageThreshold}% coverage for all new code
|
|
224
|
+
3. **Quality checks**: Code must pass all checks before commit:
|
|
225
|
+
- Type checking / Compilation
|
|
226
|
+
- Linting (zero warnings)
|
|
227
|
+
- All tests passing
|
|
228
|
+
- Coverage threshold met
|
|
229
|
+
4. **Documentation**: Update /docs/ with all changes
|
|
230
|
+
5. **Structure**: Follow project structure from AGENTS.md
|
|
231
|
+
|
|
232
|
+
## Language-Specific Standards
|
|
233
|
+
|
|
234
|
+
${config.languages.map((lang) => `### ${lang.charAt(0).toUpperCase() + lang.slice(1)}\nSee AGENTS.md for ${lang} standards`).join('\n\n')}
|
|
235
|
+
|
|
236
|
+
## Testing Patterns
|
|
237
|
+
|
|
238
|
+
- Tests in /tests directory
|
|
239
|
+
- Test-driven development
|
|
240
|
+
- Edge cases and error paths
|
|
241
|
+
- Integration tests where appropriate
|
|
242
|
+
`;
|
|
243
|
+
await writeFile(targetPath, content);
|
|
244
|
+
return targetPath;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Generate Cursor commands from templates
|
|
248
|
+
*/
|
|
249
|
+
export async function generateCursorCommands(targetDir) {
|
|
250
|
+
const commandsDir = path.join(targetDir, '.cursor', 'commands');
|
|
251
|
+
await ensureDir(commandsDir);
|
|
252
|
+
const templatesDir = path.join(getTemplatesDir(), 'commands');
|
|
253
|
+
const generatedFiles = [];
|
|
254
|
+
// List of command templates to copy
|
|
255
|
+
const commandTemplates = [
|
|
256
|
+
'rulebook-task-create.md',
|
|
257
|
+
'rulebook-task-list.md',
|
|
258
|
+
'rulebook-task-show.md',
|
|
259
|
+
'rulebook-task-validate.md',
|
|
260
|
+
'rulebook-task-archive.md',
|
|
261
|
+
'rulebook-task-apply.md',
|
|
262
|
+
];
|
|
263
|
+
for (const template of commandTemplates) {
|
|
264
|
+
const sourcePath = path.join(templatesDir, template);
|
|
265
|
+
const targetPath = path.join(commandsDir, template);
|
|
266
|
+
// Skip if already exists (don't overwrite user customizations)
|
|
267
|
+
if (await fileExists(targetPath)) {
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
// Check if template exists
|
|
271
|
+
if (await fileExists(sourcePath)) {
|
|
272
|
+
const content = await readFile(sourcePath);
|
|
273
|
+
await writeFile(targetPath, content);
|
|
274
|
+
generatedFiles.push(targetPath);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return generatedFiles;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Generate AI CLI configuration files (CLAUDE.md, CODEX.md, GEMINI.md, gemini-extension.json)
|
|
281
|
+
* These files help AI CLI tools understand project standards
|
|
282
|
+
*/
|
|
283
|
+
export async function generateAICLIFiles(config, targetDir = process.cwd()) {
|
|
284
|
+
const generatedFiles = [];
|
|
285
|
+
// CLAUDE.md is generated by `src/core/claude-md-generator.ts` (v5.3.0
|
|
286
|
+
// @import format) — no longer produced here.
|
|
287
|
+
// Generate CODEX.md for Codex CLI
|
|
288
|
+
const codexPath = path.join(targetDir, 'CODEX.md');
|
|
289
|
+
if (!(await fileExists(codexPath))) {
|
|
290
|
+
const codexContent = generateCodexMdContent(config);
|
|
291
|
+
await writeFile(codexPath, codexContent);
|
|
292
|
+
generatedFiles.push(codexPath);
|
|
293
|
+
}
|
|
294
|
+
// Generate GEMINI.md for Gemini CLI
|
|
295
|
+
const geminiPath = path.join(targetDir, 'GEMINI.md');
|
|
296
|
+
if (!(await fileExists(geminiPath))) {
|
|
297
|
+
const geminiContent = generateGeminiMdContent(config);
|
|
298
|
+
await writeFile(geminiPath, geminiContent);
|
|
299
|
+
generatedFiles.push(geminiPath);
|
|
300
|
+
}
|
|
301
|
+
// Generate gemini-extension.json for Gemini CLI extension
|
|
302
|
+
const geminiExtPath = path.join(targetDir, 'gemini-extension.json');
|
|
303
|
+
if (!(await fileExists(geminiExtPath))) {
|
|
304
|
+
const geminiExtContent = generateGeminiExtensionContent(config, targetDir);
|
|
305
|
+
await writeFile(geminiExtPath, JSON.stringify(geminiExtContent, null, 2));
|
|
306
|
+
generatedFiles.push(geminiExtPath);
|
|
307
|
+
}
|
|
308
|
+
return generatedFiles;
|
|
309
|
+
}
|
|
310
|
+
function generateCodexMdContent(config) {
|
|
311
|
+
const languages = config.languages.map((l) => l.charAt(0).toUpperCase() + l.slice(1)).join(', ');
|
|
312
|
+
return `# CODEX.md
|
|
313
|
+
|
|
314
|
+
Instructions for OpenAI Codex and compatible tools.
|
|
315
|
+
|
|
316
|
+
## Project Standards
|
|
317
|
+
|
|
318
|
+
This project uses @hivehub/rulebook. Follow AGENTS.md for all code generation.
|
|
319
|
+
|
|
320
|
+
**Languages**: ${languages || 'Not specified'}
|
|
321
|
+
**Test Coverage**: ${config.coverageThreshold}%+
|
|
322
|
+
|
|
323
|
+
## Rules
|
|
324
|
+
|
|
325
|
+
1. Read AGENTS.md before generating code
|
|
326
|
+
2. Write tests first (TDD approach)
|
|
327
|
+
3. Maintain ${config.coverageThreshold}%+ test coverage
|
|
328
|
+
4. Run quality checks before committing
|
|
329
|
+
5. Follow language-specific patterns from AGENTS.md
|
|
330
|
+
|
|
331
|
+
## Quick Reference
|
|
332
|
+
|
|
333
|
+
- Standards: See AGENTS.md
|
|
334
|
+
- Modular rules: See /rulebook/ directory
|
|
335
|
+
- Documentation: See /docs/ directory
|
|
336
|
+
- Tests: See /tests/ directory
|
|
337
|
+
|
|
338
|
+
Always reference AGENTS.md for consistent code generation.
|
|
339
|
+
`;
|
|
340
|
+
}
|
|
341
|
+
function generateGeminiMdContent(config) {
|
|
342
|
+
const languages = config.languages.map((l) => l.charAt(0).toUpperCase() + l.slice(1)).join(', ');
|
|
343
|
+
return `# GEMINI.md
|
|
344
|
+
|
|
345
|
+
Instructions for Google Gemini CLI and API.
|
|
346
|
+
|
|
347
|
+
## Project Configuration
|
|
348
|
+
|
|
349
|
+
This project uses @hivehub/rulebook standards defined in AGENTS.md.
|
|
350
|
+
|
|
351
|
+
**Languages**: ${languages || 'Not specified'}
|
|
352
|
+
**Coverage Requirement**: ${config.coverageThreshold}%
|
|
353
|
+
|
|
354
|
+
## Development Guidelines
|
|
355
|
+
|
|
356
|
+
1. **Check AGENTS.md first** - Contains all project standards
|
|
357
|
+
2. **Test-driven development** - Write tests before implementation
|
|
358
|
+
3. **Quality gates** - All code must pass:
|
|
359
|
+
- Type checking
|
|
360
|
+
- Linting (zero warnings)
|
|
361
|
+
- Tests (100% pass rate)
|
|
362
|
+
- Coverage (${config.coverageThreshold}%+)
|
|
363
|
+
4. **Documentation** - Update /docs/ for all features
|
|
364
|
+
|
|
365
|
+
## Project Structure
|
|
366
|
+
|
|
367
|
+
- \`AGENTS.md\` - AI agent directives and standards
|
|
368
|
+
- \`/rulebook/\` - Modular rule definitions
|
|
369
|
+
- \`/docs/\` - Documentation
|
|
370
|
+
- \`/tests/\` - Test files
|
|
371
|
+
|
|
372
|
+
For detailed standards, see AGENTS.md.
|
|
373
|
+
`;
|
|
374
|
+
}
|
|
375
|
+
function generateGeminiExtensionContent(config, targetDir) {
|
|
376
|
+
return {
|
|
377
|
+
name: path.basename(targetDir),
|
|
378
|
+
version: '1.0.0',
|
|
379
|
+
description: 'Gemini CLI extension for project standards',
|
|
380
|
+
main: 'GEMINI.md',
|
|
381
|
+
includes: ['AGENTS.md', '.rulebook/**/*.md', 'docs/**/*.md'],
|
|
382
|
+
excludes: ['node_modules/**', 'dist/**', '.git/**'],
|
|
383
|
+
settings: {
|
|
384
|
+
coverageThreshold: config.coverageThreshold,
|
|
385
|
+
languages: config.languages,
|
|
386
|
+
strictMode: true,
|
|
387
|
+
},
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
//# sourceMappingURL=workflow-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-generator.js","sourceRoot":"","sources":["../../../src/core/generators/workflow-generator.ts"],"names":[],"mappings":"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"}
|