@hivehub/rulebook 4.3.1 → 5.0.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.
Files changed (115) hide show
  1. package/.claude/commands/rulebook-decision-create.md +55 -0
  2. package/.claude/commands/rulebook-decision-list.md +15 -0
  3. package/.claude/commands/rulebook-knowledge-add.md +41 -0
  4. package/.claude/commands/rulebook-knowledge-list.md +15 -0
  5. package/.claude/commands/rulebook-learn-capture.md +48 -0
  6. package/.claude/commands/rulebook-learn-list.md +13 -0
  7. package/.claude/commands/rulebook-task-archive.md +24 -0
  8. package/.claude-plugin/plugin.json +1 -1
  9. package/README.md +53 -10
  10. package/dist/cli/commands.d.ts +32 -0
  11. package/dist/cli/commands.d.ts.map +1 -1
  12. package/dist/cli/commands.js +257 -0
  13. package/dist/cli/commands.js.map +1 -1
  14. package/dist/core/agent-template-engine.d.ts +51 -0
  15. package/dist/core/agent-template-engine.d.ts.map +1 -0
  16. package/dist/core/agent-template-engine.js +273 -0
  17. package/dist/core/agent-template-engine.js.map +1 -0
  18. package/dist/core/complexity-detector.d.ts +36 -0
  19. package/dist/core/complexity-detector.d.ts.map +1 -0
  20. package/dist/core/complexity-detector.js +254 -0
  21. package/dist/core/complexity-detector.js.map +1 -0
  22. package/dist/core/decision-manager.d.ts +25 -0
  23. package/dist/core/decision-manager.d.ts.map +1 -0
  24. package/dist/core/decision-manager.js +188 -0
  25. package/dist/core/decision-manager.js.map +1 -0
  26. package/dist/core/generator.d.ts +1 -0
  27. package/dist/core/generator.d.ts.map +1 -1
  28. package/dist/core/generator.js +47 -3
  29. package/dist/core/generator.js.map +1 -1
  30. package/dist/core/indexer/background-indexer.d.ts +9 -2
  31. package/dist/core/indexer/background-indexer.d.ts.map +1 -1
  32. package/dist/core/indexer/background-indexer.js +99 -83
  33. package/dist/core/indexer/background-indexer.js.map +1 -1
  34. package/dist/core/knowledge-manager.d.ts +24 -0
  35. package/dist/core/knowledge-manager.d.ts.map +1 -0
  36. package/dist/core/knowledge-manager.js +173 -0
  37. package/dist/core/knowledge-manager.js.map +1 -0
  38. package/dist/core/learn-manager.d.ts +29 -0
  39. package/dist/core/learn-manager.d.ts.map +1 -0
  40. package/dist/core/learn-manager.js +159 -0
  41. package/dist/core/learn-manager.js.map +1 -0
  42. package/dist/core/rule-engine.d.ts +64 -0
  43. package/dist/core/rule-engine.d.ts.map +1 -0
  44. package/dist/core/rule-engine.js +333 -0
  45. package/dist/core/rule-engine.js.map +1 -0
  46. package/dist/core/task-manager.d.ts +4 -0
  47. package/dist/core/task-manager.d.ts.map +1 -1
  48. package/dist/core/task-manager.js +39 -24
  49. package/dist/core/task-manager.js.map +1 -1
  50. package/dist/core/workspace/project-worker.d.ts +9 -0
  51. package/dist/core/workspace/project-worker.d.ts.map +1 -1
  52. package/dist/core/workspace/project-worker.js +27 -0
  53. package/dist/core/workspace/project-worker.js.map +1 -1
  54. package/dist/index.js +250 -1
  55. package/dist/index.js.map +1 -1
  56. package/dist/mcp/rulebook-server.d.ts.map +1 -1
  57. package/dist/mcp/rulebook-server.js +758 -22
  58. package/dist/mcp/rulebook-server.js.map +1 -1
  59. package/dist/memory/hnsw-index.d.ts +3 -1
  60. package/dist/memory/hnsw-index.d.ts.map +1 -1
  61. package/dist/memory/hnsw-index.js +121 -18
  62. package/dist/memory/hnsw-index.js.map +1 -1
  63. package/dist/memory/memory-manager.d.ts +5 -0
  64. package/dist/memory/memory-manager.d.ts.map +1 -1
  65. package/dist/memory/memory-manager.js +34 -8
  66. package/dist/memory/memory-manager.js.map +1 -1
  67. package/dist/memory/memory-store.d.ts +15 -3
  68. package/dist/memory/memory-store.d.ts.map +1 -1
  69. package/dist/memory/memory-store.js +327 -272
  70. package/dist/memory/memory-store.js.map +1 -1
  71. package/dist/types.d.ts +60 -0
  72. package/dist/types.d.ts.map +1 -1
  73. package/package.json +8 -3
  74. package/templates/agents/compiler/codegen-debugger.md +34 -0
  75. package/templates/agents/compiler/stdlib-engineer.md +28 -0
  76. package/templates/agents/compiler/test-coverage-guardian.md +31 -0
  77. package/templates/agents/context-intelligence.md +52 -0
  78. package/templates/agents/game-engine/cpp-core-expert.md +35 -0
  79. package/templates/agents/game-engine/render-engineer.md +22 -0
  80. package/templates/agents/game-engine/shader-engineer.md +38 -0
  81. package/templates/agents/game-engine/systems-integration.md +43 -0
  82. package/templates/agents/generic/code-reviewer.md +39 -0
  83. package/templates/agents/generic/docs-writer.md +25 -0
  84. package/templates/agents/generic/project-manager.md +34 -0
  85. package/templates/agents/generic/researcher.md +34 -0
  86. package/templates/agents/generic/test-engineer.md +40 -0
  87. package/templates/agents/mobile/platform-specialist.md +22 -0
  88. package/templates/agents/mobile/ui-engineer.md +22 -0
  89. package/templates/agents/web-app/api-designer.md +22 -0
  90. package/templates/agents/web-app/backend-engineer.md +30 -0
  91. package/templates/agents/web-app/database-engineer.md +22 -0
  92. package/templates/agents/web-app/frontend-engineer.md +29 -0
  93. package/templates/agents/web-app/security-reviewer.md +32 -0
  94. package/templates/commands/rulebook-decision-create.md +55 -0
  95. package/templates/commands/rulebook-decision-list.md +15 -0
  96. package/templates/commands/rulebook-knowledge-add.md +41 -0
  97. package/templates/commands/rulebook-knowledge-list.md +15 -0
  98. package/templates/commands/rulebook-learn-capture.md +48 -0
  99. package/templates/commands/rulebook-learn-list.md +13 -0
  100. package/templates/core/AGENT_AUTOMATION.md +8 -0
  101. package/templates/core/DECISIONS.md +38 -0
  102. package/templates/core/KNOWLEDGE.md +49 -0
  103. package/templates/core/RULEBOOK.md +12 -0
  104. package/templates/core/TIER1_PROHIBITIONS.md +154 -0
  105. package/templates/core/TOKEN_OPTIMIZATION.md +49 -0
  106. package/templates/git/GIT_WORKFLOW.md +35 -0
  107. package/templates/rules/follow-task-sequence.md +36 -0
  108. package/templates/rules/git-safety.md +29 -0
  109. package/templates/rules/incremental-tests.md +29 -0
  110. package/templates/rules/no-deferred.md +31 -0
  111. package/templates/rules/no-shortcuts.md +30 -0
  112. package/templates/rules/research-first.md +30 -0
  113. package/templates/rules/sequential-editing.md +21 -0
  114. package/templates/rules/session-workflow.md +24 -0
  115. package/templates/rules/task-decomposition.md +32 -0
@@ -0,0 +1,159 @@
1
+ import { existsSync, mkdirSync, readdirSync } from 'fs';
2
+ import { join } from 'path';
3
+ import { readFile as readFileUtil, writeFile as writeFileUtil, } from '../utils/file-system.js';
4
+ import { DecisionManager } from './decision-manager.js';
5
+ import { KnowledgeManager } from './knowledge-manager.js';
6
+ const LEARNINGS_DIR = 'learnings';
7
+ function slugify(title) {
8
+ return title
9
+ .toLowerCase()
10
+ .replace(/[^a-z0-9]+/g, '-')
11
+ .replace(/^-|-$/g, '');
12
+ }
13
+ export class LearnManager {
14
+ learningsPath;
15
+ ralphHistoryPath;
16
+ decisionManager;
17
+ knowledgeManager;
18
+ constructor(projectRoot, rulebookDir = '.rulebook') {
19
+ const rbPath = join(projectRoot, rulebookDir);
20
+ this.learningsPath = join(rbPath, LEARNINGS_DIR);
21
+ this.ralphHistoryPath = join(rbPath, 'ralph', 'history');
22
+ this.decisionManager = new DecisionManager(projectRoot, rulebookDir);
23
+ this.knowledgeManager = new KnowledgeManager(projectRoot, rulebookDir);
24
+ }
25
+ ensureDir() {
26
+ if (!existsSync(this.learningsPath)) {
27
+ mkdirSync(this.learningsPath, { recursive: true });
28
+ }
29
+ }
30
+ async capture(title, content, options = {}) {
31
+ this.ensureDir();
32
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
33
+ const slug = slugify(title);
34
+ const id = `${timestamp}-${slug}`;
35
+ const learning = {
36
+ id,
37
+ title,
38
+ content,
39
+ source: options.source ?? 'manual',
40
+ relatedTask: options.relatedTask,
41
+ relatedDecision: options.relatedDecision,
42
+ tags: options.tags ?? [],
43
+ createdAt: new Date().toISOString(),
44
+ };
45
+ // Write markdown
46
+ const md = [
47
+ `# ${title}`,
48
+ '',
49
+ `**Source**: ${learning.source}`,
50
+ `**Date**: ${learning.createdAt.split('T')[0]}`,
51
+ learning.relatedTask ? `**Related Task**: ${learning.relatedTask}` : '',
52
+ learning.tags.length > 0 ? `**Tags**: ${learning.tags.join(', ')}` : '',
53
+ '',
54
+ content,
55
+ '',
56
+ ]
57
+ .filter(Boolean)
58
+ .join('\n');
59
+ await writeFileUtil(join(this.learningsPath, `${id}.md`), md);
60
+ await writeFileUtil(join(this.learningsPath, `${id}.metadata.json`), JSON.stringify(learning, null, 2));
61
+ return learning;
62
+ }
63
+ async fromRalph() {
64
+ this.ensureDir();
65
+ if (!existsSync(this.ralphHistoryPath))
66
+ return [];
67
+ const files = readdirSync(this.ralphHistoryPath).filter((f) => f.startsWith('iteration-') && f.endsWith('.json'));
68
+ // Load existing learning titles for dedup
69
+ const existing = await this.list();
70
+ const existingTitles = new Set(existing.map((l) => l.title));
71
+ const newLearnings = [];
72
+ for (const file of files) {
73
+ const raw = await readFileUtil(join(this.ralphHistoryPath, file));
74
+ if (!raw)
75
+ continue;
76
+ try {
77
+ const iteration = JSON.parse(raw);
78
+ const learnings = iteration.learnings ?? [];
79
+ for (const text of learnings) {
80
+ // Use first line or first 60 chars as title
81
+ const title = text.split('\n')[0].slice(0, 80);
82
+ if (existingTitles.has(title))
83
+ continue;
84
+ existingTitles.add(title);
85
+ const learning = await this.capture(title, text, {
86
+ source: 'ralph',
87
+ relatedTask: iteration.task_id,
88
+ tags: ['ralph', `iteration-${iteration.iteration}`],
89
+ });
90
+ newLearnings.push(learning);
91
+ }
92
+ }
93
+ catch {
94
+ // skip malformed
95
+ }
96
+ }
97
+ return newLearnings;
98
+ }
99
+ async list(limit) {
100
+ this.ensureDir();
101
+ const files = readdirSync(this.learningsPath).filter((f) => f.endsWith('.metadata.json'));
102
+ const learnings = [];
103
+ for (const file of files) {
104
+ const raw = await readFileUtil(join(this.learningsPath, file));
105
+ if (!raw)
106
+ continue;
107
+ try {
108
+ learnings.push(JSON.parse(raw));
109
+ }
110
+ catch {
111
+ // skip malformed
112
+ }
113
+ }
114
+ // Sort newest first
115
+ learnings.sort((a, b) => b.createdAt.localeCompare(a.createdAt));
116
+ return limit ? learnings.slice(0, limit) : learnings;
117
+ }
118
+ async show(id) {
119
+ this.ensureDir();
120
+ const metaPath = join(this.learningsPath, `${id}.metadata.json`);
121
+ if (!existsSync(metaPath))
122
+ return null;
123
+ const raw = await readFileUtil(metaPath);
124
+ if (!raw)
125
+ return null;
126
+ const learning = JSON.parse(raw);
127
+ const content = (await readFileUtil(join(this.learningsPath, `${id}.md`))) ?? '';
128
+ return { learning, content };
129
+ }
130
+ async promote(id, target, options = {}) {
131
+ const result = await this.show(id);
132
+ if (!result)
133
+ return null;
134
+ const { learning } = result;
135
+ const title = options.title ?? learning.title;
136
+ let targetId;
137
+ if (target === 'knowledge') {
138
+ const entry = await this.knowledgeManager.add('pattern', title, {
139
+ category: options.category ?? 'code',
140
+ description: learning.content,
141
+ tags: learning.tags,
142
+ source: 'learn',
143
+ });
144
+ targetId = entry.id;
145
+ }
146
+ else {
147
+ const decision = await this.decisionManager.create(title, {
148
+ context: learning.content,
149
+ relatedTasks: learning.relatedTask ? [learning.relatedTask] : undefined,
150
+ });
151
+ targetId = String(decision.id);
152
+ }
153
+ // Mark as promoted
154
+ learning.promotedTo = { type: target, id: targetId };
155
+ await writeFileUtil(join(this.learningsPath, `${id}.metadata.json`), JSON.stringify(learning, null, 2));
156
+ return { type: target, id: targetId };
157
+ }
158
+ }
159
+ //# sourceMappingURL=learn-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learn-manager.js","sourceRoot":"","sources":["../../src/core/learn-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Canonical Rule Engine — v5.0 One Source, Multiple Projections
3
+ *
4
+ * Rules live in `.rulebook/rules/` with YAML frontmatter. The engine reads
5
+ * canonical rules and projects them to each detected AI tool's format:
6
+ *
7
+ * - Claude Code → `.claude/rules/<name>.md`
8
+ * - Cursor → `.cursor/rules/<name>.mdc` (with YAML frontmatter)
9
+ * - Gemini → sections in `GEMINI.md`
10
+ * - Copilot → sections in `.github/copilot-instructions.md`
11
+ * - Windsurf → `.windsurf/rules/<name>.md`
12
+ * - Continue.dev → `.continue/rules/<name>.md`
13
+ */
14
+ export type RuleTier = 1 | 2 | 3;
15
+ export type ToolTarget = 'all' | 'claude-code' | 'cursor' | 'gemini' | 'codex' | 'windsurf' | 'continue' | 'copilot';
16
+ export interface CanonicalRule {
17
+ name: string;
18
+ tier: RuleTier;
19
+ description: string;
20
+ alwaysApply: boolean;
21
+ filePatterns: string[];
22
+ tools: ToolTarget[];
23
+ body: string;
24
+ }
25
+ export interface RuleProjectionResult {
26
+ claudeCode: string[];
27
+ cursor: string[];
28
+ gemini: string[];
29
+ copilot: string[];
30
+ windsurf: string[];
31
+ continueDev: string[];
32
+ }
33
+ /**
34
+ * Load all canonical rules from `.rulebook/rules/` directory.
35
+ */
36
+ export declare function loadCanonicalRules(projectRoot: string): Promise<CanonicalRule[]>;
37
+ export interface DetectedTools {
38
+ claudeCode?: boolean;
39
+ cursor?: boolean;
40
+ gemini?: boolean;
41
+ codex?: boolean;
42
+ windsurf?: boolean;
43
+ continueDev?: boolean;
44
+ copilot?: boolean;
45
+ }
46
+ /**
47
+ * Project all canonical rules to all detected tools.
48
+ * One source (`.rulebook/rules/`), multiple projections.
49
+ */
50
+ export declare function projectRules(projectRoot: string, detectedTools: DetectedTools): Promise<RuleProjectionResult>;
51
+ /**
52
+ * List all canonical rules with their metadata (for CLI/MCP).
53
+ */
54
+ export declare function listRules(projectRoot: string): Promise<Array<{
55
+ name: string;
56
+ tier: RuleTier;
57
+ description: string;
58
+ tools: ToolTarget[];
59
+ }>>;
60
+ /**
61
+ * Install a rule from the built-in template library into `.rulebook/rules/`.
62
+ */
63
+ export declare function installRule(projectRoot: string, templateName: string, templatesDir: string): Promise<string | null>;
64
+ //# sourceMappingURL=rule-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-engine.d.ts","sourceRoot":"","sources":["../../src/core/rule-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH,MAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAEjC,MAAM,MAAM,UAAU,GAClB,KAAK,GACL,aAAa,GACb,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,UAAU,GACV,UAAU,GACV,SAAS,CAAC;AAEd,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAgDD;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CA2BtF;AAoOD,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,aAAa,GAC3B,OAAO,CAAC,oBAAoB,CAAC,CAyB/B;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,CAAA;CAAE,CAAC,CAAC,CAQ5F;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAWxB"}
@@ -0,0 +1,333 @@
1
+ /**
2
+ * Canonical Rule Engine — v5.0 One Source, Multiple Projections
3
+ *
4
+ * Rules live in `.rulebook/rules/` with YAML frontmatter. The engine reads
5
+ * canonical rules and projects them to each detected AI tool's format:
6
+ *
7
+ * - Claude Code → `.claude/rules/<name>.md`
8
+ * - Cursor → `.cursor/rules/<name>.mdc` (with YAML frontmatter)
9
+ * - Gemini → sections in `GEMINI.md`
10
+ * - Copilot → sections in `.github/copilot-instructions.md`
11
+ * - Windsurf → `.windsurf/rules/<name>.md`
12
+ * - Continue.dev → `.continue/rules/<name>.md`
13
+ */
14
+ import { existsSync } from 'fs';
15
+ import { readFile, writeFile, mkdir, readdir } from 'fs/promises';
16
+ import { join, basename } from 'path';
17
+ // ── Frontmatter Parser ──────────────────────────────────────────────────
18
+ /**
19
+ * Parse YAML-like frontmatter from a markdown file.
20
+ * Handles simple key: value, key: [array], and key: true/false.
21
+ * Does NOT require a full YAML parser dependency.
22
+ */
23
+ function parseFrontmatter(content) {
24
+ const fmMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);
25
+ if (!fmMatch) {
26
+ return { meta: {}, body: content };
27
+ }
28
+ const meta = {};
29
+ const fmLines = fmMatch[1].split(/\r?\n/);
30
+ for (const line of fmLines) {
31
+ const kv = line.match(/^(\w+)\s*:\s*(.+)$/);
32
+ if (!kv)
33
+ continue;
34
+ const key = kv[1];
35
+ let val = kv[2].trim();
36
+ // Parse arrays: ["a", "b"] or [a, b]
37
+ if (typeof val === 'string' && val.startsWith('[') && val.endsWith(']')) {
38
+ val = val
39
+ .slice(1, -1)
40
+ .split(',')
41
+ .map((s) => s.trim().replace(/^["']|["']$/g, ''))
42
+ .filter(Boolean);
43
+ }
44
+ // Parse booleans
45
+ else if (val === 'true')
46
+ val = true;
47
+ else if (val === 'false')
48
+ val = false;
49
+ // Parse numbers
50
+ else if (typeof val === 'string' && /^\d+$/.test(val))
51
+ val = parseInt(val, 10);
52
+ // Strip quotes
53
+ else if (typeof val === 'string')
54
+ val = val.replace(/^["']|["']$/g, '');
55
+ meta[key] = val;
56
+ }
57
+ return { meta, body: fmMatch[2] };
58
+ }
59
+ // ── Rule Loading ────────────────────────────────────────────────────────
60
+ /**
61
+ * Load all canonical rules from `.rulebook/rules/` directory.
62
+ */
63
+ export async function loadCanonicalRules(projectRoot) {
64
+ const rulesDir = join(projectRoot, '.rulebook', 'rules');
65
+ if (!existsSync(rulesDir))
66
+ return [];
67
+ const files = await readdir(rulesDir);
68
+ const rules = [];
69
+ for (const file of files) {
70
+ if (!file.endsWith('.md'))
71
+ continue;
72
+ const content = await readFile(join(rulesDir, file), 'utf-8');
73
+ const { meta, body } = parseFrontmatter(content);
74
+ rules.push({
75
+ name: meta.name || basename(file, '.md'),
76
+ tier: meta.tier || 2,
77
+ description: meta.description || '',
78
+ alwaysApply: meta.alwaysApply === true,
79
+ filePatterns: Array.isArray(meta.filePatterns) ? meta.filePatterns : ['*'],
80
+ tools: Array.isArray(meta.tools) ? meta.tools : ['all'],
81
+ body: body.trim(),
82
+ });
83
+ }
84
+ // Sort by tier (1 first) then name
85
+ rules.sort((a, b) => a.tier - b.tier || a.name.localeCompare(b.name));
86
+ return rules;
87
+ }
88
+ // ── Rule Projection ─────────────────────────────────────────────────────
89
+ function shouldTarget(rule, tool) {
90
+ return rule.tools.includes('all') || rule.tools.includes(tool);
91
+ }
92
+ /**
93
+ * Project rules to Claude Code format: `.claude/rules/<name>.md`
94
+ * Claude Code rules are plain markdown — no special frontmatter.
95
+ */
96
+ async function projectToClaudeCode(projectRoot, rules) {
97
+ const targetRules = rules.filter((r) => shouldTarget(r, 'claude-code'));
98
+ if (targetRules.length === 0)
99
+ return [];
100
+ const dir = join(projectRoot, '.claude', 'rules');
101
+ if (!existsSync(dir))
102
+ await mkdir(dir, { recursive: true });
103
+ const written = [];
104
+ for (const rule of targetRules) {
105
+ const filePath = join(dir, `${rule.name}.md`);
106
+ const content = `# ${rule.description || rule.name}\n\n${rule.body}\n`;
107
+ await writeFile(filePath, content, 'utf-8');
108
+ written.push(filePath);
109
+ }
110
+ return written;
111
+ }
112
+ /**
113
+ * Project rules to Cursor format: `.cursor/rules/<name>.mdc`
114
+ * Cursor uses YAML frontmatter with `description`, `alwaysApply`, and `globs`.
115
+ */
116
+ async function projectToCursor(projectRoot, rules) {
117
+ const targetRules = rules.filter((r) => shouldTarget(r, 'cursor'));
118
+ if (targetRules.length === 0)
119
+ return [];
120
+ const dir = join(projectRoot, '.cursor', 'rules');
121
+ if (!existsSync(dir))
122
+ await mkdir(dir, { recursive: true });
123
+ const written = [];
124
+ for (const rule of targetRules) {
125
+ const filePath = join(dir, `${rule.name}.mdc`);
126
+ let frontmatter = `---\ndescription: "${rule.description}"\n`;
127
+ if (rule.alwaysApply) {
128
+ frontmatter += `alwaysApply: true\n`;
129
+ }
130
+ else if (rule.filePatterns.length > 0 && rule.filePatterns[0] !== '*') {
131
+ const globs = JSON.stringify(rule.filePatterns);
132
+ frontmatter += `globs: ${globs}\n`;
133
+ }
134
+ frontmatter += `---\n`;
135
+ const content = `${frontmatter}\n${rule.body}\n`;
136
+ await writeFile(filePath, content, 'utf-8');
137
+ written.push(filePath);
138
+ }
139
+ return written;
140
+ }
141
+ /**
142
+ * Project rules to Gemini format: sections in `GEMINI.md`.
143
+ * Groups rules by tier with appropriate headings.
144
+ */
145
+ async function projectToGemini(projectRoot, rules) {
146
+ const targetRules = rules.filter((r) => shouldTarget(r, 'gemini'));
147
+ if (targetRules.length === 0)
148
+ return [];
149
+ const filePath = join(projectRoot, 'GEMINI.md');
150
+ const tierHeadings = {
151
+ 1: '## Highest Precedence Rules (Tier 1)',
152
+ 2: '## Mandatory Workflow Rules (Tier 2)',
153
+ 3: '## Standards (Tier 3)',
154
+ };
155
+ const sections = [
156
+ '<!-- RULEBOOK:START -->',
157
+ '# Project Rules for Gemini',
158
+ '',
159
+ 'Generated by @hivehub/rulebook. Do not edit manually.',
160
+ '',
161
+ ];
162
+ for (const tier of [1, 2, 3]) {
163
+ const tierRules = targetRules.filter((r) => r.tier === tier);
164
+ if (tierRules.length === 0)
165
+ continue;
166
+ sections.push(tierHeadings[tier]);
167
+ sections.push('');
168
+ for (const rule of tierRules) {
169
+ sections.push(`### ${rule.description || rule.name}`);
170
+ sections.push('');
171
+ sections.push(rule.body);
172
+ sections.push('');
173
+ }
174
+ }
175
+ sections.push('<!-- RULEBOOK:END -->');
176
+ sections.push('');
177
+ // Preserve user content outside RULEBOOK markers
178
+ if (existsSync(filePath)) {
179
+ const existing = await readFile(filePath, 'utf-8');
180
+ if (existing.includes('<!-- RULEBOOK:START -->')) {
181
+ const before = existing.split('<!-- RULEBOOK:START -->')[0];
182
+ const afterParts = existing.split('<!-- RULEBOOK:END -->');
183
+ const after = afterParts.length > 1 ? afterParts[afterParts.length - 1] : '';
184
+ await writeFile(filePath, before + sections.join('\n') + after, 'utf-8');
185
+ }
186
+ else if (!existing.includes('<!-- RULEBOOK:START -->')) {
187
+ // User-owned file without markers — skip
188
+ return [];
189
+ }
190
+ }
191
+ else {
192
+ await writeFile(filePath, sections.join('\n'), 'utf-8');
193
+ }
194
+ return [filePath];
195
+ }
196
+ /**
197
+ * Project rules to Copilot format: sections in `.github/copilot-instructions.md`.
198
+ */
199
+ async function projectToCopilot(projectRoot, rules) {
200
+ const targetRules = rules.filter((r) => shouldTarget(r, 'copilot'));
201
+ if (targetRules.length === 0)
202
+ return [];
203
+ const dir = join(projectRoot, '.github');
204
+ if (!existsSync(dir))
205
+ await mkdir(dir, { recursive: true });
206
+ const filePath = join(dir, 'copilot-instructions.md');
207
+ const sections = [
208
+ '<!-- RULEBOOK:START -->',
209
+ '# Project Rules for GitHub Copilot',
210
+ '',
211
+ 'Generated by @hivehub/rulebook. Do not edit between RULEBOOK markers.',
212
+ '',
213
+ ];
214
+ for (const rule of targetRules) {
215
+ sections.push(`## ${rule.description || rule.name}`);
216
+ sections.push('');
217
+ sections.push(rule.body);
218
+ sections.push('');
219
+ }
220
+ sections.push('<!-- RULEBOOK:END -->');
221
+ sections.push('');
222
+ // Preserve user content outside markers
223
+ if (existsSync(filePath)) {
224
+ const existing = await readFile(filePath, 'utf-8');
225
+ if (existing.includes('<!-- RULEBOOK:START -->')) {
226
+ const before = existing.split('<!-- RULEBOOK:START -->')[0];
227
+ const afterParts = existing.split('<!-- RULEBOOK:END -->');
228
+ const after = afterParts.length > 1 ? afterParts[afterParts.length - 1] : '';
229
+ await writeFile(filePath, before + sections.join('\n') + after, 'utf-8');
230
+ }
231
+ else {
232
+ return []; // User-owned file
233
+ }
234
+ }
235
+ else {
236
+ await writeFile(filePath, sections.join('\n'), 'utf-8');
237
+ }
238
+ return [filePath];
239
+ }
240
+ /**
241
+ * Project rules to Windsurf format: `.windsurf/rules/<name>.md`
242
+ */
243
+ async function projectToWindsurf(projectRoot, rules) {
244
+ const targetRules = rules.filter((r) => shouldTarget(r, 'windsurf'));
245
+ if (targetRules.length === 0)
246
+ return [];
247
+ const dir = join(projectRoot, '.windsurf', 'rules');
248
+ if (!existsSync(dir))
249
+ await mkdir(dir, { recursive: true });
250
+ const written = [];
251
+ for (const rule of targetRules) {
252
+ const filePath = join(dir, `${rule.name}.md`);
253
+ const content = `# ${rule.description || rule.name}\n\n${rule.body}\n`;
254
+ await writeFile(filePath, content, 'utf-8');
255
+ written.push(filePath);
256
+ }
257
+ return written;
258
+ }
259
+ /**
260
+ * Project rules to Continue.dev format: `.continue/rules/<name>.md`
261
+ */
262
+ async function projectToContinueDev(projectRoot, rules) {
263
+ const targetRules = rules.filter((r) => shouldTarget(r, 'continue'));
264
+ if (targetRules.length === 0)
265
+ return [];
266
+ const dir = join(projectRoot, '.continue', 'rules');
267
+ if (!existsSync(dir))
268
+ await mkdir(dir, { recursive: true });
269
+ const written = [];
270
+ for (const rule of targetRules) {
271
+ const filePath = join(dir, `${rule.name}.md`);
272
+ const content = `# ${rule.description || rule.name}\n\n${rule.body}\n`;
273
+ await writeFile(filePath, content, 'utf-8');
274
+ written.push(filePath);
275
+ }
276
+ return written;
277
+ }
278
+ /**
279
+ * Project all canonical rules to all detected tools.
280
+ * One source (`.rulebook/rules/`), multiple projections.
281
+ */
282
+ export async function projectRules(projectRoot, detectedTools) {
283
+ const rules = await loadCanonicalRules(projectRoot);
284
+ if (rules.length === 0) {
285
+ return {
286
+ claudeCode: [],
287
+ cursor: [],
288
+ gemini: [],
289
+ copilot: [],
290
+ windsurf: [],
291
+ continueDev: [],
292
+ };
293
+ }
294
+ const result = {
295
+ claudeCode: detectedTools.claudeCode ? await projectToClaudeCode(projectRoot, rules) : [],
296
+ cursor: detectedTools.cursor ? await projectToCursor(projectRoot, rules) : [],
297
+ gemini: detectedTools.gemini ? await projectToGemini(projectRoot, rules) : [],
298
+ copilot: detectedTools.copilot ? await projectToCopilot(projectRoot, rules) : [],
299
+ windsurf: detectedTools.windsurf ? await projectToWindsurf(projectRoot, rules) : [],
300
+ continueDev: detectedTools.continueDev
301
+ ? await projectToContinueDev(projectRoot, rules)
302
+ : [],
303
+ };
304
+ return result;
305
+ }
306
+ /**
307
+ * List all canonical rules with their metadata (for CLI/MCP).
308
+ */
309
+ export async function listRules(projectRoot) {
310
+ const rules = await loadCanonicalRules(projectRoot);
311
+ return rules.map((r) => ({
312
+ name: r.name,
313
+ tier: r.tier,
314
+ description: r.description,
315
+ tools: r.tools,
316
+ }));
317
+ }
318
+ /**
319
+ * Install a rule from the built-in template library into `.rulebook/rules/`.
320
+ */
321
+ export async function installRule(projectRoot, templateName, templatesDir) {
322
+ const templatePath = join(templatesDir, 'rules', `${templateName}.md`);
323
+ if (!existsSync(templatePath))
324
+ return null;
325
+ const rulesDir = join(projectRoot, '.rulebook', 'rules');
326
+ if (!existsSync(rulesDir))
327
+ await mkdir(rulesDir, { recursive: true });
328
+ const destPath = join(rulesDir, `${templateName}.md`);
329
+ const content = await readFile(templatePath, 'utf-8');
330
+ await writeFile(destPath, content, 'utf-8');
331
+ return destPath;
332
+ }
333
+ //# sourceMappingURL=rule-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-engine.js","sourceRoot":"","sources":["../../src/core/rule-engine.ts"],"names":[],"mappings":"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"}
@@ -52,6 +52,10 @@ export declare class TaskManager {
52
52
  * Update task status
53
53
  */
54
54
  updateTaskStatus(taskId: string, status: RulebookTask['status']): Promise<void>;
55
+ /**
56
+ * Get raw task metadata (including blocks/blockedBy/cascadeImpact for v5 blocker tracking)
57
+ */
58
+ getTaskMetadata(taskId: string): Promise<Record<string, unknown> | null>;
55
59
  /**
56
60
  * Show task details
57
61
  */
@@ -1 +1 @@
1
- {"version":3,"file":"task-manager.d.ts","sourceRoot":"","sources":["../../src/core/task-manager.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,SAAS,CAAC;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,EAAE,MAAM,EAAE,WAAW,GAAE,MAAoB;IAMlE;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAYjC;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAInC;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuD/C;;OAEG;IACG,SAAS,CAAC,eAAe,GAAE,OAAe,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAyC1E;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAE,OAAe,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAsFvF;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAkEjE;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAoCjF;;OAEG;IACG,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBrF;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAiB5D;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAWhD;AAED,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,EACnB,WAAW,GAAE,MAAoB,GAChC,WAAW,CAEb"}
1
+ {"version":3,"file":"task-manager.d.ts","sourceRoot":"","sources":["../../src/core/task-manager.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,SAAS,CAAC;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,EAAE,MAAM,EAAE,WAAW,GAAE,MAAoB;IAMlE;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAYjC;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAInC;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuD/C;;OAEG;IACG,SAAS,CAAC,eAAe,GAAE,OAAe,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAyC1E;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAE,OAAe,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAsFvF;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAkEjE;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAoCjF;;OAEG;IACG,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBrF;;OAEG;IACG,eAAe,CACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAW1C;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAiB5D;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAWhD;AAED,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,EACnB,WAAW,GAAE,MAAoB,GAChC,WAAW,CAEb"}