@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,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v5.3.0 CLAUDE.md generator.
|
|
3
|
+
*
|
|
4
|
+
* Produces a thin (<150 line) CLAUDE.md composed of `@imports`, aligned with
|
|
5
|
+
* Anthropic's official memory model
|
|
6
|
+
* (https://code.claude.com/docs/en/memory#claude-md-imports).
|
|
7
|
+
*
|
|
8
|
+
* The generated content is wrapped in `<!-- RULEBOOK:START v5.3.0 -->` /
|
|
9
|
+
* `<!-- RULEBOOK:END -->` sentinels so future `rulebook update` runs can
|
|
10
|
+
* regenerate the block in-place while preserving any user content outside
|
|
11
|
+
* the sentinels.
|
|
12
|
+
*/
|
|
13
|
+
export declare const CLAUDE_MD_FILE = "CLAUDE.md";
|
|
14
|
+
export declare const CLAUDE_MD_SENTINEL_START = "<!-- RULEBOOK:START v5.3.0";
|
|
15
|
+
export declare const CLAUDE_MD_SENTINEL_END = "<!-- RULEBOOK:END -->";
|
|
16
|
+
export declare const CLAUDE_MD_TEMPLATE_NAME = "CLAUDE_MD_v2.md";
|
|
17
|
+
export interface ClaudeMdGenerationOptions {
|
|
18
|
+
/**
|
|
19
|
+
* If true, every `@import` line in the template is kept regardless of
|
|
20
|
+
* whether the target file exists. Default false: missing imports are
|
|
21
|
+
* commented out so Claude Code does not warn about broken `@imports`.
|
|
22
|
+
*/
|
|
23
|
+
keepAllImports?: boolean;
|
|
24
|
+
}
|
|
25
|
+
export declare function getClaudeMdPath(projectRoot: string): string;
|
|
26
|
+
/**
|
|
27
|
+
* Read the v5.3.0 CLAUDE.md template from the package's templates directory.
|
|
28
|
+
*/
|
|
29
|
+
export declare function readClaudeMdTemplate(): Promise<string>;
|
|
30
|
+
/**
|
|
31
|
+
* Render the CLAUDE.md body for a given project. The result is the full
|
|
32
|
+
* file contents to write (including the RULEBOOK sentinels). When merging
|
|
33
|
+
* with an existing CLAUDE.md that already has content outside the sentinels,
|
|
34
|
+
* use {@link mergeIntoExisting} via `merger.ts`.
|
|
35
|
+
*/
|
|
36
|
+
export declare function generateClaudeMd(projectRoot: string, options?: ClaudeMdGenerationOptions): Promise<string>;
|
|
37
|
+
/**
|
|
38
|
+
* Write the CLAUDE.md file to disk. Creates a backup snapshot in
|
|
39
|
+
* `.rulebook/backup/` before overwriting. Returns the absolute path
|
|
40
|
+
* to the written file and the backup (if created).
|
|
41
|
+
*/
|
|
42
|
+
export declare function writeClaudeMd(projectRoot: string, content: string): Promise<{
|
|
43
|
+
path: string;
|
|
44
|
+
backupPath: string | null;
|
|
45
|
+
}>;
|
|
46
|
+
/**
|
|
47
|
+
* Detect whether a file's content already contains a v5.3.0-style RULEBOOK
|
|
48
|
+
* block. Used by the merger to decide between in-place block replacement
|
|
49
|
+
* and full-file overwrite.
|
|
50
|
+
*/
|
|
51
|
+
export declare function hasV2Sentinels(content: string): boolean;
|
|
52
|
+
//# sourceMappingURL=claude-md-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-md-generator.d.ts","sourceRoot":"","sources":["../../../src/core/claude/claude-md-generator.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;GAWG;AAEH,eAAO,MAAM,cAAc,cAAc,CAAC;AAC1C,eAAO,MAAM,wBAAwB,+BAA+B,CAAC;AACrE,eAAO,MAAM,sBAAsB,0BAA0B,CAAC;AAC9D,eAAO,MAAM,uBAAuB,oBAAoB,CAAC;AAYzD,MAAM,WAAW,yBAAyB;IACxC;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC,CAM5D;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,MAAM,CAAC,CAGjB;AA+BD;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAatD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvD"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { existsSync } from 'fs';
|
|
3
|
+
import { readFile, writeFile, fileExists, ensureDir } from '../../utils/file-system.js';
|
|
4
|
+
import { getTemplatesDir } from '../generators/generator.js';
|
|
5
|
+
/**
|
|
6
|
+
* v5.3.0 CLAUDE.md generator.
|
|
7
|
+
*
|
|
8
|
+
* Produces a thin (<150 line) CLAUDE.md composed of `@imports`, aligned with
|
|
9
|
+
* Anthropic's official memory model
|
|
10
|
+
* (https://code.claude.com/docs/en/memory#claude-md-imports).
|
|
11
|
+
*
|
|
12
|
+
* The generated content is wrapped in `<!-- RULEBOOK:START v5.3.0 -->` /
|
|
13
|
+
* `<!-- RULEBOOK:END -->` sentinels so future `rulebook update` runs can
|
|
14
|
+
* regenerate the block in-place while preserving any user content outside
|
|
15
|
+
* the sentinels.
|
|
16
|
+
*/
|
|
17
|
+
export const CLAUDE_MD_FILE = 'CLAUDE.md';
|
|
18
|
+
export const CLAUDE_MD_SENTINEL_START = '<!-- RULEBOOK:START v5.3.0';
|
|
19
|
+
export const CLAUDE_MD_SENTINEL_END = '<!-- RULEBOOK:END -->';
|
|
20
|
+
export const CLAUDE_MD_TEMPLATE_NAME = 'CLAUDE_MD_v2.md';
|
|
21
|
+
/**
|
|
22
|
+
* Marker substrings on `@import` lines that may be conditionally included
|
|
23
|
+
* depending on file presence in the project root.
|
|
24
|
+
*/
|
|
25
|
+
const CONDITIONAL_IMPORTS = [
|
|
26
|
+
{ marker: '@AGENTS.override.md', targets: ['AGENTS.override.md'] },
|
|
27
|
+
{ marker: '@.rulebook/STATE.md', targets: ['.rulebook/STATE.md'] },
|
|
28
|
+
{ marker: '@.rulebook/PLANS.md', targets: ['.rulebook/PLANS.md'] },
|
|
29
|
+
];
|
|
30
|
+
export function getClaudeMdPath(projectRoot) {
|
|
31
|
+
return path.join(projectRoot, CLAUDE_MD_FILE);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Read the v5.3.0 CLAUDE.md template from the package's templates directory.
|
|
35
|
+
*/
|
|
36
|
+
export async function readClaudeMdTemplate() {
|
|
37
|
+
const templatePath = path.join(getTemplatesDir(), 'core', CLAUDE_MD_TEMPLATE_NAME);
|
|
38
|
+
if (!(await fileExists(templatePath))) {
|
|
39
|
+
throw new Error(`CLAUDE.md template not found at ${templatePath}`);
|
|
40
|
+
}
|
|
41
|
+
return await readFile(templatePath);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Render the CLAUDE.md body for a given project. The result is the full
|
|
45
|
+
* file contents to write (including the RULEBOOK sentinels). When merging
|
|
46
|
+
* with an existing CLAUDE.md that already has content outside the sentinels,
|
|
47
|
+
* use {@link mergeIntoExisting} via `merger.ts`.
|
|
48
|
+
*/
|
|
49
|
+
export async function generateClaudeMd(projectRoot, options = {}) {
|
|
50
|
+
const template = await readClaudeMdTemplate();
|
|
51
|
+
return resolveImports(template, projectRoot, options);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Walk the template line-by-line and comment out any `@<file>` import whose
|
|
55
|
+
* target does not exist in the project. We only ever transform lines whose
|
|
56
|
+
* trimmed content matches one of the well-known conditional markers; this
|
|
57
|
+
* keeps the template's other content (including `@AGENTS.md`, which is
|
|
58
|
+
* always required) untouched.
|
|
59
|
+
*/
|
|
60
|
+
function resolveImports(template, projectRoot, options) {
|
|
61
|
+
if (options.keepAllImports)
|
|
62
|
+
return template;
|
|
63
|
+
const lines = template.split('\n');
|
|
64
|
+
return lines
|
|
65
|
+
.map((line) => {
|
|
66
|
+
const trimmed = line.trim();
|
|
67
|
+
const match = CONDITIONAL_IMPORTS.find((c) => trimmed === c.marker);
|
|
68
|
+
if (!match)
|
|
69
|
+
return line;
|
|
70
|
+
const allExist = match.targets.every((rel) => existsSync(path.join(projectRoot, rel)));
|
|
71
|
+
if (allExist)
|
|
72
|
+
return line;
|
|
73
|
+
return `<!-- ${trimmed} (skipped — target file not present) -->`;
|
|
74
|
+
})
|
|
75
|
+
.join('\n');
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Write the CLAUDE.md file to disk. Creates a backup snapshot in
|
|
79
|
+
* `.rulebook/backup/` before overwriting. Returns the absolute path
|
|
80
|
+
* to the written file and the backup (if created).
|
|
81
|
+
*/
|
|
82
|
+
export async function writeClaudeMd(projectRoot, content) {
|
|
83
|
+
const target = getClaudeMdPath(projectRoot);
|
|
84
|
+
let backupPath = null;
|
|
85
|
+
if (await fileExists(target)) {
|
|
86
|
+
const backupDir = path.join(projectRoot, '.rulebook', 'backup');
|
|
87
|
+
await ensureDir(backupDir);
|
|
88
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
89
|
+
backupPath = path.join(backupDir, `CLAUDE.md.backup-${timestamp}`);
|
|
90
|
+
const { promises: fs } = await import('fs');
|
|
91
|
+
await fs.copyFile(target, backupPath);
|
|
92
|
+
}
|
|
93
|
+
await writeFile(target, content);
|
|
94
|
+
return { path: target, backupPath };
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Detect whether a file's content already contains a v5.3.0-style RULEBOOK
|
|
98
|
+
* block. Used by the merger to decide between in-place block replacement
|
|
99
|
+
* and full-file overwrite.
|
|
100
|
+
*/
|
|
101
|
+
export function hasV2Sentinels(content) {
|
|
102
|
+
return content.includes(CLAUDE_MD_SENTINEL_START) && content.includes(CLAUDE_MD_SENTINEL_END);
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=claude-md-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-md-generator.js","sourceRoot":"","sources":["../../../src/core/claude/claude-md-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v5.3.0 `.claude/settings.json` manager.
|
|
3
|
+
*
|
|
4
|
+
* Rulebook owns a specific subset of settings.json keys:
|
|
5
|
+
*
|
|
6
|
+
* - `hooks.PreToolUse[]` entries where `matcher === "Agent"` and the
|
|
7
|
+
* command name contains `enforce-team-for-background-agents`.
|
|
8
|
+
* - `hooks.SessionStart[]` entries where the matcher is `"compact"` and
|
|
9
|
+
* the command name contains `on-compact-reinject` OR `resume-from-handoff`.
|
|
10
|
+
* - `hooks.Stop[]` entries where the command name contains
|
|
11
|
+
* `check-context-and-handoff`.
|
|
12
|
+
* - `env.CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS` when multi-agent is enabled.
|
|
13
|
+
*
|
|
14
|
+
* Everything else is left alone. This lets projects mix rulebook-managed
|
|
15
|
+
* settings with their own hand-written ones.
|
|
16
|
+
*/
|
|
17
|
+
export interface ClaudeSettingsDesire {
|
|
18
|
+
/** Enable the PreToolUse team-enforcement hook (F-NEW-1). */
|
|
19
|
+
teamEnforcement?: boolean;
|
|
20
|
+
/** Enable the SessionStart:compact re-injection hook (F-NEW-2). */
|
|
21
|
+
compactContextReinject?: boolean;
|
|
22
|
+
/** Enable the Stop + SessionStart session handoff pair (F-NEW-5). */
|
|
23
|
+
sessionHandoff?: boolean;
|
|
24
|
+
/** Enable PreToolUse enforcement hooks (no-deferred, no-shortcuts, mcp-for-tasks). */
|
|
25
|
+
qualityEnforcement?: boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Enable rulebook-terse hooks (v5.4.0). Installs SessionStart hook
|
|
28
|
+
* `terse-activate.js` and UserPromptSubmit hook `terse-mode-tracker.js`,
|
|
29
|
+
* both invoked as `node <path>`. Requires `npm run build` to have
|
|
30
|
+
* produced `dist/hooks/*.js`.
|
|
31
|
+
*/
|
|
32
|
+
terseMode?: boolean;
|
|
33
|
+
}
|
|
34
|
+
export declare function getClaudeSettingsPath(projectRoot: string): string;
|
|
35
|
+
export declare function getHookScriptPath(projectRoot: string, scriptName: string): string;
|
|
36
|
+
/**
|
|
37
|
+
* Merge the rulebook-owned hook/env entries into an existing settings.json,
|
|
38
|
+
* or create the file if absent. Returns the final serialized settings.
|
|
39
|
+
*/
|
|
40
|
+
export declare function applyClaudeSettings(projectRoot: string, desire: ClaudeSettingsDesire): Promise<{
|
|
41
|
+
path: string;
|
|
42
|
+
changed: boolean;
|
|
43
|
+
}>;
|
|
44
|
+
//# sourceMappingURL=claude-settings-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-settings-manager.d.ts","sourceRoot":"","sources":["../../../src/core/claude/claude-settings-manager.ts"],"names":[],"mappings":"AAUA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,WAAW,oBAAoB;IACnC,6DAA6D;IAC7D,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,mEAAmE;IACnE,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,qEAAqE;IACrE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,sFAAsF;IACtF,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAoCD,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAEjF;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CA8H7C"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { readFile, writeFile, writeShellScript, fileExists, ensureDir, } from '../../utils/file-system.js';
|
|
3
|
+
import { getTemplatesDir } from '../generators/generator.js';
|
|
4
|
+
const SIGNATURES = {
|
|
5
|
+
teamEnforce: 'enforce-team-for-background-agents',
|
|
6
|
+
compactReinject: 'on-compact-reinject',
|
|
7
|
+
handoffCheck: 'check-context-and-handoff',
|
|
8
|
+
handoffResume: 'resume-from-handoff',
|
|
9
|
+
enforcePreTool: 'enforce-pre-tool',
|
|
10
|
+
terseActivate: 'terse-activate.sh',
|
|
11
|
+
terseModeTracker: 'terse-mode-tracker.sh',
|
|
12
|
+
};
|
|
13
|
+
// Hook signatures retired in past releases. Always removed during sync so
|
|
14
|
+
// stale settings.json entries from older rulebook versions get cleaned up
|
|
15
|
+
// even when the user upgrades without changing their `desire` flags.
|
|
16
|
+
const LEGACY_SIGNATURES = ['enforce-no-deferred', 'enforce-no-shortcuts', 'enforce-mcp-for-tasks'];
|
|
17
|
+
export function getClaudeSettingsPath(projectRoot) {
|
|
18
|
+
return path.join(projectRoot, '.claude', 'settings.json');
|
|
19
|
+
}
|
|
20
|
+
export function getHookScriptPath(projectRoot, scriptName) {
|
|
21
|
+
return path.join(projectRoot, '.claude', 'hooks', scriptName);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Merge the rulebook-owned hook/env entries into an existing settings.json,
|
|
25
|
+
* or create the file if absent. Returns the final serialized settings.
|
|
26
|
+
*/
|
|
27
|
+
export async function applyClaudeSettings(projectRoot, desire) {
|
|
28
|
+
const settingsPath = getClaudeSettingsPath(projectRoot);
|
|
29
|
+
await ensureDir(path.dirname(settingsPath));
|
|
30
|
+
// Copy the hook scripts from templates/ into .claude/hooks/ so the
|
|
31
|
+
// settings.json entries refer to paths that exist locally.
|
|
32
|
+
await installHookScripts(projectRoot, desire);
|
|
33
|
+
let existing = {};
|
|
34
|
+
let beforeOnDisk = null;
|
|
35
|
+
if (await fileExists(settingsPath)) {
|
|
36
|
+
try {
|
|
37
|
+
beforeOnDisk = await readFile(settingsPath);
|
|
38
|
+
existing = JSON.parse(beforeOnDisk);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// Corrupt settings.json — do not clobber, bail.
|
|
42
|
+
throw new Error(`Existing ${settingsPath} is not valid JSON`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
existing.hooks = existing.hooks ?? {};
|
|
46
|
+
existing.env = existing.env ?? {};
|
|
47
|
+
// Team enforcement
|
|
48
|
+
if (desire.teamEnforcement) {
|
|
49
|
+
existing.env['CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS'] = '1';
|
|
50
|
+
upsertHook(existing.hooks, 'PreToolUse', 'Agent', SIGNATURES.teamEnforce, buildCommandFor(projectRoot, 'enforce-team-for-background-agents.sh'));
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
removeHook(existing.hooks, 'PreToolUse', SIGNATURES.teamEnforce);
|
|
54
|
+
}
|
|
55
|
+
// COMPACT_CONTEXT reinject
|
|
56
|
+
if (desire.compactContextReinject) {
|
|
57
|
+
upsertHook(existing.hooks, 'SessionStart', 'compact', SIGNATURES.compactReinject, buildCommandFor(projectRoot, 'on-compact-reinject.sh'));
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
removeHook(existing.hooks, 'SessionStart', SIGNATURES.compactReinject);
|
|
61
|
+
}
|
|
62
|
+
// Session handoff pair
|
|
63
|
+
if (desire.sessionHandoff) {
|
|
64
|
+
upsertHook(existing.hooks, 'Stop', undefined, SIGNATURES.handoffCheck, buildCommandFor(projectRoot, 'check-context-and-handoff.sh'));
|
|
65
|
+
upsertHook(existing.hooks, 'SessionStart', undefined, SIGNATURES.handoffResume, buildCommandFor(projectRoot, 'resume-from-handoff.sh'));
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
removeHook(existing.hooks, 'Stop', SIGNATURES.handoffCheck);
|
|
69
|
+
removeHook(existing.hooks, 'SessionStart', SIGNATURES.handoffResume);
|
|
70
|
+
}
|
|
71
|
+
// rulebook-terse: SessionStart + UserPromptSubmit (v5.4.0)
|
|
72
|
+
if (desire.terseMode) {
|
|
73
|
+
upsertHook(existing.hooks, 'SessionStart', undefined, SIGNATURES.terseActivate, buildCommandFor(projectRoot, 'terse-activate.sh'));
|
|
74
|
+
upsertHook(existing.hooks, 'UserPromptSubmit', undefined, SIGNATURES.terseModeTracker, buildCommandFor(projectRoot, 'terse-mode-tracker.sh'));
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
removeHook(existing.hooks, 'SessionStart', SIGNATURES.terseActivate);
|
|
78
|
+
removeHook(existing.hooks, 'UserPromptSubmit', SIGNATURES.terseModeTracker);
|
|
79
|
+
}
|
|
80
|
+
// Quality enforcement: single consolidated PreToolUse hook (v5.6.0).
|
|
81
|
+
// The three legacy scripts (enforce-no-deferred/no-shortcuts/mcp-for-tasks)
|
|
82
|
+
// were merged into enforce-pre-tool.sh for ~3x lower per-tool latency.
|
|
83
|
+
// The matcher restricts spawn to Edit/Write/Bash — Read/Glob/Grep/Agent/
|
|
84
|
+
// MCP/etc never trigger any deny rule, so spawning the hook for them is
|
|
85
|
+
// wasted work (cuts ~60% of invocations on a typical session).
|
|
86
|
+
if (desire.qualityEnforcement) {
|
|
87
|
+
upsertHook(existing.hooks, 'PreToolUse', 'Edit|Write|Bash', SIGNATURES.enforcePreTool, buildCommandFor(projectRoot, 'enforce-pre-tool.sh'));
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
removeHook(existing.hooks, 'PreToolUse', SIGNATURES.enforcePreTool);
|
|
91
|
+
}
|
|
92
|
+
// Always strip stale entries from older rulebook versions, regardless of
|
|
93
|
+
// the qualityEnforcement flag. Without this, users upgrading from v5.5.x
|
|
94
|
+
// would still have settings.json pointing at deleted scripts.
|
|
95
|
+
for (const legacy of LEGACY_SIGNATURES) {
|
|
96
|
+
removeHook(existing.hooks, 'PreToolUse', legacy);
|
|
97
|
+
}
|
|
98
|
+
// Collapse empty arrays/objects so we don't leave noise behind.
|
|
99
|
+
pruneEmptyHooks(existing.hooks);
|
|
100
|
+
if (existing.env && Object.keys(existing.env).length === 0)
|
|
101
|
+
delete existing.env;
|
|
102
|
+
const after = JSON.stringify(existing, null, 2) + '\n';
|
|
103
|
+
const changed = beforeOnDisk === null || after !== beforeOnDisk;
|
|
104
|
+
if (changed) {
|
|
105
|
+
await writeFile(settingsPath, after);
|
|
106
|
+
}
|
|
107
|
+
return { path: settingsPath, changed };
|
|
108
|
+
}
|
|
109
|
+
function buildCommandFor(projectRoot, scriptName) {
|
|
110
|
+
const scriptPath = getHookScriptPath(projectRoot, scriptName);
|
|
111
|
+
return `bash ${scriptPath.replace(/\\/g, '/')}`;
|
|
112
|
+
}
|
|
113
|
+
function upsertHook(hooks, event, matcher, signature, command) {
|
|
114
|
+
const list = (hooks[event] ?? []);
|
|
115
|
+
hooks[event] = list;
|
|
116
|
+
// Find an existing entry matching our signature; replace its command.
|
|
117
|
+
for (const entry of list) {
|
|
118
|
+
for (const h of entry.hooks) {
|
|
119
|
+
if (h.type === 'command' && h.command.includes(signature)) {
|
|
120
|
+
h.command = command;
|
|
121
|
+
if (matcher !== undefined)
|
|
122
|
+
entry.matcher = matcher;
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
list.push({
|
|
128
|
+
...(matcher !== undefined ? { matcher } : {}),
|
|
129
|
+
hooks: [{ type: 'command', command }],
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
function removeHook(hooks, event, signature) {
|
|
133
|
+
const list = hooks[event];
|
|
134
|
+
if (!list)
|
|
135
|
+
return;
|
|
136
|
+
for (let i = list.length - 1; i >= 0; i--) {
|
|
137
|
+
const entry = list[i];
|
|
138
|
+
entry.hooks = entry.hooks.filter((h) => !(h.type === 'command' && h.command.includes(signature)));
|
|
139
|
+
if (entry.hooks.length === 0)
|
|
140
|
+
list.splice(i, 1);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function pruneEmptyHooks(hooks) {
|
|
144
|
+
for (const key of Object.keys(hooks)) {
|
|
145
|
+
const list = hooks[key];
|
|
146
|
+
if (!list || list.length === 0)
|
|
147
|
+
delete hooks[key];
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Copy the hook scripts required by the desired settings from the package
|
|
152
|
+
* `templates/hooks/` directory into the project's `.claude/hooks/` directory.
|
|
153
|
+
* Existing files are overwritten — the hooks are rulebook-owned.
|
|
154
|
+
*/
|
|
155
|
+
async function installHookScripts(projectRoot, desire) {
|
|
156
|
+
const templatesHookDir = path.join(getTemplatesDir(), 'hooks');
|
|
157
|
+
const destDir = path.join(projectRoot, '.claude', 'hooks');
|
|
158
|
+
await ensureDir(destDir);
|
|
159
|
+
const shellScripts = [];
|
|
160
|
+
if (desire.teamEnforcement) {
|
|
161
|
+
shellScripts.push('enforce-team-for-background-agents.sh');
|
|
162
|
+
shellScripts.push('enforce-team-for-background-agents.ps1');
|
|
163
|
+
}
|
|
164
|
+
if (desire.compactContextReinject) {
|
|
165
|
+
shellScripts.push('on-compact-reinject.sh');
|
|
166
|
+
}
|
|
167
|
+
if (desire.sessionHandoff) {
|
|
168
|
+
shellScripts.push('check-context-and-handoff.sh');
|
|
169
|
+
shellScripts.push('resume-from-handoff.sh');
|
|
170
|
+
}
|
|
171
|
+
if (desire.qualityEnforcement) {
|
|
172
|
+
shellScripts.push('enforce-pre-tool.sh');
|
|
173
|
+
}
|
|
174
|
+
if (desire.terseMode) {
|
|
175
|
+
shellScripts.push('terse-activate.sh');
|
|
176
|
+
shellScripts.push('terse-activate.ps1');
|
|
177
|
+
shellScripts.push('terse-mode-tracker.sh');
|
|
178
|
+
shellScripts.push('terse-mode-tracker.ps1');
|
|
179
|
+
}
|
|
180
|
+
for (const name of shellScripts) {
|
|
181
|
+
const src = path.join(templatesHookDir, name);
|
|
182
|
+
if (!(await fileExists(src)))
|
|
183
|
+
continue; // template not present yet
|
|
184
|
+
const dest = path.join(destDir, name);
|
|
185
|
+
if (name.endsWith('.sh')) {
|
|
186
|
+
await writeShellScript(dest, { sourcePath: src });
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
const content = await readFile(src);
|
|
190
|
+
await writeFile(dest, content);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=claude-settings-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-settings-manager.js","sourceRoot":"","sources":["../../../src/core/claude/claude-settings-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { createLogger } from '../logger.js';
|
|
2
|
+
import type { RulebookConfig } from '../../types.js';
|
|
3
|
+
export interface CLITool {
|
|
4
|
+
name: string;
|
|
5
|
+
command: string;
|
|
6
|
+
version?: string;
|
|
7
|
+
available: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface CLIResponse {
|
|
10
|
+
success: boolean;
|
|
11
|
+
output: string;
|
|
12
|
+
error?: string;
|
|
13
|
+
duration: number;
|
|
14
|
+
exitCode: number;
|
|
15
|
+
}
|
|
16
|
+
export declare class CLIBridge {
|
|
17
|
+
private logger;
|
|
18
|
+
private config;
|
|
19
|
+
private activeProcesses;
|
|
20
|
+
private onLog?;
|
|
21
|
+
private debugLogFile?;
|
|
22
|
+
private debugLogInitialized;
|
|
23
|
+
constructor(logger: ReturnType<typeof createLogger>, config: RulebookConfig);
|
|
24
|
+
/**
|
|
25
|
+
* Initialize debug logging (called once after singleton creation)
|
|
26
|
+
*/
|
|
27
|
+
private initializeDebugLog;
|
|
28
|
+
/**
|
|
29
|
+
* Write to debug log file
|
|
30
|
+
*/
|
|
31
|
+
private debugLog;
|
|
32
|
+
/**
|
|
33
|
+
* Set callback for logging (used by watcher UI)
|
|
34
|
+
*/
|
|
35
|
+
setLogCallback(callback: (level: 'info' | 'success' | 'warning' | 'error', message: string) => void): void;
|
|
36
|
+
/**
|
|
37
|
+
* Detect available CLI tools
|
|
38
|
+
*/
|
|
39
|
+
detectCLITools(): Promise<CLITool[]>;
|
|
40
|
+
/**
|
|
41
|
+
* Send command to CLI tool
|
|
42
|
+
*/
|
|
43
|
+
sendCommandToCLI(toolName: string, command: string, options?: {
|
|
44
|
+
timeout?: number;
|
|
45
|
+
workingDirectory?: string;
|
|
46
|
+
env?: Record<string, string>;
|
|
47
|
+
}): Promise<CLIResponse>;
|
|
48
|
+
/**
|
|
49
|
+
* Wait for CLI completion with timeout handling
|
|
50
|
+
*/
|
|
51
|
+
waitForCompletion(toolName: string, command: string, timeout?: number): Promise<CLIResponse>;
|
|
52
|
+
/**
|
|
53
|
+
* Handle CLI timeout by sending continue command
|
|
54
|
+
*/
|
|
55
|
+
handleTimeout(toolName: string, originalCommand: string): Promise<CLIResponse>;
|
|
56
|
+
/**
|
|
57
|
+
* Send task implementation command
|
|
58
|
+
*/
|
|
59
|
+
sendTaskCommand(toolName: string, task: {
|
|
60
|
+
id: string;
|
|
61
|
+
title: string;
|
|
62
|
+
description: string;
|
|
63
|
+
}): Promise<CLIResponse>;
|
|
64
|
+
/**
|
|
65
|
+
* Send continue implementation command
|
|
66
|
+
*/
|
|
67
|
+
sendContinueCommand(toolName: string, iterations?: number): Promise<CLIResponse>;
|
|
68
|
+
/**
|
|
69
|
+
* Send test command
|
|
70
|
+
*/
|
|
71
|
+
sendTestCommand(toolName: string): Promise<CLIResponse>;
|
|
72
|
+
/**
|
|
73
|
+
* Send lint command
|
|
74
|
+
*/
|
|
75
|
+
sendLintCommand(toolName: string): Promise<CLIResponse>;
|
|
76
|
+
/**
|
|
77
|
+
* Send format command
|
|
78
|
+
*/
|
|
79
|
+
sendFormatCommand(toolName: string): Promise<CLIResponse>;
|
|
80
|
+
/**
|
|
81
|
+
* Send commit command
|
|
82
|
+
*/
|
|
83
|
+
sendCommitCommand(toolName: string, message: string): Promise<CLIResponse>;
|
|
84
|
+
/**
|
|
85
|
+
* Check if CLI tool is responsive
|
|
86
|
+
*/
|
|
87
|
+
checkCLIHealth(toolName: string): Promise<boolean>;
|
|
88
|
+
/**
|
|
89
|
+
* Get CLI tool capabilities
|
|
90
|
+
*/
|
|
91
|
+
getCLICapabilities(toolName: string): Promise<string[]>;
|
|
92
|
+
/**
|
|
93
|
+
* Execute workflow step
|
|
94
|
+
*/
|
|
95
|
+
executeWorkflowStep(toolName: string, step: 'implement' | 'test' | 'lint' | 'format' | 'commit', context?: Record<string, unknown>): Promise<CLIResponse>;
|
|
96
|
+
/**
|
|
97
|
+
* Kill all active processes (cleanup)
|
|
98
|
+
*/
|
|
99
|
+
killAllProcesses(): Promise<void>;
|
|
100
|
+
/**
|
|
101
|
+
* Smart continue detection based on CLI output patterns
|
|
102
|
+
*/
|
|
103
|
+
smartContinueDetection(toolName: string, lastOutput: string): Promise<boolean>;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Create CLI bridge instance (singleton)
|
|
107
|
+
*/
|
|
108
|
+
export declare function createCLIBridge(logger: ReturnType<typeof createLogger>, config: RulebookConfig): CLIBridge;
|
|
109
|
+
/**
|
|
110
|
+
* Reset singleton (for testing only)
|
|
111
|
+
*/
|
|
112
|
+
export declare function resetCLIBridge(): void;
|
|
113
|
+
//# sourceMappingURL=cli-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-bridge.d.ts","sourceRoot":"","sources":["../../../src/core/console/cli-bridge.ts"],"names":[],"mappings":"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"}
|