codymaster 4.4.4 → 4.5.1
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/CHANGELOG.md +33 -0
- package/README.md +29 -14
- package/commands/demo.md +1 -1
- package/dist/context-bus.js +70 -0
- package/dist/context-db.js +265 -0
- package/dist/continuity.js +12 -0
- package/dist/file-watcher.js +79 -0
- package/dist/index.js +152 -1
- package/dist/l0-indexer.js +158 -0
- package/dist/mcp-context-server.js +400 -0
- package/dist/migrate-json-to-sqlite.js +126 -0
- package/dist/skill-chain.js +19 -3
- package/dist/token-budget.js +108 -0
- package/dist/uri-resolver.js +203 -0
- package/package.json +7 -1
- package/skills/_shared/helpers.md +50 -14
- package/skills/cm-autopilot/SKILL.md +29 -0
- package/skills/cm-autopilot/scripts/autopilot.py +190 -0
- package/skills/cm-continuity/SKILL.md +90 -28
- package/skills/cm-quality-gate/SKILL.md +11 -1
- package/skills/cm-safe-deploy/SKILL.md +38 -2
- package/skills/cm-security-gate/SKILL.md +158 -34
- package/skills/cm-skill-chain/SKILL.md +47 -1
- package/skills/cm-start/SKILL.md +11 -2
- package/skills/cm-test-gate/SKILL.md +3 -0
- package/skills/boxme-git-config/SKILL.md +0 -56
- package/skills/boxme-local-dev/SKILL.md +0 -66
- package/skills/jobs-to-be-done/SKILL.md +0 -266
- package/skills/jobs-to-be-done/references/case-studies.md +0 -154
- package/skills/jobs-to-be-done/references/competitive-strategy.md +0 -280
- package/skills/jobs-to-be-done/references/diagnostics.md +0 -158
- package/skills/jobs-to-be-done/references/innovation-process.md +0 -392
- package/skills/jobs-to-be-done/references/organizational-change.md +0 -328
- package/skills/marketplace-report-crawler/SKILL.md +0 -176
- package/skills/marketplace-report-crawler/config/accounts.json +0 -41
- package/skills/marketplace-report-crawler/config/report-types.json +0 -422
- package/skills/marketplace-report-crawler/config/sessions.json +0 -3
- package/skills/marketplace-report-crawler/scripts/ab-wrapper.sh +0 -102
- package/skills/marketplace-report-crawler/scripts/browser-actions/lazada/lazada-actions.js +0 -114
- package/skills/marketplace-report-crawler/scripts/browser-actions/shopee/shopee-actions.js +0 -94
- package/skills/marketplace-report-crawler/scripts/browser-actions/tiktok/tiktok-actions.js +0 -272
- package/skills/marketplace-report-crawler/scripts/crawl-runner.js +0 -281
- package/skills/marketplace-report-crawler/scripts/session-check.sh +0 -72
- package/skills/marketplace-report-crawler/scripts/session-manager.sh +0 -349
- package/skills/marketplace-report-crawler/scripts/setup-folders.sh +0 -83
- package/skills/medical-research/SKILL.md +0 -194
- package/skills/medical-research/scripts/evidence_checker.py +0 -288
- package/skills/mom-test/SKILL.md +0 -267
- package/skills/mom-test/references/avoiding-bad-data.md +0 -221
- package/skills/mom-test/references/case-studies.md +0 -306
- package/skills/mom-test/references/commitment-advancement.md +0 -219
- package/skills/mom-test/references/finding-conversations.md +0 -251
- package/skills/mom-test/references/processing-learning.md +0 -256
- package/skills/mom-test/references/question-patterns.md +0 -198
- package/skills/pandasai-analytics/SKILL.md +0 -251
- package/skills/release-it/SKILL.md +0 -235
- package/skills/release-it/references/anti-patterns.md +0 -279
- package/skills/release-it/references/capacity-planning.md +0 -285
- package/skills/release-it/references/chaos-engineering.md +0 -325
- package/skills/release-it/references/deployment-strategies.md +0 -331
- package/skills/release-it/references/observability.md +0 -301
- package/skills/release-it/references/stability-patterns.md +0 -355
- package/skills/skill-creator-ultra/.agents/workflows/skill-audit.md +0 -37
- package/skills/skill-creator-ultra/.agents/workflows/skill-compare.md +0 -34
- package/skills/skill-creator-ultra/.agents/workflows/skill-export.md +0 -51
- package/skills/skill-creator-ultra/.agents/workflows/skill-generate.md +0 -39
- package/skills/skill-creator-ultra/.agents/workflows/skill-scaffold.md +0 -52
- package/skills/skill-creator-ultra/.agents/workflows/skill-simulate.md +0 -25
- package/skills/skill-creator-ultra/.agents/workflows/skill-stats.md +0 -31
- package/skills/skill-creator-ultra/.agents/workflows/skill-validate.md +0 -25
- package/skills/skill-creator-ultra/README.md +0 -1242
- package/skills/skill-creator-ultra/SKILL.md +0 -388
- package/skills/skill-creator-ultra/agents/analyzer.md +0 -274
- package/skills/skill-creator-ultra/agents/comparator.md +0 -202
- package/skills/skill-creator-ultra/agents/grader.md +0 -223
- package/skills/skill-creator-ultra/assets/eval_review.html +0 -146
- package/skills/skill-creator-ultra/eval-viewer/generate_review.py +0 -471
- package/skills/skill-creator-ultra/eval-viewer/viewer.html +0 -1325
- package/skills/skill-creator-ultra/examples/example_anthropic_frontend.md +0 -109
- package/skills/skill-creator-ultra/examples/example_anthropic_pdf.md +0 -116
- package/skills/skill-creator-ultra/examples/example_api_docs.md +0 -189
- package/skills/skill-creator-ultra/examples/example_db_migration.md +0 -253
- package/skills/skill-creator-ultra/examples/example_git_commit.md +0 -111
- package/skills/skill-creator-ultra/install.ps1 +0 -289
- package/skills/skill-creator-ultra/install.sh +0 -313
- package/skills/skill-creator-ultra/phases/phase1_interview.md +0 -202
- package/skills/skill-creator-ultra/phases/phase2_extract.md +0 -55
- package/skills/skill-creator-ultra/phases/phase3_detect.md +0 -57
- package/skills/skill-creator-ultra/phases/phase4_generate.md +0 -543
- package/skills/skill-creator-ultra/phases/phase5_test.md +0 -319
- package/skills/skill-creator-ultra/phases/phase6_eval.md +0 -301
- package/skills/skill-creator-ultra/phases/phase7_iterate.md +0 -103
- package/skills/skill-creator-ultra/phases/phase8_optimize.md +0 -113
- package/skills/skill-creator-ultra/resources/advanced_patterns.md +0 -499
- package/skills/skill-creator-ultra/resources/anti_patterns.md +0 -376
- package/skills/skill-creator-ultra/resources/blueprints.md +0 -498
- package/skills/skill-creator-ultra/resources/checklist.md +0 -243
- package/skills/skill-creator-ultra/resources/composition_cookbook.md +0 -291
- package/skills/skill-creator-ultra/resources/description_optimization.md +0 -90
- package/skills/skill-creator-ultra/resources/eval_guide.md +0 -133
- package/skills/skill-creator-ultra/resources/industry_questions.md +0 -189
- package/skills/skill-creator-ultra/resources/interview_questions.md +0 -200
- package/skills/skill-creator-ultra/resources/pattern_detection.md +0 -200
- package/skills/skill-creator-ultra/resources/prompt_engineering.md +0 -531
- package/skills/skill-creator-ultra/resources/schemas.md +0 -430
- package/skills/skill-creator-ultra/resources/script_integration.md +0 -593
- package/skills/skill-creator-ultra/resources/scripts_guide.md +0 -339
- package/skills/skill-creator-ultra/resources/skill_template.md +0 -124
- package/skills/skill-creator-ultra/resources/skill_writing_guide.md +0 -634
- package/skills/skill-creator-ultra/resources/versioning_guide.md +0 -193
- package/skills/skill-creator-ultra/scripts/ci_eval.py +0 -200
- package/skills/skill-creator-ultra/scripts/package_skill.py +0 -165
- package/skills/skill-creator-ultra/scripts/simulate_skill.py +0 -398
- package/skills/skill-creator-ultra/scripts/skill_audit.py +0 -611
- package/skills/skill-creator-ultra/scripts/skill_compare.py +0 -265
- package/skills/skill-creator-ultra/scripts/skill_export.py +0 -334
- package/skills/skill-creator-ultra/scripts/skill_scaffold.py +0 -403
- package/skills/skill-creator-ultra/scripts/skill_stats.py +0 -339
- package/skills/skill-creator-ultra/scripts/validate_skill.py +0 -411
- package/skills/tailwind-mastery/SKILL.md +0 -229
- package/skills/vercel-react-best-practices/AGENTS.md +0 -3373
- package/skills/vercel-react-best-practices/README.md +0 -123
- package/skills/vercel-react-best-practices/SKILL.md +0 -143
- package/skills/vercel-react-best-practices/rules/_sections.md +0 -46
- package/skills/vercel-react-best-practices/rules/_template.md +0 -28
- package/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +0 -55
- package/skills/vercel-react-best-practices/rules/advanced-init-once.md +0 -42
- package/skills/vercel-react-best-practices/rules/advanced-use-latest.md +0 -39
- package/skills/vercel-react-best-practices/rules/async-api-routes.md +0 -38
- package/skills/vercel-react-best-practices/rules/async-defer-await.md +0 -80
- package/skills/vercel-react-best-practices/rules/async-dependencies.md +0 -51
- package/skills/vercel-react-best-practices/rules/async-parallel.md +0 -28
- package/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +0 -99
- package/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +0 -59
- package/skills/vercel-react-best-practices/rules/bundle-conditional.md +0 -31
- package/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +0 -49
- package/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +0 -35
- package/skills/vercel-react-best-practices/rules/bundle-preload.md +0 -50
- package/skills/vercel-react-best-practices/rules/client-event-listeners.md +0 -74
- package/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +0 -71
- package/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +0 -48
- package/skills/vercel-react-best-practices/rules/client-swr-dedup.md +0 -56
- package/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +0 -107
- package/skills/vercel-react-best-practices/rules/js-cache-function-results.md +0 -80
- package/skills/vercel-react-best-practices/rules/js-cache-property-access.md +0 -28
- package/skills/vercel-react-best-practices/rules/js-cache-storage.md +0 -70
- package/skills/vercel-react-best-practices/rules/js-combine-iterations.md +0 -32
- package/skills/vercel-react-best-practices/rules/js-early-exit.md +0 -50
- package/skills/vercel-react-best-practices/rules/js-flatmap-filter.md +0 -60
- package/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +0 -45
- package/skills/vercel-react-best-practices/rules/js-index-maps.md +0 -37
- package/skills/vercel-react-best-practices/rules/js-length-check-first.md +0 -49
- package/skills/vercel-react-best-practices/rules/js-min-max-loop.md +0 -82
- package/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +0 -24
- package/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +0 -57
- package/skills/vercel-react-best-practices/rules/rendering-activity.md +0 -26
- package/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
- package/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +0 -40
- package/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +0 -38
- package/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +0 -46
- package/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
- package/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +0 -30
- package/skills/vercel-react-best-practices/rules/rendering-resource-hints.md +0 -85
- package/skills/vercel-react-best-practices/rules/rendering-script-defer-async.md +0 -68
- package/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +0 -28
- package/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +0 -75
- package/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +0 -39
- package/skills/vercel-react-best-practices/rules/rerender-dependencies.md +0 -45
- package/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +0 -40
- package/skills/vercel-react-best-practices/rules/rerender-derived-state.md +0 -29
- package/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +0 -74
- package/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +0 -58
- package/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +0 -38
- package/skills/vercel-react-best-practices/rules/rerender-memo.md +0 -44
- package/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +0 -45
- package/skills/vercel-react-best-practices/rules/rerender-no-inline-components.md +0 -82
- package/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +0 -35
- package/skills/vercel-react-best-practices/rules/rerender-split-combined-hooks.md +0 -64
- package/skills/vercel-react-best-practices/rules/rerender-transitions.md +0 -40
- package/skills/vercel-react-best-practices/rules/rerender-use-deferred-value.md +0 -59
- package/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +0 -73
- package/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +0 -73
- package/skills/vercel-react-best-practices/rules/server-auth-actions.md +0 -96
- package/skills/vercel-react-best-practices/rules/server-cache-lru.md +0 -41
- package/skills/vercel-react-best-practices/rules/server-cache-react.md +0 -76
- package/skills/vercel-react-best-practices/rules/server-dedup-props.md +0 -65
- package/skills/vercel-react-best-practices/rules/server-hoist-static-io.md +0 -142
- package/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +0 -83
- package/skills/vercel-react-best-practices/rules/server-serialization.md +0 -38
- package/skills/web-design-guidelines/SKILL.md +0 -39
package/dist/index.js
CHANGED
|
@@ -54,6 +54,11 @@ const data_1 = require("./data");
|
|
|
54
54
|
const dashboard_1 = require("./dashboard");
|
|
55
55
|
const agent_dispatch_1 = require("./agent-dispatch");
|
|
56
56
|
const continuity_1 = require("./continuity");
|
|
57
|
+
const l0_indexer_1 = require("./l0-indexer");
|
|
58
|
+
const context_bus_1 = require("./context-bus");
|
|
59
|
+
const token_budget_1 = require("./token-budget");
|
|
60
|
+
const migrate_json_to_sqlite_1 = require("./migrate-json-to-sqlite");
|
|
61
|
+
const uri_resolver_1 = require("./uri-resolver");
|
|
57
62
|
const judge_1 = require("./judge");
|
|
58
63
|
const skill_chain_1 = require("./skill-chain");
|
|
59
64
|
const path_1 = __importDefault(require("path"));
|
|
@@ -1410,9 +1415,27 @@ program
|
|
|
1410
1415
|
case 'dec':
|
|
1411
1416
|
continuityDecisions(projectPath);
|
|
1412
1417
|
break;
|
|
1418
|
+
case 'index':
|
|
1419
|
+
continuityIndex(projectPath);
|
|
1420
|
+
break;
|
|
1421
|
+
case 'budget':
|
|
1422
|
+
continuityBudget(projectPath);
|
|
1423
|
+
break;
|
|
1424
|
+
case 'bus':
|
|
1425
|
+
continuityBus(projectPath);
|
|
1426
|
+
break;
|
|
1427
|
+
case 'mcp':
|
|
1428
|
+
continuityMcp(projectPath);
|
|
1429
|
+
break;
|
|
1430
|
+
case 'migrate':
|
|
1431
|
+
continuityMigrate(projectPath);
|
|
1432
|
+
break;
|
|
1433
|
+
case 'export':
|
|
1434
|
+
continuityExport(projectPath);
|
|
1435
|
+
break;
|
|
1413
1436
|
default:
|
|
1414
1437
|
console.log(chalk_1.default.red(`Unknown: ${cmd}`));
|
|
1415
|
-
console.log(chalk_1.default.gray('Available: init, status, reset, learnings, decisions'));
|
|
1438
|
+
console.log(chalk_1.default.gray('Available: init, status, reset, learnings, decisions, index, budget, bus, mcp, migrate, export'));
|
|
1416
1439
|
}
|
|
1417
1440
|
});
|
|
1418
1441
|
function continuityInit(projectPath) {
|
|
@@ -1502,6 +1525,134 @@ function continuityDecisions(projectPath) {
|
|
|
1502
1525
|
console.log((0, theme_1.dim)(` ${formatTimeAgoCli(d.timestamp)} | ${d.agent || 'unknown'}\n`));
|
|
1503
1526
|
}
|
|
1504
1527
|
}
|
|
1528
|
+
function continuityIndex(projectPath) {
|
|
1529
|
+
if (!(0, continuity_1.hasCmDir)(projectPath)) {
|
|
1530
|
+
console.log((0, box_1.renderResult)('warning', 'No .cm/ directory found. Run: cm continuity init'));
|
|
1531
|
+
return;
|
|
1532
|
+
}
|
|
1533
|
+
console.log((0, box_1.renderCommandHeader)('Refreshing L0 Indexes', '🗂️'));
|
|
1534
|
+
const result = (0, l0_indexer_1.refreshAllIndexes)(projectPath);
|
|
1535
|
+
const learningsLines = result.learnings.split('\n').length;
|
|
1536
|
+
const skeletonLines = result.skeleton.split('\n').length;
|
|
1537
|
+
console.log((0, theme_1.success)(` ✅ learnings-index.md (${learningsLines} lines)`));
|
|
1538
|
+
console.log((0, theme_1.success)(` ✅ skeleton-index.md (${skeletonLines} lines)`));
|
|
1539
|
+
console.log((0, theme_1.success)(' ✅ Continuity abstract generated'));
|
|
1540
|
+
console.log((0, theme_1.dim)(`\n Files written to .cm/`));
|
|
1541
|
+
}
|
|
1542
|
+
function continuityBudget(projectPath) {
|
|
1543
|
+
const budget = (0, token_budget_1.loadBudget)(projectPath);
|
|
1544
|
+
console.log((0, box_1.renderCommandHeader)('Token Budget', '💰'));
|
|
1545
|
+
console.log('\n' + (0, token_budget_1.generateBudgetReport)(budget) + '\n');
|
|
1546
|
+
}
|
|
1547
|
+
function continuityBus(projectPath) {
|
|
1548
|
+
const bus = (0, context_bus_1.readBus)(projectPath);
|
|
1549
|
+
if (!bus) {
|
|
1550
|
+
console.log((0, box_1.renderResult)('info', 'No active context bus. Start a chain to initialize.'));
|
|
1551
|
+
return;
|
|
1552
|
+
}
|
|
1553
|
+
console.log((0, box_1.renderCommandHeader)(`Context Bus — ${bus.pipeline}`, '🚌'));
|
|
1554
|
+
console.log((0, theme_1.dim)(` Session: ${bus.session_id}`));
|
|
1555
|
+
console.log((0, theme_1.dim)(` Step: ${bus.current_step || '(none)'}`));
|
|
1556
|
+
console.log((0, theme_1.dim)(` Started: ${bus.started_at}`));
|
|
1557
|
+
console.log((0, theme_1.dim)(` Updated: ${bus.updated_at}`));
|
|
1558
|
+
const steps = Object.keys(bus.shared_context);
|
|
1559
|
+
if (steps.length > 0) {
|
|
1560
|
+
console.log((0, theme_1.brand)('\n Completed Steps:'));
|
|
1561
|
+
for (const skill of steps) {
|
|
1562
|
+
const out = bus.shared_context[skill];
|
|
1563
|
+
console.log((0, theme_1.success)(` ✅ ${skill}`) + ((out === null || out === void 0 ? void 0 : out.summary) ? (0, theme_1.dim)(` — ${out.summary}`) : ''));
|
|
1564
|
+
}
|
|
1565
|
+
}
|
|
1566
|
+
console.log((0, theme_1.dim)('\n Resource State:'));
|
|
1567
|
+
for (const [k, v] of Object.entries(bus.resource_state)) {
|
|
1568
|
+
console.log((0, theme_1.dim)(` ${k}: ${v || 'not indexed'}`));
|
|
1569
|
+
}
|
|
1570
|
+
}
|
|
1571
|
+
function continuityMigrate(projectPath) {
|
|
1572
|
+
if (!(0, continuity_1.hasCmDir)(projectPath)) {
|
|
1573
|
+
console.log((0, box_1.renderResult)('warning', 'No .cm/ directory found. Run: cm continuity init'));
|
|
1574
|
+
return;
|
|
1575
|
+
}
|
|
1576
|
+
console.log((0, box_1.renderCommandHeader)('Migrate JSON → SQLite', '🗃️'));
|
|
1577
|
+
console.log((0, theme_1.dim)(' Reading learnings.json + decisions.json → .cm/context.db\n'));
|
|
1578
|
+
try {
|
|
1579
|
+
const result = (0, migrate_json_to_sqlite_1.migrateJsonToSqlite)(projectPath);
|
|
1580
|
+
console.log((0, theme_1.success)(` ✅ Learnings migrated: ${result.learnings.migrated} (skipped: ${result.learnings.skipped})`));
|
|
1581
|
+
console.log((0, theme_1.success)(` ✅ Decisions migrated: ${result.decisions.migrated} (skipped: ${result.decisions.skipped})`));
|
|
1582
|
+
if (result.backupCreated)
|
|
1583
|
+
console.log((0, theme_1.dim)(' 📦 Backups created: learnings.json.backup, decisions.json.backup'));
|
|
1584
|
+
console.log((0, theme_1.dim)(`\n DB: ${result.dbPath}`));
|
|
1585
|
+
}
|
|
1586
|
+
catch (err) {
|
|
1587
|
+
console.log((0, theme_1.error)(` ❌ Migration failed: ${err.message}`));
|
|
1588
|
+
}
|
|
1589
|
+
}
|
|
1590
|
+
function continuityExport(projectPath) {
|
|
1591
|
+
if (!(0, continuity_1.hasCmDir)(projectPath)) {
|
|
1592
|
+
console.log((0, box_1.renderResult)('warning', 'No .cm/ directory found. Run: cm continuity init'));
|
|
1593
|
+
return;
|
|
1594
|
+
}
|
|
1595
|
+
console.log((0, box_1.renderCommandHeader)('Export SQLite → JSON', '📤'));
|
|
1596
|
+
try {
|
|
1597
|
+
const result = (0, migrate_json_to_sqlite_1.exportSqliteToJson)(projectPath);
|
|
1598
|
+
console.log((0, theme_1.success)(` ✅ Learnings exported: ${result.learnings} → ${result.learningsPath}`));
|
|
1599
|
+
console.log((0, theme_1.success)(` ✅ Decisions exported: ${result.decisions} → ${result.decisionsPath}`));
|
|
1600
|
+
}
|
|
1601
|
+
catch (err) {
|
|
1602
|
+
console.log((0, theme_1.error)(` ❌ Export failed: ${err.message}`));
|
|
1603
|
+
}
|
|
1604
|
+
}
|
|
1605
|
+
function continuityMcp(projectPath) {
|
|
1606
|
+
const mcpPath = path_1.default.join(__dirname, 'mcp-context-server.js');
|
|
1607
|
+
console.log((0, box_1.renderCommandHeader)('MCP Context Server', '🔌'));
|
|
1608
|
+
console.log((0, theme_1.dim)(' Runs as a stdio MCP server exposing 7 context tools.\n'));
|
|
1609
|
+
console.log((0, box_1.renderKeyValue)([
|
|
1610
|
+
['Binary', mcpPath],
|
|
1611
|
+
['Project', projectPath],
|
|
1612
|
+
['Tools', 'cm_query, cm_resolve, cm_bus_read, cm_bus_write, cm_budget_check, cm_memory_decay, cm_index_refresh'],
|
|
1613
|
+
]));
|
|
1614
|
+
console.log((0, theme_1.brand)('\n Claude Desktop config snippet:'));
|
|
1615
|
+
console.log((0, theme_1.dim)(` {
|
|
1616
|
+
"mcpServers": {
|
|
1617
|
+
"cm-context": {
|
|
1618
|
+
"command": "node",
|
|
1619
|
+
"args": ["${mcpPath}", "--project", "${projectPath}"]
|
|
1620
|
+
}
|
|
1621
|
+
}
|
|
1622
|
+
}`));
|
|
1623
|
+
console.log((0, theme_1.info)('\n 💡 Add the above to ~/Library/Application Support/Claude/claude_desktop_config.json'));
|
|
1624
|
+
}
|
|
1625
|
+
// ─── Resolve Command ──────────────────────────────────────────────────────────
|
|
1626
|
+
program
|
|
1627
|
+
.command('resolve <uri>')
|
|
1628
|
+
.description('Resolve a cm:// URI and print content (e.g. cm://memory/learnings)')
|
|
1629
|
+
.option('-d, --depth <depth>', 'Loading depth: L0 | L1 | L2', 'L1')
|
|
1630
|
+
.option('-p, --project <path>', 'Project path (default: cwd)')
|
|
1631
|
+
.action((uri, opts) => {
|
|
1632
|
+
var _a;
|
|
1633
|
+
const projectPath = path_1.default.resolve(opts.project || process.cwd());
|
|
1634
|
+
const depth = (['L0', 'L1', 'L2'].includes((_a = opts.depth) !== null && _a !== void 0 ? _a : '') ? opts.depth : 'L1');
|
|
1635
|
+
try {
|
|
1636
|
+
const resolved = (0, uri_resolver_1.resolve)(uri, projectPath, depth);
|
|
1637
|
+
console.log((0, box_1.renderCommandHeader)(`cm:// Resolver — ${depth}`, '🔗'));
|
|
1638
|
+
console.log((0, box_1.renderKeyValue)([
|
|
1639
|
+
['URI', resolved.uri],
|
|
1640
|
+
['Depth', resolved.depth],
|
|
1641
|
+
['Found', String(resolved.found)],
|
|
1642
|
+
['Tokens', String(resolved.tokenEstimate)],
|
|
1643
|
+
]));
|
|
1644
|
+
if (resolved.found) {
|
|
1645
|
+
console.log((0, theme_1.brand)('\n Content:\n'));
|
|
1646
|
+
console.log(resolved.content);
|
|
1647
|
+
}
|
|
1648
|
+
else {
|
|
1649
|
+
console.log((0, theme_1.warning)('\n Not found — no content available at this URI.'));
|
|
1650
|
+
}
|
|
1651
|
+
}
|
|
1652
|
+
catch (err) {
|
|
1653
|
+
console.log((0, theme_1.error)(` ❌ ${err.message}`));
|
|
1654
|
+
}
|
|
1655
|
+
});
|
|
1505
1656
|
// ─── Brain Command (Enhanced Memory Explorer) ────────────────────────────────
|
|
1506
1657
|
program
|
|
1507
1658
|
.command('brain [cmd]')
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.generateLearningsIndex = generateLearningsIndex;
|
|
7
|
+
exports.generateSkeletonIndex = generateSkeletonIndex;
|
|
8
|
+
exports.generateContinuityAbstract = generateContinuityAbstract;
|
|
9
|
+
exports.refreshAllIndexes = refreshAllIndexes;
|
|
10
|
+
const fs_1 = __importDefault(require("fs"));
|
|
11
|
+
const path_1 = __importDefault(require("path"));
|
|
12
|
+
// ─── Constants ──────────────────────────────────────────────────────────────
|
|
13
|
+
const CM_DIR = '.cm';
|
|
14
|
+
// ─── Learnings Index (L0) ───────────────────────────────────────────────────
|
|
15
|
+
function generateLearningsIndex(projectPath) {
|
|
16
|
+
const learningsPath = path_1.default.join(projectPath, CM_DIR, 'memory', 'learnings.json');
|
|
17
|
+
let learnings = [];
|
|
18
|
+
try {
|
|
19
|
+
if (fs_1.default.existsSync(learningsPath)) {
|
|
20
|
+
learnings = JSON.parse(fs_1.default.readFileSync(learningsPath, 'utf-8'));
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
catch (_a) {
|
|
24
|
+
learnings = [];
|
|
25
|
+
}
|
|
26
|
+
const active = learnings.filter(l => !l.status || l.status === 'active');
|
|
27
|
+
const lines = [
|
|
28
|
+
`# Learnings Index (${active.length} entries)`,
|
|
29
|
+
`> L0 summary — read full entry by ID when needed`,
|
|
30
|
+
'',
|
|
31
|
+
];
|
|
32
|
+
for (const l of active) {
|
|
33
|
+
const id = l.id || '?';
|
|
34
|
+
const summary = l.error || l.whatFailed || '(no description)';
|
|
35
|
+
const scope = l.scope ? `[${l.scope}` : '[global';
|
|
36
|
+
const ttl = l.ttl ? `, TTL:${l.ttl}d]` : ']';
|
|
37
|
+
const reinforce = l.reinforceCount && l.reinforceCount > 0 ? ` ×${l.reinforceCount}` : '';
|
|
38
|
+
lines.push(`- ${id}: ${summary} ${scope}${ttl}${reinforce}`);
|
|
39
|
+
}
|
|
40
|
+
const index = lines.join('\n');
|
|
41
|
+
// Write to disk
|
|
42
|
+
const outPath = path_1.default.join(projectPath, CM_DIR, 'learnings-index.md');
|
|
43
|
+
try {
|
|
44
|
+
fs_1.default.writeFileSync(outPath, index, 'utf-8');
|
|
45
|
+
}
|
|
46
|
+
catch ( /* non-fatal */_b) { /* non-fatal */ }
|
|
47
|
+
return index;
|
|
48
|
+
}
|
|
49
|
+
// ─── Skeleton Index (L0) ────────────────────────────────────────────────────
|
|
50
|
+
function generateSkeletonIndex(projectPath) {
|
|
51
|
+
const skeletonPath = path_1.default.join(projectPath, CM_DIR, 'skeleton.md');
|
|
52
|
+
if (!fs_1.default.existsSync(skeletonPath)) {
|
|
53
|
+
const fallback = '# Skeleton Index\n> No skeleton.md found. Run `cm continuity index` to generate.\n';
|
|
54
|
+
const outPath = path_1.default.join(projectPath, CM_DIR, 'skeleton-index.md');
|
|
55
|
+
try {
|
|
56
|
+
fs_1.default.writeFileSync(outPath, fallback, 'utf-8');
|
|
57
|
+
}
|
|
58
|
+
catch ( /* non-fatal */_a) { /* non-fatal */ }
|
|
59
|
+
return fallback;
|
|
60
|
+
}
|
|
61
|
+
const content = fs_1.default.readFileSync(skeletonPath, 'utf-8');
|
|
62
|
+
const lines = content.split('\n');
|
|
63
|
+
const result = ['# Skeleton Index (L0)\n'];
|
|
64
|
+
// Extract Entry Points section
|
|
65
|
+
const entryIdx = lines.findIndex(l => /entry points?/i.test(l));
|
|
66
|
+
if (entryIdx !== -1) {
|
|
67
|
+
result.push('## Entry Points');
|
|
68
|
+
for (let i = entryIdx + 1; i < Math.min(entryIdx + 8, lines.length); i++) {
|
|
69
|
+
if (lines[i].startsWith('#'))
|
|
70
|
+
break;
|
|
71
|
+
if (lines[i].trim())
|
|
72
|
+
result.push(lines[i]);
|
|
73
|
+
}
|
|
74
|
+
result.push('');
|
|
75
|
+
}
|
|
76
|
+
// Extract top-level src/ module names from directory tree
|
|
77
|
+
const modules = [];
|
|
78
|
+
for (const line of lines) {
|
|
79
|
+
// Match lines like " continuity.ts (469 lines)" or "src/continuity.ts"
|
|
80
|
+
const m = line.match(/(?:^|\s{2,4})(\w[\w-]+)\.ts\b/);
|
|
81
|
+
if (m && !m[1].includes('test') && !m[1].includes('spec')) {
|
|
82
|
+
if (!modules.includes(m[1]))
|
|
83
|
+
modules.push(m[1]);
|
|
84
|
+
}
|
|
85
|
+
if (modules.length >= 12)
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
if (modules.length > 0) {
|
|
89
|
+
result.push('## Core Modules');
|
|
90
|
+
result.push(modules.map(m => `- ${m}`).join('\n'));
|
|
91
|
+
result.push('');
|
|
92
|
+
}
|
|
93
|
+
// Extract Config Files section
|
|
94
|
+
const configIdx = lines.findIndex(l => /config files?/i.test(l));
|
|
95
|
+
if (configIdx !== -1) {
|
|
96
|
+
result.push('## Config');
|
|
97
|
+
for (let i = configIdx + 1; i < Math.min(configIdx + 6, lines.length); i++) {
|
|
98
|
+
if (lines[i].startsWith('#'))
|
|
99
|
+
break;
|
|
100
|
+
if (lines[i].trim())
|
|
101
|
+
result.push(lines[i]);
|
|
102
|
+
}
|
|
103
|
+
result.push('');
|
|
104
|
+
}
|
|
105
|
+
// Extract Tests section
|
|
106
|
+
const testIdx = lines.findIndex(l => /^#+\s*tests?/i.test(l));
|
|
107
|
+
if (testIdx !== -1) {
|
|
108
|
+
result.push('## Tests');
|
|
109
|
+
for (let i = testIdx + 1; i < Math.min(testIdx + 6, lines.length); i++) {
|
|
110
|
+
if (lines[i].startsWith('#'))
|
|
111
|
+
break;
|
|
112
|
+
if (lines[i].trim())
|
|
113
|
+
result.push(lines[i]);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
const index = result.join('\n');
|
|
117
|
+
const outPath = path_1.default.join(projectPath, CM_DIR, 'skeleton-index.md');
|
|
118
|
+
try {
|
|
119
|
+
fs_1.default.writeFileSync(outPath, index, 'utf-8');
|
|
120
|
+
}
|
|
121
|
+
catch ( /* non-fatal */_b) { /* non-fatal */ }
|
|
122
|
+
return index;
|
|
123
|
+
}
|
|
124
|
+
// ─── Continuity Abstract ────────────────────────────────────────────────────
|
|
125
|
+
function generateContinuityAbstract(projectPath) {
|
|
126
|
+
const contPath = path_1.default.join(projectPath, CM_DIR, 'CONTINUITY.md');
|
|
127
|
+
if (!fs_1.default.existsSync(contPath)) {
|
|
128
|
+
return '> No session active.';
|
|
129
|
+
}
|
|
130
|
+
const content = fs_1.default.readFileSync(contPath, 'utf-8');
|
|
131
|
+
// Extract key fields
|
|
132
|
+
const phaseMatch = content.match(/Current Phase:\s*(.+)/);
|
|
133
|
+
const iterMatch = content.match(/Current Iteration:\s*(\d+)/);
|
|
134
|
+
const goalMatch = content.match(/## Active Goal\s*\n([^\n#]+)/);
|
|
135
|
+
const taskMatch = content.match(/- Title:\s*(.+)/);
|
|
136
|
+
const nextMatch = content.match(/## Next Actions.*?\n1\.\s*(.+)/);
|
|
137
|
+
const phase = phaseMatch ? phaseMatch[1].trim() : 'idle';
|
|
138
|
+
const iter = iterMatch ? iterMatch[1] : '0';
|
|
139
|
+
const goal = goalMatch ? goalMatch[1].trim() : 'No active goal';
|
|
140
|
+
const task = taskMatch ? taskMatch[1].trim() : null;
|
|
141
|
+
const next = nextMatch ? nextMatch[1].trim() : null;
|
|
142
|
+
const parts = [
|
|
143
|
+
`**Phase:** ${phase} (iter ${iter}) | **Goal:** ${goal}`,
|
|
144
|
+
];
|
|
145
|
+
if (task)
|
|
146
|
+
parts.push(`**Task:** ${task}`);
|
|
147
|
+
if (next)
|
|
148
|
+
parts.push(`**Next:** ${next}`);
|
|
149
|
+
return parts.join('\n');
|
|
150
|
+
}
|
|
151
|
+
// ─── Refresh All ────────────────────────────────────────────────────────────
|
|
152
|
+
function refreshAllIndexes(projectPath) {
|
|
153
|
+
return {
|
|
154
|
+
learnings: generateLearningsIndex(projectPath),
|
|
155
|
+
skeleton: generateSkeletonIndex(projectPath),
|
|
156
|
+
continuity: generateContinuityAbstract(projectPath),
|
|
157
|
+
};
|
|
158
|
+
}
|