cap-pro 1.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-plugin/README.md +26 -0
- package/.claude-plugin/marketplace.json +24 -0
- package/.claude-plugin/plugin.json +24 -0
- package/LICENSE +21 -0
- package/README.ja-JP.md +834 -0
- package/README.ko-KR.md +823 -0
- package/README.md +806 -0
- package/README.pt-BR.md +452 -0
- package/README.zh-CN.md +800 -0
- package/agents/cap-architect.md +269 -0
- package/agents/cap-brainstormer.md +207 -0
- package/agents/cap-curator.md +276 -0
- package/agents/cap-debugger.md +365 -0
- package/agents/cap-designer.md +246 -0
- package/agents/cap-historian.md +464 -0
- package/agents/cap-migrator.md +291 -0
- package/agents/cap-prototyper.md +197 -0
- package/agents/cap-validator.md +308 -0
- package/bin/install.js +5433 -0
- package/cap/bin/cap-tools.cjs +853 -0
- package/cap/bin/lib/arc-scanner.cjs +344 -0
- package/cap/bin/lib/cap-affinity-engine.cjs +862 -0
- package/cap/bin/lib/cap-anchor.cjs +228 -0
- package/cap/bin/lib/cap-annotation-writer.cjs +340 -0
- package/cap/bin/lib/cap-checkpoint.cjs +434 -0
- package/cap/bin/lib/cap-cluster-detect.cjs +945 -0
- package/cap/bin/lib/cap-cluster-display.cjs +52 -0
- package/cap/bin/lib/cap-cluster-format.cjs +245 -0
- package/cap/bin/lib/cap-cluster-helpers.cjs +295 -0
- package/cap/bin/lib/cap-cluster-io.cjs +212 -0
- package/cap/bin/lib/cap-completeness.cjs +540 -0
- package/cap/bin/lib/cap-deps.cjs +583 -0
- package/cap/bin/lib/cap-design-families.cjs +332 -0
- package/cap/bin/lib/cap-design.cjs +966 -0
- package/cap/bin/lib/cap-divergence-detector.cjs +400 -0
- package/cap/bin/lib/cap-doctor.cjs +752 -0
- package/cap/bin/lib/cap-feature-map-internals.cjs +19 -0
- package/cap/bin/lib/cap-feature-map-migrate.cjs +335 -0
- package/cap/bin/lib/cap-feature-map-monorepo.cjs +885 -0
- package/cap/bin/lib/cap-feature-map-shard.cjs +315 -0
- package/cap/bin/lib/cap-feature-map.cjs +1943 -0
- package/cap/bin/lib/cap-fitness-score.cjs +1075 -0
- package/cap/bin/lib/cap-impact-analysis.cjs +652 -0
- package/cap/bin/lib/cap-learn-review.cjs +1072 -0
- package/cap/bin/lib/cap-learning-signals.cjs +627 -0
- package/cap/bin/lib/cap-loader.cjs +227 -0
- package/cap/bin/lib/cap-logger.cjs +57 -0
- package/cap/bin/lib/cap-memory-bridge.cjs +764 -0
- package/cap/bin/lib/cap-memory-confidence.cjs +452 -0
- package/cap/bin/lib/cap-memory-dir.cjs +987 -0
- package/cap/bin/lib/cap-memory-engine.cjs +698 -0
- package/cap/bin/lib/cap-memory-extends.cjs +398 -0
- package/cap/bin/lib/cap-memory-graph.cjs +790 -0
- package/cap/bin/lib/cap-memory-migrate.cjs +2015 -0
- package/cap/bin/lib/cap-memory-pin.cjs +183 -0
- package/cap/bin/lib/cap-memory-platform.cjs +490 -0
- package/cap/bin/lib/cap-memory-prune.cjs +707 -0
- package/cap/bin/lib/cap-memory-schema.cjs +812 -0
- package/cap/bin/lib/cap-migrate-tags.cjs +309 -0
- package/cap/bin/lib/cap-migrate.cjs +540 -0
- package/cap/bin/lib/cap-pattern-apply.cjs +1203 -0
- package/cap/bin/lib/cap-pattern-pipeline.cjs +1034 -0
- package/cap/bin/lib/cap-plugin-manifest.cjs +80 -0
- package/cap/bin/lib/cap-realtime-affinity.cjs +399 -0
- package/cap/bin/lib/cap-reconcile.cjs +570 -0
- package/cap/bin/lib/cap-research-gate.cjs +218 -0
- package/cap/bin/lib/cap-scope-filter.cjs +402 -0
- package/cap/bin/lib/cap-semantic-pipeline.cjs +1038 -0
- package/cap/bin/lib/cap-session-extract.cjs +987 -0
- package/cap/bin/lib/cap-session.cjs +445 -0
- package/cap/bin/lib/cap-snapshot-linkage.cjs +963 -0
- package/cap/bin/lib/cap-stack-docs.cjs +646 -0
- package/cap/bin/lib/cap-tag-observer.cjs +371 -0
- package/cap/bin/lib/cap-tag-scanner.cjs +1766 -0
- package/cap/bin/lib/cap-telemetry.cjs +466 -0
- package/cap/bin/lib/cap-test-audit.cjs +1438 -0
- package/cap/bin/lib/cap-thread-migrator.cjs +307 -0
- package/cap/bin/lib/cap-thread-synthesis.cjs +545 -0
- package/cap/bin/lib/cap-thread-tracker.cjs +519 -0
- package/cap/bin/lib/cap-trace.cjs +399 -0
- package/cap/bin/lib/cap-trust-mode.cjs +336 -0
- package/cap/bin/lib/cap-ui-design-editor.cjs +642 -0
- package/cap/bin/lib/cap-ui-mind-map.cjs +712 -0
- package/cap/bin/lib/cap-ui-thread-nav.cjs +693 -0
- package/cap/bin/lib/cap-ui.cjs +1245 -0
- package/cap/bin/lib/cap-upgrade.cjs +1028 -0
- package/cap/bin/lib/cli/arg-helpers.cjs +49 -0
- package/cap/bin/lib/cli/frontmatter-router.cjs +31 -0
- package/cap/bin/lib/cli/init-router.cjs +68 -0
- package/cap/bin/lib/cli/phase-router.cjs +102 -0
- package/cap/bin/lib/cli/state-router.cjs +61 -0
- package/cap/bin/lib/cli/template-router.cjs +37 -0
- package/cap/bin/lib/cli/uat-router.cjs +29 -0
- package/cap/bin/lib/cli/validation-router.cjs +26 -0
- package/cap/bin/lib/cli/verification-router.cjs +31 -0
- package/cap/bin/lib/cli/workstream-router.cjs +39 -0
- package/cap/bin/lib/commands.cjs +961 -0
- package/cap/bin/lib/config.cjs +467 -0
- package/cap/bin/lib/convention-reader.cjs +258 -0
- package/cap/bin/lib/core.cjs +1241 -0
- package/cap/bin/lib/feature-aggregator.cjs +423 -0
- package/cap/bin/lib/frontmatter.cjs +337 -0
- package/cap/bin/lib/init.cjs +1443 -0
- package/cap/bin/lib/manifest-generator.cjs +383 -0
- package/cap/bin/lib/milestone.cjs +253 -0
- package/cap/bin/lib/model-profiles.cjs +69 -0
- package/cap/bin/lib/monorepo-context.cjs +226 -0
- package/cap/bin/lib/monorepo-migrator.cjs +509 -0
- package/cap/bin/lib/phase.cjs +889 -0
- package/cap/bin/lib/profile-output.cjs +989 -0
- package/cap/bin/lib/profile-pipeline.cjs +540 -0
- package/cap/bin/lib/roadmap.cjs +330 -0
- package/cap/bin/lib/security.cjs +394 -0
- package/cap/bin/lib/session-manager.cjs +292 -0
- package/cap/bin/lib/skeleton-generator.cjs +179 -0
- package/cap/bin/lib/state.cjs +1032 -0
- package/cap/bin/lib/template.cjs +231 -0
- package/cap/bin/lib/test-detector.cjs +62 -0
- package/cap/bin/lib/uat.cjs +283 -0
- package/cap/bin/lib/verify.cjs +889 -0
- package/cap/bin/lib/workspace-detector.cjs +371 -0
- package/cap/bin/lib/workstream.cjs +492 -0
- package/cap/commands/gsd/workstreams.md +63 -0
- package/cap/references/arc-standard.md +315 -0
- package/cap/references/cap-agent-architecture.md +101 -0
- package/cap/references/cap-gitignore-template +9 -0
- package/cap/references/cap-zero-deps.md +158 -0
- package/cap/references/checkpoints.md +778 -0
- package/cap/references/continuation-format.md +249 -0
- package/cap/references/contract-test-templates.md +312 -0
- package/cap/references/feature-map-template.md +25 -0
- package/cap/references/git-integration.md +295 -0
- package/cap/references/git-planning-commit.md +38 -0
- package/cap/references/model-profiles.md +174 -0
- package/cap/references/phase-numbering.md +126 -0
- package/cap/references/planning-config.md +202 -0
- package/cap/references/property-test-templates.md +316 -0
- package/cap/references/security-test-templates.md +347 -0
- package/cap/references/session-template.json +8 -0
- package/cap/references/tdd.md +263 -0
- package/cap/references/user-profiling.md +681 -0
- package/cap/references/verification-patterns.md +612 -0
- package/cap/templates/UAT.md +265 -0
- package/cap/templates/claude-md.md +175 -0
- package/cap/templates/codebase/architecture.md +255 -0
- package/cap/templates/codebase/concerns.md +310 -0
- package/cap/templates/codebase/conventions.md +307 -0
- package/cap/templates/codebase/integrations.md +280 -0
- package/cap/templates/codebase/stack.md +186 -0
- package/cap/templates/codebase/structure.md +285 -0
- package/cap/templates/codebase/testing.md +480 -0
- package/cap/templates/config.json +44 -0
- package/cap/templates/context.md +352 -0
- package/cap/templates/continue-here.md +78 -0
- package/cap/templates/copilot-instructions.md +7 -0
- package/cap/templates/debug-subagent-prompt.md +91 -0
- package/cap/templates/discussion-log.md +63 -0
- package/cap/templates/milestone-archive.md +123 -0
- package/cap/templates/milestone.md +115 -0
- package/cap/templates/phase-prompt.md +610 -0
- package/cap/templates/planner-subagent-prompt.md +117 -0
- package/cap/templates/project.md +186 -0
- package/cap/templates/requirements.md +231 -0
- package/cap/templates/research-project/ARCHITECTURE.md +204 -0
- package/cap/templates/research-project/FEATURES.md +147 -0
- package/cap/templates/research-project/PITFALLS.md +200 -0
- package/cap/templates/research-project/STACK.md +120 -0
- package/cap/templates/research-project/SUMMARY.md +170 -0
- package/cap/templates/research.md +552 -0
- package/cap/templates/roadmap.md +202 -0
- package/cap/templates/state.md +176 -0
- package/cap/templates/summary.md +364 -0
- package/cap/templates/user-preferences.md +498 -0
- package/cap/templates/verification-report.md +322 -0
- package/cap/workflows/add-phase.md +112 -0
- package/cap/workflows/add-tests.md +351 -0
- package/cap/workflows/add-todo.md +158 -0
- package/cap/workflows/audit-milestone.md +340 -0
- package/cap/workflows/audit-uat.md +109 -0
- package/cap/workflows/autonomous.md +891 -0
- package/cap/workflows/check-todos.md +177 -0
- package/cap/workflows/cleanup.md +152 -0
- package/cap/workflows/complete-milestone.md +767 -0
- package/cap/workflows/diagnose-issues.md +231 -0
- package/cap/workflows/discovery-phase.md +289 -0
- package/cap/workflows/discuss-phase-assumptions.md +653 -0
- package/cap/workflows/discuss-phase.md +1049 -0
- package/cap/workflows/do.md +104 -0
- package/cap/workflows/execute-phase.md +846 -0
- package/cap/workflows/execute-plan.md +514 -0
- package/cap/workflows/fast.md +105 -0
- package/cap/workflows/forensics.md +265 -0
- package/cap/workflows/health.md +181 -0
- package/cap/workflows/help.md +660 -0
- package/cap/workflows/insert-phase.md +130 -0
- package/cap/workflows/list-phase-assumptions.md +178 -0
- package/cap/workflows/list-workspaces.md +56 -0
- package/cap/workflows/manager.md +362 -0
- package/cap/workflows/map-codebase.md +377 -0
- package/cap/workflows/milestone-summary.md +223 -0
- package/cap/workflows/new-milestone.md +486 -0
- package/cap/workflows/new-project.md +1250 -0
- package/cap/workflows/new-workspace.md +237 -0
- package/cap/workflows/next.md +97 -0
- package/cap/workflows/node-repair.md +92 -0
- package/cap/workflows/note.md +156 -0
- package/cap/workflows/pause-work.md +176 -0
- package/cap/workflows/plan-milestone-gaps.md +273 -0
- package/cap/workflows/plan-phase.md +857 -0
- package/cap/workflows/plant-seed.md +169 -0
- package/cap/workflows/pr-branch.md +129 -0
- package/cap/workflows/profile-user.md +449 -0
- package/cap/workflows/progress.md +507 -0
- package/cap/workflows/quick.md +757 -0
- package/cap/workflows/remove-phase.md +155 -0
- package/cap/workflows/remove-workspace.md +90 -0
- package/cap/workflows/research-phase.md +82 -0
- package/cap/workflows/resume-project.md +326 -0
- package/cap/workflows/review.md +228 -0
- package/cap/workflows/session-report.md +146 -0
- package/cap/workflows/settings.md +283 -0
- package/cap/workflows/ship.md +228 -0
- package/cap/workflows/stats.md +60 -0
- package/cap/workflows/transition.md +671 -0
- package/cap/workflows/ui-phase.md +298 -0
- package/cap/workflows/ui-review.md +161 -0
- package/cap/workflows/update.md +323 -0
- package/cap/workflows/validate-phase.md +170 -0
- package/cap/workflows/verify-phase.md +254 -0
- package/cap/workflows/verify-work.md +637 -0
- package/commands/cap/annotate.md +165 -0
- package/commands/cap/brainstorm.md +393 -0
- package/commands/cap/checkpoint.md +106 -0
- package/commands/cap/completeness.md +94 -0
- package/commands/cap/continue.md +72 -0
- package/commands/cap/debug.md +588 -0
- package/commands/cap/deps.md +169 -0
- package/commands/cap/design.md +479 -0
- package/commands/cap/init.md +354 -0
- package/commands/cap/iterate.md +249 -0
- package/commands/cap/learn.md +459 -0
- package/commands/cap/memory.md +275 -0
- package/commands/cap/migrate-feature-map.md +91 -0
- package/commands/cap/migrate-memory.md +108 -0
- package/commands/cap/migrate-tags.md +91 -0
- package/commands/cap/migrate.md +131 -0
- package/commands/cap/prototype.md +510 -0
- package/commands/cap/reconcile.md +121 -0
- package/commands/cap/review.md +360 -0
- package/commands/cap/save.md +72 -0
- package/commands/cap/scan.md +404 -0
- package/commands/cap/start.md +356 -0
- package/commands/cap/status.md +118 -0
- package/commands/cap/test-audit.md +262 -0
- package/commands/cap/test.md +394 -0
- package/commands/cap/trace.md +133 -0
- package/commands/cap/ui.md +167 -0
- package/hooks/dist/cap-check-update.js +115 -0
- package/hooks/dist/cap-context-monitor.js +185 -0
- package/hooks/dist/cap-learn-review-hook.js +114 -0
- package/hooks/dist/cap-learning-hook.js +192 -0
- package/hooks/dist/cap-memory.js +299 -0
- package/hooks/dist/cap-prompt-guard.js +97 -0
- package/hooks/dist/cap-statusline.js +157 -0
- package/hooks/dist/cap-tag-observer.js +115 -0
- package/hooks/dist/cap-version-check.js +112 -0
- package/hooks/dist/cap-workflow-guard.js +175 -0
- package/hooks/hooks.json +55 -0
- package/package.json +58 -0
- package/scripts/base64-scan.sh +262 -0
- package/scripts/build-hooks.js +93 -0
- package/scripts/cap-removal-checklist.md +202 -0
- package/scripts/prompt-injection-scan.sh +199 -0
- package/scripts/run-tests.cjs +181 -0
- package/scripts/secret-scan.sh +227 -0
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// @cap-feature(feature:F-050) I/O layer extracted from cap-cluster-display.cjs.
|
|
4
|
+
// Loads data from disk (graph.json, thread-index.json, threads/{id}.json), runs affinity computation
|
|
5
|
+
// and cluster detection, and exposes loadAndFormat* convenience wrappers that delegate to cap-cluster-format.
|
|
6
|
+
// @cap-feature(feature:F-040) Cluster I/O wrappers -- load disk state then format.
|
|
7
|
+
// @cap-decision Each silent catch site in the original _loadClusterData() now emits a structured diagnostic
|
|
8
|
+
// via cap-logger.debug(). The recovery semantics (return null/empty) are preserved so the public API and
|
|
9
|
+
// caller behavior do not change. Only difference: with CAP_DEBUG=1 set, failures become visible.
|
|
10
|
+
|
|
11
|
+
const path = require('node:path');
|
|
12
|
+
const logger = require('./cap-logger.cjs');
|
|
13
|
+
const format = require('./cap-cluster-format.cjs');
|
|
14
|
+
|
|
15
|
+
// --- Lazy-loaded dependencies (avoid circular requires + speed up cold start) ---
|
|
16
|
+
|
|
17
|
+
/** @returns {typeof import('./cap-cluster-detect.cjs')} */
|
|
18
|
+
function _clusterDetect() {
|
|
19
|
+
return require(path.join(__dirname, 'cap-cluster-detect.cjs'));
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** @returns {typeof import('./cap-affinity-engine.cjs')} */
|
|
23
|
+
function _affinityEngine() {
|
|
24
|
+
return require(path.join(__dirname, 'cap-affinity-engine.cjs'));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** @returns {typeof import('./cap-semantic-pipeline.cjs')} */
|
|
28
|
+
function _semanticPipeline() {
|
|
29
|
+
return require(path.join(__dirname, 'cap-semantic-pipeline.cjs'));
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** @returns {typeof import('./cap-memory-graph.cjs')} */
|
|
33
|
+
function _memoryGraph() {
|
|
34
|
+
return require(path.join(__dirname, 'cap-memory-graph.cjs'));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** @returns {typeof import('./cap-thread-tracker.cjs')} */
|
|
38
|
+
function _threadTracker() {
|
|
39
|
+
return require(path.join(__dirname, 'cap-thread-tracker.cjs'));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// --- I/O Convenience Functions ---
|
|
43
|
+
|
|
44
|
+
// @cap-todo(ac:F-040/AC-6) I/O convenience wrappers load data from disk and delegate to pure formatters
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Load all data and format the cluster overview.
|
|
48
|
+
*
|
|
49
|
+
* @param {string} cwd - Project root directory
|
|
50
|
+
* @returns {string} Formatted overview string
|
|
51
|
+
*/
|
|
52
|
+
function loadAndFormatOverview(cwd) {
|
|
53
|
+
const { clusters, graph, affinityResults } = _loadClusterData(cwd);
|
|
54
|
+
return format.formatClusterOverview(clusters, graph, affinityResults);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Load all data and format a cluster detail view.
|
|
59
|
+
*
|
|
60
|
+
* @param {string} cwd - Project root directory
|
|
61
|
+
* @param {string} clusterLabel - Label of the cluster to display
|
|
62
|
+
* @returns {string} Formatted detail string
|
|
63
|
+
*/
|
|
64
|
+
function loadAndFormatDetail(cwd, clusterLabel) {
|
|
65
|
+
const { clusters, graph, affinityResults, threads } = _loadClusterData(cwd);
|
|
66
|
+
|
|
67
|
+
// Find cluster by label (case-insensitive partial match)
|
|
68
|
+
const normalizedLabel = (clusterLabel || '').toLowerCase().trim();
|
|
69
|
+
const cluster = clusters.find(c =>
|
|
70
|
+
c.label.toLowerCase() === normalizedLabel ||
|
|
71
|
+
c.label.toLowerCase().includes(normalizedLabel)
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
if (!cluster) {
|
|
75
|
+
const available = clusters.map(c => ` - ${c.label}`).join('\n');
|
|
76
|
+
return [
|
|
77
|
+
`Cluster "${clusterLabel}" not found.`,
|
|
78
|
+
'',
|
|
79
|
+
'Available clusters:',
|
|
80
|
+
available || ' (none)',
|
|
81
|
+
].join('\n');
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return format.formatClusterDetail(cluster, affinityResults, graph, threads);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Load all data and format the Neural Memory status section.
|
|
89
|
+
* Designed for integration into /cap:status output.
|
|
90
|
+
*
|
|
91
|
+
* @param {string} cwd - Project root directory
|
|
92
|
+
* @returns {string} Formatted status section
|
|
93
|
+
*/
|
|
94
|
+
function loadAndFormatStatus(cwd) {
|
|
95
|
+
const { clusters, graph, affinityResults } = _loadClusterData(cwd);
|
|
96
|
+
return format.formatNeuralMemoryStatus(clusters, graph, affinityResults);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// --- Internal: shared data loader with structured diagnostics ---
|
|
100
|
+
|
|
101
|
+
// @cap-todo(ac:F-050/AC-2) Each catch site emits a structured diagnostic (op, file, errorType, errorMessage,
|
|
102
|
+
// recoveryAction) via cap-logger.debug() instead of silently swallowing the error.
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Load graph, threads, compute affinity, and run cluster detection.
|
|
106
|
+
* Shared data loading for all I/O convenience functions.
|
|
107
|
+
*
|
|
108
|
+
* @param {string} cwd - Project root directory
|
|
109
|
+
* @returns {{clusters: Object[], graph: Object, affinityResults: Object[], threads: Object[]}}
|
|
110
|
+
*/
|
|
111
|
+
function _loadClusterData(cwd) {
|
|
112
|
+
const graphMod = _memoryGraph();
|
|
113
|
+
const threadMod = _threadTracker();
|
|
114
|
+
const affinityMod = _affinityEngine();
|
|
115
|
+
const clusterMod = _clusterDetect();
|
|
116
|
+
const semanticMod = _semanticPipeline();
|
|
117
|
+
|
|
118
|
+
// --- 1. Load graph ---
|
|
119
|
+
// @cap-risk(feature:F-050) Graph load fallback creates an empty graph -- callers see a fresh blank
|
|
120
|
+
// graph instead of a hard error. Now visible via CAP_DEBUG so failures are debuggable.
|
|
121
|
+
const graphPath = path.join(cwd, '.cap', 'memory', 'graph.json');
|
|
122
|
+
let graph;
|
|
123
|
+
try {
|
|
124
|
+
graph = graphMod.loadGraph(cwd);
|
|
125
|
+
} catch (err) {
|
|
126
|
+
logger.debug(logger.fromError('loadClusterData.loadGraph', err, {
|
|
127
|
+
file: graphPath,
|
|
128
|
+
recoveryAction: 'creating empty graph via createGraph()',
|
|
129
|
+
}));
|
|
130
|
+
graph = graphMod.createGraph();
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// --- 2. Load thread index and all threads ---
|
|
134
|
+
const indexPath = path.join(cwd, '.cap', 'memory', 'thread-index.json');
|
|
135
|
+
let threads = [];
|
|
136
|
+
try {
|
|
137
|
+
const index = threadMod.loadIndex(cwd);
|
|
138
|
+
const entries = index.threads || [];
|
|
139
|
+
for (const entry of entries) {
|
|
140
|
+
// @cap-risk(feature:F-050) Per-thread load fallback skips unloadable threads -- they vanish
|
|
141
|
+
// from cluster output. Now visible via CAP_DEBUG so partial losses are debuggable.
|
|
142
|
+
try {
|
|
143
|
+
const thread = threadMod.loadThread(cwd, entry.id);
|
|
144
|
+
if (thread) threads.push(thread);
|
|
145
|
+
} catch (err) {
|
|
146
|
+
const threadFile = path.join(cwd, '.cap', 'memory', 'threads', `${entry.id}.json`);
|
|
147
|
+
logger.debug(logger.fromError('loadClusterData.loadThread', err, {
|
|
148
|
+
file: threadFile,
|
|
149
|
+
threadId: entry.id,
|
|
150
|
+
recoveryAction: 'skipping this thread; continuing with remaining entries',
|
|
151
|
+
}));
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
} catch (err) {
|
|
155
|
+
logger.debug(logger.fromError('loadClusterData.loadIndex', err, {
|
|
156
|
+
file: indexPath,
|
|
157
|
+
recoveryAction: 'returning empty threads array',
|
|
158
|
+
}));
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// --- 3. Load affinity config and compute batch affinity ---
|
|
162
|
+
// @cap-risk(feature:F-050) Affinity failure returns empty results -- cluster detection will see no
|
|
163
|
+
// edges and produce no clusters. Now visible via CAP_DEBUG so silent emptiness is debuggable.
|
|
164
|
+
let affinityResults = [];
|
|
165
|
+
try {
|
|
166
|
+
const config = affinityMod.loadConfig(cwd);
|
|
167
|
+
const context = { graph, allThreads: threads, threadIndex: threads };
|
|
168
|
+
// Signature is computeAffinityBatch(threads, context, config) — swapped here
|
|
169
|
+
// meant `context` landed in `config`, `config.weights` was undefined, and the
|
|
170
|
+
// whole affinity pipeline silently returned empty results. User-visible
|
|
171
|
+
// symptom: /cap:cluster kept reporting "No clusters detected" even on
|
|
172
|
+
// projects with 20+ threads and curated cluster entries in thread-index.json.
|
|
173
|
+
affinityResults = affinityMod.computeAffinityBatch(threads, context, config);
|
|
174
|
+
affinityResults = affinityMod.filterPersistable(affinityResults);
|
|
175
|
+
} catch (err) {
|
|
176
|
+
logger.debug(logger.fromError('loadClusterData.computeAffinity', err, {
|
|
177
|
+
threadCount: threads.length,
|
|
178
|
+
recoveryAction: 'returning empty affinityResults array',
|
|
179
|
+
}));
|
|
180
|
+
affinityResults = [];
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// --- 4. Run cluster detection ---
|
|
184
|
+
// @cap-risk(feature:F-050) Cluster detection failure returns empty cluster list -- the user sees
|
|
185
|
+
// "no clusters detected" even when threads exist. Now visible via CAP_DEBUG.
|
|
186
|
+
let clusters = [];
|
|
187
|
+
try {
|
|
188
|
+
const taxonomy = semanticMod.SEED_TAXONOMY;
|
|
189
|
+
const result = clusterMod.runClusterDetection(affinityResults, graph, threads, { taxonomy });
|
|
190
|
+
clusters = result.clusters || [];
|
|
191
|
+
graph = result.graph || graph;
|
|
192
|
+
} catch (err) {
|
|
193
|
+
logger.debug(logger.fromError('loadClusterData.runClusterDetection', err, {
|
|
194
|
+
affinityResultCount: affinityResults.length,
|
|
195
|
+
threadCount: threads.length,
|
|
196
|
+
recoveryAction: 'returning empty clusters array; preserving original graph',
|
|
197
|
+
}));
|
|
198
|
+
clusters = [];
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
return { clusters, graph, affinityResults, threads };
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
module.exports = {
|
|
205
|
+
// I/O convenience
|
|
206
|
+
loadAndFormatOverview,
|
|
207
|
+
loadAndFormatDetail,
|
|
208
|
+
loadAndFormatStatus,
|
|
209
|
+
|
|
210
|
+
// Internal (for testing)
|
|
211
|
+
_loadClusterData,
|
|
212
|
+
};
|