@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
|
@@ -1,55 +1,55 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Claude Code PreToolUse hook for the Agent tool.
|
|
3
|
-
#
|
|
4
|
-
# Policy enforced by @hivehub/rulebook v5.3.0:
|
|
5
|
-
# - A single Agent call is fine (foreground or background).
|
|
6
|
-
# - Spawning multiple standalone Agents for parallel work is FORBIDDEN.
|
|
7
|
-
# Parallel multi-agent work MUST go through a Team so agents can
|
|
8
|
-
# communicate via SendMessage.
|
|
9
|
-
#
|
|
10
|
-
# Enforcement strategy:
|
|
11
|
-
# Block any Agent invocation with `run_in_background: true` UNLESS it
|
|
12
|
-
# targets `subagent_type: team-lead` or provides a `team_name`. This
|
|
13
|
-
# forces background parallel work to be coordinated through a Team.
|
|
14
|
-
#
|
|
15
|
-
# The hook reads the tool input JSON from stdin and emits a permission
|
|
16
|
-
# decision JSON on stdout, per Claude Code's PreToolUse hook contract.
|
|
17
|
-
|
|
18
|
-
set -euo pipefail
|
|
19
|
-
|
|
20
|
-
input="$(cat)"
|
|
21
|
-
|
|
22
|
-
tool_name="$(printf '%s' "$input" | jq -r '.tool_name // empty' 2>/dev/null || true)"
|
|
23
|
-
if [[ "$tool_name" != "Agent" ]]; then
|
|
24
|
-
# Not our concern — allow.
|
|
25
|
-
printf '%s' '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow"}}'
|
|
26
|
-
exit 0
|
|
27
|
-
fi
|
|
28
|
-
|
|
29
|
-
run_in_background="$(printf '%s' "$input" | jq -r '.tool_input.run_in_background // false' 2>/dev/null || echo false)"
|
|
30
|
-
subagent_type="$(printf '%s' "$input" | jq -r '.tool_input.subagent_type // empty' 2>/dev/null || true)"
|
|
31
|
-
team_name="$(printf '%s' "$input" | jq -r '.tool_input.team_name // empty' 2>/dev/null || true)"
|
|
32
|
-
|
|
33
|
-
# Foreground single agent → always allowed.
|
|
34
|
-
if [[ "$run_in_background" != "true" ]]; then
|
|
35
|
-
printf '%s' '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow"}}'
|
|
36
|
-
exit 0
|
|
37
|
-
fi
|
|
38
|
-
|
|
39
|
-
# Background agents must be part of a team OR be the team-lead coordinator.
|
|
40
|
-
if [[ "$subagent_type" == "team-lead" ]] || [[ -n "$team_name" ]]; then
|
|
41
|
-
printf '%s' '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow"}}'
|
|
42
|
-
exit 0
|
|
43
|
-
fi
|
|
44
|
-
|
|
45
|
-
# Block standalone background agent.
|
|
46
|
-
reason="POLICY VIOLATION: Spawning standalone background Agents is forbidden. Multi-agent parallel work MUST use a Team so agents can communicate via SendMessage. Either (a) use TeamCreate to create a team, (b) spawn a team-lead that creates the team, or (c) set team_name on the Agent call. See .claude/rules/multi-agent-teams.md for the policy."
|
|
47
|
-
|
|
48
|
-
jq -nc --arg reason "$reason" '{
|
|
49
|
-
hookSpecificOutput: {
|
|
50
|
-
hookEventName: "PreToolUse",
|
|
51
|
-
permissionDecision: "deny",
|
|
52
|
-
permissionDecisionReason: $reason
|
|
53
|
-
}
|
|
54
|
-
}'
|
|
55
|
-
exit 0
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Claude Code PreToolUse hook for the Agent tool.
|
|
3
|
+
#
|
|
4
|
+
# Policy enforced by @hivehub/rulebook v5.3.0:
|
|
5
|
+
# - A single Agent call is fine (foreground or background).
|
|
6
|
+
# - Spawning multiple standalone Agents for parallel work is FORBIDDEN.
|
|
7
|
+
# Parallel multi-agent work MUST go through a Team so agents can
|
|
8
|
+
# communicate via SendMessage.
|
|
9
|
+
#
|
|
10
|
+
# Enforcement strategy:
|
|
11
|
+
# Block any Agent invocation with `run_in_background: true` UNLESS it
|
|
12
|
+
# targets `subagent_type: team-lead` or provides a `team_name`. This
|
|
13
|
+
# forces background parallel work to be coordinated through a Team.
|
|
14
|
+
#
|
|
15
|
+
# The hook reads the tool input JSON from stdin and emits a permission
|
|
16
|
+
# decision JSON on stdout, per Claude Code's PreToolUse hook contract.
|
|
17
|
+
|
|
18
|
+
set -euo pipefail
|
|
19
|
+
|
|
20
|
+
input="$(cat)"
|
|
21
|
+
|
|
22
|
+
tool_name="$(printf '%s' "$input" | jq -r '.tool_name // empty' 2>/dev/null || true)"
|
|
23
|
+
if [[ "$tool_name" != "Agent" ]]; then
|
|
24
|
+
# Not our concern — allow.
|
|
25
|
+
printf '%s' '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow"}}'
|
|
26
|
+
exit 0
|
|
27
|
+
fi
|
|
28
|
+
|
|
29
|
+
run_in_background="$(printf '%s' "$input" | jq -r '.tool_input.run_in_background // false' 2>/dev/null || echo false)"
|
|
30
|
+
subagent_type="$(printf '%s' "$input" | jq -r '.tool_input.subagent_type // empty' 2>/dev/null || true)"
|
|
31
|
+
team_name="$(printf '%s' "$input" | jq -r '.tool_input.team_name // empty' 2>/dev/null || true)"
|
|
32
|
+
|
|
33
|
+
# Foreground single agent → always allowed.
|
|
34
|
+
if [[ "$run_in_background" != "true" ]]; then
|
|
35
|
+
printf '%s' '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow"}}'
|
|
36
|
+
exit 0
|
|
37
|
+
fi
|
|
38
|
+
|
|
39
|
+
# Background agents must be part of a team OR be the team-lead coordinator.
|
|
40
|
+
if [[ "$subagent_type" == "team-lead" ]] || [[ -n "$team_name" ]]; then
|
|
41
|
+
printf '%s' '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow"}}'
|
|
42
|
+
exit 0
|
|
43
|
+
fi
|
|
44
|
+
|
|
45
|
+
# Block standalone background agent.
|
|
46
|
+
reason="POLICY VIOLATION: Spawning standalone background Agents is forbidden. Multi-agent parallel work MUST use a Team so agents can communicate via SendMessage. Either (a) use TeamCreate to create a team, (b) spawn a team-lead that creates the team, or (c) set team_name on the Agent call. See .claude/rules/multi-agent-teams.md for the policy."
|
|
47
|
+
|
|
48
|
+
jq -nc --arg reason "$reason" '{
|
|
49
|
+
hookSpecificOutput: {
|
|
50
|
+
hookEventName: "PreToolUse",
|
|
51
|
+
permissionDecision: "deny",
|
|
52
|
+
permissionDecisionReason: $reason
|
|
53
|
+
}
|
|
54
|
+
}'
|
|
55
|
+
exit 0
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Claude Code SessionStart hook (matcher: "compact").
|
|
3
|
-
#
|
|
4
|
-
# Re-injects critical architectural context after a conversation
|
|
5
|
-
# compaction. Claude Code already re-loads CLAUDE.md on compact, so
|
|
6
|
-
# this hook is defense-in-depth: it outputs a short, always-fresh
|
|
7
|
-
# cheat sheet from `.rulebook/COMPACT_CONTEXT.md` so the model has
|
|
8
|
-
# the load-bearing reminders immediately available without waiting
|
|
9
|
-
# for the CLAUDE.md re-read.
|
|
10
|
-
#
|
|
11
|
-
# The file is user-editable. Rulebook seeds it during `init` from a
|
|
12
|
-
# stack-specific template and never overwrites it afterward.
|
|
13
|
-
|
|
14
|
-
set -euo pipefail
|
|
15
|
-
|
|
16
|
-
PROJECT_ROOT="$(pwd)"
|
|
17
|
-
CONTEXT_FILE="${PROJECT_ROOT}/.rulebook/COMPACT_CONTEXT.md"
|
|
18
|
-
|
|
19
|
-
if [[ ! -f "$CONTEXT_FILE" ]]; then
|
|
20
|
-
# Nothing to inject — emit a benign empty additionalContext.
|
|
21
|
-
printf '%s' '{"hookSpecificOutput":{"hookEventName":"SessionStart","additionalContext":""}}'
|
|
22
|
-
exit 0
|
|
23
|
-
fi
|
|
24
|
-
|
|
25
|
-
content="$(cat "$CONTEXT_FILE")"
|
|
26
|
-
|
|
27
|
-
# Emit as additionalContext via jq so we correctly escape newlines/quotes.
|
|
28
|
-
jq -nc --arg ctx "$content" '{
|
|
29
|
-
hookSpecificOutput: {
|
|
30
|
-
hookEventName: "SessionStart",
|
|
31
|
-
additionalContext: $ctx
|
|
32
|
-
}
|
|
33
|
-
}'
|
|
34
|
-
exit 0
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Claude Code SessionStart hook (matcher: "compact").
|
|
3
|
+
#
|
|
4
|
+
# Re-injects critical architectural context after a conversation
|
|
5
|
+
# compaction. Claude Code already re-loads CLAUDE.md on compact, so
|
|
6
|
+
# this hook is defense-in-depth: it outputs a short, always-fresh
|
|
7
|
+
# cheat sheet from `.rulebook/COMPACT_CONTEXT.md` so the model has
|
|
8
|
+
# the load-bearing reminders immediately available without waiting
|
|
9
|
+
# for the CLAUDE.md re-read.
|
|
10
|
+
#
|
|
11
|
+
# The file is user-editable. Rulebook seeds it during `init` from a
|
|
12
|
+
# stack-specific template and never overwrites it afterward.
|
|
13
|
+
|
|
14
|
+
set -euo pipefail
|
|
15
|
+
|
|
16
|
+
PROJECT_ROOT="$(pwd)"
|
|
17
|
+
CONTEXT_FILE="${PROJECT_ROOT}/.rulebook/COMPACT_CONTEXT.md"
|
|
18
|
+
|
|
19
|
+
if [[ ! -f "$CONTEXT_FILE" ]]; then
|
|
20
|
+
# Nothing to inject — emit a benign empty additionalContext.
|
|
21
|
+
printf '%s' '{"hookSpecificOutput":{"hookEventName":"SessionStart","additionalContext":""}}'
|
|
22
|
+
exit 0
|
|
23
|
+
fi
|
|
24
|
+
|
|
25
|
+
content="$(cat "$CONTEXT_FILE")"
|
|
26
|
+
|
|
27
|
+
# Emit as additionalContext via jq so we correctly escape newlines/quotes.
|
|
28
|
+
jq -nc --arg ctx "$content" '{
|
|
29
|
+
hookSpecificOutput: {
|
|
30
|
+
hookEventName: "SessionStart",
|
|
31
|
+
additionalContext: $ctx
|
|
32
|
+
}
|
|
33
|
+
}'
|
|
34
|
+
exit 0
|
|
@@ -1,61 +1,61 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Claude Code SessionStart hook — auto-restore from handoff.
|
|
3
|
-
#
|
|
4
|
-
# Checks for `.rulebook/handoff/_pending.md`. If present, emits its
|
|
5
|
-
# contents as additionalContext so the new session begins with full
|
|
6
|
-
# prior-session context loaded, then archives the file to
|
|
7
|
-
# `.rulebook/handoff/<ISO-timestamp>.md` for history.
|
|
8
|
-
|
|
9
|
-
set -euo pipefail
|
|
10
|
-
|
|
11
|
-
# Read hook input from stdin to get the actual project cwd
|
|
12
|
-
input="$(cat || true)"
|
|
13
|
-
PROJECT_ROOT=""
|
|
14
|
-
if [[ -n "$input" ]] && command -v jq &>/dev/null; then
|
|
15
|
-
PROJECT_ROOT="$(printf '%s' "$input" | jq -r '.cwd // empty' 2>/dev/null || true)"
|
|
16
|
-
fi
|
|
17
|
-
[[ -z "$PROJECT_ROOT" ]] && PROJECT_ROOT="${CLAUDE_PROJECT_DIR:-$(pwd)}"
|
|
18
|
-
HANDOFF_DIR="${PROJECT_ROOT}/.rulebook/handoff"
|
|
19
|
-
PENDING="${HANDOFF_DIR}/_pending.md"
|
|
20
|
-
URGENT="${HANDOFF_DIR}/.urgent"
|
|
21
|
-
CONFIG_FILE="${PROJECT_ROOT}/.rulebook/rulebook.json"
|
|
22
|
-
|
|
23
|
-
# No pending handoff — nothing to inject
|
|
24
|
-
if [[ ! -f "$PENDING" ]]; then
|
|
25
|
-
printf '%s' '{}'
|
|
26
|
-
exit 0
|
|
27
|
-
fi
|
|
28
|
-
|
|
29
|
-
content="$(cat "$PENDING")"
|
|
30
|
-
|
|
31
|
-
# Archive the pending file with ISO timestamp
|
|
32
|
-
timestamp=$(date -u +"%Y-%m-%dT%H-%M-%S")
|
|
33
|
-
archive_name="${timestamp}.md"
|
|
34
|
-
mv "$PENDING" "${HANDOFF_DIR}/${archive_name}"
|
|
35
|
-
|
|
36
|
-
# Clear urgent sentinel if present
|
|
37
|
-
rm -f "$URGENT"
|
|
38
|
-
|
|
39
|
-
# Prune old handoff files (keep max N, default 50)
|
|
40
|
-
max_history=50
|
|
41
|
-
if [[ -f "$CONFIG_FILE" ]] && command -v jq &>/dev/null; then
|
|
42
|
-
max_history=$(jq -r '.handoff.maxHistoryFiles // 50' "$CONFIG_FILE" 2>/dev/null || echo 50)
|
|
43
|
-
fi
|
|
44
|
-
|
|
45
|
-
# Count and prune (oldest first, skip _pending.md and .urgent)
|
|
46
|
-
history_count=$(find "$HANDOFF_DIR" -maxdepth 1 -name "*.md" -type f 2>/dev/null | wc -l)
|
|
47
|
-
if [[ "$history_count" -gt "$max_history" ]]; then
|
|
48
|
-
excess=$(( history_count - max_history ))
|
|
49
|
-
find "$HANDOFF_DIR" -maxdepth 1 -name "*.md" -type f -printf '%T@ %p\n' 2>/dev/null \
|
|
50
|
-
| sort -n | head -"$excess" | awk '{print $2}' | xargs rm -f
|
|
51
|
-
fi
|
|
52
|
-
|
|
53
|
-
# Emit the handoff content as additionalContext
|
|
54
|
-
header="## Session restored from handoff (${archive_name})\n\nThe following context was saved by the previous session's /handoff skill:\n\n"
|
|
55
|
-
jq -nc --arg ctx "${header}${content}" '{
|
|
56
|
-
hookSpecificOutput: {
|
|
57
|
-
hookEventName: "SessionStart",
|
|
58
|
-
additionalContext: $ctx
|
|
59
|
-
}
|
|
60
|
-
}'
|
|
61
|
-
exit 0
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Claude Code SessionStart hook — auto-restore from handoff.
|
|
3
|
+
#
|
|
4
|
+
# Checks for `.rulebook/handoff/_pending.md`. If present, emits its
|
|
5
|
+
# contents as additionalContext so the new session begins with full
|
|
6
|
+
# prior-session context loaded, then archives the file to
|
|
7
|
+
# `.rulebook/handoff/<ISO-timestamp>.md` for history.
|
|
8
|
+
|
|
9
|
+
set -euo pipefail
|
|
10
|
+
|
|
11
|
+
# Read hook input from stdin to get the actual project cwd
|
|
12
|
+
input="$(cat || true)"
|
|
13
|
+
PROJECT_ROOT=""
|
|
14
|
+
if [[ -n "$input" ]] && command -v jq &>/dev/null; then
|
|
15
|
+
PROJECT_ROOT="$(printf '%s' "$input" | jq -r '.cwd // empty' 2>/dev/null || true)"
|
|
16
|
+
fi
|
|
17
|
+
[[ -z "$PROJECT_ROOT" ]] && PROJECT_ROOT="${CLAUDE_PROJECT_DIR:-$(pwd)}"
|
|
18
|
+
HANDOFF_DIR="${PROJECT_ROOT}/.rulebook/handoff"
|
|
19
|
+
PENDING="${HANDOFF_DIR}/_pending.md"
|
|
20
|
+
URGENT="${HANDOFF_DIR}/.urgent"
|
|
21
|
+
CONFIG_FILE="${PROJECT_ROOT}/.rulebook/rulebook.json"
|
|
22
|
+
|
|
23
|
+
# No pending handoff — nothing to inject
|
|
24
|
+
if [[ ! -f "$PENDING" ]]; then
|
|
25
|
+
printf '%s' '{}'
|
|
26
|
+
exit 0
|
|
27
|
+
fi
|
|
28
|
+
|
|
29
|
+
content="$(cat "$PENDING")"
|
|
30
|
+
|
|
31
|
+
# Archive the pending file with ISO timestamp
|
|
32
|
+
timestamp=$(date -u +"%Y-%m-%dT%H-%M-%S")
|
|
33
|
+
archive_name="${timestamp}.md"
|
|
34
|
+
mv "$PENDING" "${HANDOFF_DIR}/${archive_name}"
|
|
35
|
+
|
|
36
|
+
# Clear urgent sentinel if present
|
|
37
|
+
rm -f "$URGENT"
|
|
38
|
+
|
|
39
|
+
# Prune old handoff files (keep max N, default 50)
|
|
40
|
+
max_history=50
|
|
41
|
+
if [[ -f "$CONFIG_FILE" ]] && command -v jq &>/dev/null; then
|
|
42
|
+
max_history=$(jq -r '.handoff.maxHistoryFiles // 50' "$CONFIG_FILE" 2>/dev/null || echo 50)
|
|
43
|
+
fi
|
|
44
|
+
|
|
45
|
+
# Count and prune (oldest first, skip _pending.md and .urgent)
|
|
46
|
+
history_count=$(find "$HANDOFF_DIR" -maxdepth 1 -name "*.md" -type f 2>/dev/null | wc -l)
|
|
47
|
+
if [[ "$history_count" -gt "$max_history" ]]; then
|
|
48
|
+
excess=$(( history_count - max_history ))
|
|
49
|
+
find "$HANDOFF_DIR" -maxdepth 1 -name "*.md" -type f -printf '%T@ %p\n' 2>/dev/null \
|
|
50
|
+
| sort -n | head -"$excess" | awk '{print $2}' | xargs rm -f
|
|
51
|
+
fi
|
|
52
|
+
|
|
53
|
+
# Emit the handoff content as additionalContext
|
|
54
|
+
header="## Session restored from handoff (${archive_name})\n\nThe following context was saved by the previous session's /handoff skill:\n\n"
|
|
55
|
+
jq -nc --arg ctx "${header}${content}" '{
|
|
56
|
+
hookSpecificOutput: {
|
|
57
|
+
hookEventName: "SessionStart",
|
|
58
|
+
additionalContext: $ctx
|
|
59
|
+
}
|
|
60
|
+
}'
|
|
61
|
+
exit 0
|