@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,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration Module
|
|
3
|
+
*
|
|
4
|
+
* Handles migrations for the archive system, including adding projectId
|
|
5
|
+
* to existing manifests that only have projectSlug.
|
|
6
|
+
*/
|
|
7
|
+
import * as path from "path";
|
|
8
|
+
import { listManifests, readManifest, saveManifest, writeGlobalIndex, } from "./archive-store.js";
|
|
9
|
+
import { addToIndex } from "./search-indexer.js";
|
|
10
|
+
import { getDefaultSearchIndex } from "./types.js";
|
|
11
|
+
import { decodeProjectPath } from "../session/detector.js";
|
|
12
|
+
/**
|
|
13
|
+
* Migrate existing manifests to include projectId.
|
|
14
|
+
*
|
|
15
|
+
* For manifests that have projectPath but no projectId, generates
|
|
16
|
+
* projectId from the full path using dash-encoding pattern.
|
|
17
|
+
*
|
|
18
|
+
* Also rebuilds the search index to use projectId as keys.
|
|
19
|
+
*/
|
|
20
|
+
export async function migrateToProjectId() {
|
|
21
|
+
const result = {
|
|
22
|
+
updated: 0,
|
|
23
|
+
skipped: 0,
|
|
24
|
+
errors: [],
|
|
25
|
+
};
|
|
26
|
+
try {
|
|
27
|
+
// 1. Get all manifest IDs
|
|
28
|
+
const manifestIds = await listManifests();
|
|
29
|
+
// 2. Migrate each manifest
|
|
30
|
+
const migratedManifests = [];
|
|
31
|
+
for (const id of manifestIds) {
|
|
32
|
+
try {
|
|
33
|
+
const manifest = await readManifest(id);
|
|
34
|
+
if (!manifest) {
|
|
35
|
+
result.errors.push(`Could not read manifest: ${id}`);
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
// Check if migration is needed
|
|
39
|
+
if (manifest.projectId) {
|
|
40
|
+
result.skipped++;
|
|
41
|
+
migratedManifests.push(manifest);
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
// Generate projectId from projectPath
|
|
45
|
+
if (manifest.projectPath) {
|
|
46
|
+
manifest.projectId = manifest.projectPath.replace(/\//g, "-");
|
|
47
|
+
await saveManifest(manifest);
|
|
48
|
+
result.updated++;
|
|
49
|
+
migratedManifests.push(manifest);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
// Fallback: use projectSlug if no projectPath (shouldn't happen)
|
|
53
|
+
manifest.projectId = manifest.projectSlug;
|
|
54
|
+
await saveManifest(manifest);
|
|
55
|
+
result.updated++;
|
|
56
|
+
migratedManifests.push(manifest);
|
|
57
|
+
result.errors.push(`Manifest ${id} has no projectPath, used projectSlug as fallback`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
result.errors.push(`Failed to migrate manifest ${id}: ${err instanceof Error ? err.message : String(err)}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// 3. Rebuild the search index with new projectId keys
|
|
65
|
+
const newIndex = getDefaultSearchIndex();
|
|
66
|
+
for (const manifest of migratedManifests) {
|
|
67
|
+
addToIndex(newIndex, manifest);
|
|
68
|
+
}
|
|
69
|
+
await writeGlobalIndex(newIndex);
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
result.errors.push(`Migration failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
73
|
+
}
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Check if migration is needed.
|
|
78
|
+
* Returns true if any manifests are missing projectId.
|
|
79
|
+
*/
|
|
80
|
+
export async function isMigrationNeeded() {
|
|
81
|
+
try {
|
|
82
|
+
const manifestIds = await listManifests();
|
|
83
|
+
// Check a sample of manifests (first 10)
|
|
84
|
+
const sampleIds = manifestIds.slice(0, 10);
|
|
85
|
+
for (const id of sampleIds) {
|
|
86
|
+
const manifest = await readManifest(id);
|
|
87
|
+
if (manifest && !manifest.projectId) {
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Get migration status (how many manifests need migration).
|
|
99
|
+
*/
|
|
100
|
+
export async function getMigrationStatus() {
|
|
101
|
+
const manifestIds = await listManifests();
|
|
102
|
+
let needsMigration = 0;
|
|
103
|
+
let alreadyMigrated = 0;
|
|
104
|
+
for (const id of manifestIds) {
|
|
105
|
+
const manifest = await readManifest(id);
|
|
106
|
+
if (manifest) {
|
|
107
|
+
if (manifest.projectId) {
|
|
108
|
+
alreadyMigrated++;
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
needsMigration++;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
total: manifestIds.length,
|
|
117
|
+
needsMigration,
|
|
118
|
+
alreadyMigrated,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Migrate manifest project paths using the fixed decodeProjectPath().
|
|
123
|
+
*
|
|
124
|
+
* Re-decodes each manifest's projectId (which is the encoded dir name)
|
|
125
|
+
* to get the correct projectPath and projectSlug using sessions-index.json.
|
|
126
|
+
* Updates manifests where the decoded values differ from what's stored.
|
|
127
|
+
*/
|
|
128
|
+
export async function migrateProjectPaths() {
|
|
129
|
+
const result = {
|
|
130
|
+
updated: 0,
|
|
131
|
+
skipped: 0,
|
|
132
|
+
errors: [],
|
|
133
|
+
};
|
|
134
|
+
try {
|
|
135
|
+
const manifestIds = await listManifests();
|
|
136
|
+
for (const id of manifestIds) {
|
|
137
|
+
try {
|
|
138
|
+
const manifest = await readManifest(id);
|
|
139
|
+
if (!manifest) {
|
|
140
|
+
result.errors.push(`Could not read manifest: ${id}`);
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
// Use projectId (encoded path) to re-decode
|
|
144
|
+
const encodedDir = manifest.projectId || manifest.projectPath?.replace(/\//g, "-");
|
|
145
|
+
if (!encodedDir) {
|
|
146
|
+
result.errors.push(`Manifest ${id} has no projectId or projectPath`);
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
const correctPath = await decodeProjectPath(encodedDir);
|
|
150
|
+
const correctSlug = path.basename(correctPath);
|
|
151
|
+
// Check if update is needed
|
|
152
|
+
if (manifest.projectPath === correctPath && manifest.projectSlug === correctSlug) {
|
|
153
|
+
result.skipped++;
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
// Update the manifest
|
|
157
|
+
manifest.projectPath = correctPath;
|
|
158
|
+
manifest.projectSlug = correctSlug;
|
|
159
|
+
await saveManifest(manifest);
|
|
160
|
+
result.updated++;
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
result.errors.push(`Failed to migrate manifest ${id}: ${err instanceof Error ? err.message : String(err)}`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
result.errors.push(`Migration failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
169
|
+
}
|
|
170
|
+
return result;
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration.js","sourceRoot":"","sources":["../../src/archive/migration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plan Cataloger
|
|
3
|
+
*
|
|
4
|
+
* Ensures plan content is cataloged in .jacques/index.json with content-based dedup.
|
|
5
|
+
* This is the single entry point for adding plans to the catalog regardless of source
|
|
6
|
+
* (embedded, written, or agent-generated).
|
|
7
|
+
*/
|
|
8
|
+
import type { PlanEntry } from "../context/types.js";
|
|
9
|
+
export interface CatalogPlanInput {
|
|
10
|
+
title: string;
|
|
11
|
+
content: string;
|
|
12
|
+
sessionId: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Catalog a plan in the project index.
|
|
16
|
+
*
|
|
17
|
+
* Takes plan content and ensures it exists in .jacques/index.json:
|
|
18
|
+
* 1. Normalize content → SHA-256 hash (full content + body only)
|
|
19
|
+
* 2. Check for existing entry with same contentHash or bodyHash
|
|
20
|
+
* 3. If exists: merge sessionId into sessions[], return existing entry
|
|
21
|
+
* 4. If new: write .md file, add to index, return new entry
|
|
22
|
+
*/
|
|
23
|
+
export declare function catalogPlan(projectPath: string, input: CatalogPlanInput): Promise<PlanEntry>;
|
|
24
|
+
//# sourceMappingURL=plan-cataloger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-cataloger.d.ts","sourceRoot":"","sources":["../../src/archive/plan-cataloger.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AASrD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,SAAS,CAAC,CA0FpB"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plan Cataloger
|
|
3
|
+
*
|
|
4
|
+
* Ensures plan content is cataloged in .jacques/index.json with content-based dedup.
|
|
5
|
+
* This is the single entry point for adding plans to the catalog regardless of source
|
|
6
|
+
* (embedded, written, or agent-generated).
|
|
7
|
+
*/
|
|
8
|
+
import { promises as fs } from "fs";
|
|
9
|
+
import { join } from "path";
|
|
10
|
+
import { readProjectIndex, addPlanToIndex } from "../context/indexer.js";
|
|
11
|
+
import { generatePlanFingerprint, extractPlanTitle, findDuplicatePlan, } from "./plan-extractor.js";
|
|
12
|
+
import { generatePlanFilename, generateVersionedFilename } from "./filename-utils.js";
|
|
13
|
+
/**
|
|
14
|
+
* Catalog a plan in the project index.
|
|
15
|
+
*
|
|
16
|
+
* Takes plan content and ensures it exists in .jacques/index.json:
|
|
17
|
+
* 1. Normalize content → SHA-256 hash (full content + body only)
|
|
18
|
+
* 2. Check for existing entry with same contentHash or bodyHash
|
|
19
|
+
* 3. If exists: merge sessionId into sessions[], return existing entry
|
|
20
|
+
* 4. If new: write .md file, add to index, return new entry
|
|
21
|
+
*/
|
|
22
|
+
export async function catalogPlan(projectPath, input) {
|
|
23
|
+
const { content, sessionId } = input;
|
|
24
|
+
const fingerprint = generatePlanFingerprint(content);
|
|
25
|
+
const now = new Date().toISOString();
|
|
26
|
+
// Check for existing plan with same content hash in index
|
|
27
|
+
const index = await readProjectIndex(projectPath);
|
|
28
|
+
const existingByContentHash = index.plans.find((p) => p.contentHash === fingerprint.contentHash);
|
|
29
|
+
if (existingByContentHash) {
|
|
30
|
+
// Content-hash match: merge session, update timestamp, backfill bodyHash if missing
|
|
31
|
+
const updatedPlan = {
|
|
32
|
+
...existingByContentHash,
|
|
33
|
+
bodyHash: existingByContentHash.bodyHash || fingerprint.bodyHash,
|
|
34
|
+
updatedAt: now,
|
|
35
|
+
sessions: [...new Set([...existingByContentHash.sessions, sessionId])],
|
|
36
|
+
};
|
|
37
|
+
await addPlanToIndex(projectPath, updatedPlan);
|
|
38
|
+
return updatedPlan;
|
|
39
|
+
}
|
|
40
|
+
// Check for existing plan with same body hash (different title, same body)
|
|
41
|
+
const existingByBodyHash = index.plans.find((p) => p.bodyHash === fingerprint.bodyHash);
|
|
42
|
+
if (existingByBodyHash) {
|
|
43
|
+
// Body-hash match: merge session, update hashes, update timestamp
|
|
44
|
+
const updatedPlan = {
|
|
45
|
+
...existingByBodyHash,
|
|
46
|
+
contentHash: existingByBodyHash.contentHash || fingerprint.contentHash,
|
|
47
|
+
bodyHash: fingerprint.bodyHash,
|
|
48
|
+
updatedAt: now,
|
|
49
|
+
sessions: [...new Set([...existingByBodyHash.sessions, sessionId])],
|
|
50
|
+
};
|
|
51
|
+
await addPlanToIndex(projectPath, updatedPlan);
|
|
52
|
+
return updatedPlan;
|
|
53
|
+
}
|
|
54
|
+
// Also check fuzzy duplicate (high similarity, no title gate)
|
|
55
|
+
const duplicate = await findDuplicatePlan(content, projectPath);
|
|
56
|
+
if (duplicate) {
|
|
57
|
+
// Fuzzy match: merge session, add hashes, update timestamp
|
|
58
|
+
const updatedPlan = {
|
|
59
|
+
...duplicate,
|
|
60
|
+
contentHash: duplicate.contentHash || fingerprint.contentHash,
|
|
61
|
+
bodyHash: duplicate.bodyHash || fingerprint.bodyHash,
|
|
62
|
+
updatedAt: now,
|
|
63
|
+
sessions: [...new Set([...duplicate.sessions, sessionId])],
|
|
64
|
+
};
|
|
65
|
+
await addPlanToIndex(projectPath, updatedPlan);
|
|
66
|
+
return updatedPlan;
|
|
67
|
+
}
|
|
68
|
+
// New plan: write file and add to index
|
|
69
|
+
const title = input.title || extractPlanTitle(content);
|
|
70
|
+
let filename = generatePlanFilename(title);
|
|
71
|
+
const plansDir = join(projectPath, ".jacques", "plans");
|
|
72
|
+
await fs.mkdir(plansDir, { recursive: true });
|
|
73
|
+
// Check for filename collision
|
|
74
|
+
try {
|
|
75
|
+
await fs.access(join(plansDir, filename));
|
|
76
|
+
// File exists with different content, create versioned filename
|
|
77
|
+
filename = await generateVersionedFilename(plansDir, filename);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// File doesn't exist, use as-is
|
|
81
|
+
}
|
|
82
|
+
// Write the plan file
|
|
83
|
+
const planPath = join(plansDir, filename);
|
|
84
|
+
await fs.writeFile(planPath, content, "utf-8");
|
|
85
|
+
// Create and save the catalog entry with both hashes
|
|
86
|
+
const planEntry = {
|
|
87
|
+
id: filename.replace(".md", ""),
|
|
88
|
+
title,
|
|
89
|
+
filename,
|
|
90
|
+
path: `plans/${filename}`,
|
|
91
|
+
contentHash: fingerprint.contentHash,
|
|
92
|
+
bodyHash: fingerprint.bodyHash,
|
|
93
|
+
createdAt: now,
|
|
94
|
+
updatedAt: now,
|
|
95
|
+
sessions: [sessionId],
|
|
96
|
+
};
|
|
97
|
+
await addPlanToIndex(projectPath, planEntry);
|
|
98
|
+
return planEntry;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=plan-cataloger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-cataloger.js","sourceRoot":"","sources":["../../src/archive/plan-cataloger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plan Extractor
|
|
3
|
+
*
|
|
4
|
+
* Detects and extracts embedded plans from user messages in sessions.
|
|
5
|
+
* Plans are often embedded when starting from plan mode with "Implement the following plan:".
|
|
6
|
+
*/
|
|
7
|
+
import type { ParsedEntry } from "../session/parser.js";
|
|
8
|
+
import type { PlanReference } from "./types.js";
|
|
9
|
+
import type { PlanEntry } from "../context/types.js";
|
|
10
|
+
/** Patterns that indicate an embedded plan */
|
|
11
|
+
export declare const PLAN_TRIGGER_PATTERNS: RegExp[];
|
|
12
|
+
/**
|
|
13
|
+
* Detected plan with metadata
|
|
14
|
+
*/
|
|
15
|
+
export interface DetectedPlan {
|
|
16
|
+
planContent: string;
|
|
17
|
+
messageIndex: number;
|
|
18
|
+
planIndex: number;
|
|
19
|
+
triggeredBy: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Plan fingerprint for deduplication
|
|
23
|
+
*/
|
|
24
|
+
export interface PlanFingerprint {
|
|
25
|
+
contentHash: string;
|
|
26
|
+
bodyHash: string;
|
|
27
|
+
titleNormalized: string;
|
|
28
|
+
lengthRange: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Detect embedded plans in session entries.
|
|
32
|
+
* Checks all user messages for plan trigger patterns.
|
|
33
|
+
*/
|
|
34
|
+
export declare function detectEmbeddedPlans(entries: ParsedEntry[]): DetectedPlan[];
|
|
35
|
+
/**
|
|
36
|
+
* Split content that contains multiple plans by top-level headings.
|
|
37
|
+
*/
|
|
38
|
+
export declare function splitMultiplePlans(content: string): string[];
|
|
39
|
+
/**
|
|
40
|
+
* Extract title from plan content.
|
|
41
|
+
* Prefers first markdown heading, falls back to first line.
|
|
42
|
+
*/
|
|
43
|
+
export declare function extractPlanTitle(content: string): string;
|
|
44
|
+
/**
|
|
45
|
+
* Extract plan body (content without the title heading).
|
|
46
|
+
* Strips the first markdown heading line and returns the rest.
|
|
47
|
+
*/
|
|
48
|
+
export declare function extractPlanBody(content: string): string;
|
|
49
|
+
/**
|
|
50
|
+
* Generate a hash of the plan body only (excludes title).
|
|
51
|
+
* Used for detecting duplicates with different titles but same content.
|
|
52
|
+
*/
|
|
53
|
+
export declare function generateBodyHash(content: string): string;
|
|
54
|
+
/**
|
|
55
|
+
* Generate a plan fingerprint for deduplication.
|
|
56
|
+
* Normalizes content to ignore whitespace differences.
|
|
57
|
+
*/
|
|
58
|
+
export declare function generatePlanFingerprint(content: string): PlanFingerprint;
|
|
59
|
+
/**
|
|
60
|
+
* Calculate text similarity using simple word overlap (Jaccard similarity).
|
|
61
|
+
* Returns a score between 0 (no overlap) and 1 (identical).
|
|
62
|
+
*/
|
|
63
|
+
export declare function calculateSimilarity(text1: string, text2: string): number;
|
|
64
|
+
/**
|
|
65
|
+
* Find a duplicate plan in the existing catalog.
|
|
66
|
+
* Uses a two-tier approach:
|
|
67
|
+
* 1. Exact contentHash match (full content identical)
|
|
68
|
+
* 2. Exact bodyHash match (same body, different title)
|
|
69
|
+
* 3. Fuzzy similarity >= 75% within same length range (no title gate)
|
|
70
|
+
*
|
|
71
|
+
* Returns the PlanEntry if found, null otherwise.
|
|
72
|
+
*/
|
|
73
|
+
export declare function findDuplicatePlan(content: string, projectPath: string): Promise<PlanEntry | null>;
|
|
74
|
+
/**
|
|
75
|
+
* Index an embedded plan in the project index.
|
|
76
|
+
* Creates or updates the PlanEntry with session link.
|
|
77
|
+
*/
|
|
78
|
+
export declare function indexEmbeddedPlan(content: string, filename: string, sessionId: string, projectPath: string): Promise<PlanEntry>;
|
|
79
|
+
/**
|
|
80
|
+
* Extract embedded plans from session entries and save to project.
|
|
81
|
+
* Returns array of PlanReference objects for the manifest.
|
|
82
|
+
*/
|
|
83
|
+
export declare function extractEmbeddedPlans(entries: ParsedEntry[], projectPath: string, sessionId: string): Promise<PlanReference[]>;
|
|
84
|
+
//# sourceMappingURL=plan-extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-extractor.d.ts","sourceRoot":"","sources":["../../src/archive/plan-extractor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAKrD,8CAA8C;AAC9C,eAAO,MAAM,qBAAqB,UAIjC,CAAC;AAQF;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,YAAY,EAAE,CA4C1E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAkC5D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAgBxD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAoBvD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQxD;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAuCxE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAYxE;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAiD3B;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,SAAS,CAAC,CAgDpB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,WAAW,EAAE,EACtB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,aAAa,EAAE,CAAC,CAgF1B"}
|