freeharness 0.4.1 → 0.4.2

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.
Files changed (194) hide show
  1. package/README.md +8 -7
  2. package/canonical/HARVEST.yaml +25 -14
  3. package/canonical/PROVENANCE.yaml +1 -1
  4. package/canonical/agents/README.md +77 -36
  5. package/canonical/agents/agentic-architect.md +2 -1
  6. package/canonical/agents/database-reviewer.md +6 -8
  7. package/canonical/agents/explorer-ai-engineer-analyst.md +2 -6
  8. package/canonical/agents/implementer.md +30 -0
  9. package/canonical/agents/pr-reviewer.md +9 -11
  10. package/canonical/agents/python-reviewer.md +7 -9
  11. package/canonical/agents/report-formatter.md +7 -3
  12. package/canonical/agents/security-reviewer.md +7 -8
  13. package/canonical/agents/test-writer.md +5 -2
  14. package/canonical/hooks/cost-prices.json +11 -9
  15. package/canonical/hooks/freeharness-config-guard.mjs +8072 -87
  16. package/canonical/hooks/freeharness-context-monitor.mjs +88 -54
  17. package/canonical/hooks/freeharness-converge.mjs +78 -23
  18. package/canonical/hooks/freeharness-cost-tracker.mjs +1129 -218
  19. package/canonical/hooks/freeharness-memory-guard.mjs +20 -23
  20. package/canonical/hooks/freeharness-precompact.mjs +217 -87
  21. package/canonical/hooks/freeharness-quota-tap.mjs +173 -0
  22. package/canonical/hooks/freeharness-reload-context.mjs +197 -0
  23. package/canonical/hooks/freeharness-repeat-tool.mjs +1 -1
  24. package/canonical/hooks/freeharness-sdd-context.mjs +970 -0
  25. package/canonical/hooks/freeharness-session-start +297 -59
  26. package/canonical/hooks/hooks.claude-code.json +1 -1
  27. package/canonical/hooks/hooks.config-guard.claude-code.json +3 -2
  28. package/canonical/hooks/hooks.context-monitor.claude-code.json +1 -1
  29. package/canonical/hooks/hooks.converge.claude-code.json +1 -1
  30. package/canonical/hooks/hooks.memory-guard.claude-code.json +3 -2
  31. package/canonical/hooks/hooks.reload-context.claude-code.json +15 -0
  32. package/canonical/openspec/schema.spec-driven.yaml +29 -8
  33. package/canonical/openspec/templates/follow-ups.md +3 -2
  34. package/canonical/openspec/templates/proposal.md +1 -1
  35. package/canonical/openspec/templates/tasks.md +8 -0
  36. package/canonical/rules/CLAUDE.md +5 -4
  37. package/canonical/rules/routing.md +10 -9
  38. package/canonical/skills/agent-evaluation/SKILL.md +17 -6
  39. package/canonical/skills/agent-evaluation/evals/cases.yaml +38 -23
  40. package/canonical/skills/agentic-architecture/SKILL.md +4 -0
  41. package/canonical/skills/agentic-architecture/evals/cases.yaml +27 -0
  42. package/canonical/skills/code-review/SKILL.md +9 -2
  43. package/canonical/skills/code-review/evals/cases.yaml +1118 -27
  44. package/canonical/skills/git-workflow/SKILL.md +2 -0
  45. package/canonical/skills/local-code/SKILL.md +2 -2
  46. package/canonical/skills/local-code/evals/cases.yaml +1 -1
  47. package/canonical/skills/report-formatting/SKILL.md +10 -2
  48. package/canonical/skills/report-formatting/reference/ARCHITECTURE.md +3 -3
  49. package/canonical/skills/report-formatting/reference/HELPERS.md +10 -5
  50. package/canonical/skills/report-formatting/reference/RELEASE.md +1 -2
  51. package/canonical/skills/report-formatting/reference/TEMPLATES.md +3 -2
  52. package/canonical/skills/report-formatting/reference/authoring.md +25 -37
  53. package/canonical/skills/report-formatting/scripts/build-architecture.js +1 -1
  54. package/canonical/skills/report-formatting/scripts/build-md-claro.js +5 -8
  55. package/canonical/skills/report-formatting/scripts/check-env.js +0 -4
  56. package/canonical/skills/report-formatting/scripts/docmodel.js +3 -11
  57. package/canonical/skills/report-formatting/scripts/example-build.js +8 -10
  58. package/canonical/skills/report-formatting/scripts/example_build_ArchitectureReview_docx.js +8 -10
  59. package/canonical/skills/report-formatting/scripts/example_build_ExecutiveReport_docx.js +8 -10
  60. package/canonical/skills/report-formatting/scripts/theme-claro.js +39 -10
  61. package/canonical/skills/subagent-driven-development/SKILL.md +35 -28
  62. package/canonical/skills/subagent-driven-development/evals/cases.yaml +3496 -19
  63. package/canonical/skills/subagent-driven-development/reference/brief.md +185 -35
  64. package/canonical/skills/subagent-driven-development/reference/handoff.md +82 -2
  65. package/canonical/skills/subagent-driven-development/reference/loop.md +57 -0
  66. package/canonical/skills/subagent-driven-development/reference/trees.md +40 -0
  67. package/canonical/skills/subagent-driven-development/reference/workspace.md +31 -0
  68. package/canonical/skills/subagent-driven-development/scripts/validate-handoff.mjs +4771 -326
  69. package/dist/adapters/harness/claude-code.d.ts +19 -3
  70. package/dist/adapters/harness/claude-code.js +204 -39
  71. package/dist/adapters/harness/opencode.js +16 -2
  72. package/dist/adapters/harness/plugin.js +28 -17
  73. package/dist/adapters/memory/doctor.d.ts +174 -29
  74. package/dist/adapters/memory/doctor.js +758 -134
  75. package/dist/adapters/memory/migrate.d.ts +95 -0
  76. package/dist/adapters/memory/migrate.js +497 -0
  77. package/dist/adapters/memory/paths.d.ts +22 -0
  78. package/dist/adapters/memory/paths.js +85 -0
  79. package/dist/adapters/memory/vendored.d.ts +56 -29
  80. package/dist/adapters/memory/vendored.js +191 -154
  81. package/dist/adapters/sync/diff.js +4 -1
  82. package/dist/cli/cleanup-prompt.d.ts +35 -0
  83. package/dist/cli/cleanup-prompt.js +68 -0
  84. package/dist/cli/cleanup.d.ts +22 -24
  85. package/dist/cli/cleanup.js +182 -68
  86. package/dist/cli/cost-quota.d.ts +158 -0
  87. package/dist/cli/cost-quota.js +645 -0
  88. package/dist/cli/cost.d.ts +408 -46
  89. package/dist/cli/cost.js +1731 -57
  90. package/dist/cli/doctor.d.ts +52 -13
  91. package/dist/cli/doctor.js +193 -44
  92. package/dist/cli/hard-cleanup.d.ts +93 -0
  93. package/dist/cli/hard-cleanup.js +552 -0
  94. package/dist/cli/install-facts.d.ts +28 -0
  95. package/dist/cli/install-facts.js +66 -0
  96. package/dist/cli/json-key-edit.d.ts +18 -0
  97. package/dist/cli/json-key-edit.js +118 -0
  98. package/dist/cli/memory-import.d.ts +74 -0
  99. package/dist/cli/memory-import.js +469 -0
  100. package/dist/cli/plugin-validate.d.ts +12 -0
  101. package/dist/cli/plugin-validate.js +43 -0
  102. package/dist/cli/uninstall.d.ts +1 -1
  103. package/dist/cli/uninstall.js +2 -2
  104. package/dist/cli/upstream-launchers.d.ts +49 -0
  105. package/dist/cli/upstream-launchers.js +287 -0
  106. package/dist/index.js +247 -70
  107. package/dist/infra/fsutil.d.ts +31 -3
  108. package/dist/infra/fsutil.js +69 -6
  109. package/dist/infra/manifest.d.ts +2 -1
  110. package/dist/infra/manifest.js +3 -2
  111. package/dist/infra/prices.d.ts +18 -0
  112. package/dist/infra/prices.js +64 -0
  113. package/node_modules/@freeharness/core/dist/tiers.d.ts +10 -1
  114. package/node_modules/@freeharness/core/dist/tiers.js +24 -2
  115. package/node_modules/@freeharness/core/package.json +1 -1
  116. package/node_modules/@freeharness/sdd/PROVENANCE.yaml +279 -2
  117. package/node_modules/@freeharness/sdd/dist/src/bin/openspec.js +34 -8
  118. package/node_modules/@freeharness/sdd/dist/src/shim/archive.d.ts +7 -6
  119. package/node_modules/@freeharness/sdd/dist/src/shim/archive.js +72 -64
  120. package/node_modules/@freeharness/sdd/dist/src/shim/follow-up.d.ts +48 -16
  121. package/node_modules/@freeharness/sdd/dist/src/shim/follow-up.js +168 -70
  122. package/node_modules/@freeharness/sdd/dist/src/shim/instructions.d.ts +36 -6
  123. package/node_modules/@freeharness/sdd/dist/src/shim/instructions.js +110 -49
  124. package/node_modules/@freeharness/sdd/dist/src/shim/list.d.ts +1 -1
  125. package/node_modules/@freeharness/sdd/dist/src/shim/list.js +57 -14
  126. package/node_modules/@freeharness/sdd/dist/src/shim/nested-change.d.ts +7 -0
  127. package/node_modules/@freeharness/sdd/dist/src/shim/nested-change.js +118 -0
  128. package/node_modules/@freeharness/sdd/dist/src/shim/new-change.js +3 -1
  129. package/node_modules/@freeharness/sdd/dist/src/shim/proposal-capabilities.d.ts +12 -0
  130. package/node_modules/@freeharness/sdd/dist/src/shim/proposal-capabilities.js +94 -0
  131. package/node_modules/@freeharness/sdd/dist/src/shim/shared.d.ts +17 -0
  132. package/node_modules/@freeharness/sdd/dist/src/shim/shared.js +182 -1
  133. package/node_modules/@freeharness/sdd/dist/src/shim/status.d.ts +2 -2
  134. package/node_modules/@freeharness/sdd/dist/src/shim/status.js +34 -5
  135. package/node_modules/@freeharness/sdd/dist/src/shim/validate.d.ts +9 -0
  136. package/node_modules/@freeharness/sdd/dist/src/shim/validate.js +49 -41
  137. package/node_modules/@freeharness/sdd/dist/src/shim/warnings.d.ts +21 -0
  138. package/node_modules/@freeharness/sdd/dist/src/shim/warnings.js +66 -0
  139. package/node_modules/@freeharness/sdd/dist/vendor/openspec/apply/line-endings.d.ts +4 -0
  140. package/node_modules/@freeharness/sdd/dist/vendor/openspec/apply/line-endings.js +17 -0
  141. package/node_modules/@freeharness/sdd/dist/vendor/openspec/apply/specs-apply.js +95 -22
  142. package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/change-status-policy.d.ts +6 -0
  143. package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/change-status-policy.js +14 -6
  144. package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/index.d.ts +1 -1
  145. package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/index.js +1 -1
  146. package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/outputs.d.ts +3 -3
  147. package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/outputs.js +24 -4
  148. package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/task-progress.js +4 -7
  149. package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/types.js +13 -1
  150. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/apply-change.js +21 -6
  151. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/archive-change.js +80 -19
  152. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/explore.js +42 -22
  153. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/project-root.d.ts +32 -0
  154. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/project-root.js +39 -0
  155. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/propose.js +16 -9
  156. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/sync-specs.js +36 -1
  157. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/update-change.js +65 -30
  158. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/constants.d.ts +1 -1
  159. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/constants.js +1 -1
  160. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/parsers/change-parser.d.ts +8 -13
  161. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/parsers/change-parser.js +79 -102
  162. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/parsers/markdown-parser.js +4 -9
  163. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/parsers/requirement-blocks.d.ts +50 -10
  164. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/parsers/requirement-blocks.js +165 -37
  165. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/parsers/requirement-text.d.ts +24 -3
  166. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/parsers/requirement-text.js +55 -8
  167. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/parsers/spec-structure.js +4 -1
  168. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/purpose-placeholder.js +19 -9
  169. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/spec-discovery.d.ts +10 -0
  170. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/spec-discovery.js +115 -0
  171. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/task-lines.d.ts +3 -3
  172. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/task-lines.js +20 -20
  173. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/validator.d.ts +6 -0
  174. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/validator.js +75 -14
  175. package/node_modules/@freeharness/sdd/package.json +1 -1
  176. package/node_modules/@freeharness/sdd/vendor/openspec/assets/schema.upstream.yaml +47 -7
  177. package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-apply-change/SKILL.md +25 -7
  178. package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-archive-change/SKILL.md +50 -11
  179. package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-bulk-archive-change/SKILL.md +48 -10
  180. package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-continue-change/SKILL.md +27 -7
  181. package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-explore/SKILL.md +25 -12
  182. package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-ff-change/SKILL.md +17 -5
  183. package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-new-change/SKILL.md +12 -1
  184. package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-onboard/SKILL.md +47 -33
  185. package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-propose/SKILL.md +17 -5
  186. package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-sync-specs/SKILL.md +29 -1
  187. package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-update-change/SKILL.md +31 -13
  188. package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-verify-change/SKILL.md +75 -27
  189. package/package.json +6 -4
  190. package/provenance/canonical.PROVENANCE.yaml +1 -1
  191. package/provenance/memory.PROVENANCE.yaml +458 -6
  192. package/provenance/sdd.PROVENANCE.yaml +279 -2
  193. package/canonical/hooks/freeharness-auto-memory.mjs +0 -158
  194. package/canonical/hooks/hooks.auto-memory.claude-code.json +0 -16
@@ -0,0 +1,85 @@
1
+ // The CLI cannot import the engine: a copy of engine/shared/data-dir.ts and paths.ts resolveDbPath.
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ export const FREE_DIR_NAME = ".free-mem";
5
+ export const LEGACY_DIR_NAME = ".claude-mem";
6
+ export const DB_FILENAME = "free-mem.db";
7
+ export const LEGACY_DB_FILENAME = "claude-mem.db";
8
+ const DATA_DIR_KEYS = ["FREE_MEM_DATA_DIR", "CLAUDE_MEM_DATA_DIR"];
9
+ function expandHome(p, home) {
10
+ if (p === "~")
11
+ return home;
12
+ if (p.startsWith("~/"))
13
+ return path.join(home, p.slice(2));
14
+ return p;
15
+ }
16
+ function isDirectory(p) {
17
+ try {
18
+ return fs.statSync(p).isDirectory();
19
+ }
20
+ catch {
21
+ return false;
22
+ }
23
+ }
24
+ /** A settings file's keys as the engine reads them (BOM dropped, `env` first); null when unreadable. */
25
+ export function readMemorySettings(settingsPath) {
26
+ try {
27
+ if (!fs.existsSync(settingsPath))
28
+ return null;
29
+ const raw = JSON.parse(fs.readFileSync(settingsPath, "utf8").replace(/^/, ""));
30
+ const settings = raw.env ?? raw;
31
+ return settings !== null && typeof settings === "object" ? settings : null;
32
+ }
33
+ catch {
34
+ return null;
35
+ }
36
+ }
37
+ // Either default directory is a seeded value, not a redirect; honoring it pins later starts.
38
+ function settingsDataDir(settingsPath, home, defaultDirs) {
39
+ const settings = readMemorySettings(settingsPath);
40
+ if (!settings)
41
+ return undefined;
42
+ for (const key of DATA_DIR_KEYS) {
43
+ const value = settings[key];
44
+ if (typeof value !== "string" || !value)
45
+ continue;
46
+ const dir = expandHome(value, home);
47
+ if (!defaultDirs.includes(path.resolve(dir)))
48
+ return dir;
49
+ }
50
+ return undefined;
51
+ }
52
+ function dbFileIn(dataDir) {
53
+ const current = path.join(dataDir, DB_FILENAME);
54
+ const legacy = path.join(dataDir, LEGACY_DB_FILENAME);
55
+ return !fs.existsSync(current) && fs.existsSync(legacy) ? legacy : current;
56
+ }
57
+ /**
58
+ * Resolves the memory data directory and database from `env` and `home` alone, never from
59
+ * process globals, so callers and tests can pass fake values.
60
+ * @param env Environment to read `FREE_MEM_DATA_DIR` and `CLAUDE_MEM_DATA_DIR` from.
61
+ * @param home Home directory that holds `.free-mem` and `.claude-mem` and expands `~`.
62
+ */
63
+ export function resolveMemoryPaths(env, home) {
64
+ const freeDir = path.join(home, FREE_DIR_NAME);
65
+ const legacyDir = path.join(home, LEGACY_DIR_NAME);
66
+ const defaultDirs = [path.resolve(freeDir), path.resolve(legacyDir)];
67
+ const result = (dataDir, source) => ({
68
+ dataDir,
69
+ dbFile: dbFileIn(dataDir),
70
+ legacy: path.resolve(dataDir) === defaultDirs[1],
71
+ source,
72
+ });
73
+ for (const key of DATA_DIR_KEYS) {
74
+ const value = env[key];
75
+ if (value)
76
+ return result(expandHome(value, home), key);
77
+ }
78
+ for (const dir of [freeDir, legacyDir]) {
79
+ const redirect = settingsDataDir(path.join(dir, "settings.json"), home, defaultDirs);
80
+ if (redirect)
81
+ return result(redirect, "settings");
82
+ }
83
+ // An unmigrated install keeps serving its legacy directory until the copy creates ~/.free-mem.
84
+ return isDirectory(freeDir) || !isDirectory(legacyDir) ? result(freeDir, "default") : result(legacyDir, "fallback");
85
+ }
@@ -16,7 +16,7 @@ export declare const UPSTREAM_PLUGIN_KEY = "claude-mem@thedotmack";
16
16
  * canonicalDir: The resolved FreeHarness canonical directory (packages/cli/canonical).
17
17
  *
18
18
  * Returns:
19
- * Absolute engine path, or null when the vendored tree is absent (npx bridge).
19
+ * Absolute engine path, or null when the vendored tree is absent (memory is then skipped).
20
20
  */
21
21
  export declare function vendoredMemoryEngineDir(canonicalDir: string): string | null;
22
22
  /**
@@ -49,19 +49,44 @@ export interface ClaudePluginPaths {
49
49
  * The path set mirrored from upstream utils/paths.ts.
50
50
  */
51
51
  export declare function claudePluginPaths(version: string): ClaudePluginPaths;
52
+ /** Built bundles a plugin dir needs before it may replace a cached build. */
53
+ export declare const PLUGIN_BUNDLES: readonly ["bun-runner.js", "worker-service.cjs", "mcp-server.cjs"];
52
54
  /**
53
- * Content digest of a plugin bundle: every file's relative posix path and bytes, in
54
- * path order, so a same-version rebuild whose output is byte-identical digests the
55
- * same as the previous run. Skips `node_modules` (matches the copy filter) and the
56
- * marker file itself, so re-staging never invalidates its own guard.
55
+ * Digest of a plugin bundle over every entry's relpath, type, mode and content or link target,
56
+ * in path order. Walks with lstat and never follows a symlink. Skips `node_modules` and the
57
+ * unstaged entries, so the vendored plugin and its staged copy digest alike.
57
58
  *
58
59
  * Args:
59
60
  * dir: Directory to digest recursively (absent dir digests as empty).
60
61
  *
61
62
  * Returns:
62
- * Lowercase hex SHA-256 over `path + NUL + content + NUL` per file.
63
+ * Lowercase hex SHA-256.
63
64
  */
64
65
  export declare function bundleDigest(dir: string): string;
66
+ export interface StageResult {
67
+ staged: boolean;
68
+ digest: string;
69
+ notes: string[];
70
+ }
71
+ /**
72
+ * Stage a plugin dir into a cache dir unless the marker and the cache's own digest both equal
73
+ * the plugin digest and the declared deps resolve; `staged` is true for a (would-be) re-stage.
74
+ */
75
+ export declare function stagePluginCache(pluginDir: string, cacheDir: string, opts: {
76
+ dryRun: boolean;
77
+ }): StageResult;
78
+ /** Identity of the cache marker file (absent: null); every re-stage writes a new one. */
79
+ export declare function stageStamp(cacheDir: string): string | null;
80
+ export declare function missingPluginBundles(pluginDir: string): string[];
81
+ /** Whether a plugin dir's package.json declares runtime deps, which only Bun installs. */
82
+ export declare function declaresPluginDeps(dir: string): boolean;
83
+ /**
84
+ * Declared plugin deps that do not resolve from `<dir>/node_modules` (upstream
85
+ * verifyCriticalModules), plus the zod subpaths the worker requires when zod is declared.
86
+ */
87
+ export declare function missingPluginDeps(dir: string): string[];
88
+ /** Install a staged cache's runtime deps (the hooks run from there); throws when one stays missing. */
89
+ export declare function installPluginDeps(dir: string, bunPath: string): void;
65
90
  /** Probe result for one runtime tool. */
66
91
  export interface ToolProbe {
67
92
  path: string | null;
@@ -74,31 +99,39 @@ export interface ToolProbe {
74
99
  * Path + version, or nulls when absent.
75
100
  */
76
101
  export declare function probeBun(): ToolProbe;
77
- /**
78
- * Probe uv (Chroma vector store runtime; upstream setup-runtime getUvPath).
79
- *
80
- * Returns:
81
- * Path + version, or nulls when absent.
82
- */
83
- export declare function probeUv(): ToolProbe;
84
102
  /**
85
103
  * Whether an upstream registration (UPSTREAM_PLUGIN_KEY) is still live: present in
86
- * installed_plugins.json, or enabledPlugins carries it at a value other than `false`. Once a
87
- * migration sets it to `false`, later `registerHooks` runs see it as already migrated and skip
88
- * the backup/disable branch (idempotent on re-run).
104
+ * installed_plugins.json, or enabledPlugins carries it at a value other than `false`. Read-only:
105
+ * doctor warns on it and the data copy refuses while it is live.
89
106
  *
90
107
  * Args:
91
108
  * installed: Parsed installed_plugins.json (or `{}` when absent).
92
109
  * settings: Parsed settings.json (or `{}` when absent).
93
110
  *
94
111
  * Returns:
95
- * True when the upstream key still needs disabling.
112
+ * True when the upstream plugin may still load beside free-mem.
96
113
  */
97
114
  export declare function isUpstreamRegistered(installed: {
98
115
  plugins?: Record<string, unknown>;
99
116
  }, settings: {
100
117
  enabledPlugins?: Record<string, boolean>;
101
118
  }): boolean;
119
+ /** Write the `.install-version` marker that tells our build apart; never writes through a symlink. `uv` stays for readers of the old shape. */
120
+ export declare function writeInstallMarker(dir: string, version: string, bun: string): string;
121
+ /**
122
+ * Version from a plugin dir's manifest ("0.0.0" when absent). The version names a cache
123
+ * directory that staging removes, so an empty or path-like value must never reach a path.
124
+ *
125
+ * Args:
126
+ * pluginDir: Plugin directory holding `.claude-plugin/plugin.json`.
127
+ *
128
+ * Returns:
129
+ * The semver version.
130
+ *
131
+ * Raises:
132
+ * Error: When the manifest version is not a semver version.
133
+ */
134
+ export declare function pluginVersion(pluginDir: string): string;
102
135
  /** MemoryPort implementation backed by the vendored claude-mem plugin build. */
103
136
  export declare class VendoredMemory implements MemoryPort {
104
137
  readonly engineDir: string;
@@ -115,7 +148,7 @@ export declare class VendoredMemory implements MemoryPort {
115
148
  version(): string;
116
149
  private result;
117
150
  /**
118
- * Probe Bun and uv; instruct when missing. Never installs them (user's machine).
151
+ * Probe Bun; instruct when missing. Never installs it (user's machine).
119
152
  *
120
153
  * Returns:
121
154
  * Notes only. A missing Bun is reported as "MISSING" and blocks install().
@@ -131,20 +164,14 @@ export declare class VendoredMemory implements MemoryPort {
131
164
  * Register the plugin with Claude Code (upstream registerMarketplace / registerPlugin /
132
165
  * enablePluginInClaudeSettings). All three writes are additive merges: other
133
166
  * marketplaces, plugins, hooks and settings keys are preserved byte-for-byte in shape.
134
- *
135
- * When an upstream registration (UPSTREAM_PLUGIN_KEY) is found (installed_plugins.json
136
- * or a still-true enabledPlugins entry), this also backs up the three files below with a
137
- * shared timestamp before the first write and disables (never deletes) the old key; the
138
- * old cache directory is left in place for `freeharness cleanup` to offer later.
167
+ * An upstream registration (UPSTREAM_PLUGIN_KEY) is never written: doctor warns about it.
139
168
  */
140
169
  registerHooks(_scope: Scope, ctx: InstallContext): Promise<AdapterResult>;
141
170
  /**
142
- * Keep an existing ~/.claude-mem data directory from a delegated install. The
143
- * plugin resolves it by convention (CLAUDE_MEM_DATA_DIR or ~/.claude-mem), so no
144
- * write is needed and nothing is deleted.
171
+ * Copy a legacy ~/.claude-mem forward into ~/.free-mem: pass 1 prints the plan, pass 2 applies
172
+ * it. A worker it stops is restarted by `update` once the bundle is staged, else at SessionStart.
173
+ * The copy is never recorded in `written`, since uninstall removes what the manifest lists.
145
174
  */
146
- migrateExisting(_ctx: InstallContext): Promise<AdapterResult>;
175
+ migrateExisting(ctx: InstallContext): Promise<AdapterResult>;
147
176
  private run;
148
- private missingPluginDeps;
149
- private verifyPluginDeps;
150
177
  }