hmem-mcp 7.4.0 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +266 -54
- package/dist/cli-checkpoint-agent.d.ts +27 -0
- package/dist/cli-checkpoint-agent.js +320 -0
- package/dist/cli-checkpoint-agent.js.map +1 -0
- package/dist/cli-checkpoint.js +165 -78
- package/dist/cli-checkpoint.js.map +1 -1
- package/dist/cli-context-inject.d.ts +7 -7
- package/dist/cli-context-inject.js +54 -41
- package/dist/cli-context-inject.js.map +1 -1
- package/dist/cli-doctor.d.ts +7 -0
- package/dist/cli-doctor.js +156 -0
- package/dist/cli-doctor.js.map +1 -0
- package/dist/cli-hook-startup.d.ts +1 -0
- package/dist/cli-hook-startup.js +97 -10
- package/dist/cli-hook-startup.js.map +1 -1
- package/dist/cli-init.d.ts +0 -4
- package/dist/cli-init.js +48 -6
- package/dist/cli-init.js.map +1 -1
- package/dist/cli-log-exchange.js +10 -2
- package/dist/cli-log-exchange.js.map +1 -1
- package/dist/cli-mcp-add-curate.d.ts +7 -0
- package/dist/cli-mcp-add-curate.js +40 -0
- package/dist/cli-mcp-add-curate.js.map +1 -0
- package/dist/cli-migrate.d.ts +57 -0
- package/dist/cli-migrate.js +394 -0
- package/dist/cli-migrate.js.map +1 -0
- package/dist/cli-session-summary.d.ts +1 -1
- package/dist/cli-session-summary.js +9 -54
- package/dist/cli-session-summary.js.map +1 -1
- package/dist/cli-statusline.js +15 -11
- package/dist/cli-statusline.js.map +1 -1
- package/dist/cli-sync-pull.d.ts +3 -0
- package/dist/cli-sync-pull.js +79 -0
- package/dist/cli-sync-pull.js.map +1 -0
- package/dist/cli-sync-push.d.ts +4 -0
- package/dist/cli-sync-push.js +85 -0
- package/dist/cli-sync-push.js.map +1 -0
- package/dist/cli-sync-setup.d.ts +18 -0
- package/dist/cli-sync-setup.js +308 -0
- package/dist/cli-sync-setup.js.map +1 -0
- package/dist/cli-sync-status.d.ts +1 -0
- package/dist/cli-sync-status.js +20 -0
- package/dist/cli-sync-status.js.map +1 -0
- package/dist/cli-v2-checkpoint.d.ts +38 -0
- package/dist/cli-v2-checkpoint.js +134 -0
- package/dist/cli-v2-checkpoint.js.map +1 -0
- package/dist/cli.js +154 -34
- package/dist/cli.js.map +1 -1
- package/dist/config/config.d.ts +29 -0
- package/dist/config/config.js +123 -0
- package/dist/config/config.js.map +1 -0
- package/dist/diagnostics.js +1 -6
- package/dist/diagnostics.js.map +1 -1
- package/dist/extensions/pi-hmem.js +141 -35
- package/dist/extensions/pi-hmem.js.map +1 -1
- package/dist/hmem-config.d.ts +30 -5
- package/dist/hmem-config.js +50 -8
- package/dist/hmem-config.js.map +1 -1
- package/dist/hmem-store.d.ts +60 -2
- package/dist/hmem-store.js +205 -26
- package/dist/hmem-store.js.map +1 -1
- package/dist/hooks/binding-resolver.d.ts +13 -0
- package/dist/hooks/binding-resolver.js +42 -0
- package/dist/hooks/binding-resolver.js.map +1 -0
- package/dist/hooks/brief.d.ts +2 -0
- package/dist/hooks/brief.js +26 -0
- package/dist/hooks/brief.js.map +1 -0
- package/dist/hooks/dispatch.d.ts +5 -0
- package/dist/hooks/dispatch.js +119 -0
- package/dist/hooks/dispatch.js.map +1 -0
- package/dist/hooks/git-probe.d.ts +4 -0
- package/dist/hooks/git-probe.js +46 -0
- package/dist/hooks/git-probe.js.map +1 -0
- package/dist/hooks/harness/claude-code.d.ts +10 -0
- package/dist/hooks/harness/claude-code.js +133 -0
- package/dist/hooks/harness/claude-code.js.map +1 -0
- package/dist/hooks/harness/hermes.d.ts +4 -0
- package/dist/hooks/harness/hermes.js +20 -0
- package/dist/hooks/harness/hermes.js.map +1 -0
- package/dist/hooks/harness/pi.d.ts +4 -0
- package/dist/hooks/harness/pi.js +21 -0
- package/dist/hooks/harness/pi.js.map +1 -0
- package/dist/hooks/prompt-submit.d.ts +16 -0
- package/dist/hooks/prompt-submit.js +11 -0
- package/dist/hooks/prompt-submit.js.map +1 -0
- package/dist/hooks/session-start.d.ts +3 -0
- package/dist/hooks/session-start.js +31 -0
- package/dist/hooks/session-start.js.map +1 -0
- package/dist/hooks/stable-context.d.ts +11 -0
- package/dist/hooks/stable-context.js +117 -0
- package/dist/hooks/stable-context.js.map +1 -0
- package/dist/hooks/stop-log.d.ts +4 -0
- package/dist/hooks/stop-log.js +12 -0
- package/dist/hooks/stop-log.js.map +1 -0
- package/dist/hooks/summarizer-pick.d.ts +8 -0
- package/dist/hooks/summarizer-pick.js +18 -0
- package/dist/hooks/summarizer-pick.js.map +1 -0
- package/dist/hooks/transcript.d.ts +6 -0
- package/dist/hooks/transcript.js +72 -0
- package/dist/hooks/transcript.js.map +1 -0
- package/dist/hooks/types.d.ts +56 -0
- package/dist/hooks/types.js +2 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/mcp-curate-server.js +50 -4
- package/dist/mcp-curate-server.js.map +1 -1
- package/dist/mcp-server.js +121 -58
- package/dist/mcp-server.js.map +1 -1
- package/dist/mcp-shared.js +119 -29
- package/dist/mcp-shared.js.map +1 -1
- package/dist/memory-search.d.ts +5 -2
- package/dist/memory-search.js +5 -2
- package/dist/memory-search.js.map +1 -1
- package/dist/migrate/o-decompose.d.ts +14 -0
- package/dist/migrate/o-decompose.js +112 -0
- package/dist/migrate/o-decompose.js.map +1 -0
- package/dist/migrate/tree.d.ts +16 -0
- package/dist/migrate/tree.js +102 -0
- package/dist/migrate/tree.js.map +1 -0
- package/dist/migrate/v1-reader.d.ts +38 -0
- package/dist/migrate/v1-reader.js +34 -0
- package/dist/migrate/v1-reader.js.map +1 -0
- package/dist/migrate/v1-to-v2.d.ts +25 -0
- package/dist/migrate/v1-to-v2.js +127 -0
- package/dist/migrate/v1-to-v2.js.map +1 -0
- package/dist/session-state.d.ts +3 -0
- package/dist/session-state.js +7 -5
- package/dist/session-state.js.map +1 -1
- package/dist/store/db.d.ts +25 -0
- package/dist/store/db.js +159 -0
- package/dist/store/db.js.map +1 -0
- package/dist/store/entries.d.ts +48 -0
- package/dist/store/entries.js +145 -0
- package/dist/store/entries.js.map +1 -0
- package/dist/store/events-fts.d.ts +18 -0
- package/dist/store/events-fts.js +18 -0
- package/dist/store/events-fts.js.map +1 -0
- package/dist/store/events.d.ts +30 -0
- package/dist/store/events.js +48 -0
- package/dist/store/events.js.map +1 -0
- package/dist/store/fts.d.ts +24 -0
- package/dist/store/fts.js +35 -0
- package/dist/store/fts.js.map +1 -0
- package/dist/store/links.d.ts +24 -0
- package/dist/store/links.js +29 -0
- package/dist/store/links.js.map +1 -0
- package/dist/store/schema-engine.d.ts +20 -0
- package/dist/store/schema-engine.js +41 -0
- package/dist/store/schema-engine.js.map +1 -0
- package/dist/store/schema-v2.sql +149 -0
- package/dist/store/sessions.d.ts +38 -0
- package/dist/store/sessions.js +98 -0
- package/dist/store/sessions.js.map +1 -0
- package/dist/store/types.d.ts +74 -0
- package/dist/store/types.js +3 -0
- package/dist/store/types.js.map +1 -0
- package/dist/store/ulid.d.ts +1 -0
- package/dist/store/ulid.js +10 -0
- package/dist/store/ulid.js.map +1 -0
- package/dist/summarize/anthropic.d.ts +8 -0
- package/dist/summarize/anthropic.js +38 -0
- package/dist/summarize/anthropic.js.map +1 -0
- package/dist/summarize/loop.d.ts +40 -0
- package/dist/summarize/loop.js +64 -0
- package/dist/summarize/loop.js.map +1 -0
- package/dist/sync/api.d.ts +49 -0
- package/dist/sync/api.js +99 -0
- package/dist/sync/api.js.map +1 -0
- package/dist/sync/config.d.ts +16 -0
- package/dist/sync/config.js +27 -0
- package/dist/sync/config.js.map +1 -0
- package/dist/sync/conflict.d.ts +24 -0
- package/dist/sync/conflict.js +125 -0
- package/dist/sync/conflict.js.map +1 -0
- package/dist/sync/crypto.d.ts +53 -0
- package/dist/sync/crypto.js +140 -0
- package/dist/sync/crypto.js.map +1 -0
- package/dist/sync/passphrase.d.ts +1 -0
- package/dist/sync/passphrase.js +17 -0
- package/dist/sync/passphrase.js.map +1 -0
- package/dist/sync/v2/dispatch.d.ts +6 -0
- package/dist/sync/v2/dispatch.js +24 -0
- package/dist/sync/v2/dispatch.js.map +1 -0
- package/dist/sync/v2/envelope.d.ts +13 -0
- package/dist/sync/v2/envelope.js +36 -0
- package/dist/sync/v2/envelope.js.map +1 -0
- package/dist/sync/v2/export.d.ts +10 -0
- package/dist/sync/v2/export.js +32 -0
- package/dist/sync/v2/export.js.map +1 -0
- package/dist/sync/v2/import.d.ts +10 -0
- package/dist/sync/v2/import.js +130 -0
- package/dist/sync/v2/import.js.map +1 -0
- package/dist/sync/v2/queue.d.ts +18 -0
- package/dist/sync/v2/queue.js +59 -0
- package/dist/sync/v2/queue.js.map +1 -0
- package/dist/sync/v2/reconcile.d.ts +3 -0
- package/dist/sync/v2/reconcile.js +18 -0
- package/dist/sync/v2/reconcile.js.map +1 -0
- package/dist/sync/v2/staging.d.ts +27 -0
- package/dist/sync/v2/staging.js +46 -0
- package/dist/sync/v2/staging.js.map +1 -0
- package/dist/sync/v2/sync.d.ts +18 -0
- package/dist/sync/v2/sync.js +63 -0
- package/dist/sync/v2/sync.js.map +1 -0
- package/dist/sync/v2/transport.d.ts +43 -0
- package/dist/sync/v2/transport.js +20 -0
- package/dist/sync/v2/transport.js.map +1 -0
- package/dist/sync-bridge.d.ts +2 -0
- package/dist/sync-bridge.js +134 -0
- package/dist/sync-bridge.js.map +1 -0
- package/dist/tools/analyze-v1.d.ts +1 -0
- package/dist/tools/analyze-v1.js +142 -0
- package/dist/tools/analyze-v1.js.map +1 -0
- package/dist/util/iso.d.ts +8 -0
- package/dist/util/iso.js +15 -0
- package/dist/util/iso.js.map +1 -0
- package/dist/utils.d.ts +7 -0
- package/dist/utils.js +14 -0
- package/dist/utils.js.map +1 -0
- package/dist/v2/addressing.d.ts +9 -0
- package/dist/v2/addressing.js +55 -0
- package/dist/v2/addressing.js.map +1 -0
- package/dist/v2/checkpoint-agent.d.ts +75 -0
- package/dist/v2/checkpoint-agent.js +231 -0
- package/dist/v2/checkpoint-agent.js.map +1 -0
- package/dist/v2/checkpoint-select.d.ts +60 -0
- package/dist/v2/checkpoint-select.js +106 -0
- package/dist/v2/checkpoint-select.js.map +1 -0
- package/dist/v2/checkpoint.d.ts +62 -0
- package/dist/v2/checkpoint.js +103 -0
- package/dist/v2/checkpoint.js.map +1 -0
- package/dist/v2/curation.d.ts +23 -0
- package/dist/v2/curation.js +118 -0
- package/dist/v2/curation.js.map +1 -0
- package/dist/v2/projects.d.ts +29 -0
- package/dist/v2/projects.js +60 -0
- package/dist/v2/projects.js.map +1 -0
- package/dist/v2/read-render.d.ts +31 -0
- package/dist/v2/read-render.js +150 -0
- package/dist/v2/read-render.js.map +1 -0
- package/dist/v2/related.d.ts +8 -0
- package/dist/v2/related.js +35 -0
- package/dist/v2/related.js.map +1 -0
- package/dist/v2/search.d.ts +6 -0
- package/dist/v2/search.js +24 -0
- package/dist/v2/search.js.map +1 -0
- package/dist/v2/session-id.d.ts +7 -0
- package/dist/v2/session-id.js +14 -0
- package/dist/v2/session-id.js.map +1 -0
- package/dist/v2/sessions-tools.d.ts +11 -0
- package/dist/v2/sessions-tools.js +30 -0
- package/dist/v2/sessions-tools.js.map +1 -0
- package/dist/v2/store-facade.d.ts +23 -0
- package/dist/v2/store-facade.js +33 -0
- package/dist/v2/store-facade.js.map +1 -0
- package/dist/v2/summarize-adapter.d.ts +11 -0
- package/dist/v2/summarize-adapter.js +19 -0
- package/dist/v2/summarize-adapter.js.map +1 -0
- package/dist/v2/writes.d.ts +30 -0
- package/dist/v2/writes.js +135 -0
- package/dist/v2/writes.js.map +1 -0
- package/hmem.config.example.json +92 -10
- package/opencode-plugin/hmem.js +5 -2
- package/package.json +7 -3
- package/plugins/hermes-hmem/README.md +56 -0
- package/plugins/hermes-hmem/__init__.py +187 -0
- package/plugins/hermes-hmem/plugin.yaml +8 -0
- package/server.json +2 -2
- package/skills/hmem-activate/SKILL.md +1 -1
- package/skills/hmem-config/SKILL.md +70 -5
- package/skills/hmem-curate/SKILL.md +13 -6
- package/skills/hmem-dispatch/SKILL.md +1 -1
- package/skills/hmem-migrate-o/SKILL.md +3 -8
- package/skills/hmem-new-error/SKILL.md +1 -9
- package/skills/hmem-new-project/SKILL.md +1 -9
- package/skills/hmem-new-rule/SKILL.md +93 -0
- package/skills/hmem-read/SKILL.md +16 -8
- package/skills/hmem-release/SKILL.md +108 -9
- package/skills/hmem-search/SKILL.md +48 -25
- package/skills/hmem-session-start/SKILL.md +147 -46
- package/skills/hmem-setup/SKILL.md +3 -3
- package/skills/hmem-sync-setup/SKILL.md +1 -5
- package/skills/hmem-update/SKILL.md +345 -19
- package/skills/hmem-wipe/SKILL.md +41 -7
- package/skills/hmem-write/SKILL.md +1 -12
- package/skills/hmem-activate-workspace/evals/evals.json +0 -29
- package/skills/hmem-activate-workspace/iteration-1/benchmark.json +0 -370
- package/skills/hmem-activate-workspace/iteration-1/benchmark.md +0 -13
- package/skills/hmem-activate-workspace/iteration-1/eval-1-simple-switch/eval_metadata.json +0 -23
- package/skills/hmem-activate-workspace/iteration-1/eval-1-simple-switch/with_skill/grading.json +0 -55
- package/skills/hmem-activate-workspace/iteration-1/eval-1-simple-switch/with_skill/outputs/response.md +0 -121
- package/skills/hmem-activate-workspace/iteration-1/eval-1-simple-switch/with_skill/run-1/grading.json +0 -55
- package/skills/hmem-activate-workspace/iteration-1/eval-1-simple-switch/without_skill/grading.json +0 -44
- package/skills/hmem-activate-workspace/iteration-1/eval-1-simple-switch/without_skill/outputs/response.md +0 -78
- package/skills/hmem-activate-workspace/iteration-1/eval-1-simple-switch/without_skill/run-1/grading.json +0 -44
- package/skills/hmem-activate-workspace/iteration-1/eval-2-misrouting-fix/eval_metadata.json +0 -23
- package/skills/hmem-activate-workspace/iteration-1/eval-2-misrouting-fix/with_skill/grading.json +0 -49
- package/skills/hmem-activate-workspace/iteration-1/eval-2-misrouting-fix/with_skill/outputs/response.md +0 -98
- package/skills/hmem-activate-workspace/iteration-1/eval-2-misrouting-fix/with_skill/run-1/grading.json +0 -49
- package/skills/hmem-activate-workspace/iteration-1/eval-2-misrouting-fix/without_skill/grading.json +0 -44
- package/skills/hmem-activate-workspace/iteration-1/eval-2-misrouting-fix/without_skill/outputs/response.md +0 -57
- package/skills/hmem-activate-workspace/iteration-1/eval-2-misrouting-fix/without_skill/run-1/grading.json +0 -44
- package/skills/hmem-activate-workspace/iteration-1/eval-3-temporary-load/eval_metadata.json +0 -23
- package/skills/hmem-activate-workspace/iteration-1/eval-3-temporary-load/with_skill/grading.json +0 -48
- package/skills/hmem-activate-workspace/iteration-1/eval-3-temporary-load/with_skill/outputs/response.md +0 -69
- package/skills/hmem-activate-workspace/iteration-1/eval-3-temporary-load/with_skill/run-1/grading.json +0 -48
- package/skills/hmem-activate-workspace/iteration-1/eval-3-temporary-load/without_skill/grading.json +0 -44
- package/skills/hmem-activate-workspace/iteration-1/eval-3-temporary-load/without_skill/outputs/response.md +0 -59
- package/skills/hmem-activate-workspace/iteration-1/eval-3-temporary-load/without_skill/run-1/grading.json +0 -44
- package/skills/hmem-activate-workspace/iteration-1/eval-4-wrong-project/eval_metadata.json +0 -23
- package/skills/hmem-activate-workspace/iteration-1/eval-4-wrong-project/with_skill/grading.json +0 -55
- package/skills/hmem-activate-workspace/iteration-1/eval-4-wrong-project/with_skill/outputs/response.md +0 -182
- package/skills/hmem-activate-workspace/iteration-1/eval-4-wrong-project/with_skill/run-1/grading.json +0 -55
- package/skills/hmem-activate-workspace/iteration-1/eval-4-wrong-project/without_skill/grading.json +0 -44
- package/skills/hmem-activate-workspace/iteration-1/eval-4-wrong-project/without_skill/outputs/response.md +0 -43
- package/skills/hmem-activate-workspace/iteration-1/eval-4-wrong-project/without_skill/run-1/grading.json +0 -44
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cli-v2-checkpoint.ts
|
|
3
|
+
*
|
|
4
|
+
* Async Stop-hook entry point for the v2 checkpoint pipeline.
|
|
5
|
+
* Opens a v2 store exclusively — never touches HmemStore or any v1 path.
|
|
6
|
+
*
|
|
7
|
+
* On a v1 file, a missing/unreadable file, or a missing HMEM_PATH env:
|
|
8
|
+
* → silent no-op return (never throws, never constructs HmemStore).
|
|
9
|
+
*
|
|
10
|
+
* On a v2 file with a resolvable session:
|
|
11
|
+
* → runs one checkpoint-extraction pass (see ./v2/checkpoint.ts).
|
|
12
|
+
*
|
|
13
|
+
* Usage (hook): claude pipes `{ session_id, stop_hook_active }` on stdin.
|
|
14
|
+
*
|
|
15
|
+
* Requires env:
|
|
16
|
+
* HMEM_PATH — path to .hmem file (the hook sets this explicitly)
|
|
17
|
+
* HMEM_PROJECT_DIR — directory for config + company.hmem (derived from
|
|
18
|
+
* HMEM_PATH by resolveEnvDefaults — the hook does NOT set it)
|
|
19
|
+
*/
|
|
20
|
+
import { type RunV2CheckpointOptions } from "./v2/checkpoint.js";
|
|
21
|
+
/**
|
|
22
|
+
* Hook entry point (dispatched by cli.ts). Reads the Stop-hook JSON from stdin to
|
|
23
|
+
* obtain the session id — Claude Code provides it there, NOT in the environment —
|
|
24
|
+
* mirroring cli-log-exchange.ts. A TTY (manual run) has no hook payload, so stdin
|
|
25
|
+
* is skipped and the core falls back to env/ppid session resolution.
|
|
26
|
+
*/
|
|
27
|
+
export declare function runCliV2Checkpoint(): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Testable core: resolve env, guard, open the v2 store, run one checkpoint pass.
|
|
30
|
+
* Kept separate from the stdin-reading wrapper so tests can drive it directly
|
|
31
|
+
* (same split as cli-log-exchange.ts's appendExchangeV2Path).
|
|
32
|
+
*
|
|
33
|
+
* @param sessionId explicit session id (from the hook stdin). Falls back to
|
|
34
|
+
* resolveSessionId() (HMEM_SESSION_ID env → ppid bridge) when omitted.
|
|
35
|
+
* @param opts test seams (agent `invoke`, gate/agent probes) forwarded to
|
|
36
|
+
* runV2Checkpoint. The production hook passes none → real spawn.
|
|
37
|
+
*/
|
|
38
|
+
export declare function runCliV2CheckpointCore(sessionId?: string, opts?: RunV2CheckpointOptions): Promise<void>;
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cli-v2-checkpoint.ts
|
|
3
|
+
*
|
|
4
|
+
* Async Stop-hook entry point for the v2 checkpoint pipeline.
|
|
5
|
+
* Opens a v2 store exclusively — never touches HmemStore or any v1 path.
|
|
6
|
+
*
|
|
7
|
+
* On a v1 file, a missing/unreadable file, or a missing HMEM_PATH env:
|
|
8
|
+
* → silent no-op return (never throws, never constructs HmemStore).
|
|
9
|
+
*
|
|
10
|
+
* On a v2 file with a resolvable session:
|
|
11
|
+
* → runs one checkpoint-extraction pass (see ./v2/checkpoint.ts).
|
|
12
|
+
*
|
|
13
|
+
* Usage (hook): claude pipes `{ session_id, stop_hook_active }` on stdin.
|
|
14
|
+
*
|
|
15
|
+
* Requires env:
|
|
16
|
+
* HMEM_PATH — path to .hmem file (the hook sets this explicitly)
|
|
17
|
+
* HMEM_PROJECT_DIR — directory for config + company.hmem (derived from
|
|
18
|
+
* HMEM_PATH by resolveEnvDefaults — the hook does NOT set it)
|
|
19
|
+
*/
|
|
20
|
+
import fs from "node:fs";
|
|
21
|
+
import path from "node:path";
|
|
22
|
+
import Database from "better-sqlite3";
|
|
23
|
+
import { createV2Store } from "./v2/store-facade.js";
|
|
24
|
+
import { getSchemaMajor, V1FileError } from "./store/db.js";
|
|
25
|
+
import { loadHmemConfig } from "./hmem-config.js";
|
|
26
|
+
import { resolveSessionId } from "./v2/session-id.js";
|
|
27
|
+
import { resolveEnvDefaults } from "./cli-env.js";
|
|
28
|
+
import { runV2Checkpoint } from "./v2/checkpoint.js";
|
|
29
|
+
/**
|
|
30
|
+
* Read-only schema-major probe. Returns '2' only when the file exists and
|
|
31
|
+
* carries schema_major='2'. Any other case — v1 file, missing file, locked
|
|
32
|
+
* handle, corrupt header — returns null. Never throws.
|
|
33
|
+
*
|
|
34
|
+
* Uses a readonly better-sqlite3 handle so openDb's WAL pragma and schema
|
|
35
|
+
* bootstrap are NEVER run against the file (symmetric to the probe in
|
|
36
|
+
* cli-checkpoint.ts#isV2Store, but returns the raw major string instead of
|
|
37
|
+
* a boolean so callers can distinguish v1 vs. absent).
|
|
38
|
+
*/
|
|
39
|
+
function probeSchemaMajor(hmemPath) {
|
|
40
|
+
let db;
|
|
41
|
+
try {
|
|
42
|
+
db = new Database(hmemPath, { readonly: true });
|
|
43
|
+
return getSchemaMajor(db);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
try {
|
|
50
|
+
db?.close();
|
|
51
|
+
}
|
|
52
|
+
catch { /* ignore */ }
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Hook entry point (dispatched by cli.ts). Reads the Stop-hook JSON from stdin to
|
|
57
|
+
* obtain the session id — Claude Code provides it there, NOT in the environment —
|
|
58
|
+
* mirroring cli-log-exchange.ts. A TTY (manual run) has no hook payload, so stdin
|
|
59
|
+
* is skipped and the core falls back to env/ppid session resolution.
|
|
60
|
+
*/
|
|
61
|
+
export async function runCliV2Checkpoint() {
|
|
62
|
+
let input = {};
|
|
63
|
+
if (!process.stdin.isTTY) {
|
|
64
|
+
try {
|
|
65
|
+
input = JSON.parse(fs.readFileSync(0, "utf8") || "{}");
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// No / invalid stdin payload — core falls back to resolveSessionId().
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Re-entry guard: Claude re-fires Stop with this flag set; don't double-run.
|
|
72
|
+
if (input.stop_hook_active)
|
|
73
|
+
return;
|
|
74
|
+
await runCliV2CheckpointCore(input.session_id);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Testable core: resolve env, guard, open the v2 store, run one checkpoint pass.
|
|
78
|
+
* Kept separate from the stdin-reading wrapper so tests can drive it directly
|
|
79
|
+
* (same split as cli-log-exchange.ts's appendExchangeV2Path).
|
|
80
|
+
*
|
|
81
|
+
* @param sessionId explicit session id (from the hook stdin). Falls back to
|
|
82
|
+
* resolveSessionId() (HMEM_SESSION_ID env → ppid bridge) when omitted.
|
|
83
|
+
* @param opts test seams (agent `invoke`, gate/agent probes) forwarded to
|
|
84
|
+
* runV2Checkpoint. The production hook passes none → real spawn.
|
|
85
|
+
*/
|
|
86
|
+
export async function runCliV2CheckpointCore(sessionId, opts = {}) {
|
|
87
|
+
// 1. HMEM_PATH guard FIRST — the hook sets it explicitly. Guarding before
|
|
88
|
+
// resolveEnvDefaults() preserves the "unset → no-op" contract and stops the
|
|
89
|
+
// HMEM_PATH auto-resolver from reaching a real store.
|
|
90
|
+
if (!process.env.HMEM_PATH)
|
|
91
|
+
return;
|
|
92
|
+
// 2. Derive HMEM_PROJECT_DIR from HMEM_PATH. The Stop hook sets only HMEM_PATH;
|
|
93
|
+
// without this the original code early-returned into a silent no-op, and
|
|
94
|
+
// downstream config/agent wiring (which reads HMEM_PROJECT_DIR) would break.
|
|
95
|
+
resolveEnvDefaults();
|
|
96
|
+
const hmemPath = process.env.HMEM_PATH;
|
|
97
|
+
if (!fs.existsSync(hmemPath))
|
|
98
|
+
return;
|
|
99
|
+
// 3. Read-only schema probe BEFORE opening anything heavy.
|
|
100
|
+
// Not v2 (v1 file, empty file, missing schema_version) → no-op.
|
|
101
|
+
// This is the primary guard; the V1FileError catch below is belt-and-suspenders.
|
|
102
|
+
const schemaMajor = probeSchemaMajor(hmemPath);
|
|
103
|
+
if (schemaMajor !== "2") {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
// 4. Open via createV2Store exclusively (never HmemStore).
|
|
107
|
+
const config = loadHmemConfig(path.dirname(hmemPath));
|
|
108
|
+
let store;
|
|
109
|
+
try {
|
|
110
|
+
try {
|
|
111
|
+
store = createV2Store(hmemPath, config);
|
|
112
|
+
}
|
|
113
|
+
catch (e) {
|
|
114
|
+
// Belt-and-suspenders: if the probe is bypassed and the file turns out
|
|
115
|
+
// to be v1, openDb throws V1FileError — swallow it into a no-op.
|
|
116
|
+
if (e instanceof V1FileError)
|
|
117
|
+
return;
|
|
118
|
+
throw e;
|
|
119
|
+
}
|
|
120
|
+
// Real extraction pass. With no resolvable session, or a session with no open
|
|
121
|
+
// binding, runV2Checkpoint is a clean no-op.
|
|
122
|
+
const sid = sessionId ?? resolveSessionId();
|
|
123
|
+
if (sid) {
|
|
124
|
+
await runV2Checkpoint(store, sid, config, hmemPath, opts);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
finally {
|
|
128
|
+
try {
|
|
129
|
+
store?.close();
|
|
130
|
+
}
|
|
131
|
+
catch { /* ignore */ }
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=cli-v2-checkpoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-v2-checkpoint.js","sourceRoot":"","sources":["../src/cli-v2-checkpoint.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -13,6 +13,91 @@ if (pathIdx !== -1 && args[pathIdx + 1]) {
|
|
|
13
13
|
args.splice(pathIdx, 2);
|
|
14
14
|
}
|
|
15
15
|
const command = args[0];
|
|
16
|
+
function printUsageTable() {
|
|
17
|
+
console.log(`hmem — Humanlike Memory for AI Agents
|
|
18
|
+
|
|
19
|
+
Usage:
|
|
20
|
+
hmem serve Start the MCP server (stdio transport)
|
|
21
|
+
hmem init Install hmem for AI coding tools (interactive or with flags)
|
|
22
|
+
hmem update-skills Copy/update skill files to detected AI tools
|
|
23
|
+
hmem mcp-add-curate Register the hmem-curate MCP server with Claude Code (opt-in)
|
|
24
|
+
hmem setup-hook Add hmem SessionStart hook to Claude Code settings
|
|
25
|
+
hmem doctor Detect stale or deprecated hmem MCP entries in host configs
|
|
26
|
+
hmem stats Show memory statistics + per-project token estimates
|
|
27
|
+
hmem version Show version
|
|
28
|
+
|
|
29
|
+
Hook drivers (called by AI tool hooks, not directly by users):
|
|
30
|
+
hmem hook-startup UserPromptSubmit hook — counter, checkpoint reminders
|
|
31
|
+
hmem log-exchange Stop hook — log exchange to active O-entry
|
|
32
|
+
hmem context-inject SessionStart[clear] hook — re-inject project context
|
|
33
|
+
hmem deactivate SessionStart[clear] hook — clear active project
|
|
34
|
+
hmem statusline statusLine — generate Claude Code statusline (JSON on stdin)
|
|
35
|
+
hmem checkpoint Extract knowledge from recent exchanges (background)
|
|
36
|
+
|
|
37
|
+
Curation:
|
|
38
|
+
hmem delete <ID> Permanently delete an entry (curator only, not synced)
|
|
39
|
+
hmem migrate-o-entries Migrate O-entries to current schema
|
|
40
|
+
hmem summarize-session <id> Generate summary node for a session
|
|
41
|
+
|
|
42
|
+
Sync (requires hmem-sync installed):
|
|
43
|
+
hmem sync push Push local memory to sync server
|
|
44
|
+
hmem sync pull Pull latest memory from sync server
|
|
45
|
+
hmem sync status Show sync server + auth + last-sync state
|
|
46
|
+
hmem sync setup [--join] Interactive sync-passphrase setup
|
|
47
|
+
|
|
48
|
+
Backup / migration:
|
|
49
|
+
hmem export-staging <hmem> <json> Export .hmem to JSON staging file
|
|
50
|
+
hmem import-staging <json> <hmem> Import JSON staging back into .hmem
|
|
51
|
+
|
|
52
|
+
Environment variables (for serve):
|
|
53
|
+
HMEM_PATH Path to .hmem file (optional, auto-detected)
|
|
54
|
+
HMEM_PROJECT_DIR Directory for config + company.hmem (derived from HMEM_PATH)
|
|
55
|
+
HMEM_AGENT_ROLE Role: worker | al | pl | ceo (default: worker)
|
|
56
|
+
|
|
57
|
+
Non-interactive init flags:
|
|
58
|
+
--global System-wide install (default)
|
|
59
|
+
--local Project-local install
|
|
60
|
+
--tools claude-code Comma-separated tool list (default: all detected)
|
|
61
|
+
--dir /path Memory directory (default: ~/.hmem)
|
|
62
|
+
--no-example Skip example memory installation
|
|
63
|
+
|
|
64
|
+
Examples:
|
|
65
|
+
npx hmem init # Interactive installer
|
|
66
|
+
npx hmem init --global # Non-interactive, all detected tools
|
|
67
|
+
npx hmem init --global --tools claude-code # Non-interactive, Claude Code only
|
|
68
|
+
npx hmem update-skills # Update skills after npm update
|
|
69
|
+
HMEM_PROJECT_DIR=. npx hmem serve # Start server in current directory`);
|
|
70
|
+
}
|
|
71
|
+
function printHelp() {
|
|
72
|
+
console.log(`🧠 hmem — Quick Tips
|
|
73
|
+
|
|
74
|
+
📦 Context full? (>100k tokens)
|
|
75
|
+
/hmem-wipe — saves high-value knowledge to hmem, then /clear.
|
|
76
|
+
Run before context compaction kicks in.
|
|
77
|
+
|
|
78
|
+
🔄 Multiple devices?
|
|
79
|
+
hmem sync setup — Cross-device sync via passphrase.
|
|
80
|
+
Passphrase stays device-local; server only sees ciphertext.
|
|
81
|
+
|
|
82
|
+
📜 Define your own rules?
|
|
83
|
+
In-session: say "remember as a rule: ..."
|
|
84
|
+
→ stored as an R-entry, re-injected at every session start.
|
|
85
|
+
|
|
86
|
+
✨ Register a new project?
|
|
87
|
+
In-session: say "new project XYZ"
|
|
88
|
+
→ hmem-new-project skill handles schema + O-entry linking.
|
|
89
|
+
|
|
90
|
+
📌 Keep important entries visible every session?
|
|
91
|
+
In-session: say "pin this entry"
|
|
92
|
+
→ marks entry as [P] pinned, L2 content injected at session start.
|
|
93
|
+
|
|
94
|
+
🧹 Curate / delete entries?
|
|
95
|
+
hmem mcp-add-curate
|
|
96
|
+
→ registers the maintenance MCP (bulk edits, delete, merge, stats).
|
|
97
|
+
Activate via /mcp only when curating, deactivate when done.
|
|
98
|
+
`);
|
|
99
|
+
printUsageTable();
|
|
100
|
+
}
|
|
16
101
|
switch (command) {
|
|
17
102
|
case "serve":
|
|
18
103
|
await import("./mcp-server.js");
|
|
@@ -27,6 +112,11 @@ switch (command) {
|
|
|
27
112
|
updateSkills();
|
|
28
113
|
break;
|
|
29
114
|
}
|
|
115
|
+
case "mcp-add-curate": {
|
|
116
|
+
const { runMcpAddCurate } = await import("./cli-mcp-add-curate.js");
|
|
117
|
+
runMcpAddCurate();
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
30
120
|
case "log-exchange": {
|
|
31
121
|
const { logExchange } = await import("./cli-log-exchange.js");
|
|
32
122
|
await logExchange();
|
|
@@ -82,6 +172,35 @@ switch (command) {
|
|
|
82
172
|
await setupHook();
|
|
83
173
|
break;
|
|
84
174
|
}
|
|
175
|
+
case "doctor": {
|
|
176
|
+
const { doctor } = await import("./cli-doctor.js");
|
|
177
|
+
await doctor();
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
case "export-staging": {
|
|
181
|
+
const { exportToStaging } = await import("./sync-bridge.js");
|
|
182
|
+
const hmemPath = args[1];
|
|
183
|
+
const stagingPath = args[2];
|
|
184
|
+
if (!hmemPath || !stagingPath) {
|
|
185
|
+
console.error("Usage: hmem export-staging <hmem-path> <staging-path>");
|
|
186
|
+
process.exit(1);
|
|
187
|
+
}
|
|
188
|
+
await exportToStaging(hmemPath, stagingPath);
|
|
189
|
+
console.log(`✓ Exported ${hmemPath} → ${stagingPath}`);
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
case "import-staging": {
|
|
193
|
+
const { importFromStaging } = await import("./sync-bridge.js");
|
|
194
|
+
const hmemPath = args[1];
|
|
195
|
+
const stagingPath = args[2];
|
|
196
|
+
if (!hmemPath || !stagingPath) {
|
|
197
|
+
console.error("Usage: hmem import-staging <staging-path> <hmem-path>");
|
|
198
|
+
process.exit(1);
|
|
199
|
+
}
|
|
200
|
+
await importFromStaging(stagingPath, hmemPath);
|
|
201
|
+
console.log(`✓ Imported ${stagingPath} → ${hmemPath}`);
|
|
202
|
+
break;
|
|
203
|
+
}
|
|
85
204
|
case "version":
|
|
86
205
|
case "--version":
|
|
87
206
|
case "-v": {
|
|
@@ -91,41 +210,42 @@ switch (command) {
|
|
|
91
210
|
console.log(`hmem ${pkg.version}`);
|
|
92
211
|
break;
|
|
93
212
|
}
|
|
213
|
+
case "setup": {
|
|
214
|
+
const { runSetup } = await import("./cli-sync-setup.js");
|
|
215
|
+
await runSetup({ join: process.argv.includes("--join") });
|
|
216
|
+
break;
|
|
217
|
+
}
|
|
218
|
+
case "help":
|
|
219
|
+
case "--help":
|
|
220
|
+
case "-h":
|
|
221
|
+
printHelp();
|
|
222
|
+
break;
|
|
223
|
+
case "sync": {
|
|
224
|
+
const subCmd = process.argv[3];
|
|
225
|
+
if (subCmd === "push") {
|
|
226
|
+
const { syncPush } = await import("./cli-sync-push.js");
|
|
227
|
+
await syncPush({ skipPull: process.argv.includes("--skip-pull") });
|
|
228
|
+
}
|
|
229
|
+
else if (subCmd === "pull") {
|
|
230
|
+
const { syncPull } = await import("./cli-sync-pull.js");
|
|
231
|
+
await syncPull();
|
|
232
|
+
}
|
|
233
|
+
else if (subCmd === "status") {
|
|
234
|
+
const { syncStatus } = await import("./cli-sync-status.js");
|
|
235
|
+
await syncStatus();
|
|
236
|
+
}
|
|
237
|
+
else if (subCmd === "setup") {
|
|
238
|
+
const { runSetup } = await import("./cli-sync-setup.js");
|
|
239
|
+
await runSetup({ join: process.argv.includes("--join") });
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
console.error("Usage: hmem sync <push|pull|status|setup>");
|
|
243
|
+
process.exit(1);
|
|
244
|
+
}
|
|
245
|
+
break;
|
|
246
|
+
}
|
|
94
247
|
default:
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
Usage:
|
|
98
|
-
hmem serve Start the MCP server (stdio transport)
|
|
99
|
-
hmem init Install hmem for AI coding tools (interactive or with flags)
|
|
100
|
-
hmem update-skills Copy/update skill files to detected AI tools
|
|
101
|
-
hmem log-exchange Log a chat exchange to active O-entry (called by Stop hook)
|
|
102
|
-
hmem context-inject Output compressed context for re-injection after /clear
|
|
103
|
-
hmem deactivate Clear active project for current session (called by SessionStart[clear] hook)
|
|
104
|
-
hmem setup-hook Add hmem-using-hmem SessionStart hook to Claude Code settings
|
|
105
|
-
hmem delete <ID> Permanently delete an entry (curator use only, not synced)
|
|
106
|
-
hmem checkpoint Extract knowledge from recent exchanges via Haiku (background)
|
|
107
|
-
hmem hook-startup UserPromptSubmit hook — counter, checkpoint reminders (cross-platform)
|
|
108
|
-
hmem statusline Generate statusline for Claude Code (reads JSON from stdin)
|
|
109
|
-
hmem version Show version
|
|
110
|
-
|
|
111
|
-
Environment variables (for serve):
|
|
112
|
-
HMEM_PATH Path to .hmem file (optional, auto-detected)
|
|
113
|
-
HMEM_PROJECT_DIR Directory for config + company.hmem (derived from HMEM_PATH)
|
|
114
|
-
HMEM_AGENT_ROLE Role: worker | al | pl | ceo (default: worker)
|
|
115
|
-
|
|
116
|
-
Non-interactive init flags:
|
|
117
|
-
--global System-wide install (default)
|
|
118
|
-
--local Project-local install
|
|
119
|
-
--tools claude-code Comma-separated tool list (default: all detected)
|
|
120
|
-
--dir /path Memory directory (default: ~/.hmem)
|
|
121
|
-
--no-example Skip example memory installation
|
|
122
|
-
|
|
123
|
-
Examples:
|
|
124
|
-
npx hmem init # Interactive installer
|
|
125
|
-
npx hmem init --global # Non-interactive, all detected tools
|
|
126
|
-
npx hmem init --global --tools claude-code # Non-interactive, Claude Code only
|
|
127
|
-
npx hmem update-skills # Update skills after npm update
|
|
128
|
-
HMEM_PROJECT_DIR=. npx hmem serve # Start server in current directory`);
|
|
248
|
+
printUsageTable();
|
|
129
249
|
break;
|
|
130
250
|
}
|
|
131
251
|
export {};
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface SchemaSection {
|
|
2
|
+
name: string;
|
|
3
|
+
loadDepth: number;
|
|
4
|
+
defaultChildren?: string[];
|
|
5
|
+
/** Short convention describing what belongs in this section. Consumed by the
|
|
6
|
+
* checkpoint agent and shown as placeholder body in empty sections. ~100 chars. */
|
|
7
|
+
description?: string;
|
|
8
|
+
/** What the checkpoint agent may write here: readonly | pointer | append (default). */
|
|
9
|
+
checkpointPolicy?: 'readonly' | 'pointer' | 'append';
|
|
10
|
+
}
|
|
11
|
+
export interface EntrySchema {
|
|
12
|
+
sections: SchemaSection[];
|
|
13
|
+
createLinkedO?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface HmemConfig {
|
|
16
|
+
/** Per-prefix entry schemas. Keys are prefix letters ("P", "E", …). Generic. */
|
|
17
|
+
schemas?: Record<string, EntrySchema>;
|
|
18
|
+
prefixes?: Record<string, string>;
|
|
19
|
+
maxTitleChars?: number;
|
|
20
|
+
maxNodeChars?: number;
|
|
21
|
+
}
|
|
22
|
+
export declare const DEFAULT_PREFIXES: Record<string, string>;
|
|
23
|
+
export declare const DEFAULT_CONFIG: HmemConfig;
|
|
24
|
+
/**
|
|
25
|
+
* Load config from `<dir>/hmem.config.json`, deep-merging `schemas` over DEFAULT_CONFIG.
|
|
26
|
+
* Missing file → defaults. User-supplied schema keys win; default keys fill the rest.
|
|
27
|
+
* Malformed prefix keys (not 1–2 uppercase letters) are dropped.
|
|
28
|
+
*/
|
|
29
|
+
export declare function loadConfig(dir: string): HmemConfig;
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* hmem v2 — single config source.
|
|
3
|
+
*
|
|
4
|
+
* One discovery path only: `hmem.config.json` co-located with the `.hmem` store.
|
|
5
|
+
* This deliberately replaces v1's dual-config discovery (env-var path + cwd walk),
|
|
6
|
+
* which caused E0151 / L0180 (two configs disagreeing). User keys deep-merge over
|
|
7
|
+
* DEFAULT_CONFIG; defaults fill any gaps.
|
|
8
|
+
*
|
|
9
|
+
* The per-prefix schema model is generic: `schemas` is keyed by prefix letter, and
|
|
10
|
+
* every prefix is treated identically (no P-hardcoding — kills E0150). The P/E/H/I
|
|
11
|
+
* schemas below are ported verbatim from v1 `hmem-config.ts` (proven conventions).
|
|
12
|
+
*/
|
|
13
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
14
|
+
import { join } from 'node:path';
|
|
15
|
+
export const DEFAULT_PREFIXES = {
|
|
16
|
+
P: 'Project',
|
|
17
|
+
L: 'Lesson',
|
|
18
|
+
T: 'Task',
|
|
19
|
+
E: 'Error',
|
|
20
|
+
D: 'Decision',
|
|
21
|
+
M: 'Milestone',
|
|
22
|
+
S: 'Skill',
|
|
23
|
+
N: 'Navigator',
|
|
24
|
+
H: 'Human',
|
|
25
|
+
R: 'Rule',
|
|
26
|
+
O: 'Original',
|
|
27
|
+
I: 'Infrastructure',
|
|
28
|
+
C: 'Convention',
|
|
29
|
+
};
|
|
30
|
+
export const DEFAULT_CONFIG = {
|
|
31
|
+
prefixes: { ...DEFAULT_PREFIXES },
|
|
32
|
+
maxTitleChars: 50,
|
|
33
|
+
maxNodeChars: 100_000,
|
|
34
|
+
schemas: {
|
|
35
|
+
P: {
|
|
36
|
+
sections: [
|
|
37
|
+
{ name: 'Overview', loadDepth: 2, description: 'Current state / Goals / Architecture / Environment as L3 (≤4 lines each). L1 body: Name | Status | Tech | Repo' },
|
|
38
|
+
{ name: 'Codebase', loadDepth: 1, description: "L3.0 = Pipeline (data flow overview, auto-created). L3.N = Module (title: filename, body: purpose). L4 = exported function/class (title: full signature, body: description + src/file.ts).", defaultChildren: ['Pipeline'] },
|
|
39
|
+
{ name: 'Usage', loadDepth: 1, description: 'Installation, CLI/API, common workflows. No code — commands only' },
|
|
40
|
+
{ name: 'Context', loadDepth: 1, description: 'Initiator, audience, business context, dependencies as L3' },
|
|
41
|
+
{ name: 'Deployment', loadDepth: 1, description: 'Only if relevant. Server, build, CI/CD, release process' },
|
|
42
|
+
{ name: 'Bugs', loadDepth: 1, description: 'Open first, fixed marked [✓] or moved to .History. L3 = bug title or pointer → E-entry.' },
|
|
43
|
+
{ name: 'History', loadDepth: 0, description: 'Chronological session log. One-liner + pointer to O-entries. No copy-paste snapshots', defaultChildren: ['Tests', 'Code Style', 'Commits'] },
|
|
44
|
+
{ name: 'Roadmap', loadDepth: 2, description: '5–8 milestones as L3, main tasks as L4, subtasks as L5. Non-project-specific work → T-entry' },
|
|
45
|
+
{ name: 'Ideas', loadDepth: 1, description: 'Brainstorming. L3 = one-liner, L4 = details. Concrete ideas → promote to .Roadmap' },
|
|
46
|
+
],
|
|
47
|
+
},
|
|
48
|
+
E: {
|
|
49
|
+
sections: [
|
|
50
|
+
{ name: 'Reproduction', loadDepth: 1, description: 'Exact steps to trigger. Environment + minimal repro' },
|
|
51
|
+
{ name: 'Analysis', loadDepth: 1, description: 'Root cause investigation. What was checked, what was found' },
|
|
52
|
+
{ name: 'Possible Fixes', loadDepth: 1, description: 'Candidate approaches with tradeoffs' },
|
|
53
|
+
{ name: 'Fixing Attempts', loadDepth: 1, description: "What was tried, what worked, what didn't" },
|
|
54
|
+
{ name: 'Solution', loadDepth: 1, description: 'The fix that shipped. Commit hash + one-line summary' },
|
|
55
|
+
{ name: 'Cause', loadDepth: 1, description: 'Why the bug existed — the underlying mistake or gap' },
|
|
56
|
+
{ name: 'Key Learnings', loadDepth: 1, description: 'Generalizable insight for future work. Tag #open / #solved' },
|
|
57
|
+
],
|
|
58
|
+
},
|
|
59
|
+
H: {
|
|
60
|
+
sections: [
|
|
61
|
+
{ name: 'Identity', loadDepth: 1, description: 'Who the user is — name, contact, GitHub, roles, background. Flat L2 sub-nodes, one fact per node.' },
|
|
62
|
+
{ name: 'Work Style', loadDepth: 1, description: 'How the user works — communication style, decision-making, iteration preferences, agent behavior expectations.' },
|
|
63
|
+
{ name: 'Priorities', loadDepth: 1, description: 'Current goals, focus areas, what to optimize for.' },
|
|
64
|
+
{ name: 'Preferences', loadDepth: 1, description: "Likes and dislikes — what works, what doesn't, what to avoid. Directly actionable for agent behavior." },
|
|
65
|
+
],
|
|
66
|
+
},
|
|
67
|
+
I: {
|
|
68
|
+
sections: [
|
|
69
|
+
{ name: 'Specs', loadDepth: 2, description: 'Hardware or service description. L1 body: Name | Status | Type | Host' },
|
|
70
|
+
{ name: 'Access', loadDepth: 1, description: 'Connection methods, ports, credentials location (never store credentials inline)' },
|
|
71
|
+
{ name: 'Services', loadDepth: 1, description: 'Running services / provided functions' },
|
|
72
|
+
{ name: 'Apps', loadDepth: 1, description: 'Installed software and tools' },
|
|
73
|
+
{ name: 'Config', loadDepth: 1, description: 'Important config file paths and settings' },
|
|
74
|
+
{ name: 'Notes', loadDepth: 1, description: 'Caveats, quirks, known issues' },
|
|
75
|
+
{ name: 'Rules', loadDepth: 1, description: 'Agent rules for working with this resource' },
|
|
76
|
+
],
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
const PREFIX_KEY = /^[A-Z]{1,2}$/;
|
|
81
|
+
/**
|
|
82
|
+
* Load config from `<dir>/hmem.config.json`, deep-merging `schemas` over DEFAULT_CONFIG.
|
|
83
|
+
* Missing file → defaults. User-supplied schema keys win; default keys fill the rest.
|
|
84
|
+
* Malformed prefix keys (not 1–2 uppercase letters) are dropped.
|
|
85
|
+
*/
|
|
86
|
+
export function loadConfig(dir) {
|
|
87
|
+
const merged = {
|
|
88
|
+
...DEFAULT_CONFIG,
|
|
89
|
+
prefixes: { ...DEFAULT_CONFIG.prefixes },
|
|
90
|
+
schemas: { ...DEFAULT_CONFIG.schemas },
|
|
91
|
+
};
|
|
92
|
+
const file = join(dir, 'hmem.config.json');
|
|
93
|
+
if (!existsSync(file))
|
|
94
|
+
return merged;
|
|
95
|
+
let raw;
|
|
96
|
+
try {
|
|
97
|
+
raw = JSON.parse(readFileSync(file, 'utf8'));
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return merged; // unreadable/invalid JSON → fall back to defaults, never crash
|
|
101
|
+
}
|
|
102
|
+
if (!raw || typeof raw !== 'object')
|
|
103
|
+
return merged;
|
|
104
|
+
const user = raw;
|
|
105
|
+
if (typeof user.maxTitleChars === 'number')
|
|
106
|
+
merged.maxTitleChars = user.maxTitleChars;
|
|
107
|
+
if (typeof user.maxNodeChars === 'number')
|
|
108
|
+
merged.maxNodeChars = user.maxNodeChars;
|
|
109
|
+
if (user.prefixes && typeof user.prefixes === 'object') {
|
|
110
|
+
merged.prefixes = { ...merged.prefixes, ...user.prefixes };
|
|
111
|
+
}
|
|
112
|
+
if (user.schemas && typeof user.schemas === 'object' && !Array.isArray(user.schemas)) {
|
|
113
|
+
for (const [prefix, schema] of Object.entries(user.schemas)) {
|
|
114
|
+
if (!PREFIX_KEY.test(prefix))
|
|
115
|
+
continue;
|
|
116
|
+
if (!schema || typeof schema !== 'object' || !Array.isArray(schema.sections))
|
|
117
|
+
continue;
|
|
118
|
+
merged.schemas[prefix] = schema;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return merged;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"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"}
|
package/dist/diagnostics.js
CHANGED
|
@@ -5,14 +5,9 @@
|
|
|
5
5
|
* Rotated to .1 when the file exceeds 1 MB.
|
|
6
6
|
*/
|
|
7
7
|
import fs from "node:fs";
|
|
8
|
-
import os from "node:os";
|
|
9
8
|
import path from "node:path";
|
|
9
|
+
import { safeHomedir } from "./utils.js";
|
|
10
10
|
const MAX_BYTES = 1024 * 1024;
|
|
11
|
-
function safeHomedir() {
|
|
12
|
-
if (process.platform === "win32" && process.env.USERPROFILE)
|
|
13
|
-
return process.env.USERPROFILE;
|
|
14
|
-
return process.env.HOME || os.homedir();
|
|
15
|
-
}
|
|
16
11
|
export function diagnosticsLogPath() {
|
|
17
12
|
return path.join(safeHomedir(), ".hmem", "diagnostics.log");
|
|
18
13
|
}
|
package/dist/diagnostics.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC;AAE9B,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC;AAC9D,CAAC;AAcD,MAAM,UAAU,eAAe,CAAC,KAAsB;IACpD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;QACrC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEzD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,IAAI,CAAC,IAAI,GAAG,SAAS,EAAE,CAAC;gBAC1B,MAAM,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC;gBAC/B,IAAI,CAAC;oBAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;gBACtD,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC;QAElC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;QAC/E,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,0CAA0C;IAC5C,CAAC;AACH,CAAC"}
|