@skhema/cli 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. package/README.md +163 -0
  2. package/bin/skhema.js +2 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +92 -0
  6. package/dist/commands/agent.d.ts +3 -0
  7. package/dist/commands/agent.d.ts.map +1 -0
  8. package/dist/commands/agent.js +154 -0
  9. package/dist/commands/api.d.ts +19 -0
  10. package/dist/commands/api.d.ts.map +1 -0
  11. package/dist/commands/api.js +97 -0
  12. package/dist/commands/auth.d.ts +3 -0
  13. package/dist/commands/auth.d.ts.map +1 -0
  14. package/dist/commands/auth.js +403 -0
  15. package/dist/commands/component.d.ts +3 -0
  16. package/dist/commands/component.d.ts.map +1 -0
  17. package/dist/commands/component.js +221 -0
  18. package/dist/commands/contribute.d.ts +3 -0
  19. package/dist/commands/contribute.d.ts.map +1 -0
  20. package/dist/commands/contribute.js +318 -0
  21. package/dist/commands/element.d.ts +7 -0
  22. package/dist/commands/element.d.ts.map +1 -0
  23. package/dist/commands/element.js +167 -0
  24. package/dist/commands/export.d.ts +9 -0
  25. package/dist/commands/export.d.ts.map +1 -0
  26. package/dist/commands/export.js +42 -0
  27. package/dist/commands/init.d.ts +49 -0
  28. package/dist/commands/init.d.ts.map +1 -0
  29. package/dist/commands/init.js +275 -0
  30. package/dist/commands/link.d.ts +8 -0
  31. package/dist/commands/link.d.ts.map +1 -0
  32. package/dist/commands/link.js +70 -0
  33. package/dist/commands/resource.d.ts +3 -0
  34. package/dist/commands/resource.d.ts.map +1 -0
  35. package/dist/commands/resource.js +88 -0
  36. package/dist/commands/skills.d.ts +3 -0
  37. package/dist/commands/skills.d.ts.map +1 -0
  38. package/dist/commands/skills.js +113 -0
  39. package/dist/commands/strategy.d.ts +3 -0
  40. package/dist/commands/strategy.d.ts.map +1 -0
  41. package/dist/commands/strategy.js +143 -0
  42. package/dist/commands/webhook.d.ts +3 -0
  43. package/dist/commands/webhook.d.ts.map +1 -0
  44. package/dist/commands/webhook.js +77 -0
  45. package/dist/commands/workspace.d.ts +8 -0
  46. package/dist/commands/workspace.d.ts.map +1 -0
  47. package/dist/commands/workspace.js +219 -0
  48. package/dist/index.d.ts +2 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +1 -0
  51. package/dist/lib/api/client.d.ts +27 -0
  52. package/dist/lib/api/client.d.ts.map +1 -0
  53. package/dist/lib/api/client.js +71 -0
  54. package/dist/lib/api/command-helpers.d.ts +27 -0
  55. package/dist/lib/api/command-helpers.d.ts.map +1 -0
  56. package/dist/lib/api/command-helpers.js +77 -0
  57. package/dist/lib/api/credential-context.d.ts +3 -0
  58. package/dist/lib/api/credential-context.d.ts.map +1 -0
  59. package/dist/lib/api/credential-context.js +13 -0
  60. package/dist/lib/api/export-cli.d.ts +14 -0
  61. package/dist/lib/api/export-cli.d.ts.map +1 -0
  62. package/dist/lib/api/export-cli.js +26 -0
  63. package/dist/lib/api/formats.d.ts +12 -0
  64. package/dist/lib/api/formats.d.ts.map +1 -0
  65. package/dist/lib/api/formats.js +18 -0
  66. package/dist/lib/api/passthrough.d.ts +34 -0
  67. package/dist/lib/api/passthrough.d.ts.map +1 -0
  68. package/dist/lib/api/passthrough.js +106 -0
  69. package/dist/lib/api/payload.d.ts +16 -0
  70. package/dist/lib/api/payload.d.ts.map +1 -0
  71. package/dist/lib/api/payload.js +53 -0
  72. package/dist/lib/api/run-command.d.ts +69 -0
  73. package/dist/lib/api/run-command.d.ts.map +1 -0
  74. package/dist/lib/api/run-command.js +127 -0
  75. package/dist/lib/api/scope.d.ts +8 -0
  76. package/dist/lib/api/scope.d.ts.map +1 -0
  77. package/dist/lib/api/scope.js +16 -0
  78. package/dist/lib/api/transfer.d.ts +57 -0
  79. package/dist/lib/api/transfer.d.ts.map +1 -0
  80. package/dist/lib/api/transfer.js +153 -0
  81. package/dist/lib/auth/api-key-admin.d.ts +39 -0
  82. package/dist/lib/auth/api-key-admin.d.ts.map +1 -0
  83. package/dist/lib/auth/api-key-admin.js +66 -0
  84. package/dist/lib/auth/api-key-store.d.ts +8 -0
  85. package/dist/lib/auth/api-key-store.d.ts.map +1 -0
  86. package/dist/lib/auth/api-key-store.js +109 -0
  87. package/dist/lib/auth/device-flow.d.ts +4 -0
  88. package/dist/lib/auth/device-flow.d.ts.map +1 -0
  89. package/dist/lib/auth/device-flow.js +109 -0
  90. package/dist/lib/auth/entitlements.d.ts +16 -0
  91. package/dist/lib/auth/entitlements.d.ts.map +1 -0
  92. package/dist/lib/auth/entitlements.js +89 -0
  93. package/dist/lib/auth/localhost-flow.d.ts +4 -0
  94. package/dist/lib/auth/localhost-flow.d.ts.map +1 -0
  95. package/dist/lib/auth/localhost-flow.js +134 -0
  96. package/dist/lib/auth/oauth-client.d.ts +33 -0
  97. package/dist/lib/auth/oauth-client.d.ts.map +1 -0
  98. package/dist/lib/auth/oauth-client.js +96 -0
  99. package/dist/lib/auth/token-store.d.ts +6 -0
  100. package/dist/lib/auth/token-store.d.ts.map +1 -0
  101. package/dist/lib/auth/token-store.js +136 -0
  102. package/dist/lib/auth/types.d.ts +49 -0
  103. package/dist/lib/auth/types.d.ts.map +1 -0
  104. package/dist/lib/auth/types.js +1 -0
  105. package/dist/lib/banner.d.ts +2 -0
  106. package/dist/lib/banner.d.ts.map +1 -0
  107. package/dist/lib/banner.js +82 -0
  108. package/dist/lib/config-store.d.ts +23 -0
  109. package/dist/lib/config-store.d.ts.map +1 -0
  110. package/dist/lib/config-store.js +53 -0
  111. package/dist/lib/config.d.ts +20 -0
  112. package/dist/lib/config.d.ts.map +1 -0
  113. package/dist/lib/config.js +33 -0
  114. package/dist/lib/contribute/author-resolver.d.ts +13 -0
  115. package/dist/lib/contribute/author-resolver.d.ts.map +1 -0
  116. package/dist/lib/contribute/author-resolver.js +63 -0
  117. package/dist/lib/contribute/embed-generator.d.ts +4 -0
  118. package/dist/lib/contribute/embed-generator.d.ts.map +1 -0
  119. package/dist/lib/contribute/embed-generator.js +108 -0
  120. package/dist/lib/contribute/link-generator.d.ts +11 -0
  121. package/dist/lib/contribute/link-generator.d.ts.map +1 -0
  122. package/dist/lib/contribute/link-generator.js +119 -0
  123. package/dist/lib/contribute/method-schema.d.ts +239 -0
  124. package/dist/lib/contribute/method-schema.d.ts.map +1 -0
  125. package/dist/lib/contribute/method-schema.js +172 -0
  126. package/dist/lib/contribute/profile-resolver.d.ts +2 -0
  127. package/dist/lib/contribute/profile-resolver.d.ts.map +1 -0
  128. package/dist/lib/contribute/profile-resolver.js +25 -0
  129. package/dist/lib/contribute/types.d.ts +91 -0
  130. package/dist/lib/contribute/types.d.ts.map +1 -0
  131. package/dist/lib/contribute/types.js +1 -0
  132. package/dist/lib/mcp/registrar.d.ts +26 -0
  133. package/dist/lib/mcp/registrar.d.ts.map +1 -0
  134. package/dist/lib/mcp/registrar.js +69 -0
  135. package/dist/lib/mcp/registry.d.ts +54 -0
  136. package/dist/lib/mcp/registry.d.ts.map +1 -0
  137. package/dist/lib/mcp/registry.js +105 -0
  138. package/dist/lib/open.d.ts +2 -0
  139. package/dist/lib/open.d.ts.map +1 -0
  140. package/dist/lib/open.js +24 -0
  141. package/dist/lib/output.d.ts +25 -0
  142. package/dist/lib/output.d.ts.map +1 -0
  143. package/dist/lib/output.js +74 -0
  144. package/dist/lib/skills/installer.d.ts +4 -0
  145. package/dist/lib/skills/installer.d.ts.map +1 -0
  146. package/dist/lib/skills/installer.js +100 -0
  147. package/dist/lib/skills/lock.d.ts +4 -0
  148. package/dist/lib/skills/lock.d.ts.map +1 -0
  149. package/dist/lib/skills/lock.js +28 -0
  150. package/dist/lib/skills/platform-detect.d.ts +4 -0
  151. package/dist/lib/skills/platform-detect.d.ts.map +1 -0
  152. package/dist/lib/skills/platform-detect.js +89 -0
  153. package/dist/lib/skills/types.d.ts +29 -0
  154. package/dist/lib/skills/types.d.ts.map +1 -0
  155. package/dist/lib/skills/types.js +1 -0
  156. package/dist/postinstall.d.ts +2 -0
  157. package/dist/postinstall.d.ts.map +1 -0
  158. package/dist/postinstall.js +11 -0
  159. package/package.json +67 -0
  160. package/skills/.manifest.json +15 -0
  161. package/skills/skhema-challenge-framing/SKILL.md +28 -0
  162. package/skills/skhema-coherence-check/SKILL.md +28 -0
  163. package/skills/skhema-element-decomposition/SKILL.md +28 -0
  164. package/skills/skhema-element-writer/SKILL.md +20 -0
  165. package/skills/skhema-judgment-audit/SKILL.md +28 -0
  166. package/skills/skhema-semantic-sharpening/SKILL.md +28 -0
  167. package/skills/skhema-strategy-advisor/SKILL.md +20 -0
  168. package/skills/skhema-workspace-navigator/SKILL.md +20 -0
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Vendored from @skhema/types (src/schema/{elements,components,mapping}.ts).
3
+ *
4
+ * @skhema/types is a restricted npm package; @skhema/cli is public, so it must
5
+ * not depend on it at install time. This is the public method vocabulary (it
6
+ * renders verbatim in public embeds) — keep it in sync with @skhema/types when
7
+ * the method schema changes.
8
+ */
9
+ export const ELEMENT_TYPES = {
10
+ KEY_CHALLENGE: {
11
+ value: 'key_challenge',
12
+ label: 'Key Challenge',
13
+ acronym: 'CHL',
14
+ },
15
+ SUPPORTING_FACT: {
16
+ value: 'supporting_fact',
17
+ label: 'Supporting Fact',
18
+ acronym: 'FCT',
19
+ },
20
+ IMPACT: {
21
+ value: 'impact',
22
+ label: 'Impact',
23
+ acronym: 'IMP',
24
+ },
25
+ GUIDING_POLICY: {
26
+ value: 'guiding_policy',
27
+ label: 'Guiding Policy',
28
+ acronym: 'POL',
29
+ },
30
+ COMPETITOR_MOVE: {
31
+ value: 'competitor_move',
32
+ label: 'Competitor Move',
33
+ acronym: 'CMV',
34
+ },
35
+ SCOPE: {
36
+ value: 'scope',
37
+ label: 'Scope',
38
+ acronym: 'SCP',
39
+ },
40
+ CONSTRAINT: {
41
+ value: 'constraint',
42
+ label: 'Constraint',
43
+ acronym: 'CST',
44
+ },
45
+ SOLUTION: {
46
+ value: 'solution',
47
+ label: 'Solution',
48
+ acronym: 'SOL',
49
+ },
50
+ ASSUMPTION_HYPOTHESIS: {
51
+ value: 'assumption_hypothesis',
52
+ label: 'Assumption Hypothesis',
53
+ acronym: 'HYP',
54
+ },
55
+ EXPERIMENT: {
56
+ value: 'experiment',
57
+ label: 'Experiment',
58
+ acronym: 'EXP',
59
+ },
60
+ ACTION: {
61
+ value: 'action',
62
+ label: 'Action',
63
+ acronym: 'ACT',
64
+ },
65
+ INVESTMENT: {
66
+ value: 'investment',
67
+ label: 'Investment',
68
+ acronym: 'INV',
69
+ },
70
+ ESTIMATE: {
71
+ value: 'estimate',
72
+ label: 'Estimate',
73
+ acronym: 'EST',
74
+ },
75
+ BASELINE: {
76
+ value: 'baseline',
77
+ label: 'Baseline',
78
+ acronym: 'BSL',
79
+ },
80
+ OUTCOME: {
81
+ value: 'outcome',
82
+ label: 'Outcome',
83
+ acronym: 'OCM',
84
+ },
85
+ PERFORMANCE_VARIABLE: {
86
+ value: 'performance_variable',
87
+ label: 'Performance Variable',
88
+ acronym: 'VAR',
89
+ },
90
+ CAPABILITY: {
91
+ value: 'capability',
92
+ label: 'Capability',
93
+ acronym: 'CAP',
94
+ },
95
+ SYSTEM: {
96
+ value: 'system',
97
+ label: 'System',
98
+ acronym: 'SYS',
99
+ },
100
+ PRINCIPLE: {
101
+ value: 'principle',
102
+ label: 'Principle',
103
+ acronym: 'PRN',
104
+ },
105
+ };
106
+ export const COMPONENT_TYPES = {
107
+ DIAGNOSIS: {
108
+ value: 'diagnosis',
109
+ label: 'Diagnosis',
110
+ acronym: 'BD',
111
+ },
112
+ METHOD: {
113
+ value: 'method',
114
+ label: 'Method & Positioning',
115
+ acronym: 'MP',
116
+ },
117
+ INITIATIVES: {
118
+ value: 'initiatives',
119
+ label: 'Portfolio of Initiatives',
120
+ acronym: 'PI',
121
+ },
122
+ MEASURES: {
123
+ value: 'measures',
124
+ label: 'Measures',
125
+ acronym: 'M',
126
+ },
127
+ SUPPORT: {
128
+ value: 'support',
129
+ label: 'Support Structures',
130
+ acronym: 'SS',
131
+ },
132
+ };
133
+ export const SKHEMA_MAPPING = {
134
+ componentFlow: [
135
+ COMPONENT_TYPES.DIAGNOSIS,
136
+ COMPONENT_TYPES.METHOD,
137
+ COMPONENT_TYPES.INITIATIVES,
138
+ COMPONENT_TYPES.MEASURES,
139
+ COMPONENT_TYPES.SUPPORT,
140
+ ],
141
+ elementFlow: {
142
+ [COMPONENT_TYPES.DIAGNOSIS.value]: [
143
+ ELEMENT_TYPES.KEY_CHALLENGE,
144
+ ELEMENT_TYPES.SUPPORTING_FACT,
145
+ ELEMENT_TYPES.IMPACT,
146
+ ],
147
+ [COMPONENT_TYPES.METHOD.value]: [
148
+ ELEMENT_TYPES.GUIDING_POLICY,
149
+ ELEMENT_TYPES.COMPETITOR_MOVE,
150
+ ELEMENT_TYPES.SCOPE,
151
+ ELEMENT_TYPES.CONSTRAINT,
152
+ ],
153
+ [COMPONENT_TYPES.INITIATIVES.value]: [
154
+ ELEMENT_TYPES.SOLUTION,
155
+ ELEMENT_TYPES.ASSUMPTION_HYPOTHESIS,
156
+ ELEMENT_TYPES.EXPERIMENT,
157
+ ELEMENT_TYPES.ACTION,
158
+ ELEMENT_TYPES.ESTIMATE,
159
+ ELEMENT_TYPES.INVESTMENT,
160
+ ],
161
+ [COMPONENT_TYPES.MEASURES.value]: [
162
+ ELEMENT_TYPES.BASELINE,
163
+ ELEMENT_TYPES.OUTCOME,
164
+ ELEMENT_TYPES.PERFORMANCE_VARIABLE,
165
+ ],
166
+ [COMPONENT_TYPES.SUPPORT.value]: [
167
+ ELEMENT_TYPES.CAPABILITY,
168
+ ELEMENT_TYPES.SYSTEM,
169
+ ELEMENT_TYPES.PRINCIPLE,
170
+ ],
171
+ },
172
+ };
@@ -0,0 +1,2 @@
1
+ export declare function resolveContributorDisplayName(contributorId: string, accessToken: string): Promise<string | null>;
2
+ //# sourceMappingURL=profile-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-resolver.d.ts","sourceRoot":"","sources":["../../../src/lib/contribute/profile-resolver.ts"],"names":[],"mappings":"AAIA,wBAAsB,6BAA6B,CACjD,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsBxB"}
@@ -0,0 +1,25 @@
1
+ import { SUPABASE_PUBLISHABLE_KEY, SUPABASE_URL } from '../config.js';
2
+ const CONTRIBUTOR_MANAGE_URL = `${SUPABASE_URL}/functions/v1/contributor-manage`;
3
+ export async function resolveContributorDisplayName(contributorId, accessToken) {
4
+ try {
5
+ const response = await fetch(CONTRIBUTOR_MANAGE_URL, {
6
+ method: 'POST',
7
+ headers: {
8
+ 'Content-Type': 'application/json',
9
+ Authorization: `Bearer ${accessToken}`,
10
+ apikey: SUPABASE_PUBLISHABLE_KEY,
11
+ },
12
+ body: JSON.stringify({
13
+ action: 'resolve-display-name',
14
+ contributor_id: contributorId,
15
+ }),
16
+ });
17
+ if (!response.ok)
18
+ return null;
19
+ const data = (await response.json());
20
+ return data.displayName || null;
21
+ }
22
+ catch {
23
+ return null;
24
+ }
25
+ }
@@ -0,0 +1,91 @@
1
+ export interface GenerateEmbedOptions {
2
+ elementType: string;
3
+ contributorId: string;
4
+ authorName?: string;
5
+ authorSlug?: string;
6
+ content: string;
7
+ theme?: 'light' | 'dark' | 'auto';
8
+ trackAnalytics?: boolean;
9
+ sourceUrl?: string;
10
+ }
11
+ export interface GenerateLinkOptions {
12
+ elementType: string;
13
+ contributorId: string;
14
+ content: string;
15
+ sourceUrl?: string;
16
+ utmSource?: string;
17
+ utmMedium?: string;
18
+ utmCampaign?: string;
19
+ }
20
+ export interface GenerateEmbedResult {
21
+ snippet: string;
22
+ cdnUrl: string;
23
+ attributes: Record<string, string>;
24
+ }
25
+ export interface GenerateLinkResult {
26
+ url: string;
27
+ contentHash: string;
28
+ }
29
+ export interface GenerateComponentEmbedOptions {
30
+ componentType: string;
31
+ contributorId: string;
32
+ authorName?: string;
33
+ authorSlug?: string;
34
+ elements: Array<{
35
+ elementType: string;
36
+ content: string;
37
+ }>;
38
+ title?: string;
39
+ theme?: 'light' | 'dark' | 'auto';
40
+ trackAnalytics?: boolean;
41
+ sourceUrl?: string;
42
+ }
43
+ export interface GenerateComponentEmbedResult {
44
+ snippet: string;
45
+ cdnUrl: string;
46
+ attributes: Record<string, string>;
47
+ elementCount: number;
48
+ }
49
+ export interface GenerateComponentLinkOptions {
50
+ componentType: string;
51
+ contributorId: string;
52
+ elements: Array<{
53
+ elementType: string;
54
+ content: string;
55
+ }>;
56
+ title?: string;
57
+ sourceUrl?: string;
58
+ utmSource?: string;
59
+ utmMedium?: string;
60
+ utmCampaign?: string;
61
+ }
62
+ export interface GenerateComponentLinkResult {
63
+ url: string;
64
+ componentHash: string;
65
+ }
66
+ export interface PublishShareLinkOptions {
67
+ contributorId: string;
68
+ elementType: string;
69
+ content: string;
70
+ accessToken: string;
71
+ }
72
+ export interface PublishShareLinkResult {
73
+ shareUrl: string;
74
+ elementId: string;
75
+ contentHash: string;
76
+ }
77
+ export interface PublishComponentShareLinkOptions {
78
+ contributorId: string;
79
+ componentType: string;
80
+ title?: string;
81
+ elements: Array<{
82
+ elementType: string;
83
+ content: string;
84
+ }>;
85
+ accessToken: string;
86
+ }
87
+ export interface PublishComponentShareLinkResult {
88
+ shareUrl: string;
89
+ componentId: string;
90
+ }
91
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/contribute/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,26 @@
1
+ import { McpStatus, McpTarget } from './registry.js';
2
+ /**
3
+ * Inspect a target without touching disk: what would registering do right now?
4
+ * Returns `not-detected` for absent clients and defers to {@link planMerge} for
5
+ * the rest.
6
+ */
7
+ export declare function inspectTarget(target: McpTarget): McpStatus;
8
+ export interface McpRegisterOutcome {
9
+ status: McpStatus;
10
+ configPath?: string;
11
+ /** Path of the `.bak` copy written before an existing file was modified. */
12
+ backupPath?: string;
13
+ /** Present when status is `conflict` or `manual` — how to finish by hand. */
14
+ instructions?: string;
15
+ }
16
+ /**
17
+ * Safely register the Skhema MCP server in one target. Parses + merges the
18
+ * existing config, writes a `<file>.bak` backup next to any file it modifies,
19
+ * and writes pretty-printed JSON. Never overwrites a differing `skhema` entry
20
+ * unless `force` is set. Returns instructions (does not throw) when the config
21
+ * can't be written safely.
22
+ */
23
+ export declare function registerTarget(target: McpTarget, options?: {
24
+ force?: boolean;
25
+ }): McpRegisterOutcome;
26
+ //# sourceMappingURL=registrar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registrar.d.ts","sourceRoot":"","sources":["../../../src/lib/mcp/registrar.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmB,SAAS,EAAE,SAAS,EAAa,MAAM,eAAe,CAAA;AAUhF;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAK1D;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,SAAS,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,SAAS,EACjB,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAChC,kBAAkB,CA2CpB"}
@@ -0,0 +1,69 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { MCP_SERVER_NAME, planMerge } from './registry.js';
4
+ function readIfExists(p) {
5
+ try {
6
+ return fs.readFileSync(p, 'utf-8');
7
+ }
8
+ catch {
9
+ return null;
10
+ }
11
+ }
12
+ /**
13
+ * Inspect a target without touching disk: what would registering do right now?
14
+ * Returns `not-detected` for absent clients and defers to {@link planMerge} for
15
+ * the rest.
16
+ */
17
+ export function inspectTarget(target) {
18
+ if (!target.detected)
19
+ return 'not-detected';
20
+ if (!target.configPath)
21
+ return 'manual';
22
+ const raw = readIfExists(target.configPath);
23
+ return planMerge(raw, target.parentKey, MCP_SERVER_NAME, target.entry).status;
24
+ }
25
+ /**
26
+ * Safely register the Skhema MCP server in one target. Parses + merges the
27
+ * existing config, writes a `<file>.bak` backup next to any file it modifies,
28
+ * and writes pretty-printed JSON. Never overwrites a differing `skhema` entry
29
+ * unless `force` is set. Returns instructions (does not throw) when the config
30
+ * can't be written safely.
31
+ */
32
+ export function registerTarget(target, options = {}) {
33
+ if (!target.detected)
34
+ return { status: 'not-detected' };
35
+ if (!target.configPath) {
36
+ return { status: 'manual', instructions: target.instructions };
37
+ }
38
+ const raw = readIfExists(target.configPath);
39
+ const plan = planMerge(raw, target.parentKey, MCP_SERVER_NAME, target.entry);
40
+ if (plan.status === 'already') {
41
+ return { status: 'already', configPath: target.configPath };
42
+ }
43
+ if (plan.status === 'manual') {
44
+ return {
45
+ status: 'manual',
46
+ configPath: target.configPath,
47
+ instructions: target.instructions,
48
+ };
49
+ }
50
+ if (plan.status === 'conflict' && !options.force) {
51
+ return {
52
+ status: 'conflict',
53
+ configPath: target.configPath,
54
+ instructions: target.instructions,
55
+ };
56
+ }
57
+ // A forced conflict re-plans against an empty base so the entry is overwritten.
58
+ const merged = plan.status === 'writable'
59
+ ? plan.merged
60
+ : planMerge('{}', target.parentKey, MCP_SERVER_NAME, target.entry).merged;
61
+ let backupPath;
62
+ if (raw !== null) {
63
+ backupPath = `${target.configPath}.bak`;
64
+ fs.writeFileSync(backupPath, raw);
65
+ }
66
+ fs.mkdirSync(path.dirname(target.configPath), { recursive: true });
67
+ fs.writeFileSync(target.configPath, JSON.stringify(merged, null, 2) + '\n');
68
+ return { status: 'registered', configPath: target.configPath, backupPath };
69
+ }
@@ -0,0 +1,54 @@
1
+ /** The server key written into each client's `mcpServers` map. */
2
+ export declare const MCP_SERVER_NAME = "skhema";
3
+ /**
4
+ * A known MCP client and where/how to register the Skhema server in it.
5
+ *
6
+ * `configPath: null` (or a client whose config we can't safely parse) means we
7
+ * never mutate — we print copy-paste `instructions` instead. This is the safety
8
+ * bias: corrupting a user's config is worse than asking them to paste one block.
9
+ */
10
+ export interface McpTarget {
11
+ id: string;
12
+ name: string;
13
+ /** True when the client appears installed (its config dir/file exists). */
14
+ detected: boolean;
15
+ /**
16
+ * Dedicated JSON config file we can parse + merge + back up, or `null` when the
17
+ * client has no cleanly-writable file (GUI apps, shared configs) → instructions.
18
+ */
19
+ configPath: string | null;
20
+ /** Object key the server entry nests under (usually `mcpServers`). */
21
+ parentKey: string;
22
+ /** The server-entry value in this client's schema (e.g. `{ url }`). */
23
+ entry: Record<string, unknown>;
24
+ /** Copy-paste guidance shown when we don't or can't write the config. */
25
+ instructions: string;
26
+ }
27
+ /**
28
+ * Build the MCP target list for the current machine. Detection is filesystem
29
+ * presence of each client's config directory; `configPath` points at a dedicated
30
+ * MCP JSON file where one exists.
31
+ */
32
+ export declare function detectMcpTargets(serverUrl?: string, home?: string, cwd?: string): McpTarget[];
33
+ /**
34
+ * The outcome of inspecting (or attempting to write) a target's config.
35
+ * - `not-detected` — client not installed.
36
+ * - `already` — our server entry is present and identical (idempotent no-op).
37
+ * - `writable` — absent; a safe merge would add it.
38
+ * - `registered` — we merged + wrote it this run.
39
+ * - `conflict` — a different `skhema` entry exists; left untouched (needs --force).
40
+ * - `manual` — existing config isn't cleanly parseable → instructions only.
41
+ */
42
+ export type McpStatus = 'not-detected' | 'already' | 'writable' | 'registered' | 'conflict' | 'manual';
43
+ export interface McpMergeResult {
44
+ status: Exclude<McpStatus, 'registered' | 'not-detected'>;
45
+ /** The merged config to write (only meaningful when status is `writable`). */
46
+ merged?: Record<string, unknown>;
47
+ }
48
+ /**
49
+ * Pure core: given the existing raw config text (or `null` when absent), decide
50
+ * what registering the Skhema server would do, and produce the merged object
51
+ * when a write is safe. Never performs I/O.
52
+ */
53
+ export declare function planMerge(existingRaw: string | null, parentKey: string, serverName: string, entry: Record<string, unknown>): McpMergeResult;
54
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/lib/mcp/registry.ts"],"names":[],"mappings":"AAKA,kEAAkE;AAClE,eAAO,MAAM,eAAe,WAAW,CAAA;AAEvC;;;;;;GAMG;AACH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,2EAA2E;IAC3E,QAAQ,EAAE,OAAO,CAAA;IACjB;;;OAGG;IACH,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,sEAAsE;IACtE,SAAS,EAAE,MAAM,CAAA;IACjB,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,yEAAyE;IACzE,YAAY,EAAE,MAAM,CAAA;CACrB;AAUD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,GAAE,MAAuB,EAClC,IAAI,GAAE,MAAqB,EAC3B,GAAG,GAAE,MAAsB,GAC1B,SAAS,EAAE,CA+Cb;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,SAAS,GACjB,cAAc,GACd,SAAS,GACT,UAAU,GACV,YAAY,GACZ,UAAU,GACV,QAAQ,CAAA;AAEZ,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,YAAY,GAAG,cAAc,CAAC,CAAA;IACzD,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACjC;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,cAAc,CAsChB"}
@@ -0,0 +1,105 @@
1
+ import fs from 'fs';
2
+ import os from 'os';
3
+ import path from 'path';
4
+ import { MCP_SERVER_URL } from '../config.js';
5
+ /** The server key written into each client's `mcpServers` map. */
6
+ export const MCP_SERVER_NAME = 'skhema';
7
+ function exists(p) {
8
+ try {
9
+ return fs.existsSync(p);
10
+ }
11
+ catch {
12
+ return false;
13
+ }
14
+ }
15
+ /**
16
+ * Build the MCP target list for the current machine. Detection is filesystem
17
+ * presence of each client's config directory; `configPath` points at a dedicated
18
+ * MCP JSON file where one exists.
19
+ */
20
+ export function detectMcpTargets(serverUrl = MCP_SERVER_URL, home = os.homedir(), cwd = process.cwd()) {
21
+ const claudeConfig = path.join(home, '.claude');
22
+ const cursorDir = path.join(home, '.cursor');
23
+ const windsurfDir = path.join(home, '.codeium', 'windsurf');
24
+ const geminiDir = path.join(home, '.gemini');
25
+ return [
26
+ {
27
+ id: 'claude',
28
+ name: 'Claude Code',
29
+ detected: exists(claudeConfig) || exists(path.join(cwd, '.mcp.json')),
30
+ // Claude Code's user config (~/.claude.json) is large, project-keyed shared
31
+ // state — not cleanly mergeable. Register the project-scoped `.mcp.json` in
32
+ // the working directory instead (a dedicated, low-risk file).
33
+ configPath: path.join(cwd, '.mcp.json'),
34
+ parentKey: 'mcpServers',
35
+ entry: { type: 'http', url: serverUrl },
36
+ instructions: `claude mcp add --transport http ${MCP_SERVER_NAME} ${serverUrl}`,
37
+ },
38
+ {
39
+ id: 'cursor',
40
+ name: 'Cursor',
41
+ detected: exists(cursorDir),
42
+ configPath: path.join(cursorDir, 'mcp.json'),
43
+ parentKey: 'mcpServers',
44
+ entry: { url: serverUrl },
45
+ instructions: `Add to ~/.cursor/mcp.json → mcpServers.${MCP_SERVER_NAME} = { "url": "${serverUrl}" }`,
46
+ },
47
+ {
48
+ id: 'windsurf',
49
+ name: 'Windsurf',
50
+ detected: exists(windsurfDir),
51
+ configPath: path.join(windsurfDir, 'mcp_config.json'),
52
+ parentKey: 'mcpServers',
53
+ entry: { serverUrl },
54
+ instructions: `Add to ~/.codeium/windsurf/mcp_config.json → mcpServers.${MCP_SERVER_NAME} = { "serverUrl": "${serverUrl}" }`,
55
+ },
56
+ {
57
+ id: 'gemini',
58
+ name: 'Gemini CLI',
59
+ detected: exists(geminiDir),
60
+ configPath: path.join(geminiDir, 'settings.json'),
61
+ parentKey: 'mcpServers',
62
+ entry: { httpUrl: serverUrl },
63
+ instructions: `Add to ~/.gemini/settings.json → mcpServers.${MCP_SERVER_NAME} = { "httpUrl": "${serverUrl}" }`,
64
+ },
65
+ ];
66
+ }
67
+ /**
68
+ * Pure core: given the existing raw config text (or `null` when absent), decide
69
+ * what registering the Skhema server would do, and produce the merged object
70
+ * when a write is safe. Never performs I/O.
71
+ */
72
+ export function planMerge(existingRaw, parentKey, serverName, entry) {
73
+ let config = {};
74
+ if (existingRaw !== null && existingRaw.trim() !== '') {
75
+ let parsed;
76
+ try {
77
+ parsed = JSON.parse(existingRaw);
78
+ }
79
+ catch {
80
+ return { status: 'manual' };
81
+ }
82
+ if (parsed === null ||
83
+ typeof parsed !== 'object' ||
84
+ Array.isArray(parsed)) {
85
+ return { status: 'manual' };
86
+ }
87
+ config = parsed;
88
+ }
89
+ const parent = config[parentKey];
90
+ const parentObj = parent && typeof parent === 'object' && !Array.isArray(parent)
91
+ ? parent
92
+ : {};
93
+ const current = parentObj[serverName];
94
+ if (current !== undefined) {
95
+ if (JSON.stringify(current) === JSON.stringify(entry)) {
96
+ return { status: 'already' };
97
+ }
98
+ return { status: 'conflict' };
99
+ }
100
+ const merged = {
101
+ ...config,
102
+ [parentKey]: { ...parentObj, [serverName]: entry },
103
+ };
104
+ return { status: 'writable', merged };
105
+ }
@@ -0,0 +1,2 @@
1
+ export declare function openBrowser(url: string): Promise<void>;
2
+ //# sourceMappingURL=open.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../src/lib/open.ts"],"names":[],"mappings":"AAEA,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBtD"}
@@ -0,0 +1,24 @@
1
+ import { exec } from 'child_process';
2
+ export function openBrowser(url) {
3
+ return new Promise((resolve, reject) => {
4
+ const platform = process.platform;
5
+ let command;
6
+ if (platform === 'darwin') {
7
+ command = `open "${url}"`;
8
+ }
9
+ else if (platform === 'win32') {
10
+ command = `start "" "${url}"`;
11
+ }
12
+ else {
13
+ command = `xdg-open "${url}"`;
14
+ }
15
+ exec(command, (error) => {
16
+ if (error) {
17
+ reject(new Error(`Failed to open browser: ${error.message}`));
18
+ }
19
+ else {
20
+ resolve();
21
+ }
22
+ });
23
+ });
24
+ }
@@ -0,0 +1,25 @@
1
+ export interface CliResult<T = unknown> {
2
+ success: boolean;
3
+ data?: T;
4
+ error?: string;
5
+ metadata?: {
6
+ timestamp: string;
7
+ command?: string;
8
+ [key: string]: unknown;
9
+ };
10
+ }
11
+ export interface OutputOptions {
12
+ json?: boolean;
13
+ verbose?: boolean;
14
+ quiet?: boolean;
15
+ }
16
+ export declare function setGlobalOptions(options: OutputOptions): void;
17
+ export declare function getGlobalOptions(): OutputOptions;
18
+ export declare function formatResult<T>(result: CliResult<T>): string;
19
+ export declare function outputSuccess<T>(data: T, command?: string): void;
20
+ export declare function outputError(error: string, command?: string): void;
21
+ export declare function log(message: string): void;
22
+ export declare function logVerbose(message: string): void;
23
+ export declare function logHeader(title: string): void;
24
+ export declare function logTable(headers: string[], rows: string[][], columnWidths?: number[]): void;
25
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,SAAS,CAAC,CAAC,GAAG,OAAO;IACpC,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,CAAC,CAAA;IACR,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE;QACT,SAAS,EAAE,MAAM,CAAA;QACjB,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KACvB,CAAA;CACF;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAID,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAE7D;AAED,wBAAgB,gBAAgB,IAAI,aAAa,CAEhD;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,CAU5D;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAahE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAejE;AAED,wBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAIzC;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAIhD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAI7C;AAED,wBAAgB,QAAQ,CACtB,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,MAAM,EAAE,EAAE,EAChB,YAAY,CAAC,EAAE,MAAM,EAAE,GACtB,IAAI,CAmBN"}