@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.
- package/.claude/commands/rulebook-decision-create.md +55 -0
- package/.claude/commands/rulebook-decision-list.md +15 -0
- package/.claude/commands/rulebook-knowledge-add.md +41 -0
- package/.claude/commands/rulebook-knowledge-list.md +15 -0
- package/.claude/commands/rulebook-learn-capture.md +48 -0
- package/.claude/commands/rulebook-learn-list.md +13 -0
- package/.claude/commands/rulebook-task-archive.md +24 -0
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +53 -10
- package/dist/cli/commands.d.ts +32 -0
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +257 -0
- package/dist/cli/commands.js.map +1 -1
- package/dist/core/agent-template-engine.d.ts +51 -0
- package/dist/core/agent-template-engine.d.ts.map +1 -0
- package/dist/core/agent-template-engine.js +273 -0
- package/dist/core/agent-template-engine.js.map +1 -0
- package/dist/core/complexity-detector.d.ts +36 -0
- package/dist/core/complexity-detector.d.ts.map +1 -0
- package/dist/core/complexity-detector.js +254 -0
- package/dist/core/complexity-detector.js.map +1 -0
- package/dist/core/decision-manager.d.ts +25 -0
- package/dist/core/decision-manager.d.ts.map +1 -0
- package/dist/core/decision-manager.js +188 -0
- package/dist/core/decision-manager.js.map +1 -0
- package/dist/core/generator.d.ts +1 -0
- package/dist/core/generator.d.ts.map +1 -1
- package/dist/core/generator.js +47 -3
- package/dist/core/generator.js.map +1 -1
- package/dist/core/indexer/background-indexer.d.ts +9 -2
- package/dist/core/indexer/background-indexer.d.ts.map +1 -1
- package/dist/core/indexer/background-indexer.js +99 -83
- package/dist/core/indexer/background-indexer.js.map +1 -1
- package/dist/core/knowledge-manager.d.ts +24 -0
- package/dist/core/knowledge-manager.d.ts.map +1 -0
- package/dist/core/knowledge-manager.js +173 -0
- package/dist/core/knowledge-manager.js.map +1 -0
- package/dist/core/learn-manager.d.ts +29 -0
- package/dist/core/learn-manager.d.ts.map +1 -0
- package/dist/core/learn-manager.js +159 -0
- package/dist/core/learn-manager.js.map +1 -0
- package/dist/core/rule-engine.d.ts +64 -0
- package/dist/core/rule-engine.d.ts.map +1 -0
- package/dist/core/rule-engine.js +333 -0
- package/dist/core/rule-engine.js.map +1 -0
- package/dist/core/task-manager.d.ts +4 -0
- package/dist/core/task-manager.d.ts.map +1 -1
- package/dist/core/task-manager.js +39 -24
- package/dist/core/task-manager.js.map +1 -1
- package/dist/core/workspace/project-worker.d.ts +9 -0
- package/dist/core/workspace/project-worker.d.ts.map +1 -1
- package/dist/core/workspace/project-worker.js +27 -0
- package/dist/core/workspace/project-worker.js.map +1 -1
- package/dist/index.js +250 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/rulebook-server.d.ts.map +1 -1
- package/dist/mcp/rulebook-server.js +758 -22
- package/dist/mcp/rulebook-server.js.map +1 -1
- package/dist/memory/hnsw-index.d.ts +3 -1
- package/dist/memory/hnsw-index.d.ts.map +1 -1
- package/dist/memory/hnsw-index.js +121 -18
- package/dist/memory/hnsw-index.js.map +1 -1
- package/dist/memory/memory-manager.d.ts +5 -0
- package/dist/memory/memory-manager.d.ts.map +1 -1
- package/dist/memory/memory-manager.js +34 -8
- package/dist/memory/memory-manager.js.map +1 -1
- package/dist/memory/memory-store.d.ts +15 -3
- package/dist/memory/memory-store.d.ts.map +1 -1
- package/dist/memory/memory-store.js +327 -272
- package/dist/memory/memory-store.js.map +1 -1
- package/dist/types.d.ts +60 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +8 -3
- package/templates/agents/compiler/codegen-debugger.md +34 -0
- package/templates/agents/compiler/stdlib-engineer.md +28 -0
- package/templates/agents/compiler/test-coverage-guardian.md +31 -0
- package/templates/agents/context-intelligence.md +52 -0
- package/templates/agents/game-engine/cpp-core-expert.md +35 -0
- package/templates/agents/game-engine/render-engineer.md +22 -0
- package/templates/agents/game-engine/shader-engineer.md +38 -0
- package/templates/agents/game-engine/systems-integration.md +43 -0
- package/templates/agents/generic/code-reviewer.md +39 -0
- package/templates/agents/generic/docs-writer.md +25 -0
- package/templates/agents/generic/project-manager.md +34 -0
- package/templates/agents/generic/researcher.md +34 -0
- package/templates/agents/generic/test-engineer.md +40 -0
- package/templates/agents/mobile/platform-specialist.md +22 -0
- package/templates/agents/mobile/ui-engineer.md +22 -0
- package/templates/agents/web-app/api-designer.md +22 -0
- package/templates/agents/web-app/backend-engineer.md +30 -0
- package/templates/agents/web-app/database-engineer.md +22 -0
- package/templates/agents/web-app/frontend-engineer.md +29 -0
- package/templates/agents/web-app/security-reviewer.md +32 -0
- package/templates/commands/rulebook-decision-create.md +55 -0
- package/templates/commands/rulebook-decision-list.md +15 -0
- package/templates/commands/rulebook-knowledge-add.md +41 -0
- package/templates/commands/rulebook-knowledge-list.md +15 -0
- package/templates/commands/rulebook-learn-capture.md +48 -0
- package/templates/commands/rulebook-learn-list.md +13 -0
- package/templates/core/AGENT_AUTOMATION.md +8 -0
- package/templates/core/DECISIONS.md +38 -0
- package/templates/core/KNOWLEDGE.md +49 -0
- package/templates/core/RULEBOOK.md +12 -0
- package/templates/core/TIER1_PROHIBITIONS.md +154 -0
- package/templates/core/TOKEN_OPTIMIZATION.md +49 -0
- package/templates/git/GIT_WORKFLOW.md +35 -0
- package/templates/rules/follow-task-sequence.md +36 -0
- package/templates/rules/git-safety.md +29 -0
- package/templates/rules/incremental-tests.md +29 -0
- package/templates/rules/no-deferred.md +31 -0
- package/templates/rules/no-shortcuts.md +30 -0
- package/templates/rules/research-first.md +30 -0
- package/templates/rules/sequential-editing.md +21 -0
- package/templates/rules/session-workflow.md +24 -0
- package/templates/rules/task-decomposition.md +32 -0
package/dist/cli/commands.js
CHANGED
|
@@ -54,6 +54,10 @@ export async function initCommand(options) {
|
|
|
54
54
|
const spinner = ora('Detecting project structure...').start();
|
|
55
55
|
const detection = await detectProject(cwd);
|
|
56
56
|
spinner.succeed('Project detection complete');
|
|
57
|
+
// Assess project complexity for calibrated generation (v5)
|
|
58
|
+
const { assessComplexity } = await import('../core/complexity-detector.js');
|
|
59
|
+
const complexity = assessComplexity(cwd);
|
|
60
|
+
console.log(chalk.gray(` Complexity: ${complexity.tier.toUpperCase()} (${complexity.metrics.estimatedLoc.toLocaleString()} LOC, ${complexity.metrics.languageCount} languages)`));
|
|
57
61
|
// Show detection results
|
|
58
62
|
if (detection.languages.length > 0) {
|
|
59
63
|
console.log(chalk.green('\n✓ Detected languages:'));
|
|
@@ -265,6 +269,43 @@ export async function initCommand(options) {
|
|
|
265
269
|
// Write AGENTS.md
|
|
266
270
|
await writeFile(agentsPath, finalContent);
|
|
267
271
|
console.log(chalk.green(`\n✅ AGENTS.md written to ${agentsPath}`));
|
|
272
|
+
// Install canonical rules based on complexity tier (v5)
|
|
273
|
+
{
|
|
274
|
+
const { installRule, projectRules } = await import('../core/rule-engine.js');
|
|
275
|
+
const { getTemplatesDir } = await import('../core/generator.js');
|
|
276
|
+
const templatesDir = getTemplatesDir();
|
|
277
|
+
// Tier 1 rules — always installed
|
|
278
|
+
const tier1Rules = ['no-shortcuts', 'git-safety', 'sequential-editing', 'research-first', 'follow-task-sequence'];
|
|
279
|
+
// Tier 2 rules — installed for medium+ complexity
|
|
280
|
+
const tier2Rules = ['task-decomposition', 'incremental-tests', 'no-deferred', 'session-workflow'];
|
|
281
|
+
const rulesToInstall = [...tier1Rules];
|
|
282
|
+
if (complexity.recommendations.tier2Rules) {
|
|
283
|
+
rulesToInstall.push(...tier2Rules);
|
|
284
|
+
}
|
|
285
|
+
let installedCount = 0;
|
|
286
|
+
for (const name of rulesToInstall) {
|
|
287
|
+
const result = await installRule(cwd, name, templatesDir);
|
|
288
|
+
if (result)
|
|
289
|
+
installedCount++;
|
|
290
|
+
}
|
|
291
|
+
if (installedCount > 0) {
|
|
292
|
+
console.log(chalk.gray(` • Installed ${installedCount} canonical rules to .rulebook/rules/`));
|
|
293
|
+
}
|
|
294
|
+
// Project rules to detected tools
|
|
295
|
+
const ruleResult = await projectRules(cwd, {
|
|
296
|
+
claudeCode: existsSync(path.join(cwd, '.claude')) || existsSync(path.join(cwd, 'CLAUDE.md')),
|
|
297
|
+
cursor: detection.cursor?.detected,
|
|
298
|
+
gemini: detection.geminiCli?.detected,
|
|
299
|
+
windsurf: detection.windsurf?.detected,
|
|
300
|
+
copilot: detection.githubCopilot?.detected,
|
|
301
|
+
continueDev: detection.continueDev?.detected,
|
|
302
|
+
});
|
|
303
|
+
const totalProjected = ruleResult.claudeCode.length + ruleResult.cursor.length + ruleResult.gemini.length +
|
|
304
|
+
ruleResult.copilot.length + ruleResult.windsurf.length + ruleResult.continueDev.length;
|
|
305
|
+
if (totalProjected > 0) {
|
|
306
|
+
console.log(chalk.gray(` • Projected rules to ${totalProjected} tool-specific files`));
|
|
307
|
+
}
|
|
308
|
+
}
|
|
268
309
|
// Show Cursor MDC feedback
|
|
269
310
|
if (detection.cursor?.detected) {
|
|
270
311
|
if (detection.cursor.hasMdcRules) {
|
|
@@ -1588,6 +1629,51 @@ async function updateSingleProject(cwd, options) {
|
|
|
1588
1629
|
const mergedContent = await mergeFullAgents(detection.existingAgents, config, cwd);
|
|
1589
1630
|
await writeFile(agentsPath, mergedContent);
|
|
1590
1631
|
mergeSpinner.succeed('AGENTS.md updated');
|
|
1632
|
+
// Install + project canonical rules to all detected tools (v5 rule engine)
|
|
1633
|
+
// On update: if .rulebook/rules/ is empty (v4 project), auto-install based on complexity
|
|
1634
|
+
{
|
|
1635
|
+
const { projectRules, installRule, loadCanonicalRules } = await import('../core/rule-engine.js');
|
|
1636
|
+
const existingRules = await loadCanonicalRules(cwd);
|
|
1637
|
+
if (existingRules.length === 0) {
|
|
1638
|
+
// v4 project upgrading to v5 — install canonical rules based on complexity
|
|
1639
|
+
const { assessComplexity } = await import('../core/complexity-detector.js');
|
|
1640
|
+
const { getTemplatesDir } = await import('../core/generator.js');
|
|
1641
|
+
const complexity = assessComplexity(cwd);
|
|
1642
|
+
const templatesDir = getTemplatesDir();
|
|
1643
|
+
const tier1 = ['no-shortcuts', 'git-safety', 'sequential-editing', 'research-first', 'follow-task-sequence'];
|
|
1644
|
+
const tier2 = ['task-decomposition', 'incremental-tests', 'no-deferred', 'session-workflow'];
|
|
1645
|
+
const toInstall = [...tier1];
|
|
1646
|
+
if (complexity.recommendations.tier2Rules) {
|
|
1647
|
+
toInstall.push(...tier2);
|
|
1648
|
+
}
|
|
1649
|
+
let installed = 0;
|
|
1650
|
+
for (const name of toInstall) {
|
|
1651
|
+
const result = await installRule(cwd, name, templatesDir);
|
|
1652
|
+
if (result)
|
|
1653
|
+
installed++;
|
|
1654
|
+
}
|
|
1655
|
+
if (installed > 0) {
|
|
1656
|
+
console.log(chalk.gray(` • Installed ${installed} v5 canonical rules (${complexity.tier} project, ${complexity.metrics.estimatedLoc.toLocaleString()} LOC)`));
|
|
1657
|
+
}
|
|
1658
|
+
}
|
|
1659
|
+
const ruleResult = await projectRules(cwd, {
|
|
1660
|
+
claudeCode: existsSync(path.join(cwd, '.claude')) || existsSync(path.join(cwd, 'CLAUDE.md')),
|
|
1661
|
+
cursor: detection.cursor?.detected,
|
|
1662
|
+
gemini: detection.geminiCli?.detected,
|
|
1663
|
+
windsurf: detection.windsurf?.detected,
|
|
1664
|
+
copilot: detection.githubCopilot?.detected,
|
|
1665
|
+
continueDev: detection.continueDev?.detected,
|
|
1666
|
+
});
|
|
1667
|
+
const totalProjected = ruleResult.claudeCode.length +
|
|
1668
|
+
ruleResult.cursor.length +
|
|
1669
|
+
ruleResult.gemini.length +
|
|
1670
|
+
ruleResult.copilot.length +
|
|
1671
|
+
ruleResult.windsurf.length +
|
|
1672
|
+
ruleResult.continueDev.length;
|
|
1673
|
+
if (totalProjected > 0) {
|
|
1674
|
+
console.log(chalk.gray(` • Projected ${totalProjected} canonical rules to detected tools`));
|
|
1675
|
+
}
|
|
1676
|
+
}
|
|
1591
1677
|
// Show multi-tool config feedback (update command)
|
|
1592
1678
|
if (detection.geminiCli?.detected) {
|
|
1593
1679
|
console.log(chalk.gray(' • Gemini CLI config updated: GEMINI.md'));
|
|
@@ -3682,4 +3768,175 @@ export async function workspaceStatusCommand() {
|
|
|
3682
3768
|
await manager.shutdownAll();
|
|
3683
3769
|
}
|
|
3684
3770
|
}
|
|
3771
|
+
// Context Intelligence Layer commands (v4.4)
|
|
3772
|
+
export async function decisionCreateCommand(title, options) {
|
|
3773
|
+
const { DecisionManager } = await import('../core/decision-manager.js');
|
|
3774
|
+
const mgr = new DecisionManager(process.cwd());
|
|
3775
|
+
const spinner = ora('Creating decision...').start();
|
|
3776
|
+
try {
|
|
3777
|
+
const d = await mgr.create(title, {
|
|
3778
|
+
context: options.context,
|
|
3779
|
+
relatedTasks: options.relatedTask ? [options.relatedTask] : undefined,
|
|
3780
|
+
});
|
|
3781
|
+
spinner.succeed(`Decision ADR-${String(d.id).padStart(3, '0')}: ${d.title} (${d.status})`);
|
|
3782
|
+
}
|
|
3783
|
+
catch (error) {
|
|
3784
|
+
spinner.fail(`Failed: ${String(error)}`);
|
|
3785
|
+
}
|
|
3786
|
+
}
|
|
3787
|
+
export async function decisionListCommand(options) {
|
|
3788
|
+
const { DecisionManager } = await import('../core/decision-manager.js');
|
|
3789
|
+
const mgr = new DecisionManager(process.cwd());
|
|
3790
|
+
const decisions = await mgr.list(options.status);
|
|
3791
|
+
if (decisions.length === 0) {
|
|
3792
|
+
console.log(chalk.dim('No decisions found.'));
|
|
3793
|
+
return;
|
|
3794
|
+
}
|
|
3795
|
+
for (const d of decisions) {
|
|
3796
|
+
const badge = d.status === 'accepted' ? chalk.green(d.status) : d.status === 'superseded' ? chalk.dim(d.status) : chalk.yellow(d.status);
|
|
3797
|
+
console.log(` ADR-${String(d.id).padStart(3, '0')} ${d.title} ${badge}`);
|
|
3798
|
+
}
|
|
3799
|
+
}
|
|
3800
|
+
export async function decisionShowCommand(id) {
|
|
3801
|
+
const { DecisionManager } = await import('../core/decision-manager.js');
|
|
3802
|
+
const mgr = new DecisionManager(process.cwd());
|
|
3803
|
+
const result = await mgr.show(parseInt(id));
|
|
3804
|
+
if (!result) {
|
|
3805
|
+
console.log(chalk.red(`Decision ${id} not found.`));
|
|
3806
|
+
return;
|
|
3807
|
+
}
|
|
3808
|
+
console.log(result.content);
|
|
3809
|
+
}
|
|
3810
|
+
export async function decisionSupersedeCommand(oldId, newId) {
|
|
3811
|
+
const { DecisionManager } = await import('../core/decision-manager.js');
|
|
3812
|
+
const mgr = new DecisionManager(process.cwd());
|
|
3813
|
+
const ok = await mgr.supersede(parseInt(oldId), parseInt(newId));
|
|
3814
|
+
if (ok) {
|
|
3815
|
+
console.log(chalk.green(`Decision ${oldId} superseded by ${newId}.`));
|
|
3816
|
+
}
|
|
3817
|
+
else {
|
|
3818
|
+
console.log(chalk.red(`Decision ${oldId} not found.`));
|
|
3819
|
+
}
|
|
3820
|
+
}
|
|
3821
|
+
export async function knowledgeAddCommand(type, title, options) {
|
|
3822
|
+
const { KnowledgeManager } = await import('../core/knowledge-manager.js');
|
|
3823
|
+
const mgr = new KnowledgeManager(process.cwd());
|
|
3824
|
+
const spinner = ora('Adding knowledge entry...').start();
|
|
3825
|
+
try {
|
|
3826
|
+
const entry = await mgr.add(type, title, {
|
|
3827
|
+
category: (options.category ?? 'code'),
|
|
3828
|
+
description: options.description ?? '',
|
|
3829
|
+
});
|
|
3830
|
+
spinner.succeed(`${entry.type}: ${entry.title} (${entry.category})`);
|
|
3831
|
+
}
|
|
3832
|
+
catch (error) {
|
|
3833
|
+
spinner.fail(`Failed: ${String(error)}`);
|
|
3834
|
+
}
|
|
3835
|
+
}
|
|
3836
|
+
export async function knowledgeListCommand(options) {
|
|
3837
|
+
const { KnowledgeManager } = await import('../core/knowledge-manager.js');
|
|
3838
|
+
const mgr = new KnowledgeManager(process.cwd());
|
|
3839
|
+
const entries = await mgr.list(options.type, options.category);
|
|
3840
|
+
if (entries.length === 0) {
|
|
3841
|
+
console.log(chalk.dim('No knowledge entries found.'));
|
|
3842
|
+
return;
|
|
3843
|
+
}
|
|
3844
|
+
for (const e of entries) {
|
|
3845
|
+
const badge = e.type === 'pattern' ? chalk.green('pattern') : chalk.red('anti-pattern');
|
|
3846
|
+
console.log(` ${badge} ${e.title} ${chalk.dim(e.category)}`);
|
|
3847
|
+
}
|
|
3848
|
+
}
|
|
3849
|
+
export async function knowledgeShowCommand(id) {
|
|
3850
|
+
const { KnowledgeManager } = await import('../core/knowledge-manager.js');
|
|
3851
|
+
const mgr = new KnowledgeManager(process.cwd());
|
|
3852
|
+
const result = await mgr.show(id);
|
|
3853
|
+
if (!result) {
|
|
3854
|
+
console.log(chalk.red(`Knowledge entry "${id}" not found.`));
|
|
3855
|
+
return;
|
|
3856
|
+
}
|
|
3857
|
+
console.log(result.content);
|
|
3858
|
+
}
|
|
3859
|
+
export async function knowledgeRemoveCommand(id) {
|
|
3860
|
+
const { KnowledgeManager } = await import('../core/knowledge-manager.js');
|
|
3861
|
+
const mgr = new KnowledgeManager(process.cwd());
|
|
3862
|
+
const ok = await mgr.remove(id);
|
|
3863
|
+
if (ok) {
|
|
3864
|
+
console.log(chalk.green(`Knowledge entry "${id}" removed.`));
|
|
3865
|
+
}
|
|
3866
|
+
else {
|
|
3867
|
+
console.log(chalk.red(`Knowledge entry "${id}" not found.`));
|
|
3868
|
+
}
|
|
3869
|
+
}
|
|
3870
|
+
export async function learnCaptureCommand(options) {
|
|
3871
|
+
const { LearnManager } = await import('../core/learn-manager.js');
|
|
3872
|
+
const mgr = new LearnManager(process.cwd());
|
|
3873
|
+
// If no title/content provided, this would be interactive (placeholder for prompts)
|
|
3874
|
+
const title = options.title ?? 'Untitled learning';
|
|
3875
|
+
const content = options.content ?? '';
|
|
3876
|
+
const tags = options.tags ? options.tags.split(',').map(t => t.trim()) : [];
|
|
3877
|
+
const spinner = ora('Capturing learning...').start();
|
|
3878
|
+
try {
|
|
3879
|
+
const learning = await mgr.capture(title, content, {
|
|
3880
|
+
source: 'manual',
|
|
3881
|
+
relatedTask: options.relatedTask,
|
|
3882
|
+
tags,
|
|
3883
|
+
});
|
|
3884
|
+
spinner.succeed(`Learning captured: ${learning.title}`);
|
|
3885
|
+
}
|
|
3886
|
+
catch (error) {
|
|
3887
|
+
spinner.fail(`Failed: ${String(error)}`);
|
|
3888
|
+
}
|
|
3889
|
+
}
|
|
3890
|
+
export async function learnFromRalphCommand() {
|
|
3891
|
+
const { LearnManager } = await import('../core/learn-manager.js');
|
|
3892
|
+
const mgr = new LearnManager(process.cwd());
|
|
3893
|
+
const spinner = ora('Extracting learnings from Ralph history...').start();
|
|
3894
|
+
try {
|
|
3895
|
+
const learnings = await mgr.fromRalph();
|
|
3896
|
+
if (learnings.length === 0) {
|
|
3897
|
+
spinner.info('No new learnings found in Ralph history.');
|
|
3898
|
+
}
|
|
3899
|
+
else {
|
|
3900
|
+
spinner.succeed(`Extracted ${learnings.length} learning(s) from Ralph history.`);
|
|
3901
|
+
}
|
|
3902
|
+
}
|
|
3903
|
+
catch (error) {
|
|
3904
|
+
spinner.fail(`Failed: ${String(error)}`);
|
|
3905
|
+
}
|
|
3906
|
+
}
|
|
3907
|
+
export async function learnListCommand(options) {
|
|
3908
|
+
const { LearnManager } = await import('../core/learn-manager.js');
|
|
3909
|
+
const mgr = new LearnManager(process.cwd());
|
|
3910
|
+
const limit = options.limit ? parseInt(options.limit) : undefined;
|
|
3911
|
+
const learnings = await mgr.list(limit);
|
|
3912
|
+
if (learnings.length === 0) {
|
|
3913
|
+
console.log(chalk.dim('No learnings found.'));
|
|
3914
|
+
return;
|
|
3915
|
+
}
|
|
3916
|
+
for (const l of learnings) {
|
|
3917
|
+
const badge = l.source === 'ralph' ? chalk.blue('ralph') : l.source === 'task-archive' ? chalk.yellow('archive') : chalk.dim('manual');
|
|
3918
|
+
const promoted = l.promotedTo ? chalk.green(` → ${l.promotedTo.type}`) : '';
|
|
3919
|
+
console.log(` ${badge} ${l.title}${promoted}`);
|
|
3920
|
+
}
|
|
3921
|
+
}
|
|
3922
|
+
export async function learnPromoteCommand(id, target, options) {
|
|
3923
|
+
const { LearnManager } = await import('../core/learn-manager.js');
|
|
3924
|
+
const mgr = new LearnManager(process.cwd());
|
|
3925
|
+
if (target !== 'knowledge' && target !== 'decision') {
|
|
3926
|
+
console.log(chalk.red('Target must be "knowledge" or "decision".'));
|
|
3927
|
+
return;
|
|
3928
|
+
}
|
|
3929
|
+
const spinner = ora(`Promoting learning to ${target}...`).start();
|
|
3930
|
+
try {
|
|
3931
|
+
const result = await mgr.promote(id, target, { title: options.title });
|
|
3932
|
+
if (!result) {
|
|
3933
|
+
spinner.fail(`Learning "${id}" not found.`);
|
|
3934
|
+
return;
|
|
3935
|
+
}
|
|
3936
|
+
spinner.succeed(`Learning promoted to ${result.type} (id: ${result.id}).`);
|
|
3937
|
+
}
|
|
3938
|
+
catch (error) {
|
|
3939
|
+
spinner.fail(`Failed: ${String(error)}`);
|
|
3940
|
+
}
|
|
3941
|
+
}
|
|
3685
3942
|
//# sourceMappingURL=commands.js.map
|