@cr8rcho/alkahest 0.1.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 (130) hide show
  1. package/README.ko.md +208 -0
  2. package/README.md +208 -0
  3. package/dist/assets/dashboard.html +647 -0
  4. package/dist/cli.d.ts +2 -0
  5. package/dist/cli.js +68 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/hook.d.ts +1 -0
  8. package/dist/commands/hook.js +64 -0
  9. package/dist/commands/hook.js.map +1 -0
  10. package/dist/commands/login.d.ts +11 -0
  11. package/dist/commands/login.js +27 -0
  12. package/dist/commands/login.js.map +1 -0
  13. package/dist/commands/mcp.d.ts +6 -0
  14. package/dist/commands/mcp.js +13 -0
  15. package/dist/commands/mcp.js.map +1 -0
  16. package/dist/commands/publish.d.ts +19 -0
  17. package/dist/commands/publish.js +27 -0
  18. package/dist/commands/publish.js.map +1 -0
  19. package/dist/commands/scan.d.ts +11 -0
  20. package/dist/commands/scan.js +29 -0
  21. package/dist/commands/scan.js.map +1 -0
  22. package/dist/commands/update.d.ts +15 -0
  23. package/dist/commands/update.js +41 -0
  24. package/dist/commands/update.js.map +1 -0
  25. package/dist/commands/view.d.ts +6 -0
  26. package/dist/commands/view.js +21 -0
  27. package/dist/commands/view.js.map +1 -0
  28. package/dist/core/adapters/angular.d.ts +2 -0
  29. package/dist/core/adapters/angular.js +305 -0
  30. package/dist/core/adapters/angular.js.map +1 -0
  31. package/dist/core/adapters/astro.d.ts +3 -0
  32. package/dist/core/adapters/astro.js +140 -0
  33. package/dist/core/adapters/astro.js.map +1 -0
  34. package/dist/core/adapters/compose.d.ts +2 -0
  35. package/dist/core/adapters/compose.js +195 -0
  36. package/dist/core/adapters/compose.js.map +1 -0
  37. package/dist/core/adapters/django.d.ts +2 -0
  38. package/dist/core/adapters/django.js +314 -0
  39. package/dist/core/adapters/django.js.map +1 -0
  40. package/dist/core/adapters/expo-router.d.ts +2 -0
  41. package/dist/core/adapters/expo-router.js +60 -0
  42. package/dist/core/adapters/expo-router.js.map +1 -0
  43. package/dist/core/adapters/flask.d.ts +2 -0
  44. package/dist/core/adapters/flask.js +249 -0
  45. package/dist/core/adapters/flask.js.map +1 -0
  46. package/dist/core/adapters/flutter.d.ts +2 -0
  47. package/dist/core/adapters/flutter.js +232 -0
  48. package/dist/core/adapters/flutter.js.map +1 -0
  49. package/dist/core/adapters/index.d.ts +19 -0
  50. package/dist/core/adapters/index.js +59 -0
  51. package/dist/core/adapters/index.js.map +1 -0
  52. package/dist/core/adapters/next-app.d.ts +2 -0
  53. package/dist/core/adapters/next-app.js +62 -0
  54. package/dist/core/adapters/next-app.js.map +1 -0
  55. package/dist/core/adapters/next-pages.d.ts +2 -0
  56. package/dist/core/adapters/next-pages.js +70 -0
  57. package/dist/core/adapters/next-pages.js.map +1 -0
  58. package/dist/core/adapters/nuxt.d.ts +2 -0
  59. package/dist/core/adapters/nuxt.js +59 -0
  60. package/dist/core/adapters/nuxt.js.map +1 -0
  61. package/dist/core/adapters/rails.d.ts +2 -0
  62. package/dist/core/adapters/rails.js +275 -0
  63. package/dist/core/adapters/rails.js.map +1 -0
  64. package/dist/core/adapters/react-jsx.d.ts +68 -0
  65. package/dist/core/adapters/react-jsx.js +355 -0
  66. package/dist/core/adapters/react-jsx.js.map +1 -0
  67. package/dist/core/adapters/react-navigation.d.ts +2 -0
  68. package/dist/core/adapters/react-navigation.js +153 -0
  69. package/dist/core/adapters/react-navigation.js.map +1 -0
  70. package/dist/core/adapters/react-router.d.ts +2 -0
  71. package/dist/core/adapters/react-router.js +249 -0
  72. package/dist/core/adapters/react-router.js.map +1 -0
  73. package/dist/core/adapters/remix.d.ts +2 -0
  74. package/dist/core/adapters/remix.js +109 -0
  75. package/dist/core/adapters/remix.js.map +1 -0
  76. package/dist/core/adapters/static-html.d.ts +2 -0
  77. package/dist/core/adapters/static-html.js +157 -0
  78. package/dist/core/adapters/static-html.js.map +1 -0
  79. package/dist/core/adapters/sveltekit.d.ts +2 -0
  80. package/dist/core/adapters/sveltekit.js +151 -0
  81. package/dist/core/adapters/sveltekit.js.map +1 -0
  82. package/dist/core/adapters/swiftui.d.ts +2 -0
  83. package/dist/core/adapters/swiftui.js +216 -0
  84. package/dist/core/adapters/swiftui.js.map +1 -0
  85. package/dist/core/adapters/types.d.ts +65 -0
  86. package/dist/core/adapters/types.js +2 -0
  87. package/dist/core/adapters/types.js.map +1 -0
  88. package/dist/core/adapters/uikit.d.ts +2 -0
  89. package/dist/core/adapters/uikit.js +178 -0
  90. package/dist/core/adapters/uikit.js.map +1 -0
  91. package/dist/core/adapters/vue-router.d.ts +2 -0
  92. package/dist/core/adapters/vue-router.js +224 -0
  93. package/dist/core/adapters/vue-router.js.map +1 -0
  94. package/dist/core/adapters/vue-sfc.d.ts +28 -0
  95. package/dist/core/adapters/vue-sfc.js +132 -0
  96. package/dist/core/adapters/vue-sfc.js.map +1 -0
  97. package/dist/core/credentials.d.ts +24 -0
  98. package/dist/core/credentials.js +30 -0
  99. package/dist/core/credentials.js.map +1 -0
  100. package/dist/core/dashboard.d.ts +9 -0
  101. package/dist/core/dashboard.js +20 -0
  102. package/dist/core/dashboard.js.map +1 -0
  103. package/dist/core/emit.d.ts +7 -0
  104. package/dist/core/emit.js +23 -0
  105. package/dist/core/emit.js.map +1 -0
  106. package/dist/core/hash.d.ts +2 -0
  107. package/dist/core/hash.js +6 -0
  108. package/dist/core/hash.js.map +1 -0
  109. package/dist/core/pipeline.d.ts +25 -0
  110. package/dist/core/pipeline.js +122 -0
  111. package/dist/core/pipeline.js.map +1 -0
  112. package/dist/core/publish.d.ts +31 -0
  113. package/dist/core/publish.js +87 -0
  114. package/dist/core/publish.js.map +1 -0
  115. package/dist/core/resolve.d.ts +42 -0
  116. package/dist/core/resolve.js +128 -0
  117. package/dist/core/resolve.js.map +1 -0
  118. package/dist/core/serve.d.ts +5 -0
  119. package/dist/core/serve.js +52 -0
  120. package/dist/core/serve.js.map +1 -0
  121. package/dist/core/types.d.ts +117 -0
  122. package/dist/core/types.js +9 -0
  123. package/dist/core/types.js.map +1 -0
  124. package/dist/core/version.d.ts +23 -0
  125. package/dist/core/version.js +102 -0
  126. package/dist/core/version.js.map +1 -0
  127. package/dist/mcp/server.d.ts +7 -0
  128. package/dist/mcp/server.js +224 -0
  129. package/dist/mcp/server.js.map +1 -0
  130. package/package.json +57 -0
@@ -0,0 +1,23 @@
1
+ export interface UpdateStatus {
2
+ current: string;
3
+ /** Latest release version (no leading "v"), or null if unknown. */
4
+ latest: string | null;
5
+ behind: boolean;
6
+ }
7
+ export declare function currentVersion(): string;
8
+ /** "owner/repo" from package.json repository.url (fallback to the known repo). */
9
+ export declare function repoSlug(): string;
10
+ /** Compare dotted versions: -1 if a<b, 0 if equal, 1 if a>b (major.minor.patch). */
11
+ export declare function cmpVersion(a: string, b: string): number;
12
+ /** Latest release tag (without a leading "v"), or null if none / unreachable. */
13
+ export declare function fetchLatestRelease(timeoutMs?: number): Promise<string | null>;
14
+ /** Fresh network check — for explicit commands (`alkahest update`, check_version). */
15
+ export declare function checkForUpdate(): Promise<UpdateStatus>;
16
+ /** Throttled, cached check — for ambient notices that run on common commands. */
17
+ export declare function cachedUpdateStatus(ttlMs?: number): Promise<UpdateStatus>;
18
+ /**
19
+ * Print a one-line "update available" nudge to stderr after a command, using the cached
20
+ * check. Never throws and never blocks meaningfully (stdout stays clean for piping / MCP).
21
+ * Opt out with ALKAHEST_NO_UPDATE_NOTIFIER.
22
+ */
23
+ export declare function maybeNotifyUpdate(): Promise<void>;
@@ -0,0 +1,102 @@
1
+ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ import { createRequire } from "node:module";
5
+ /**
6
+ * Single source of truth for "is a newer alkahest out?" — the repo's latest GitHub Release.
7
+ * Used by `alkahest update`, the ambient post-command notice, and the MCP check_version tool,
8
+ * so every surface reports the same thing. All checks fail soft (offline / rate-limited /
9
+ * no releases → behind:false), and the ambient path is cached so we hit GitHub at most once
10
+ * per TTL per machine.
11
+ */
12
+ const require = createRequire(import.meta.url);
13
+ const pkg = require("../../package.json");
14
+ const FALLBACK_REPO = "cr8rcho/alkahest";
15
+ const CACHE_FILE = join(homedir(), ".alkahest", "update-check.json");
16
+ const TTL_MS = 24 * 60 * 60 * 1000; // 24h
17
+ export function currentVersion() {
18
+ return pkg.version;
19
+ }
20
+ /** "owner/repo" from package.json repository.url (fallback to the known repo). */
21
+ export function repoSlug() {
22
+ const m = pkg.repository?.url?.match(/github\.com[/:]([^/]+\/[^/.]+?)(?:\.git)?(?:$|[/#?])/i);
23
+ return m ? m[1] : FALLBACK_REPO;
24
+ }
25
+ /** Compare dotted versions: -1 if a<b, 0 if equal, 1 if a>b (major.minor.patch). */
26
+ export function cmpVersion(a, b) {
27
+ const pa = a.split(".").map((n) => parseInt(n, 10) || 0);
28
+ const pb = b.split(".").map((n) => parseInt(n, 10) || 0);
29
+ for (let i = 0; i < 3; i++) {
30
+ const d = (pa[i] ?? 0) - (pb[i] ?? 0);
31
+ if (d !== 0)
32
+ return d < 0 ? -1 : 1;
33
+ }
34
+ return 0;
35
+ }
36
+ /** Latest release tag (without a leading "v"), or null if none / unreachable. */
37
+ export async function fetchLatestRelease(timeoutMs = 2500) {
38
+ const ctrl = new AbortController();
39
+ const timer = setTimeout(() => ctrl.abort(), timeoutMs);
40
+ try {
41
+ const res = await fetch(`https://api.github.com/repos/${repoSlug()}/releases/latest`, {
42
+ headers: { accept: "application/vnd.github+json", "user-agent": "alkahest-cli" },
43
+ signal: ctrl.signal,
44
+ });
45
+ if (!res.ok)
46
+ return null; // 404 = no releases yet
47
+ const body = (await res.json());
48
+ return body.tag_name ? body.tag_name.replace(/^v/i, "").trim() : null;
49
+ }
50
+ catch {
51
+ return null; // offline / aborted / rate-limited — fail soft
52
+ }
53
+ finally {
54
+ clearTimeout(timer);
55
+ }
56
+ }
57
+ function status(latest) {
58
+ return { current: pkg.version, latest, behind: !!latest && cmpVersion(pkg.version, latest) < 0 };
59
+ }
60
+ /** Fresh network check — for explicit commands (`alkahest update`, check_version). */
61
+ export async function checkForUpdate() {
62
+ return status(await fetchLatestRelease());
63
+ }
64
+ /** Throttled, cached check — for ambient notices that run on common commands. */
65
+ export async function cachedUpdateStatus(ttlMs = TTL_MS) {
66
+ try {
67
+ const raw = JSON.parse(readFileSync(CACHE_FILE, "utf8"));
68
+ if (raw.checkedAt && Date.now() - raw.checkedAt < ttlMs)
69
+ return status(raw.latest ?? null);
70
+ }
71
+ catch {
72
+ /* no / stale / invalid cache — fall through to a fresh check */
73
+ }
74
+ const latest = await fetchLatestRelease();
75
+ try {
76
+ mkdirSync(dirname(CACHE_FILE), { recursive: true });
77
+ writeFileSync(CACHE_FILE, JSON.stringify({ checkedAt: Date.now(), latest }) + "\n");
78
+ }
79
+ catch {
80
+ /* cache is best-effort */
81
+ }
82
+ return status(latest);
83
+ }
84
+ /**
85
+ * Print a one-line "update available" nudge to stderr after a command, using the cached
86
+ * check. Never throws and never blocks meaningfully (stdout stays clean for piping / MCP).
87
+ * Opt out with ALKAHEST_NO_UPDATE_NOTIFIER.
88
+ */
89
+ export async function maybeNotifyUpdate() {
90
+ if (process.env.ALKAHEST_NO_UPDATE_NOTIFIER)
91
+ return;
92
+ try {
93
+ const s = await cachedUpdateStatus();
94
+ if (s.behind) {
95
+ console.error(`[alkahest] ⬆ update available: ${s.current} → ${s.latest} — run 'alkahest update'`);
96
+ }
97
+ }
98
+ catch {
99
+ /* a version check must never break the command */
100
+ }
101
+ }
102
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/core/version.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ /**
3
+ * MCP server that lets agents (Claude Code/Codex/Cursor) query the product map (ALKAHEST.md §7).
4
+ * No LLM key required — reasoning is done by the calling agent. Tools provide only deterministic structure.
5
+ * Default target is the server's working directory (cwd). Each tool's `path` can point to a different project.
6
+ */
7
+ export declare function buildServer(): McpServer;
@@ -0,0 +1,224 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { z } from "zod";
3
+ import { resolve } from "node:path";
4
+ import { createRequire } from "node:module";
5
+ import { runScan, loadOrScan, loadMap } from "../core/pipeline.js";
6
+ import { emitMap, emitDashboard } from "../core/emit.js";
7
+ import { publishMap } from "../core/publish.js";
8
+ import { checkForUpdate, cachedUpdateStatus } from "../core/version.js";
9
+ const require = createRequire(import.meta.url);
10
+ const pkg = require("../../package.json");
11
+ /**
12
+ * MCP server that lets agents (Claude Code/Codex/Cursor) query the product map (ALKAHEST.md §7).
13
+ * No LLM key required — reasoning is done by the calling agent. Tools provide only deterministic structure.
14
+ * Default target is the server's working directory (cwd). Each tool's `path` can point to a different project.
15
+ */
16
+ export function buildServer() {
17
+ const server = new McpServer({ name: "alkahest", version: pkg.version });
18
+ const rootOf = (path) => resolve(path ?? process.cwd());
19
+ server.registerTool("scan", {
20
+ title: "Scan project",
21
+ description: "Statically analyze a React/Next project to create/update a product map (.alkahest/map.json + dashboard). " +
22
+ "Extracts screens, transitions between screens, and the API/data calls each screen makes. Returns a result summary (counts).",
23
+ inputSchema: { path: z.string().optional().describe("Project root (default: cwd)") },
24
+ }, async ({ path }) => {
25
+ const result = runScan(rootOf(path));
26
+ if (!result)
27
+ return text("No screens found. Only Next app-router (page.* under app/ or src/app/) is supported.");
28
+ const m = result.map;
29
+ return json({
30
+ framework: m.meta.framework,
31
+ router: m.meta.router,
32
+ screens: m.screens.length,
33
+ resources: m.resources.length,
34
+ transitions: m.transitions.length,
35
+ calls: m.calls.length,
36
+ mapPath: result.outFile,
37
+ });
38
+ });
39
+ server.registerTool("overview", {
40
+ title: "Product map overview",
41
+ description: "Full product map overview: list of screens (route/title/feature count) and list of resources (label/number of calling screens). " +
42
+ "Auto-scans if map.json is missing. Call this first to grasp the product structure at a glance.",
43
+ inputSchema: { path: z.string().optional() },
44
+ }, async ({ path }) => {
45
+ const map = loadOrScan(rootOf(path));
46
+ if (!map)
47
+ return text("No screens, or unsupported project.");
48
+ return json({
49
+ framework: map.meta.framework,
50
+ router: map.meta.router,
51
+ screens: map.screens.map((s) => ({
52
+ id: s.id,
53
+ route: s.route,
54
+ title: s.title,
55
+ features: s.features.length,
56
+ navigatesTo: map.transitions.filter((t) => t.from === s.id).length,
57
+ calls: map.calls.filter((c) => c.from === s.id).length,
58
+ })),
59
+ resources: map.resources.map((r) => ({
60
+ id: r.id,
61
+ label: r.label,
62
+ calledByScreens: new Set(map.calls.filter((c) => c.to === r.id).map((c) => c.from)).size,
63
+ })),
64
+ });
65
+ });
66
+ server.registerTool("get_screen", {
67
+ title: "Screen detail",
68
+ description: "Full structure of one screen: UI features, outgoing/incoming transitions, called resources (API/data), components, and source location. " +
69
+ "The agent can use this data to write a summary or PRD itself. Specify the screen by id/route/title.",
70
+ inputSchema: { screen: z.string().describe("screen id / route / title"), path: z.string().optional() },
71
+ }, async ({ screen, path }) => {
72
+ const map = loadOrScan(rootOf(path));
73
+ if (!map)
74
+ return text("No screens, or unsupported project.");
75
+ const s = matchScreen(map, screen);
76
+ if (!s)
77
+ return text(`Screen not found: ${screen}`);
78
+ return json(screenDetail(map, s));
79
+ });
80
+ server.registerTool("who_calls", {
81
+ title: "Resource callers (impact)",
82
+ description: "Returns the screens that call a specific resource (API endpoint/data). For understanding data dependencies and change impact. " +
83
+ "Specify the resource by id ('GET /api/orders') or a path fragment ('/api/orders').",
84
+ inputSchema: { resource: z.string(), path: z.string().optional() },
85
+ }, async ({ resource, path }) => {
86
+ const map = loadOrScan(rootOf(path));
87
+ if (!map)
88
+ return text("No screens, or unsupported project.");
89
+ const q = resource.toLowerCase();
90
+ const matched = map.resources.filter((r) => r.id.toLowerCase() === q || (r.path ?? "").toLowerCase().includes(q) || r.label.toLowerCase().includes(q));
91
+ return json(matched.map((r) => ({
92
+ resource: r.label,
93
+ callers: map.calls
94
+ .filter((c) => c.to === r.id)
95
+ .map((c) => ({ screen: c.from, via: c.trigger, loc: c.loc })),
96
+ })));
97
+ });
98
+ // ---- write-back tools: the agent saves its prose into map.json so the dashboard shows it ----
99
+ server.registerTool("set_summary", {
100
+ title: "Set screen summary",
101
+ description: "Save a one-line, PM-friendly summary ('what the user does here') onto a screen in map.json, " +
102
+ "then re-emit the dashboard so it appears in the screen's panel. Write the summary yourself from get_screen data.",
103
+ inputSchema: {
104
+ screen: z.string().describe("screen id / route / title"),
105
+ summary: z.string().describe("a 1-2 sentence summary in the user's language"),
106
+ path: z.string().optional(),
107
+ },
108
+ }, async ({ screen, summary, path }) => writeField(rootOf(path), screen, (s) => { s.summary = summary; }));
109
+ server.registerTool("set_prd", {
110
+ title: "Set screen PRD",
111
+ description: "Save a PRD/requirements markdown onto a screen in map.json, then re-emit the dashboard so it appears " +
112
+ "in the screen's panel (rendered). Write the PRD yourself from get_screen / who_calls data.",
113
+ inputSchema: {
114
+ screen: z.string().describe("screen id / route / title"),
115
+ prd: z.string().describe("PRD/requirements as markdown"),
116
+ path: z.string().optional(),
117
+ },
118
+ }, async ({ screen, prd, path }) => writeField(rootOf(path), screen, (s) => { s.prd = prd; }));
119
+ // ---- publish: upload the map to the hosted viewer for a shareable link ----
120
+ server.registerTool("publish", {
121
+ title: "Publish to hosted viewer",
122
+ description: "Upload this project's product map (.alkahest/map.json) to the hosted viewer (alkahest.app) and return a " +
123
+ "shareable link anyone can open — no install, no login to view. Only map.json is uploaded; source code never " +
124
+ "leaves the machine. Run 'scan' first if the map is missing. Auth uses a publish token from the ALKAHEST_TOKEN " +
125
+ "env var (set it in this server's MCP config) or a prior 'alkahest login'.",
126
+ inputSchema: {
127
+ path: z.string().optional().describe("Project root (default: cwd)"),
128
+ name: z.string().optional().describe("Project name for the link (first publish only; defaults to folder name)"),
129
+ },
130
+ }, async ({ path, name }) => {
131
+ const res = await publishMap(rootOf(path), { name, source: "mcp" });
132
+ if (!res.ok) {
133
+ const hints = {
134
+ no_map: "Run the scan tool first to build .alkahest/map.json.",
135
+ no_token: "Set ALKAHEST_TOKEN in this MCP server's config (get a token at alkahest.app → Account).",
136
+ no_api: "Set ALKAHEST_API_URL in this MCP server's config.",
137
+ plan_limit: "Free plan project limit reached — upgrade to Pro for more.",
138
+ invalid_token: "The publish token is invalid or revoked — create a new one at alkahest.app → Account.",
139
+ client_too_old: "This alkahest is too old to publish — run 'alkahest update'.",
140
+ };
141
+ const hint = hints[res.code ?? ""] ? ` ${hints[res.code ?? ""]}` : "";
142
+ return text(`Publish failed (${res.code}): ${res.message}.${hint}`);
143
+ }
144
+ const v = await cachedUpdateStatus().catch(() => null);
145
+ return json({
146
+ ok: true,
147
+ slug: res.slug,
148
+ url: res.viewerUrl ?? res.mapUrl,
149
+ created: res.created,
150
+ ...(v?.behind
151
+ ? { updateAvailable: `${v.current} → ${v.latest}`, updateHint: "Tell the user to run: alkahest update" }
152
+ : {}),
153
+ });
154
+ });
155
+ // ---- check_version: let the agent tell the user whether to update ----
156
+ server.registerTool("check_version", {
157
+ title: "Check for alkahest updates",
158
+ description: "Report the installed alkahest version vs the latest GitHub release, so you can tell the user whether their " +
159
+ "alkahest is current. If behind, tell them to run 'alkahest update' — you can't update through MCP (the CLI " +
160
+ "updates itself and this MCP server must be restarted to pick it up). No project access; just a version check.",
161
+ inputSchema: {},
162
+ }, async () => {
163
+ const s = await checkForUpdate();
164
+ return json({
165
+ current: s.current,
166
+ latest: s.latest,
167
+ behind: s.behind,
168
+ action: s.behind
169
+ ? "Out of date — tell the user to run: alkahest update (then restart this MCP server)."
170
+ : s.latest
171
+ ? "Up to date."
172
+ : "No published GitHub release to compare against yet.",
173
+ });
174
+ });
175
+ return server;
176
+ }
177
+ // ---------- helpers ----------
178
+ function text(t) {
179
+ return { content: [{ type: "text", text: t }] };
180
+ }
181
+ function json(obj) {
182
+ return { content: [{ type: "text", text: JSON.stringify(obj, null, 2) }] };
183
+ }
184
+ /** Load map.json, mutate the matched screen, then re-emit map.json + dashboard. */
185
+ function writeField(root, screenArg, mutate) {
186
+ const map = loadMap(root);
187
+ if (!map)
188
+ return text("No map.json found — run scan first.");
189
+ const s = matchScreen(map, screenArg);
190
+ if (!s)
191
+ return text(`Screen not found: ${screenArg}`);
192
+ mutate(s);
193
+ emitMap(root, map);
194
+ emitDashboard(root, map);
195
+ return text(`Saved to ${s.id}. Dashboard updated.`);
196
+ }
197
+ function matchScreen(map, arg) {
198
+ const norm = (s) => s.toLowerCase().replace(/^\/+|\/+$/g, "");
199
+ const t = norm(arg);
200
+ return map.screens.find((s) => norm(s.id) === t || norm(s.route) === t || norm(s.title) === t);
201
+ }
202
+ function screenDetail(map, s) {
203
+ const resourceLabel = (id) => map.resources.find((r) => r.id === id)?.label ?? id;
204
+ return {
205
+ id: s.id,
206
+ route: s.route,
207
+ title: s.title,
208
+ sourceFile: s.sourceFile,
209
+ summary: s.summary || null,
210
+ prd: s.prd || null,
211
+ features: s.features,
212
+ components: s.components,
213
+ navigatesTo: map.transitions
214
+ .filter((t) => t.from === s.id)
215
+ .map((t) => ({ to: t.to ?? t.rawTarget ?? "(unresolved)", via: t.trigger, loc: t.loc })),
216
+ navigatedFrom: map.transitions
217
+ .filter((t) => t.to === s.id)
218
+ .map((t) => ({ from: t.from, via: t.trigger, loc: t.loc })),
219
+ calls: map.calls
220
+ .filter((c) => c.from === s.id)
221
+ .map((c) => ({ resource: c.to ? resourceLabel(c.to) : c.rawTarget ?? "(unresolved)", via: c.trigger, loc: c.loc })),
222
+ };
223
+ }
224
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@cr8rcho/alkahest",
3
+ "version": "0.1.1",
4
+ "publishConfig": {
5
+ "access": "public"
6
+ },
7
+ "description": "Screen-graph CLI that reverse-engineers a product from code (React/Next static analysis → product map)",
8
+ "type": "module",
9
+ "bin": {
10
+ "alkahest": "dist/cli.js"
11
+ },
12
+ "files": [
13
+ "dist"
14
+ ],
15
+ "engines": {
16
+ "node": ">=20"
17
+ },
18
+ "scripts": {
19
+ "build": "tsc && node scripts/copy-assets.mjs",
20
+ "dev": "tsx src/cli.ts",
21
+ "typecheck": "tsc --noEmit",
22
+ "prepare": "npm run build",
23
+ "prepublishOnly": "npm run build"
24
+ },
25
+ "keywords": [
26
+ "cli",
27
+ "react",
28
+ "nextjs",
29
+ "product-map",
30
+ "screen-graph",
31
+ "static-analysis",
32
+ "prd",
33
+ "mcp",
34
+ "ast"
35
+ ],
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "git+https://github.com/cr8rcho/alkahest.git"
39
+ },
40
+ "homepage": "https://github.com/cr8rcho/alkahest#readme",
41
+ "bugs": {
42
+ "url": "https://github.com/cr8rcho/alkahest/issues"
43
+ },
44
+ "author": "cr8rcho",
45
+ "license": "MIT",
46
+ "dependencies": {
47
+ "@modelcontextprotocol/sdk": "^1.29.0",
48
+ "commander": "^14.0.3",
49
+ "ts-morph": "^28.0.0",
50
+ "zod": "^3.25.76"
51
+ },
52
+ "devDependencies": {
53
+ "@types/node": "^25.9.1",
54
+ "tsx": "^4.22.3",
55
+ "typescript": "^6.0.3"
56
+ }
57
+ }