oh-my-second-brain 0.1.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 (90) hide show
  1. package/adapters/README.md +98 -0
  2. package/adapters/claude-code/.claude-plugin/plugin.json +24 -0
  3. package/adapters/claude-code/CLAUDE.md +26 -0
  4. package/adapters/claude-code/skills/capture/SKILL.md +50 -0
  5. package/adapters/claude-code/skills/define/SKILL.md +51 -0
  6. package/adapters/claude-code/skills/doctor/SKILL.md +58 -0
  7. package/adapters/claude-code/skills/retrieve/SKILL.md +55 -0
  8. package/adapters/claude-code/skills/setup/SKILL.md +71 -0
  9. package/adapters/claude-code/skills/uninstall/SKILL.md +34 -0
  10. package/adapters/codex/.codex-plugin/plugin.json +8 -0
  11. package/adapters/codex/.mcp.json +14 -0
  12. package/adapters/codex/AGENTS.md +16 -0
  13. package/adapters/codex/rules/oms.md +25 -0
  14. package/adapters/codex/skills/oms-capture/SKILL.md +16 -0
  15. package/adapters/codex/skills/oms-doctor/SKILL.md +14 -0
  16. package/adapters/codex/skills/oms-install/SKILL.md +19 -0
  17. package/adapters/codex/skills/oms-retrieve/SKILL.md +10 -0
  18. package/adapters/codex/skills/oms-setup/SKILL.md +22 -0
  19. package/adapters/codex/skills/oms-uninstall/SKILL.md +20 -0
  20. package/adapters/hermes/README.md +8 -0
  21. package/adapters/hermes/SOUL.md +19 -0
  22. package/adapters/hermes/manifest.json +7 -0
  23. package/adapters/hermes/skills/capture/SKILL.md +16 -0
  24. package/adapters/hermes/skills/doctor/SKILL.md +14 -0
  25. package/adapters/hermes/skills/install/SKILL.md +19 -0
  26. package/adapters/hermes/skills/retrieve/SKILL.md +10 -0
  27. package/adapters/hermes/skills/setup/SKILL.md +22 -0
  28. package/adapters/hermes/skills/uninstall/SKILL.md +20 -0
  29. package/core/AGENTS.md +110 -0
  30. package/core/agents/librarian.md +43 -0
  31. package/core/agents/retriever.md +62 -0
  32. package/core/ontology/concepts/inbox.yaml +4 -0
  33. package/core/ontology/concepts/literature.yaml +27 -0
  34. package/core/ontology/taxonomy.yaml +11 -0
  35. package/core/skills/capture/SKILL.md +48 -0
  36. package/core/skills/define/SKILL.md +59 -0
  37. package/core/skills/doctor/SKILL.md +49 -0
  38. package/core/skills/retrieve/SKILL.md +56 -0
  39. package/core/skills/setup/SKILL.md +44 -0
  40. package/core/skills/uninstall/SKILL.md +34 -0
  41. package/dist/adapt/HostAdapter.d.ts +21 -0
  42. package/dist/adapt/HostAdapter.js +10 -0
  43. package/dist/adapt/HostAdapter.js.map +1 -0
  44. package/dist/adapt/claudeCode.d.ts +9 -0
  45. package/dist/adapt/claudeCode.js +15 -0
  46. package/dist/adapt/claudeCode.js.map +1 -0
  47. package/dist/adapt/codex.d.ts +9 -0
  48. package/dist/adapt/codex.js +15 -0
  49. package/dist/adapt/codex.js.map +1 -0
  50. package/dist/adapt/hermes.d.ts +9 -0
  51. package/dist/adapt/hermes.js +15 -0
  52. package/dist/adapt/hermes.js.map +1 -0
  53. package/dist/capture/safe.d.ts +36 -0
  54. package/dist/capture/safe.js +167 -0
  55. package/dist/capture/safe.js.map +1 -0
  56. package/dist/cli/oms.d.ts +18 -0
  57. package/dist/cli/oms.js +401 -0
  58. package/dist/cli/oms.js.map +1 -0
  59. package/dist/conventions/frontmatter.d.ts +15 -0
  60. package/dist/conventions/frontmatter.js +23 -0
  61. package/dist/conventions/frontmatter.js.map +1 -0
  62. package/dist/conventions/validate.d.ts +24 -0
  63. package/dist/conventions/validate.js +88 -0
  64. package/dist/conventions/validate.js.map +1 -0
  65. package/dist/graph/cache.d.ts +98 -0
  66. package/dist/graph/cache.js +347 -0
  67. package/dist/graph/cache.js.map +1 -0
  68. package/dist/index.d.ts +7 -0
  69. package/dist/index.js +8 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/install/hosts.d.ts +27 -0
  72. package/dist/install/hosts.js +465 -0
  73. package/dist/install/hosts.js.map +1 -0
  74. package/dist/mcp/server.d.ts +8 -0
  75. package/dist/mcp/server.js +461 -0
  76. package/dist/mcp/server.js.map +1 -0
  77. package/dist/ontology/loader.d.ts +13 -0
  78. package/dist/ontology/loader.js +63 -0
  79. package/dist/ontology/loader.js.map +1 -0
  80. package/dist/ontology/resolver.d.ts +13 -0
  81. package/dist/ontology/resolver.js +37 -0
  82. package/dist/ontology/resolver.js.map +1 -0
  83. package/dist/ontology/types.d.ts +72 -0
  84. package/dist/ontology/types.js +12 -0
  85. package/dist/ontology/types.js.map +1 -0
  86. package/docs/install.md +115 -0
  87. package/docs/release.md +91 -0
  88. package/package.json +64 -0
  89. package/scripts/install.sh +49 -0
  90. package/scripts/uninstall.sh +57 -0
@@ -0,0 +1,34 @@
1
+ ---
2
+ name: oms-uninstall
3
+ description: Remove Oh My Second Brain host adapter and MCP registrations by running npx -y https://github.com/GoBeromsu/oms/releases/download/oms-v0.1.5/oms-0.1.5.tgz uninstall.
4
+ ---
5
+
6
+ # Skill: oms-uninstall (Claude Code)
7
+
8
+ Remove Oh My Second Brain host registrations and adapter files. This does **not** delete vault notes or `vault/.oms/` ontology data.
9
+
10
+ ## Invocation
11
+
12
+ ```
13
+ /oms-uninstall
14
+ ```
15
+
16
+ ## What this skill does
17
+
18
+ Shells out to:
19
+
20
+ ```bash
21
+ npx -y https://github.com/GoBeromsu/oms/releases/download/oms-v0.1.5/oms-0.1.5.tgz uninstall [--runtime <all|claude|codex|hermes>] [--dry-run] [--execute] [--yes]
22
+ ```
23
+
24
+ ## Recommended flow
25
+
26
+ ```bash
27
+ # Preview first:
28
+ npx -y https://github.com/GoBeromsu/oms/releases/download/oms-v0.1.5/oms-0.1.5.tgz uninstall --runtime all --dry-run
29
+
30
+ # Remove Oh My Second Brain host registrations:
31
+ npx -y https://github.com/GoBeromsu/oms/releases/download/oms-v0.1.5/oms-0.1.5.tgz uninstall --runtime all --yes
32
+ ```
33
+
34
+ Use `--execute` only when you want Oh My Second Brain to call external host CLIs such as `claude mcp remove oms` or `claude plugin uninstall oms`.
@@ -0,0 +1,21 @@
1
+ /**
2
+ * HostAdapter — per-host integration interface.
3
+ *
4
+ * Each host (Claude Code, Codex, Hermes) has structurally asymmetric installation
5
+ * paths, convention file names, and capability sets. This asymmetry is intentional
6
+ * and documented in adapters/README.md. The interface is deliberately minimal:
7
+ * resist the urge to unify what is genuinely different per host.
8
+ */
9
+ export type HostId = "claude-code" | "codex" | "hermes";
10
+ export interface HostCapabilities {
11
+ mcp: boolean;
12
+ skills: boolean;
13
+ /** Name of the host's top-level convention file (e.g. "CLAUDE.md"). */
14
+ conventionFile: string;
15
+ }
16
+ export interface HostAdapter {
17
+ readonly host: HostId;
18
+ capabilities(): HostCapabilities;
19
+ installManifest(vaultRoot: string): Promise<void>;
20
+ installConventionFile(vaultRoot: string): Promise<void>;
21
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * HostAdapter — per-host integration interface.
3
+ *
4
+ * Each host (Claude Code, Codex, Hermes) has structurally asymmetric installation
5
+ * paths, convention file names, and capability sets. This asymmetry is intentional
6
+ * and documented in adapters/README.md. The interface is deliberately minimal:
7
+ * resist the urge to unify what is genuinely different per host.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=HostAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HostAdapter.js","sourceRoot":"","sources":["../../src/adapt/HostAdapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,9 @@
1
+ import type { HostAdapter, HostCapabilities, HostId } from "./HostAdapter.js";
2
+ export declare class ClaudeCodeAdapter implements HostAdapter {
3
+ readonly host: HostId;
4
+ capabilities(): HostCapabilities;
5
+ /** TODO: v1 — write .claude/manifest.json into vaultRoot */
6
+ installManifest(_vaultRoot: string): Promise<void>;
7
+ /** TODO: v1 — scaffold CLAUDE.md into vaultRoot */
8
+ installConventionFile(_vaultRoot: string): Promise<void>;
9
+ }
@@ -0,0 +1,15 @@
1
+ export class ClaudeCodeAdapter {
2
+ host = "claude-code";
3
+ capabilities() {
4
+ return { mcp: true, skills: true, conventionFile: "CLAUDE.md" };
5
+ }
6
+ /** TODO: v1 — write .claude/manifest.json into vaultRoot */
7
+ async installManifest(_vaultRoot) {
8
+ throw new Error("not implemented in v0");
9
+ }
10
+ /** TODO: v1 — scaffold CLAUDE.md into vaultRoot */
11
+ async installConventionFile(_vaultRoot) {
12
+ throw new Error("not implemented in v0");
13
+ }
14
+ }
15
+ //# sourceMappingURL=claudeCode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claudeCode.js","sourceRoot":"","sources":["../../src/adapt/claudeCode.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,iBAAiB;IACnB,IAAI,GAAW,aAAa,CAAC;IAEtC,YAAY;QACV,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;IAClE,CAAC;IAED,4DAA4D;IAC5D,KAAK,CAAC,eAAe,CAAC,UAAkB;QACtC,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,mDAAmD;IACnD,KAAK,CAAC,qBAAqB,CAAC,UAAkB;QAC5C,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ import type { HostAdapter, HostCapabilities, HostId } from "./HostAdapter.js";
2
+ export declare class CodexAdapter implements HostAdapter {
3
+ readonly host: HostId;
4
+ capabilities(): HostCapabilities;
5
+ /** TODO: v1 — write Codex manifest into vaultRoot */
6
+ installManifest(_vaultRoot: string): Promise<void>;
7
+ /** TODO: v1 — scaffold AGENTS.md into vaultRoot */
8
+ installConventionFile(_vaultRoot: string): Promise<void>;
9
+ }
@@ -0,0 +1,15 @@
1
+ export class CodexAdapter {
2
+ host = "codex";
3
+ capabilities() {
4
+ return { mcp: true, skills: true, conventionFile: "AGENTS.md" };
5
+ }
6
+ /** TODO: v1 — write Codex manifest into vaultRoot */
7
+ async installManifest(_vaultRoot) {
8
+ throw new Error("not implemented in v0");
9
+ }
10
+ /** TODO: v1 — scaffold AGENTS.md into vaultRoot */
11
+ async installConventionFile(_vaultRoot) {
12
+ throw new Error("not implemented in v0");
13
+ }
14
+ }
15
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/adapt/codex.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,YAAY;IACd,IAAI,GAAW,OAAO,CAAC;IAEhC,YAAY;QACV,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;IAClE,CAAC;IAED,qDAAqD;IACrD,KAAK,CAAC,eAAe,CAAC,UAAkB;QACtC,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,mDAAmD;IACnD,KAAK,CAAC,qBAAqB,CAAC,UAAkB;QAC5C,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ import type { HostAdapter, HostCapabilities, HostId } from "./HostAdapter.js";
2
+ export declare class HermesAdapter implements HostAdapter {
3
+ readonly host: HostId;
4
+ capabilities(): HostCapabilities;
5
+ /** TODO: v1 — write Hermes manifest into vaultRoot */
6
+ installManifest(_vaultRoot: string): Promise<void>;
7
+ /** TODO: v1 — scaffold SOUL.md into vaultRoot */
8
+ installConventionFile(_vaultRoot: string): Promise<void>;
9
+ }
@@ -0,0 +1,15 @@
1
+ export class HermesAdapter {
2
+ host = "hermes";
3
+ capabilities() {
4
+ return { mcp: true, skills: true, conventionFile: "SOUL.md" };
5
+ }
6
+ /** TODO: v1 — write Hermes manifest into vaultRoot */
7
+ async installManifest(_vaultRoot) {
8
+ throw new Error("not implemented in v0");
9
+ }
10
+ /** TODO: v1 — scaffold SOUL.md into vaultRoot */
11
+ async installConventionFile(_vaultRoot) {
12
+ throw new Error("not implemented in v0");
13
+ }
14
+ }
15
+ //# sourceMappingURL=hermes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hermes.js","sourceRoot":"","sources":["../../src/adapt/hermes.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,aAAa;IACf,IAAI,GAAW,QAAQ,CAAC;IAEjC,YAAY;QACV,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC;IAChE,CAAC;IAED,sDAAsD;IACtD,KAAK,CAAC,eAAe,CAAC,UAAkB;QACtC,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,iDAAiD;IACjD,KAAK,CAAC,qBAAqB,CAAC,UAAkB;QAC5C,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;CACF"}
@@ -0,0 +1,36 @@
1
+ import type { Ontology } from "../ontology/types.js";
2
+ export type CapturePrepareAction = "ready" | "ask-missing-fields" | "route-to-inbox";
3
+ export type CaptureWriteMode = "create" | "append";
4
+ export interface CapturePrepareInput {
5
+ vault: string;
6
+ ontology: Ontology;
7
+ concept?: string;
8
+ folder?: string;
9
+ filename?: string;
10
+ frontmatter?: Record<string, unknown>;
11
+ }
12
+ export interface CapturePlan {
13
+ action: CapturePrepareAction;
14
+ concept: string | null;
15
+ folder: string;
16
+ notePath: string;
17
+ missingFields: string[];
18
+ frontmatter: Record<string, unknown>;
19
+ reason?: string;
20
+ }
21
+ export interface CaptureCommitInput {
22
+ vault: string;
23
+ ontology: Ontology;
24
+ notePath: string;
25
+ frontmatter: Record<string, unknown>;
26
+ body: string;
27
+ mode: CaptureWriteMode;
28
+ }
29
+ export interface CaptureCommitResult {
30
+ written: true;
31
+ mode: CaptureWriteMode;
32
+ notePath: string;
33
+ }
34
+ export declare function safeVaultNotePath(vault: string, notePath: string): string;
35
+ export declare function prepareCapture(input: CapturePrepareInput): CapturePlan;
36
+ export declare function commitCapture(input: CaptureCommitInput): Promise<CaptureCommitResult>;
@@ -0,0 +1,167 @@
1
+ import { mkdir, readFile, writeFile, appendFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { stringify as yamlStringify } from "yaml";
4
+ import { validateFrontmatter } from "../conventions/validate.js";
5
+ import { resolveConcept } from "../ontology/resolver.js";
6
+ function slugify(value) {
7
+ const slug = value
8
+ .toLowerCase()
9
+ .replace(/[^\p{L}\p{N}]+/gu, "-")
10
+ .replace(/^-+|-+$/g, "")
11
+ .slice(0, 80);
12
+ return slug || "untitled";
13
+ }
14
+ function conceptsForFolder(ontology, folder) {
15
+ const binding = ontology.taxonomy.folders[folder]?.concept;
16
+ if (!binding)
17
+ return [];
18
+ return Array.isArray(binding) ? binding : [binding];
19
+ }
20
+ function findConcept(ontology, conceptName) {
21
+ return conceptName ? ontology.concepts.get(conceptName) : undefined;
22
+ }
23
+ function defaultInboxFolder(ontology) {
24
+ if (ontology.taxonomy.folders["inbox"])
25
+ return "inbox";
26
+ const inboxConcept = ontology.concepts.get("inbox");
27
+ return inboxConcept?.folder ?? "inbox";
28
+ }
29
+ function requiredMissing(concept, frontmatter) {
30
+ if (!concept)
31
+ return [];
32
+ return validateFrontmatter(frontmatter, concept).violations
33
+ .filter((violation) => violation.rule === "required")
34
+ .map((violation) => violation.field);
35
+ }
36
+ export function safeVaultNotePath(vault, notePath) {
37
+ if (path.isAbsolute(notePath)) {
38
+ throw new Error("notePath must be vault-relative");
39
+ }
40
+ const normalized = notePath.replace(/\\/g, "/");
41
+ if (!normalized.endsWith(".md")) {
42
+ throw new Error("notePath must end with .md");
43
+ }
44
+ const segments = normalized.split("/");
45
+ if (segments.some((part) => part === ".." || part === "." || part === "")) {
46
+ throw new Error("notePath must not contain unsafe path segments");
47
+ }
48
+ if (segments.some((part) => part.startsWith(".")) || segments.includes("node_modules")) {
49
+ throw new Error("notePath cannot target hidden, internal, or dependency folders");
50
+ }
51
+ const resolved = path.resolve(vault, normalized);
52
+ const relative = path.relative(vault, resolved);
53
+ if (relative.startsWith("..") || path.isAbsolute(relative)) {
54
+ throw new Error("notePath must stay inside the configured vault");
55
+ }
56
+ return resolved;
57
+ }
58
+ function safeCaptureFilename(requested, title) {
59
+ if (!requested) {
60
+ return {
61
+ filename: `${new Date().toISOString().slice(0, 10)}-${slugify(title)}.md`,
62
+ safe: true,
63
+ };
64
+ }
65
+ const normalized = requested.replace(/\\/g, "/");
66
+ const segments = normalized.split("/");
67
+ const safe = segments.length === 1 &&
68
+ normalized.endsWith(".md") &&
69
+ !segments.some((part) => part === ".." || part === "." || part === "" || part.startsWith("."));
70
+ return {
71
+ filename: safe ? normalized : `${new Date().toISOString().slice(0, 10)}-${slugify(title)}.md`,
72
+ safe,
73
+ };
74
+ }
75
+ export function prepareCapture(input) {
76
+ const frontmatter = input.frontmatter ?? {};
77
+ const requestedConcept = findConcept(input.ontology, input.concept);
78
+ const folder = input.folder ?? requestedConcept?.folder ?? defaultInboxFolder(input.ontology);
79
+ const folderConcepts = conceptsForFolder(input.ontology, folder);
80
+ const resolvedConcept = requestedConcept ?? findConcept(input.ontology, folderConcepts[0]);
81
+ const titleValue = frontmatter["title"];
82
+ const title = typeof titleValue === "string" ? titleValue : "untitled";
83
+ const filenamePlan = safeCaptureFilename(input.filename, title);
84
+ const filename = filenamePlan.filename;
85
+ const notePath = `${folder}/${filename}`;
86
+ if (!filenamePlan.safe) {
87
+ const inbox = defaultInboxFolder(input.ontology);
88
+ return {
89
+ action: "route-to-inbox",
90
+ concept: "inbox",
91
+ folder: inbox,
92
+ notePath: `${inbox}/${filename}`,
93
+ missingFields: [],
94
+ frontmatter,
95
+ reason: "Requested filename was unsafe; planned a safe inbox capture path.",
96
+ };
97
+ }
98
+ if (!resolvedConcept || !folderConcepts.includes(resolvedConcept.concept)) {
99
+ const inbox = defaultInboxFolder(input.ontology);
100
+ return {
101
+ action: "route-to-inbox",
102
+ concept: "inbox",
103
+ folder: inbox,
104
+ notePath: `${inbox}/${filename}`,
105
+ missingFields: [],
106
+ frontmatter,
107
+ reason: "No safe folder/concept binding matched the requested capture.",
108
+ };
109
+ }
110
+ const missingFields = requiredMissing(resolvedConcept, frontmatter);
111
+ return {
112
+ action: missingFields.length > 0 ? "ask-missing-fields" : "ready",
113
+ concept: resolvedConcept.concept,
114
+ folder,
115
+ notePath,
116
+ missingFields,
117
+ frontmatter,
118
+ };
119
+ }
120
+ function formatNote(frontmatter, body) {
121
+ return `---\n${yamlStringify(frontmatter).trimEnd()}\n---\n\n${body.trim()}\n`;
122
+ }
123
+ function hasErrorCode(error, code) {
124
+ return error instanceof Error && "code" in error && error.code === code;
125
+ }
126
+ export async function commitCapture(input) {
127
+ const fullPath = safeVaultNotePath(input.vault, input.notePath);
128
+ const normalizedNotePath = path.relative(input.vault, fullPath).replace(/\\/g, "/");
129
+ const concept = resolveConcept(input.ontology, normalizedNotePath);
130
+ if (!concept) {
131
+ throw new Error("Cannot commit capture: notePath does not resolve to a concept binding");
132
+ }
133
+ const validation = validateFrontmatter(input.frontmatter, concept);
134
+ if (!validation.valid) {
135
+ const fields = validation.violations.map((violation) => violation.field).join(", ");
136
+ throw new Error(`Cannot commit capture: frontmatter violates the concept contract (${fields})`);
137
+ }
138
+ await mkdir(path.dirname(fullPath), { recursive: true });
139
+ if (input.mode === "append") {
140
+ try {
141
+ await readFile(fullPath, "utf-8");
142
+ await appendFile(fullPath, `\n\n${input.body.trim()}\n`, "utf-8");
143
+ }
144
+ catch (error) {
145
+ if (!hasErrorCode(error, "ENOENT")) {
146
+ throw error;
147
+ }
148
+ await writeFile(fullPath, formatNote(input.frontmatter, input.body), "utf-8");
149
+ }
150
+ }
151
+ else {
152
+ try {
153
+ await writeFile(fullPath, formatNote(input.frontmatter, input.body), {
154
+ encoding: "utf-8",
155
+ flag: "wx",
156
+ });
157
+ }
158
+ catch (error) {
159
+ if (hasErrorCode(error, "EEXIST")) {
160
+ throw new Error("Cannot create capture: target note already exists");
161
+ }
162
+ throw error;
163
+ }
164
+ }
165
+ return { written: true, mode: input.mode, notePath: normalizedNotePath };
166
+ }
167
+ //# sourceMappingURL=safe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe.js","sourceRoot":"","sources":["../../src/capture/safe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ export interface ClaudeInstallPlan {
3
+ pluginPath: string;
4
+ pluginInstallCommand: string;
5
+ mcpRegistrationCommand: string;
6
+ mcpRuntimeStatus: "read-status-runtime";
7
+ }
8
+ export declare function buildClaudeInstallPlan(opts: {
9
+ vault: string;
10
+ }): ClaudeInstallPlan;
11
+ export declare function runSetup(opts: {
12
+ vault: string;
13
+ yes: boolean;
14
+ installClaude?: boolean;
15
+ }): Promise<void>;
16
+ export declare function runDoctor(opts: {
17
+ vault: string;
18
+ }): Promise<number>;