neotoma 0.4.2 → 0.4.5

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 (129) hide show
  1. package/README.md +43 -0
  2. package/dist/actions.d.ts.map +1 -1
  3. package/dist/actions.js +332 -150
  4. package/dist/actions.js.map +1 -1
  5. package/dist/cli/commands/mirror.d.ts +52 -0
  6. package/dist/cli/commands/mirror.d.ts.map +1 -0
  7. package/dist/cli/commands/mirror.js +147 -0
  8. package/dist/cli/commands/mirror.js.map +1 -0
  9. package/dist/cli/config.d.ts +8 -0
  10. package/dist/cli/config.d.ts.map +1 -1
  11. package/dist/cli/config.js.map +1 -1
  12. package/dist/cli/doctor.d.ts +76 -0
  13. package/dist/cli/doctor.d.ts.map +1 -0
  14. package/dist/cli/doctor.js +345 -0
  15. package/dist/cli/doctor.js.map +1 -0
  16. package/dist/cli/hooks.d.ts +45 -0
  17. package/dist/cli/hooks.d.ts.map +1 -0
  18. package/dist/cli/hooks.js +273 -0
  19. package/dist/cli/hooks.js.map +1 -0
  20. package/dist/cli/hooks_detect.d.ts +53 -0
  21. package/dist/cli/hooks_detect.d.ts.map +1 -0
  22. package/dist/cli/hooks_detect.js +220 -0
  23. package/dist/cli/hooks_detect.js.map +1 -0
  24. package/dist/cli/index.d.ts.map +1 -1
  25. package/dist/cli/index.js +595 -49
  26. package/dist/cli/index.js.map +1 -1
  27. package/dist/cli/permissions.d.ts +46 -0
  28. package/dist/cli/permissions.d.ts.map +1 -0
  29. package/dist/cli/permissions.js +191 -0
  30. package/dist/cli/permissions.js.map +1 -0
  31. package/dist/cli/setup.d.ts +46 -0
  32. package/dist/cli/setup.d.ts.map +1 -0
  33. package/dist/cli/setup.js +105 -0
  34. package/dist/cli/setup.js.map +1 -0
  35. package/dist/core/operations.d.ts +145 -0
  36. package/dist/core/operations.d.ts.map +1 -0
  37. package/dist/core/operations.js +106 -0
  38. package/dist/core/operations.js.map +1 -0
  39. package/dist/openclaw_entry.d.ts +45 -0
  40. package/dist/openclaw_entry.d.ts.map +1 -0
  41. package/dist/openclaw_entry.js +75 -0
  42. package/dist/openclaw_entry.js.map +1 -0
  43. package/dist/server.d.ts.map +1 -1
  44. package/dist/server.js +107 -748
  45. package/dist/server.js.map +1 -1
  46. package/dist/services/batch_correction.d.ts +129 -0
  47. package/dist/services/batch_correction.d.ts.map +1 -0
  48. package/dist/services/batch_correction.js +231 -0
  49. package/dist/services/batch_correction.js.map +1 -0
  50. package/dist/services/canonical_markdown.d.ts +145 -0
  51. package/dist/services/canonical_markdown.d.ts.map +1 -0
  52. package/dist/services/canonical_markdown.js +425 -0
  53. package/dist/services/canonical_markdown.js.map +1 -0
  54. package/dist/services/canonical_mirror.d.ts +127 -0
  55. package/dist/services/canonical_mirror.d.ts.map +1 -0
  56. package/dist/services/canonical_mirror.js +1047 -0
  57. package/dist/services/canonical_mirror.js.map +1 -0
  58. package/dist/services/canonical_mirror_git.d.ts +71 -0
  59. package/dist/services/canonical_mirror_git.d.ts.map +1 -0
  60. package/dist/services/canonical_mirror_git.js +211 -0
  61. package/dist/services/canonical_mirror_git.js.map +1 -0
  62. package/dist/services/entity_resolution.d.ts +17 -1
  63. package/dist/services/entity_resolution.d.ts.map +1 -1
  64. package/dist/services/entity_resolution.js +97 -24
  65. package/dist/services/entity_resolution.js.map +1 -1
  66. package/dist/services/entity_type_equivalence.d.ts +40 -0
  67. package/dist/services/entity_type_equivalence.d.ts.map +1 -0
  68. package/dist/services/entity_type_equivalence.js +109 -0
  69. package/dist/services/entity_type_equivalence.js.map +1 -0
  70. package/dist/services/entity_type_guard.d.ts +52 -0
  71. package/dist/services/entity_type_guard.d.ts.map +1 -0
  72. package/dist/services/entity_type_guard.js +204 -0
  73. package/dist/services/entity_type_guard.js.map +1 -0
  74. package/dist/services/file_text_extraction.d.ts.map +1 -1
  75. package/dist/services/file_text_extraction.js +5 -0
  76. package/dist/services/file_text_extraction.js.map +1 -1
  77. package/dist/services/flat_packed_detection.d.ts +32 -0
  78. package/dist/services/flat_packed_detection.d.ts.map +1 -0
  79. package/dist/services/flat_packed_detection.js +96 -0
  80. package/dist/services/flat_packed_detection.js.map +1 -0
  81. package/dist/services/interpretation.d.ts.map +1 -1
  82. package/dist/services/interpretation.js +9 -0
  83. package/dist/services/interpretation.js.map +1 -1
  84. package/dist/services/memory_export.d.ts +56 -0
  85. package/dist/services/memory_export.d.ts.map +1 -0
  86. package/dist/services/memory_export.js +295 -0
  87. package/dist/services/memory_export.js.map +1 -0
  88. package/dist/services/raw_fragments.js +1 -1
  89. package/dist/services/raw_fragments.js.map +1 -1
  90. package/dist/services/raw_storage.d.ts +6 -0
  91. package/dist/services/raw_storage.d.ts.map +1 -1
  92. package/dist/services/raw_storage.js +26 -0
  93. package/dist/services/raw_storage.js.map +1 -1
  94. package/dist/services/schema_definitions.d.ts.map +1 -1
  95. package/dist/services/schema_definitions.js +37 -0
  96. package/dist/services/schema_definitions.js.map +1 -1
  97. package/dist/services/schema_reference_linking.d.ts +38 -0
  98. package/dist/services/schema_reference_linking.d.ts.map +1 -0
  99. package/dist/services/schema_reference_linking.js +130 -0
  100. package/dist/services/schema_reference_linking.js.map +1 -0
  101. package/dist/services/schema_registry.d.ts +39 -0
  102. package/dist/services/schema_registry.d.ts.map +1 -1
  103. package/dist/services/schema_registry.js +91 -2
  104. package/dist/services/schema_registry.js.map +1 -1
  105. package/dist/services/snapshot_computation.d.ts.map +1 -1
  106. package/dist/services/snapshot_computation.js +10 -0
  107. package/dist/services/snapshot_computation.js.map +1 -1
  108. package/dist/services/timeline_events.d.ts +24 -5
  109. package/dist/services/timeline_events.d.ts.map +1 -1
  110. package/dist/services/timeline_events.js +89 -13
  111. package/dist/services/timeline_events.js.map +1 -1
  112. package/dist/shared/action_schemas.d.ts +18 -2
  113. package/dist/shared/action_schemas.d.ts.map +1 -1
  114. package/dist/shared/action_schemas.js +8 -0
  115. package/dist/shared/action_schemas.js.map +1 -1
  116. package/dist/shared/local_transport.d.ts +13 -0
  117. package/dist/shared/local_transport.d.ts.map +1 -1
  118. package/dist/shared/local_transport.js +89 -6
  119. package/dist/shared/local_transport.js.map +1 -1
  120. package/dist/tool_definitions.d.ts +22 -0
  121. package/dist/tool_definitions.d.ts.map +1 -0
  122. package/dist/tool_definitions.js +747 -0
  123. package/dist/tool_definitions.js.map +1 -0
  124. package/openapi.yaml +13 -0
  125. package/openclaw.plugin.json +87 -0
  126. package/package.json +31 -1
  127. package/skills/query-memory/SKILL.md +67 -0
  128. package/skills/recover-sqlite-database/SKILL.md +46 -0
  129. package/skills/store-data/SKILL.md +58 -0
@@ -0,0 +1,345 @@
1
+ /**
2
+ * `neotoma doctor` — consolidated diagnostics for agent-led onboarding.
3
+ *
4
+ * Returns a single machine-readable snapshot covering install/runtime/API/MCP/
5
+ * CLI instructions/permission-file state so agents do not improvise with shell
6
+ * introspection (python3, grep, ls, cat, jq, find, which, node -e).
7
+ */
8
+ import fs from "node:fs/promises";
9
+ import { existsSync, readFileSync } from "node:fs";
10
+ import os from "node:os";
11
+ import path from "node:path";
12
+ import { fileURLToPath } from "node:url";
13
+ import { execFileSync } from "node:child_process";
14
+ import { discoverApiInstances } from "./config.js";
15
+ import { detectHooks, toHookHarness, } from "./hooks_detect.js";
16
+ const __filename = fileURLToPath(import.meta.url);
17
+ const __dirname = path.dirname(__filename);
18
+ function safeExec(cmd, args) {
19
+ try {
20
+ const out = execFileSync(cmd, args, { stdio: ["ignore", "pipe", "ignore"], encoding: "utf8" });
21
+ return out.trim() || null;
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ }
27
+ /** Resolve the neotoma binary and detect which shell-manager owns node (mise/nvm/fnm). */
28
+ function detectRuntime() {
29
+ const whichNeotoma = safeExec("which", ["neotoma"]);
30
+ const whichNode = safeExec("which", ["node"]);
31
+ const npmPrefix = safeExec("npm", ["prefix", "-g"]);
32
+ const npmRoot = npmPrefix ? path.join(npmPrefix, "lib", "node_modules") : null;
33
+ const globalBin = npmPrefix ? path.join(npmPrefix, "bin", "neotoma") : null;
34
+ const globalPkgDir = npmRoot ? path.join(npmRoot, "neotoma") : null;
35
+ const globalPkgExists = globalPkgDir ? existsSync(globalPkgDir) : false;
36
+ // Detect resolved_via from the which-neotoma path
37
+ let resolvedVia = "unknown";
38
+ if (whichNeotoma) {
39
+ if (whichNeotoma.includes("/.local/share/mise/") || whichNeotoma.includes("/.mise/")) {
40
+ resolvedVia = "mise";
41
+ }
42
+ else if (whichNeotoma.includes("/.nvm/")) {
43
+ resolvedVia = "nvm";
44
+ }
45
+ else if (whichNeotoma.includes("/.fnm/") || whichNeotoma.includes("/fnm/")) {
46
+ resolvedVia = "fnm";
47
+ }
48
+ else if (whichNeotoma.includes("/node_modules/") || (globalBin && path.resolve(whichNeotoma) === path.resolve(globalBin))) {
49
+ resolvedVia = "npm";
50
+ }
51
+ else {
52
+ resolvedVia = "path";
53
+ }
54
+ }
55
+ // Compute hint when `which neotoma` fails but the global package exists (typical mise/nvm PATH mismatch).
56
+ let pathFixHint = null;
57
+ if (!whichNeotoma && globalPkgExists) {
58
+ if (npmPrefix && npmPrefix.includes("/mise/")) {
59
+ pathFixHint = `Run \`eval "$(mise activate zsh)"\` in this shell (or restart the terminal) so your agent shell finds the \`neotoma\` binary at ${globalBin ?? "the global npm bin"}.`;
60
+ }
61
+ else if (npmPrefix && npmPrefix.includes("/.nvm/")) {
62
+ pathFixHint = `Your Node version manager (nvm) installed neotoma at ${globalBin}. Ensure your non-interactive shell sources nvm (e.g. add \`source "$NVM_DIR/nvm.sh"\` to ~/.zshenv).`;
63
+ }
64
+ else {
65
+ pathFixHint = `\`neotoma\` is not on PATH but exists at ${globalBin ?? globalPkgDir}. Add the containing directory to PATH or re-run \`npm install -g neotoma\` from this shell.`;
66
+ }
67
+ }
68
+ else if (!whichNeotoma && !globalPkgExists) {
69
+ pathFixHint = "Run `npm install -g neotoma` to install the CLI globally.";
70
+ }
71
+ return {
72
+ neotoma_on_path: Boolean(whichNeotoma),
73
+ node_on_path: Boolean(whichNode),
74
+ resolved_via: resolvedVia,
75
+ which_neotoma: whichNeotoma,
76
+ global_bin: globalBin,
77
+ npm_global_root: npmRoot,
78
+ global_package_dir: globalPkgExists ? globalPkgDir : null,
79
+ path_fix_hint: pathFixHint,
80
+ };
81
+ }
82
+ function readVersionFromPackageJson(pkgPath) {
83
+ try {
84
+ const raw = readFileSync(pkgPath, "utf8");
85
+ const pkg = JSON.parse(raw);
86
+ return pkg.version ?? null;
87
+ }
88
+ catch {
89
+ return null;
90
+ }
91
+ }
92
+ /** Detect the neotoma version from global package.json or local install. */
93
+ function detectVersion(globalPkgDir) {
94
+ if (globalPkgDir) {
95
+ const v = readVersionFromPackageJson(path.join(globalPkgDir, "package.json"));
96
+ if (v)
97
+ return v;
98
+ }
99
+ // Fallback: package.json adjacent to current module (dev checkout)
100
+ try {
101
+ const here = path.resolve(path.join(__dirname, "..", "..", "package.json"));
102
+ const v = readVersionFromPackageJson(here);
103
+ if (v)
104
+ return v;
105
+ }
106
+ catch {
107
+ // ignore
108
+ }
109
+ return null;
110
+ }
111
+ /** Heuristically detect which agent harness invoked the CLI (for `current_tool_hint`). */
112
+ function detectCurrentToolHint(cwd) {
113
+ const env = process.env;
114
+ if (env.CLAUDE_CODE_ENTRYPOINT || env.CLAUDECODE)
115
+ return "claude-code";
116
+ if (env.CURSOR_AGENT || env.CURSOR_TRACE_ID || env.CURSOR_IDE)
117
+ return "cursor";
118
+ if (env.OPENAI_CODEX_BUILD || env.CODEX_HOME)
119
+ return "codex";
120
+ if (env.OPENCLAW_SESSION || env.OPENCLAW_CWD)
121
+ return "openclaw";
122
+ // Second-best: directory-level markers.
123
+ try {
124
+ if (existsSync(path.join(cwd, ".claude")))
125
+ return "claude-code";
126
+ if (existsSync(path.join(cwd, ".cursor")))
127
+ return "cursor";
128
+ if (existsSync(path.join(cwd, ".codex")))
129
+ return "codex";
130
+ }
131
+ catch {
132
+ // ignore
133
+ }
134
+ return null;
135
+ }
136
+ /** Check a Claude Code permission file for neotoma wildcard allow entries. */
137
+ async function readClaudePermissions(filePath) {
138
+ try {
139
+ const raw = await fs.readFile(filePath, "utf8");
140
+ const parsed = JSON.parse(raw);
141
+ const allow = parsed.permissions?.allow ?? [];
142
+ return {
143
+ path: filePath,
144
+ exists: true,
145
+ has_neotoma_allow: allow.some((s) => /^Bash\(neotoma:\*?\)$/.test(s) || s === "Bash(neotoma:*)"),
146
+ has_npm_install_allow: allow.some((s) => /npm\s+install\s+-g\s+neotoma/.test(s)),
147
+ };
148
+ }
149
+ catch {
150
+ return { path: filePath, exists: false, has_neotoma_allow: false, has_npm_install_allow: false };
151
+ }
152
+ }
153
+ /** Check a Cursor allowlist JSON file (or legacy path) for neotoma entries. */
154
+ async function readCursorAllowlist(projectRoot) {
155
+ const candidate = path.join(projectRoot, ".cursor", "allowlist.json");
156
+ try {
157
+ const raw = await fs.readFile(candidate, "utf8");
158
+ const parsed = JSON.parse(raw);
159
+ const allow = parsed.allow ?? [];
160
+ return {
161
+ path: candidate,
162
+ exists: true,
163
+ has_neotoma_allow: allow.some((s) => /neotoma/.test(s)),
164
+ has_npm_install_allow: allow.some((s) => /npm\s+install\s+-g\s+neotoma/.test(s)),
165
+ };
166
+ }
167
+ catch {
168
+ return { path: candidate, exists: false, has_neotoma_allow: false, has_npm_install_allow: false };
169
+ }
170
+ }
171
+ /** Check Codex config.toml for neotoma approval entries. */
172
+ async function readCodexApprovals() {
173
+ const home = os.homedir();
174
+ const candidate = path.join(home, ".codex", "config.toml");
175
+ try {
176
+ const raw = await fs.readFile(candidate, "utf8");
177
+ const hasNeotoma = /neotoma/i.test(raw) && /\[approvals?\]/.test(raw);
178
+ const hasNpmAllow = /npm\s+install\s+-g\s+neotoma/.test(raw);
179
+ return {
180
+ path: candidate,
181
+ exists: true,
182
+ has_neotoma_allow: hasNeotoma,
183
+ has_npm_install_allow: hasNpmAllow,
184
+ };
185
+ }
186
+ catch {
187
+ return { path: candidate, exists: false, has_neotoma_allow: false, has_npm_install_allow: false };
188
+ }
189
+ }
190
+ /** Suggest the next step based on consolidated state. */
191
+ function suggestNextStep(report) {
192
+ if (!report.neotoma.installed)
193
+ return "install";
194
+ if (!report.data.initialized)
195
+ return "init";
196
+ const mcpConfigured = Object.values(report.mcp_servers_detected).some((c) => c.has_neotoma || c.has_neotoma_dev);
197
+ if (!mcpConfigured)
198
+ return "configure-mcp";
199
+ const cliInstr = report.cli_instructions;
200
+ const hasAnyCliInstr = cliInstr.project.cursor ||
201
+ cliInstr.project.claude ||
202
+ cliInstr.project.codex ||
203
+ cliInstr.user.cursor ||
204
+ cliInstr.user.claude ||
205
+ cliInstr.user.codex;
206
+ if (!hasAnyCliInstr)
207
+ return "configure-cli-instructions";
208
+ const hasPerms = Object.values(report.permission_files).some((p) => p.has_neotoma_allow);
209
+ if (!hasPerms && report.current_tool_hint && report.current_tool_hint !== "openclaw") {
210
+ return "configure-permissions";
211
+ }
212
+ if (!report.api.running)
213
+ return "activate";
214
+ if (report.hooks.eligible_for_offer)
215
+ return "offer-hooks";
216
+ return "ready";
217
+ }
218
+ export async function runDoctor(opts = {}) {
219
+ const cwd = opts.cwd ?? process.cwd();
220
+ const runtime = detectRuntime();
221
+ const version = detectVersion(runtime.global_package_dir);
222
+ const installed = runtime.neotoma_on_path || runtime.global_package_dir !== null;
223
+ // Data/init status
224
+ const configDir = path.join(os.homedir(), ".config", "neotoma");
225
+ const dataDir = process.env.NEOTOMA_DATA_DIR ?? path.join(os.homedir(), "neotoma", "data");
226
+ const dbCandidates = [path.join(dataDir, "neotoma.db"), path.join(dataDir, "neotoma.prod.db")];
227
+ const dbExists = dbCandidates.some((p) => existsSync(p));
228
+ const initialized = dbExists && existsSync(configDir);
229
+ // API running?
230
+ let apiRunning = false;
231
+ let apiEnv = null;
232
+ let apiPort = null;
233
+ const apiPid = null;
234
+ let apiBaseUrl = null;
235
+ try {
236
+ const instances = await discoverApiInstances({ config: opts.config });
237
+ const first = instances.find((i) => i.healthy) ?? instances[0];
238
+ if (first) {
239
+ apiRunning = Boolean(first.healthy);
240
+ apiEnv = first.envHint === "dev" ? "dev" : first.envHint === "prod" ? "prod" : null;
241
+ apiPort = first.port ?? null;
242
+ apiBaseUrl = first.url ?? null;
243
+ }
244
+ }
245
+ catch {
246
+ // ignore discovery errors
247
+ }
248
+ // MCP server detection
249
+ const mcpServersDetected = {};
250
+ try {
251
+ const { scanForMcpConfigs } = await import("./mcp_config_scan.js");
252
+ const { configs } = await scanForMcpConfigs(cwd, { includeUserLevel: true });
253
+ for (const c of configs) {
254
+ const id = inferMcpToolId(c.path);
255
+ mcpServersDetected[id] = {
256
+ path: c.path,
257
+ has_neotoma: c.hasProd,
258
+ has_neotoma_dev: c.hasDev,
259
+ };
260
+ }
261
+ }
262
+ catch {
263
+ // leave empty
264
+ }
265
+ // CLI instructions
266
+ let cliInstructions = {
267
+ project: { cursor: false, claude: false, codex: false },
268
+ user: { cursor: false, claude: false, codex: false },
269
+ };
270
+ try {
271
+ const { scanAgentInstructions } = await import("./agent_instructions_scan.js");
272
+ const res = await scanAgentInstructions(cwd, { includeUserLevel: true });
273
+ cliInstructions = {
274
+ project: {
275
+ cursor: res.appliedProject.cursor,
276
+ claude: res.appliedProject.claude,
277
+ codex: res.appliedProject.codex,
278
+ },
279
+ user: {
280
+ cursor: res.appliedUser.cursor,
281
+ claude: res.appliedUser.claude,
282
+ codex: res.appliedUser.codex,
283
+ },
284
+ };
285
+ }
286
+ catch {
287
+ // leave defaults
288
+ }
289
+ // Permission files
290
+ const permissionFiles = {
291
+ claude_code_project: await readClaudePermissions(path.join(cwd, ".claude", "settings.local.json")),
292
+ claude_code_user: await readClaudePermissions(path.join(os.homedir(), ".claude", "settings.json")),
293
+ cursor_project: await readCursorAllowlist(cwd),
294
+ codex_user: await readCodexApprovals(),
295
+ };
296
+ const currentToolHint = detectCurrentToolHint(cwd);
297
+ // Hooks detection. `toHookHarness` filters out tools without hook support
298
+ // (e.g. claude-desktop, openclaw) so eligibility never triggers on them.
299
+ const mcpConfigured = Object.values(mcpServersDetected).some((c) => c.has_neotoma || c.has_neotoma_dev);
300
+ const currentHookHarness = toHookHarness(currentToolHint);
301
+ const hooks = await detectHooks({
302
+ cwd,
303
+ currentTool: currentHookHarness,
304
+ mcpConfigured,
305
+ });
306
+ const partial = {
307
+ neotoma: {
308
+ installed,
309
+ version,
310
+ ...runtime,
311
+ },
312
+ data: {
313
+ config_dir: configDir,
314
+ data_dir: dataDir,
315
+ db_exists: dbExists,
316
+ initialized,
317
+ },
318
+ api: {
319
+ running: apiRunning,
320
+ env: apiEnv,
321
+ port: apiPort,
322
+ pid: apiPid,
323
+ base_url: apiBaseUrl,
324
+ },
325
+ mcp_servers_detected: mcpServersDetected,
326
+ cli_instructions: cliInstructions,
327
+ permission_files: permissionFiles,
328
+ current_tool_hint: currentToolHint,
329
+ hooks,
330
+ };
331
+ return { ...partial, suggested_next_step: suggestNextStep(partial) };
332
+ }
333
+ function inferMcpToolId(filePath) {
334
+ const n = filePath.toLowerCase();
335
+ if (n.includes(".cursor"))
336
+ return "cursor";
337
+ if (n.includes("claude_desktop"))
338
+ return "claude_desktop";
339
+ if (n.includes(".claude"))
340
+ return "claude_code";
341
+ if (n.includes(".codex"))
342
+ return "codex";
343
+ return path.basename(filePath);
344
+ }
345
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * `neotoma hooks` — install / uninstall / status for lifecycle hooks.
3
+ *
4
+ * This command intentionally does *not* ship as part of `neotoma setup`.
5
+ * Hooks are offered separately during activation (see install.md step 6.5)
6
+ * so the user sees Neotoma's MCP-driven value before we add a second write
7
+ * path into their tool configuration.
8
+ *
9
+ * The command itself is a thin wrapper that delegates to each package's own
10
+ * installer script:
11
+ * - cursor → packages/cursor-hooks/scripts/install.mjs
12
+ * - codex → packages/codex-hooks/scripts/install.mjs
13
+ * - claude-code / opencode / claude-agent-sdk → print a snippet and exit
14
+ *
15
+ * Guardrails (enforced before any write):
16
+ * - `data.initialized === false` → refuse; instruct user to `neotoma init`.
17
+ * - `hooks.installed[tool].other_hook_plugins.length > 0` → refuse unless
18
+ * `--force` is set; surface the detected plugin names.
19
+ * - Non-interactive prompt by default; `--yes` bypasses confirmation.
20
+ */
21
+ import { type DoctorReport } from "./doctor.js";
22
+ import type { HookHarnessId } from "./hooks_detect.js";
23
+ export interface HooksCommandOptions {
24
+ tool: HookHarnessId;
25
+ cwd?: string;
26
+ dryRun?: boolean;
27
+ yes?: boolean;
28
+ force?: boolean;
29
+ }
30
+ export interface HooksCommandResult {
31
+ ok: boolean;
32
+ tool: HookHarnessId;
33
+ action: "install" | "uninstall" | "status";
34
+ message: string;
35
+ /** Populated when delegation to a package script happened. */
36
+ delegated_to: string | null;
37
+ /** Raw doctor.hooks snapshot after the command. */
38
+ status: DoctorReport["hooks"];
39
+ }
40
+ export declare function runHooksInstall(opts: HooksCommandOptions): Promise<HooksCommandResult>;
41
+ export declare function runHooksUninstall(opts: HooksCommandOptions): Promise<HooksCommandResult>;
42
+ export declare function runHooksStatus(opts?: {
43
+ cwd?: string;
44
+ }): Promise<DoctorReport["hooks"]>;
45
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/cli/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAQH,OAAO,EAAa,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,mBAAmB,CAAC;AAMnE,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,aAAa,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,mDAAmD;IACnD,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;CAC/B;AAkRD,wBAAsB,eAAe,CACnC,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,kBAAkB,CAAC,CAG7B;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,kBAAkB,CAAC,CAG7B;AAED,wBAAsB,cAAc,CAClC,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC1B,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAGhC"}