@jacques-ai/core 0.0.7-alpha.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/dist/archive/archive-store.d.ts +166 -0
- package/dist/archive/archive-store.d.ts.map +1 -0
- package/dist/archive/archive-store.js +612 -0
- package/dist/archive/archive-store.js.map +1 -0
- package/dist/archive/bulk-archive.d.ts +63 -0
- package/dist/archive/bulk-archive.d.ts.map +1 -0
- package/dist/archive/bulk-archive.js +315 -0
- package/dist/archive/bulk-archive.js.map +1 -0
- package/dist/archive/filename-utils.d.ts +39 -0
- package/dist/archive/filename-utils.d.ts.map +1 -0
- package/dist/archive/filename-utils.js +78 -0
- package/dist/archive/filename-utils.js.map +1 -0
- package/dist/archive/index.d.ts +21 -0
- package/dist/archive/index.d.ts.map +1 -0
- package/dist/archive/index.js +45 -0
- package/dist/archive/index.js.map +1 -0
- package/dist/archive/manifest-extractor.d.ts +40 -0
- package/dist/archive/manifest-extractor.d.ts.map +1 -0
- package/dist/archive/manifest-extractor.js +456 -0
- package/dist/archive/manifest-extractor.js.map +1 -0
- package/dist/archive/migration.d.ts +59 -0
- package/dist/archive/migration.d.ts.map +1 -0
- package/dist/archive/migration.js +172 -0
- package/dist/archive/migration.js.map +1 -0
- package/dist/archive/plan-cataloger.d.ts +24 -0
- package/dist/archive/plan-cataloger.d.ts.map +1 -0
- package/dist/archive/plan-cataloger.js +100 -0
- package/dist/archive/plan-cataloger.js.map +1 -0
- package/dist/archive/plan-extractor.d.ts +84 -0
- package/dist/archive/plan-extractor.d.ts.map +1 -0
- package/dist/archive/plan-extractor.js +371 -0
- package/dist/archive/plan-extractor.js.map +1 -0
- package/dist/archive/search-indexer.d.ts +50 -0
- package/dist/archive/search-indexer.d.ts.map +1 -0
- package/dist/archive/search-indexer.js +294 -0
- package/dist/archive/search-indexer.js.map +1 -0
- package/dist/archive/subagent-store.d.ts +113 -0
- package/dist/archive/subagent-store.d.ts.map +1 -0
- package/dist/archive/subagent-store.js +173 -0
- package/dist/archive/subagent-store.js.map +1 -0
- package/dist/archive/types.d.ts +236 -0
- package/dist/archive/types.d.ts.map +1 -0
- package/dist/archive/types.js +30 -0
- package/dist/archive/types.js.map +1 -0
- package/dist/branding.d.ts +9 -0
- package/dist/branding.d.ts.map +1 -0
- package/dist/branding.js +50 -0
- package/dist/branding.js.map +1 -0
- package/dist/cache/git-utils.d.ts +36 -0
- package/dist/cache/git-utils.d.ts.map +1 -0
- package/dist/cache/git-utils.js +160 -0
- package/dist/cache/git-utils.js.map +1 -0
- package/dist/cache/hidden-projects.d.ts +19 -0
- package/dist/cache/hidden-projects.d.ts.map +1 -0
- package/dist/cache/hidden-projects.js +48 -0
- package/dist/cache/hidden-projects.js.map +1 -0
- package/dist/cache/index.d.ts +15 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +20 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/metadata-extractor.d.ts +62 -0
- package/dist/cache/metadata-extractor.d.ts.map +1 -0
- package/dist/cache/metadata-extractor.js +574 -0
- package/dist/cache/metadata-extractor.js.map +1 -0
- package/dist/cache/mode-detector.d.ts +19 -0
- package/dist/cache/mode-detector.d.ts.map +1 -0
- package/dist/cache/mode-detector.js +161 -0
- package/dist/cache/mode-detector.js.map +1 -0
- package/dist/cache/persistence.d.ts +39 -0
- package/dist/cache/persistence.d.ts.map +1 -0
- package/dist/cache/persistence.js +98 -0
- package/dist/cache/persistence.js.map +1 -0
- package/dist/cache/project-discovery.d.ts +41 -0
- package/dist/cache/project-discovery.d.ts.map +1 -0
- package/dist/cache/project-discovery.js +212 -0
- package/dist/cache/project-discovery.js.map +1 -0
- package/dist/cache/session-index.d.ts +258 -0
- package/dist/cache/session-index.d.ts.map +1 -0
- package/dist/cache/session-index.js +1030 -0
- package/dist/cache/session-index.js.map +1 -0
- package/dist/cache/types.d.ts +159 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +29 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/catalog/bulk-extractor.d.ts +18 -0
- package/dist/catalog/bulk-extractor.d.ts.map +1 -0
- package/dist/catalog/bulk-extractor.js +150 -0
- package/dist/catalog/bulk-extractor.js.map +1 -0
- package/dist/catalog/extractor.d.ts +53 -0
- package/dist/catalog/extractor.d.ts.map +1 -0
- package/dist/catalog/extractor.js +522 -0
- package/dist/catalog/extractor.js.map +1 -0
- package/dist/catalog/index.d.ts +10 -0
- package/dist/catalog/index.d.ts.map +1 -0
- package/dist/catalog/index.js +11 -0
- package/dist/catalog/index.js.map +1 -0
- package/dist/catalog/types.d.ts +134 -0
- package/dist/catalog/types.d.ts.map +1 -0
- package/dist/catalog/types.js +8 -0
- package/dist/catalog/types.js.map +1 -0
- package/dist/client/index.d.ts +6 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +5 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/websocket-client.d.ts +96 -0
- package/dist/client/websocket-client.d.ts.map +1 -0
- package/dist/client/websocket-client.js +222 -0
- package/dist/client/websocket-client.js.map +1 -0
- package/dist/context/index.d.ts +13 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +26 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/indexer.d.ts +73 -0
- package/dist/context/indexer.d.ts.map +1 -0
- package/dist/context/indexer.js +233 -0
- package/dist/context/indexer.js.map +1 -0
- package/dist/context/manager.d.ts +66 -0
- package/dist/context/manager.d.ts.map +1 -0
- package/dist/context/manager.js +310 -0
- package/dist/context/manager.js.map +1 -0
- package/dist/context/types.d.ts +149 -0
- package/dist/context/types.d.ts.map +1 -0
- package/dist/context/types.js +36 -0
- package/dist/context/types.js.map +1 -0
- package/dist/handoff/catalog.d.ts +54 -0
- package/dist/handoff/catalog.d.ts.map +1 -0
- package/dist/handoff/catalog.js +121 -0
- package/dist/handoff/catalog.js.map +1 -0
- package/dist/handoff/generator.d.ts +107 -0
- package/dist/handoff/generator.d.ts.map +1 -0
- package/dist/handoff/generator.js +603 -0
- package/dist/handoff/generator.js.map +1 -0
- package/dist/handoff/index.d.ts +13 -0
- package/dist/handoff/index.d.ts.map +1 -0
- package/dist/handoff/index.js +12 -0
- package/dist/handoff/index.js.map +1 -0
- package/dist/handoff/llm-generator.d.ts +77 -0
- package/dist/handoff/llm-generator.d.ts.map +1 -0
- package/dist/handoff/llm-generator.js +513 -0
- package/dist/handoff/llm-generator.js.map +1 -0
- package/dist/handoff/prompts.d.ts +18 -0
- package/dist/handoff/prompts.d.ts.map +1 -0
- package/dist/handoff/prompts.js +22 -0
- package/dist/handoff/prompts.js.map +1 -0
- package/dist/handoff/types.d.ts +28 -0
- package/dist/handoff/types.d.ts.map +1 -0
- package/dist/handoff/types.js +7 -0
- package/dist/handoff/types.js.map +1 -0
- package/dist/index.d.ts +56 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +132 -0
- package/dist/index.js.map +1 -0
- package/dist/logging/claude-operations.d.ts +111 -0
- package/dist/logging/claude-operations.d.ts.map +1 -0
- package/dist/logging/claude-operations.js +132 -0
- package/dist/logging/claude-operations.js.map +1 -0
- package/dist/logging/error-utils.d.ts +18 -0
- package/dist/logging/error-utils.d.ts.map +1 -0
- package/dist/logging/error-utils.js +37 -0
- package/dist/logging/error-utils.js.map +1 -0
- package/dist/logging/index.d.ts +11 -0
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +10 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/logging/logger.d.ts +25 -0
- package/dist/logging/logger.d.ts.map +1 -0
- package/dist/logging/logger.js +39 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/notifications/constants.d.ts +16 -0
- package/dist/notifications/constants.d.ts.map +1 -0
- package/dist/notifications/constants.js +49 -0
- package/dist/notifications/constants.js.map +1 -0
- package/dist/notifications/index.d.ts +9 -0
- package/dist/notifications/index.d.ts.map +1 -0
- package/dist/notifications/index.js +8 -0
- package/dist/notifications/index.js.map +1 -0
- package/dist/notifications/types.d.ts +28 -0
- package/dist/notifications/types.d.ts.map +1 -0
- package/dist/notifications/types.js +7 -0
- package/dist/notifications/types.js.map +1 -0
- package/dist/notifications/utils.d.ts +20 -0
- package/dist/notifications/utils.d.ts.map +1 -0
- package/dist/notifications/utils.js +37 -0
- package/dist/notifications/utils.js.map +1 -0
- package/dist/plan/index.d.ts +12 -0
- package/dist/plan/index.d.ts.map +1 -0
- package/dist/plan/index.js +15 -0
- package/dist/plan/index.js.map +1 -0
- package/dist/plan/plan-parser.d.ts +33 -0
- package/dist/plan/plan-parser.d.ts.map +1 -0
- package/dist/plan/plan-parser.js +189 -0
- package/dist/plan/plan-parser.js.map +1 -0
- package/dist/plan/progress-computer.d.ts +34 -0
- package/dist/plan/progress-computer.d.ts.map +1 -0
- package/dist/plan/progress-computer.js +211 -0
- package/dist/plan/progress-computer.js.map +1 -0
- package/dist/plan/progress-matcher.d.ts +34 -0
- package/dist/plan/progress-matcher.d.ts.map +1 -0
- package/dist/plan/progress-matcher.js +297 -0
- package/dist/plan/progress-matcher.js.map +1 -0
- package/dist/plan/task-extractor.d.ts +30 -0
- package/dist/plan/task-extractor.d.ts.map +1 -0
- package/dist/plan/task-extractor.js +435 -0
- package/dist/plan/task-extractor.js.map +1 -0
- package/dist/plan/types.d.ts +131 -0
- package/dist/plan/types.d.ts.map +1 -0
- package/dist/plan/types.js +8 -0
- package/dist/plan/types.js.map +1 -0
- package/dist/project/aggregator.d.ts +43 -0
- package/dist/project/aggregator.d.ts.map +1 -0
- package/dist/project/aggregator.js +218 -0
- package/dist/project/aggregator.js.map +1 -0
- package/dist/project/index.d.ts +9 -0
- package/dist/project/index.d.ts.map +1 -0
- package/dist/project/index.js +9 -0
- package/dist/project/index.js.map +1 -0
- package/dist/project/types.d.ts +65 -0
- package/dist/project/types.d.ts.map +1 -0
- package/dist/project/types.js +27 -0
- package/dist/project/types.js.map +1 -0
- package/dist/session/detector.d.ts +113 -0
- package/dist/session/detector.d.ts.map +1 -0
- package/dist/session/detector.js +333 -0
- package/dist/session/detector.js.map +1 -0
- package/dist/session/filters.d.ts +32 -0
- package/dist/session/filters.d.ts.map +1 -0
- package/dist/session/filters.js +100 -0
- package/dist/session/filters.js.map +1 -0
- package/dist/session/format-title.d.ts +16 -0
- package/dist/session/format-title.d.ts.map +1 -0
- package/dist/session/format-title.js +54 -0
- package/dist/session/format-title.js.map +1 -0
- package/dist/session/index.d.ts +16 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +10 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/parser.d.ts +264 -0
- package/dist/session/parser.d.ts.map +1 -0
- package/dist/session/parser.js +588 -0
- package/dist/session/parser.js.map +1 -0
- package/dist/session/token-estimator.d.ts +32 -0
- package/dist/session/token-estimator.d.ts.map +1 -0
- package/dist/session/token-estimator.js +139 -0
- package/dist/session/token-estimator.js.map +1 -0
- package/dist/session/transformer.d.ts +126 -0
- package/dist/session/transformer.d.ts.map +1 -0
- package/dist/session/transformer.js +158 -0
- package/dist/session/transformer.js.map +1 -0
- package/dist/setup/hooks-config.d.ts +35 -0
- package/dist/setup/hooks-config.d.ts.map +1 -0
- package/dist/setup/hooks-config.js +107 -0
- package/dist/setup/hooks-config.js.map +1 -0
- package/dist/setup/hooks-symlink.d.ts +17 -0
- package/dist/setup/hooks-symlink.d.ts.map +1 -0
- package/dist/setup/hooks-symlink.js +89 -0
- package/dist/setup/hooks-symlink.js.map +1 -0
- package/dist/setup/index.d.ts +13 -0
- package/dist/setup/index.d.ts.map +1 -0
- package/dist/setup/index.js +12 -0
- package/dist/setup/index.js.map +1 -0
- package/dist/setup/prerequisites.d.ts +11 -0
- package/dist/setup/prerequisites.d.ts.map +1 -0
- package/dist/setup/prerequisites.js +72 -0
- package/dist/setup/prerequisites.js.map +1 -0
- package/dist/setup/settings-merge.d.ts +33 -0
- package/dist/setup/settings-merge.d.ts.map +1 -0
- package/dist/setup/settings-merge.js +131 -0
- package/dist/setup/settings-merge.js.map +1 -0
- package/dist/setup/skills-install.d.ts +17 -0
- package/dist/setup/skills-install.d.ts.map +1 -0
- package/dist/setup/skills-install.js +60 -0
- package/dist/setup/skills-install.js.map +1 -0
- package/dist/setup/types.d.ts +39 -0
- package/dist/setup/types.d.ts.map +1 -0
- package/dist/setup/types.js +7 -0
- package/dist/setup/types.js.map +1 -0
- package/dist/setup/verification.d.ts +9 -0
- package/dist/setup/verification.d.ts.map +1 -0
- package/dist/setup/verification.js +91 -0
- package/dist/setup/verification.js.map +1 -0
- package/dist/shortcuts/index.d.ts +8 -0
- package/dist/shortcuts/index.d.ts.map +1 -0
- package/dist/shortcuts/index.js +6 -0
- package/dist/shortcuts/index.js.map +1 -0
- package/dist/shortcuts/key-utils.d.ts +54 -0
- package/dist/shortcuts/key-utils.d.ts.map +1 -0
- package/dist/shortcuts/key-utils.js +129 -0
- package/dist/shortcuts/key-utils.js.map +1 -0
- package/dist/shortcuts/shortcut-registry.d.ts +37 -0
- package/dist/shortcuts/shortcut-registry.d.ts.map +1 -0
- package/dist/shortcuts/shortcut-registry.js +322 -0
- package/dist/shortcuts/shortcut-registry.js.map +1 -0
- package/dist/sources/config.d.ts +91 -0
- package/dist/sources/config.d.ts.map +1 -0
- package/dist/sources/config.js +229 -0
- package/dist/sources/config.js.map +1 -0
- package/dist/sources/googledocs.d.ts +43 -0
- package/dist/sources/googledocs.d.ts.map +1 -0
- package/dist/sources/googledocs.js +298 -0
- package/dist/sources/googledocs.js.map +1 -0
- package/dist/sources/index.d.ts +14 -0
- package/dist/sources/index.d.ts.map +1 -0
- package/dist/sources/index.js +19 -0
- package/dist/sources/index.js.map +1 -0
- package/dist/sources/notion.d.ts +35 -0
- package/dist/sources/notion.d.ts.map +1 -0
- package/dist/sources/notion.js +352 -0
- package/dist/sources/notion.js.map +1 -0
- package/dist/sources/obsidian.d.ts +38 -0
- package/dist/sources/obsidian.d.ts.map +1 -0
- package/dist/sources/obsidian.js +228 -0
- package/dist/sources/obsidian.js.map +1 -0
- package/dist/sources/types.d.ts +133 -0
- package/dist/sources/types.d.ts.map +1 -0
- package/dist/sources/types.js +19 -0
- package/dist/sources/types.js.map +1 -0
- package/dist/storage/index.d.ts +6 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +5 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/writer.d.ts +86 -0
- package/dist/storage/writer.d.ts.map +1 -0
- package/dist/storage/writer.js +137 -0
- package/dist/storage/writer.js.map +1 -0
- package/dist/types.d.ts +203 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/claude-token.d.ts +49 -0
- package/dist/utils/claude-token.d.ts.map +1 -0
- package/dist/utils/claude-token.js +169 -0
- package/dist/utils/claude-token.js.map +1 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +13 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/settings.d.ts +100 -0
- package/dist/utils/settings.d.ts.map +1 -0
- package/dist/utils/settings.js +206 -0
- package/dist/utils/settings.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata-extractor.js","sourceRoot":"","sources":["../../src/cache/metadata-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mode Detector
|
|
3
|
+
*
|
|
4
|
+
* Detect session mode (planning vs execution) and extract plan references
|
|
5
|
+
* from parsed JSONL entries.
|
|
6
|
+
*/
|
|
7
|
+
import type { ParsedEntry } from "../session/parser.js";
|
|
8
|
+
import type { PlanRef } from "./types.js";
|
|
9
|
+
/**
|
|
10
|
+
* Detect session mode (planning vs execution) and extract plan references.
|
|
11
|
+
*
|
|
12
|
+
* - Planning mode: EnterPlanMode tool was called during session
|
|
13
|
+
* - Execution mode: First user message contains plan trigger pattern
|
|
14
|
+
*/
|
|
15
|
+
export declare function detectModeAndPlans(entries: ParsedEntry[]): {
|
|
16
|
+
mode: 'planning' | 'execution' | null;
|
|
17
|
+
planRefs: PlanRef[];
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=mode-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mode-detector.d.ts","sourceRoot":"","sources":["../../src/cache/mode-detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG;IAC1D,IAAI,EAAE,UAAU,GAAG,WAAW,GAAG,IAAI,CAAC;IACtC,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB,CAyKA"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mode Detector
|
|
3
|
+
*
|
|
4
|
+
* Detect session mode (planning vs execution) and extract plan references
|
|
5
|
+
* from parsed JSONL entries.
|
|
6
|
+
*/
|
|
7
|
+
import { PLAN_TRIGGER_PATTERNS, extractPlanTitle } from "../archive/plan-extractor.js";
|
|
8
|
+
/**
|
|
9
|
+
* Detect session mode (planning vs execution) and extract plan references.
|
|
10
|
+
*
|
|
11
|
+
* - Planning mode: EnterPlanMode tool was called during session
|
|
12
|
+
* - Execution mode: First user message contains plan trigger pattern
|
|
13
|
+
*/
|
|
14
|
+
export function detectModeAndPlans(entries) {
|
|
15
|
+
let mode = null;
|
|
16
|
+
const planRefs = [];
|
|
17
|
+
// Track if currently in plan mode (enter/exit pairs)
|
|
18
|
+
let inPlanMode = false;
|
|
19
|
+
// Track first real user message for execution mode detection
|
|
20
|
+
let firstUserMessageChecked = false;
|
|
21
|
+
entries.forEach((entry, index) => {
|
|
22
|
+
// Check for EnterPlanMode / ExitPlanMode tool calls
|
|
23
|
+
if (entry.type === 'tool_call' && entry.content.toolName === 'EnterPlanMode') {
|
|
24
|
+
inPlanMode = true;
|
|
25
|
+
}
|
|
26
|
+
if (entry.type === 'tool_call' && entry.content.toolName === 'ExitPlanMode') {
|
|
27
|
+
inPlanMode = false;
|
|
28
|
+
}
|
|
29
|
+
// Check first user message for execution mode
|
|
30
|
+
if (entry.type === 'user_message' && entry.content.text && !firstUserMessageChecked) {
|
|
31
|
+
const text = entry.content.text.trim();
|
|
32
|
+
// Skip internal command messages
|
|
33
|
+
if (text.startsWith('<local-command') ||
|
|
34
|
+
text.startsWith('<command-') ||
|
|
35
|
+
text.length === 0) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
firstUserMessageChecked = true;
|
|
39
|
+
// Check if first message matches plan trigger patterns
|
|
40
|
+
for (const pattern of PLAN_TRIGGER_PATTERNS) {
|
|
41
|
+
if (pattern.test(text)) {
|
|
42
|
+
mode = 'execution';
|
|
43
|
+
// Extract plan content and title
|
|
44
|
+
const match = text.match(pattern);
|
|
45
|
+
if (match) {
|
|
46
|
+
const planContent = text.substring(match[0].length).trim();
|
|
47
|
+
// Only count as plan if it has content with markdown heading
|
|
48
|
+
if (planContent.length >= 100 && planContent.includes('#')) {
|
|
49
|
+
const title = extractPlanTitle(planContent);
|
|
50
|
+
planRefs.push({
|
|
51
|
+
title,
|
|
52
|
+
source: 'embedded',
|
|
53
|
+
messageIndex: index,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Check for embedded plans in other user messages (not just first)
|
|
62
|
+
if (entry.type === 'user_message' && entry.content.text && firstUserMessageChecked) {
|
|
63
|
+
const text = entry.content.text.trim();
|
|
64
|
+
// Skip internal command messages
|
|
65
|
+
if (text.startsWith('<local-command') ||
|
|
66
|
+
text.startsWith('<command-') ||
|
|
67
|
+
text.length === 0) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
// Check for plan trigger patterns in subsequent messages
|
|
71
|
+
for (const pattern of PLAN_TRIGGER_PATTERNS) {
|
|
72
|
+
if (pattern.test(text)) {
|
|
73
|
+
const match = text.match(pattern);
|
|
74
|
+
if (match) {
|
|
75
|
+
const planContent = text.substring(match[0].length).trim();
|
|
76
|
+
if (planContent.length >= 100 && planContent.includes('#')) {
|
|
77
|
+
const title = extractPlanTitle(planContent);
|
|
78
|
+
// Avoid duplicate entries for the same message
|
|
79
|
+
if (!planRefs.some(r => r.messageIndex === index)) {
|
|
80
|
+
planRefs.push({
|
|
81
|
+
title,
|
|
82
|
+
source: 'embedded',
|
|
83
|
+
messageIndex: index,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Check for Plan agent responses from agent_progress entries
|
|
93
|
+
if (entry.type === 'agent_progress' && entry.content.agentType === 'Plan') {
|
|
94
|
+
const agentId = entry.content.agentId;
|
|
95
|
+
if (agentId && !planRefs.some(r => r.source === 'agent' && r.agentId === agentId)) {
|
|
96
|
+
planRefs.push({
|
|
97
|
+
title: entry.content.agentDescription || 'Agent-Generated Plan',
|
|
98
|
+
source: 'agent',
|
|
99
|
+
messageIndex: index,
|
|
100
|
+
agentId,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Check for Write tool calls to plan files
|
|
105
|
+
if (entry.type === 'tool_call' && entry.content.toolName === 'Write') {
|
|
106
|
+
const input = entry.content.toolInput;
|
|
107
|
+
const filePath = input?.file_path || '';
|
|
108
|
+
const content = input?.content || '';
|
|
109
|
+
// Skip code files - they're not plans even if "plan" is in the name
|
|
110
|
+
const codeExtensions = [
|
|
111
|
+
'.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',
|
|
112
|
+
'.py', '.rb', '.go', '.rs', '.java', '.kt', '.swift',
|
|
113
|
+
'.c', '.cpp', '.h', '.hpp', '.cs', '.php',
|
|
114
|
+
'.vue', '.svelte', '.astro',
|
|
115
|
+
'.css', '.scss', '.less', '.sass',
|
|
116
|
+
'.html', '.htm', '.xml', '.svg',
|
|
117
|
+
'.json', '.yaml', '.yml', '.toml',
|
|
118
|
+
'.sh', '.bash', '.zsh', '.fish',
|
|
119
|
+
'.sql', '.graphql', '.prisma',
|
|
120
|
+
];
|
|
121
|
+
const isCodeFile = codeExtensions.some(ext => filePath.toLowerCase().endsWith(ext));
|
|
122
|
+
if (isCodeFile) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
// Check if path looks like a plan file
|
|
126
|
+
const pathLooksLikePlan = filePath.toLowerCase().includes('plan') ||
|
|
127
|
+
filePath.endsWith('.plan.md') ||
|
|
128
|
+
filePath.includes('.jacques/plans/');
|
|
129
|
+
// Check if content looks like markdown plan (not code)
|
|
130
|
+
const hasHeading = /^#+\s+.+/m.test(content);
|
|
131
|
+
const hasListOrParagraph = /^[-*]\s+.+/m.test(content) || content.split('\n\n').length > 1;
|
|
132
|
+
const firstLine = content.split('\n').find(line => line.trim().length > 0) || '';
|
|
133
|
+
const codePatterns = [
|
|
134
|
+
/^import\s+/,
|
|
135
|
+
/^export\s+/,
|
|
136
|
+
/^const\s+/,
|
|
137
|
+
/^function\s+/,
|
|
138
|
+
/^class\s+/,
|
|
139
|
+
/^interface\s+/,
|
|
140
|
+
/^type\s+/,
|
|
141
|
+
];
|
|
142
|
+
const looksLikeCode = codePatterns.some(p => p.test(firstLine.trim()));
|
|
143
|
+
const looksLikeMarkdown = hasHeading && hasListOrParagraph && !looksLikeCode;
|
|
144
|
+
if (pathLooksLikePlan && looksLikeMarkdown) {
|
|
145
|
+
const title = extractPlanTitle(content);
|
|
146
|
+
planRefs.push({
|
|
147
|
+
title,
|
|
148
|
+
source: 'write',
|
|
149
|
+
messageIndex: index,
|
|
150
|
+
filePath,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
// Planning mode takes precedence if currently in plan mode
|
|
156
|
+
if (inPlanMode) {
|
|
157
|
+
mode = 'planning';
|
|
158
|
+
}
|
|
159
|
+
return { mode, planRefs };
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=mode-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mode-detector.js","sourceRoot":"","sources":["../../src/cache/mode-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistence
|
|
3
|
+
*
|
|
4
|
+
* Session index file I/O and caching with build deduplication.
|
|
5
|
+
*/
|
|
6
|
+
import type { SessionIndex } from "./types.js";
|
|
7
|
+
/**
|
|
8
|
+
* Get the cache directory path
|
|
9
|
+
*/
|
|
10
|
+
export declare function getCacheDir(): string;
|
|
11
|
+
/**
|
|
12
|
+
* Get the session index file path
|
|
13
|
+
*/
|
|
14
|
+
export declare function getIndexPath(): string;
|
|
15
|
+
/**
|
|
16
|
+
* Ensure cache directory exists
|
|
17
|
+
*/
|
|
18
|
+
export declare function ensureCacheDir(): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Read the session index from disk
|
|
21
|
+
*/
|
|
22
|
+
export declare function readSessionIndex(): Promise<SessionIndex>;
|
|
23
|
+
/**
|
|
24
|
+
* Write the session index to disk
|
|
25
|
+
*/
|
|
26
|
+
export declare function writeSessionIndex(index: SessionIndex): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Get the session index, building if necessary.
|
|
29
|
+
* Concurrent calls that trigger a rebuild share a single build.
|
|
30
|
+
* @param maxAge Maximum age in milliseconds before rebuilding (default: 5 minutes)
|
|
31
|
+
*/
|
|
32
|
+
export declare function getSessionIndex(options?: {
|
|
33
|
+
maxAge?: number;
|
|
34
|
+
}): Promise<SessionIndex>;
|
|
35
|
+
/**
|
|
36
|
+
* Invalidate the index (force rebuild on next read)
|
|
37
|
+
*/
|
|
38
|
+
export declare function invalidateIndex(): Promise<void>;
|
|
39
|
+
//# sourceMappingURL=persistence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../src/cache/persistence.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAO/C;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAEpD;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,YAAY,CAAC,CAW9D;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAI1E;AASD;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5B,OAAO,CAAC,YAAY,CAAC,CA0BvB;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAOrD"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistence
|
|
3
|
+
*
|
|
4
|
+
* Session index file I/O and caching with build deduplication.
|
|
5
|
+
*/
|
|
6
|
+
import { promises as fs } from "fs";
|
|
7
|
+
import * as path from "path";
|
|
8
|
+
import { getDefaultSessionIndex, JACQUES_CACHE_PATH, SESSION_INDEX_FILE } from "./types.js";
|
|
9
|
+
import { isNotFoundError, getErrorMessage } from "../logging/error-utils.js";
|
|
10
|
+
import { createLogger } from "../logging/logger.js";
|
|
11
|
+
const logger = createLogger({ prefix: "[Cache]" });
|
|
12
|
+
/**
|
|
13
|
+
* Get the cache directory path
|
|
14
|
+
*/
|
|
15
|
+
export function getCacheDir() {
|
|
16
|
+
return JACQUES_CACHE_PATH;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Get the session index file path
|
|
20
|
+
*/
|
|
21
|
+
export function getIndexPath() {
|
|
22
|
+
return path.join(JACQUES_CACHE_PATH, SESSION_INDEX_FILE);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Ensure cache directory exists
|
|
26
|
+
*/
|
|
27
|
+
export async function ensureCacheDir() {
|
|
28
|
+
await fs.mkdir(JACQUES_CACHE_PATH, { recursive: true });
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Read the session index from disk
|
|
32
|
+
*/
|
|
33
|
+
export async function readSessionIndex() {
|
|
34
|
+
try {
|
|
35
|
+
const indexPath = getIndexPath();
|
|
36
|
+
const content = await fs.readFile(indexPath, "utf-8");
|
|
37
|
+
return JSON.parse(content);
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
if (!isNotFoundError(err)) {
|
|
41
|
+
logger.warn("Failed to read session index:", getErrorMessage(err));
|
|
42
|
+
}
|
|
43
|
+
return getDefaultSessionIndex();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Write the session index to disk
|
|
48
|
+
*/
|
|
49
|
+
export async function writeSessionIndex(index) {
|
|
50
|
+
await ensureCacheDir();
|
|
51
|
+
const indexPath = getIndexPath();
|
|
52
|
+
await fs.writeFile(indexPath, JSON.stringify(index, null, 2), "utf-8");
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* In-flight build promise — deduplicates concurrent buildSessionIndex() calls.
|
|
56
|
+
* When multiple callers (e.g. /api/sessions/by-project and /api/projects)
|
|
57
|
+
* request the index simultaneously, only one build runs.
|
|
58
|
+
*/
|
|
59
|
+
let buildInProgress = null;
|
|
60
|
+
/**
|
|
61
|
+
* Get the session index, building if necessary.
|
|
62
|
+
* Concurrent calls that trigger a rebuild share a single build.
|
|
63
|
+
* @param maxAge Maximum age in milliseconds before rebuilding (default: 5 minutes)
|
|
64
|
+
*/
|
|
65
|
+
export async function getSessionIndex(options) {
|
|
66
|
+
const { maxAge = 5 * 60 * 1000 } = options || {};
|
|
67
|
+
const existing = await readSessionIndex();
|
|
68
|
+
// Check if index is fresh enough
|
|
69
|
+
const lastScanned = new Date(existing.lastScanned).getTime();
|
|
70
|
+
const age = Date.now() - lastScanned;
|
|
71
|
+
if (age < maxAge && existing.sessions.length > 0) {
|
|
72
|
+
return existing;
|
|
73
|
+
}
|
|
74
|
+
// Deduplicate concurrent builds
|
|
75
|
+
if (buildInProgress) {
|
|
76
|
+
return buildInProgress;
|
|
77
|
+
}
|
|
78
|
+
// Dynamic import to avoid circular dependency:
|
|
79
|
+
// persistence -> metadata-extractor -> persistence (via writeSessionIndex)
|
|
80
|
+
const { buildSessionIndex } = await import("./metadata-extractor.js");
|
|
81
|
+
buildInProgress = buildSessionIndex().finally(() => {
|
|
82
|
+
buildInProgress = null;
|
|
83
|
+
});
|
|
84
|
+
return buildInProgress;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Invalidate the index (force rebuild on next read)
|
|
88
|
+
*/
|
|
89
|
+
export async function invalidateIndex() {
|
|
90
|
+
try {
|
|
91
|
+
const indexPath = getIndexPath();
|
|
92
|
+
await fs.unlink(indexPath);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// Index doesn't exist, nothing to do
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=persistence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../src/cache/persistence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project Discovery
|
|
3
|
+
*
|
|
4
|
+
* Discovers projects from ~/.claude/projects/, groups by git repo root,
|
|
5
|
+
* merges worktrees, and provides session query helpers.
|
|
6
|
+
*/
|
|
7
|
+
import type { SessionEntry, DiscoveredProject } from "./types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Get the project group key for a session.
|
|
10
|
+
* Uses basename of gitRepoRoot when available (groups worktrees together).
|
|
11
|
+
* Canonical implementation — CLI imports this; GUI mirrors it for browser compat.
|
|
12
|
+
*/
|
|
13
|
+
export declare function getProjectGroupKey(session: {
|
|
14
|
+
git_repo_root?: string | null;
|
|
15
|
+
project: string;
|
|
16
|
+
}): string;
|
|
17
|
+
/**
|
|
18
|
+
* Get a single session entry by ID
|
|
19
|
+
*/
|
|
20
|
+
export declare function getSessionEntry(sessionId: string): Promise<SessionEntry | null>;
|
|
21
|
+
/**
|
|
22
|
+
* Get sessions grouped by project.
|
|
23
|
+
* Uses basename of gitRepoRoot when available to group worktrees together.
|
|
24
|
+
*/
|
|
25
|
+
export declare function getSessionsByProject(): Promise<Map<string, SessionEntry[]>>;
|
|
26
|
+
/**
|
|
27
|
+
* Get index statistics
|
|
28
|
+
*/
|
|
29
|
+
export declare function getIndexStats(): Promise<{
|
|
30
|
+
totalSessions: number;
|
|
31
|
+
totalProjects: number;
|
|
32
|
+
totalSizeBytes: number;
|
|
33
|
+
lastScanned: string;
|
|
34
|
+
}>;
|
|
35
|
+
/**
|
|
36
|
+
* Discover all projects from ~/.claude/projects/, grouped by git repo root.
|
|
37
|
+
* Git worktrees of the same repo are merged into a single project entry.
|
|
38
|
+
* Non-git projects are standalone entries.
|
|
39
|
+
*/
|
|
40
|
+
export declare function discoverProjects(): Promise<DiscoveredProject[]>;
|
|
41
|
+
//# sourceMappingURL=project-discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-discovery.d.ts","sourceRoot":"","sources":["../../src/cache/project-discovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAgB,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAMhF;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAMtG;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAG9B;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CACnD,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAC5B,CAeA;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC,CAeD;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA2JrE"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project Discovery
|
|
3
|
+
*
|
|
4
|
+
* Discovers projects from ~/.claude/projects/, groups by git repo root,
|
|
5
|
+
* merges worktrees, and provides session query helpers.
|
|
6
|
+
*/
|
|
7
|
+
import * as path from "path";
|
|
8
|
+
import { getSessionIndex } from "./persistence.js";
|
|
9
|
+
import { detectGitInfo, readWorktreeRepoRoot } from "./git-utils.js";
|
|
10
|
+
import { getHiddenProjects } from "./hidden-projects.js";
|
|
11
|
+
import { listAllProjects } from "./metadata-extractor.js";
|
|
12
|
+
/**
|
|
13
|
+
* Get the project group key for a session.
|
|
14
|
+
* Uses basename of gitRepoRoot when available (groups worktrees together).
|
|
15
|
+
* Canonical implementation — CLI imports this; GUI mirrors it for browser compat.
|
|
16
|
+
*/
|
|
17
|
+
export function getProjectGroupKey(session) {
|
|
18
|
+
if (session.git_repo_root) {
|
|
19
|
+
// Handle both / and \ separators (Windows uses backslashes)
|
|
20
|
+
return session.git_repo_root.split(/[/\\]/).pop() || session.project;
|
|
21
|
+
}
|
|
22
|
+
return session.project;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get a single session entry by ID
|
|
26
|
+
*/
|
|
27
|
+
export async function getSessionEntry(sessionId) {
|
|
28
|
+
const index = await getSessionIndex();
|
|
29
|
+
return index.sessions.find((s) => s.id === sessionId) || null;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get sessions grouped by project.
|
|
33
|
+
* Uses basename of gitRepoRoot when available to group worktrees together.
|
|
34
|
+
*/
|
|
35
|
+
export async function getSessionsByProject() {
|
|
36
|
+
const index = await getSessionIndex();
|
|
37
|
+
const byProject = new Map();
|
|
38
|
+
for (const session of index.sessions) {
|
|
39
|
+
// Group by git repo root basename when available (groups worktrees together)
|
|
40
|
+
const groupKey = session.gitRepoRoot
|
|
41
|
+
? path.basename(session.gitRepoRoot)
|
|
42
|
+
: session.projectSlug;
|
|
43
|
+
const existing = byProject.get(groupKey) || [];
|
|
44
|
+
existing.push(session);
|
|
45
|
+
byProject.set(groupKey, existing);
|
|
46
|
+
}
|
|
47
|
+
return byProject;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get index statistics
|
|
51
|
+
*/
|
|
52
|
+
export async function getIndexStats() {
|
|
53
|
+
const index = await getSessionIndex();
|
|
54
|
+
// Count unique projects
|
|
55
|
+
const projects = new Set(index.sessions.map((s) => s.projectSlug));
|
|
56
|
+
// Sum file sizes
|
|
57
|
+
const totalSize = index.sessions.reduce((sum, s) => sum + s.fileSizeBytes, 0);
|
|
58
|
+
return {
|
|
59
|
+
totalSessions: index.sessions.length,
|
|
60
|
+
totalProjects: projects.size,
|
|
61
|
+
totalSizeBytes: totalSize,
|
|
62
|
+
lastScanned: index.lastScanned,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Discover all projects from ~/.claude/projects/, grouped by git repo root.
|
|
67
|
+
* Git worktrees of the same repo are merged into a single project entry.
|
|
68
|
+
* Non-git projects are standalone entries.
|
|
69
|
+
*/
|
|
70
|
+
export async function discoverProjects() {
|
|
71
|
+
const rawProjects = await listAllProjects();
|
|
72
|
+
const index = await getSessionIndex();
|
|
73
|
+
// Build a lookup: encoded directory name -> sessions
|
|
74
|
+
// Uses the encoded dir (literal folder name in ~/.claude/projects/) rather than
|
|
75
|
+
// decoded projectPath, because the session index cache may have been built with
|
|
76
|
+
// stale/naive path decoding. The encoded dir name is always stable.
|
|
77
|
+
const sessionsByEncodedDir = new Map();
|
|
78
|
+
for (const session of index.sessions) {
|
|
79
|
+
const encodedDir = path.basename(path.dirname(session.jsonlPath));
|
|
80
|
+
const existing = sessionsByEncodedDir.get(encodedDir) || [];
|
|
81
|
+
existing.push(session);
|
|
82
|
+
sessionsByEncodedDir.set(encodedDir, existing);
|
|
83
|
+
}
|
|
84
|
+
const projectMap = new Map();
|
|
85
|
+
for (const raw of rawProjects) {
|
|
86
|
+
const encodedDir = path.basename(raw.encodedPath);
|
|
87
|
+
const matchingSessions = sessionsByEncodedDir.get(encodedDir) || [];
|
|
88
|
+
// Determine group key and git repo root
|
|
89
|
+
let groupKey;
|
|
90
|
+
let gitRepoRoot = null;
|
|
91
|
+
let isGitProject = false;
|
|
92
|
+
// First: check if any indexed session has gitRepoRoot
|
|
93
|
+
const sessionWithGit = matchingSessions.find((s) => s.gitRepoRoot);
|
|
94
|
+
if (sessionWithGit?.gitRepoRoot) {
|
|
95
|
+
gitRepoRoot = sessionWithGit.gitRepoRoot;
|
|
96
|
+
groupKey = path.basename(gitRepoRoot);
|
|
97
|
+
isGitProject = true;
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
// No git info in index — probe the filesystem
|
|
101
|
+
const gitInfo = await detectGitInfo(raw.projectPath);
|
|
102
|
+
if (gitInfo.repoRoot) {
|
|
103
|
+
gitRepoRoot = gitInfo.repoRoot;
|
|
104
|
+
groupKey = path.basename(gitInfo.repoRoot);
|
|
105
|
+
isGitProject = true;
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
// Non-git project: standalone entry
|
|
109
|
+
groupKey = raw.projectSlug;
|
|
110
|
+
isGitProject = false;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Find most recent activity among matching sessions
|
|
114
|
+
let latestActivity = null;
|
|
115
|
+
for (const s of matchingSessions) {
|
|
116
|
+
if (s.endedAt && (!latestActivity || s.endedAt > latestActivity)) {
|
|
117
|
+
latestActivity = s.endedAt;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Merge into existing group or create new
|
|
121
|
+
const existing = projectMap.get(groupKey);
|
|
122
|
+
if (existing) {
|
|
123
|
+
existing.projectPaths.push(raw.projectPath);
|
|
124
|
+
existing.encodedPaths.push(raw.encodedPath);
|
|
125
|
+
existing.sessionCount += matchingSessions.length;
|
|
126
|
+
if (latestActivity && (!existing.lastActivity || latestActivity > existing.lastActivity)) {
|
|
127
|
+
existing.lastActivity = latestActivity;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
projectMap.set(groupKey, {
|
|
132
|
+
name: groupKey,
|
|
133
|
+
gitRepoRoot,
|
|
134
|
+
isGitProject,
|
|
135
|
+
projectPaths: [raw.projectPath],
|
|
136
|
+
encodedPaths: [raw.encodedPath],
|
|
137
|
+
sessionCount: matchingSessions.length,
|
|
138
|
+
lastActivity: latestActivity,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Second pass: merge non-git projects that have git evidence into matching git projects.
|
|
143
|
+
// This handles deleted worktrees whose directories no longer exist on disk —
|
|
144
|
+
// detectGitInfo fails but the JSONL sessions still have gitBranch/gitRepoRoot set.
|
|
145
|
+
const nonGitKeys = Array.from(projectMap.entries())
|
|
146
|
+
.filter(([, p]) => !p.isGitProject)
|
|
147
|
+
.map(([key]) => key);
|
|
148
|
+
const gitProjects = Array.from(projectMap.values()).filter((p) => p.isGitProject && p.gitRepoRoot);
|
|
149
|
+
for (const key of nonGitKeys) {
|
|
150
|
+
const project = projectMap.get(key);
|
|
151
|
+
if (!project)
|
|
152
|
+
continue;
|
|
153
|
+
const allSessions = project.encodedPaths.flatMap((ep) => sessionsByEncodedDir.get(path.basename(ep)) || []);
|
|
154
|
+
const hasGitBranch = allSessions.some((s) => s.gitBranch);
|
|
155
|
+
if (!hasGitBranch)
|
|
156
|
+
continue;
|
|
157
|
+
let matchingGit;
|
|
158
|
+
// Strategy 1: Read .git file in zombie worktree (dir exists, .git file present).
|
|
159
|
+
// Zombie worktrees have a .git file pointing to the main repo's worktrees dir.
|
|
160
|
+
const projectDir = project.projectPaths[0];
|
|
161
|
+
const repoRoot = await readWorktreeRepoRoot(projectDir);
|
|
162
|
+
if (repoRoot) {
|
|
163
|
+
matchingGit = gitProjects.find((gp) => gp.gitRepoRoot === repoRoot);
|
|
164
|
+
}
|
|
165
|
+
// Strategy 2: Name-prefix heuristic for truly deleted worktrees (dir gone).
|
|
166
|
+
// Worktree dirs are typically named <repo>-<branch>, so the repo basename
|
|
167
|
+
// is a prefix of the worktree dirname. Only merge when unambiguous.
|
|
168
|
+
if (!matchingGit) {
|
|
169
|
+
const worktreeDirname = path.basename(projectDir);
|
|
170
|
+
const candidates = gitProjects.filter((gp) => gp.gitRepoRoot && worktreeDirname.startsWith(path.basename(gp.gitRepoRoot)));
|
|
171
|
+
if (candidates.length === 1) {
|
|
172
|
+
matchingGit = candidates[0];
|
|
173
|
+
}
|
|
174
|
+
else if (candidates.length > 1) {
|
|
175
|
+
// Prefer longest prefix match (most specific repo name)
|
|
176
|
+
candidates.sort((a, b) => path.basename(b.gitRepoRoot).length - path.basename(a.gitRepoRoot).length);
|
|
177
|
+
matchingGit = candidates[0];
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
if (!matchingGit)
|
|
181
|
+
continue;
|
|
182
|
+
// Merge into the git project
|
|
183
|
+
matchingGit.projectPaths.push(...project.projectPaths);
|
|
184
|
+
matchingGit.encodedPaths.push(...project.encodedPaths);
|
|
185
|
+
matchingGit.sessionCount += project.sessionCount;
|
|
186
|
+
if (project.lastActivity && (!matchingGit.lastActivity || project.lastActivity > matchingGit.lastActivity)) {
|
|
187
|
+
matchingGit.lastActivity = project.lastActivity;
|
|
188
|
+
}
|
|
189
|
+
projectMap.delete(key);
|
|
190
|
+
}
|
|
191
|
+
// Filter out hidden projects
|
|
192
|
+
const hidden = await getHiddenProjects();
|
|
193
|
+
if (hidden.size > 0) {
|
|
194
|
+
for (const [key, project] of projectMap) {
|
|
195
|
+
if (hidden.has(project.name)) {
|
|
196
|
+
projectMap.delete(key);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// Sort: most recent activity first, then alphabetically
|
|
201
|
+
return Array.from(projectMap.values()).sort((a, b) => {
|
|
202
|
+
if (a.lastActivity && b.lastActivity) {
|
|
203
|
+
return b.lastActivity.localeCompare(a.lastActivity);
|
|
204
|
+
}
|
|
205
|
+
if (a.lastActivity && !b.lastActivity)
|
|
206
|
+
return -1;
|
|
207
|
+
if (!a.lastActivity && b.lastActivity)
|
|
208
|
+
return 1;
|
|
209
|
+
return a.name.localeCompare(b.name);
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=project-discovery.js.map
|