@digital-lake/lognexus 1.0.0-alpha.1 → 1.0.0-alpha.4

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 (48) hide show
  1. package/README.md +39 -3
  2. package/dist/cli.js +208 -4
  3. package/dist/cli.js.map +1 -1
  4. package/dist/index.d.ts +10 -1
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +10 -1
  7. package/dist/index.js.map +1 -1
  8. package/dist/mcp/prompts.d.ts +30 -0
  9. package/dist/mcp/prompts.d.ts.map +1 -0
  10. package/dist/mcp/prompts.js +150 -0
  11. package/dist/mcp/prompts.js.map +1 -0
  12. package/dist/mcp/resources.d.ts +25 -0
  13. package/dist/mcp/resources.d.ts.map +1 -0
  14. package/dist/mcp/resources.js +75 -0
  15. package/dist/mcp/resources.js.map +1 -0
  16. package/dist/mcp/server.d.ts +22 -0
  17. package/dist/mcp/server.d.ts.map +1 -0
  18. package/dist/mcp/server.js +202 -0
  19. package/dist/mcp/server.js.map +1 -0
  20. package/dist/mcp/tools.d.ts +26 -0
  21. package/dist/mcp/tools.d.ts.map +1 -0
  22. package/dist/mcp/tools.js +197 -0
  23. package/dist/mcp/tools.js.map +1 -0
  24. package/dist/notes/attach.d.ts +20 -0
  25. package/dist/notes/attach.d.ts.map +1 -0
  26. package/dist/notes/attach.js +27 -0
  27. package/dist/notes/attach.js.map +1 -0
  28. package/dist/notes/notes.d.ts +14 -0
  29. package/dist/notes/notes.d.ts.map +1 -0
  30. package/dist/notes/notes.js +82 -0
  31. package/dist/notes/notes.js.map +1 -0
  32. package/dist/scaffold.d.ts +1 -0
  33. package/dist/scaffold.d.ts.map +1 -1
  34. package/dist/scaffold.js +11 -11
  35. package/dist/scaffold.js.map +1 -1
  36. package/dist/state/manager.d.ts +9 -0
  37. package/dist/state/manager.d.ts.map +1 -0
  38. package/dist/state/manager.js +72 -0
  39. package/dist/state/manager.js.map +1 -0
  40. package/dist/state/schema.d.ts +111 -0
  41. package/dist/state/schema.d.ts.map +1 -0
  42. package/dist/state/schema.js +31 -0
  43. package/dist/state/schema.js.map +1 -0
  44. package/dist/state/sync.d.ts +8 -0
  45. package/dist/state/sync.d.ts.map +1 -0
  46. package/dist/state/sync.js +79 -0
  47. package/dist/state/sync.js.map +1 -0
  48. package/package.json +1 -1
@@ -0,0 +1,75 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { DEFAULT_ROUTING_TEMPLATE } from "../scaffold.js";
4
+ import { loadState } from "../state/manager.js";
5
+ export const MCP_RESOURCE_PREFIX = "lognexus://";
6
+ export const STATE_RESOURCE_URI = `${MCP_RESOURCE_PREFIX}state`;
7
+ export const ROUTING_RESOURCE_URI = `${MCP_RESOURCE_PREFIX}routing`;
8
+ export class McpResourceError extends Error {
9
+ constructor(message) {
10
+ super(message);
11
+ this.name = "McpResourceError";
12
+ }
13
+ }
14
+ const RESOURCE_DEFINITIONS = [
15
+ {
16
+ uri: STATE_RESOURCE_URI,
17
+ name: "LogNexus agent state",
18
+ description: "Persistent LogNexus agent state (.lognexus/state.json): active issue, current subtask, completed subtasks and last synchronization timestamp.",
19
+ mimeType: "application/json",
20
+ },
21
+ {
22
+ uri: ROUTING_RESOURCE_URI,
23
+ name: "Model-tier routing configuration",
24
+ description: "Multi-model routing rules from .lognexus/routing.md, or the default tier taxonomy when the project has not been initialized.",
25
+ mimeType: "text/markdown",
26
+ },
27
+ ];
28
+ export function listMcpResources() {
29
+ return RESOURCE_DEFINITIONS;
30
+ }
31
+ export function readStateResource(targetDir = process.cwd()) {
32
+ return {
33
+ contents: [
34
+ {
35
+ uri: STATE_RESOURCE_URI,
36
+ mimeType: "application/json",
37
+ text: JSON.stringify(loadState(targetDir), null, 2),
38
+ },
39
+ ],
40
+ };
41
+ }
42
+ export function readRoutingResource(targetDir = process.cwd()) {
43
+ const routingPath = join(targetDir, ".lognexus", "routing.md");
44
+ const hasRoutingFile = existsSync(routingPath);
45
+ let text;
46
+ try {
47
+ text = hasRoutingFile ? readFileSync(routingPath, "utf8") : DEFAULT_ROUTING_TEMPLATE;
48
+ }
49
+ catch {
50
+ text = DEFAULT_ROUTING_TEMPLATE;
51
+ }
52
+ if (!hasRoutingFile) {
53
+ text = `<!-- Default routing template: .lognexus/routing.md not found in this project. -->\n${text}`;
54
+ }
55
+ return {
56
+ contents: [
57
+ {
58
+ uri: ROUTING_RESOURCE_URI,
59
+ mimeType: "text/markdown",
60
+ text,
61
+ },
62
+ ],
63
+ };
64
+ }
65
+ export function readMcpResource(uri, targetDir = process.cwd()) {
66
+ switch (uri) {
67
+ case STATE_RESOURCE_URI:
68
+ return readStateResource(targetDir);
69
+ case ROUTING_RESOURCE_URI:
70
+ return readRoutingResource(targetDir);
71
+ default:
72
+ throw new McpResourceError(`Unknown LogNexus resource: '${uri}'.`);
73
+ }
74
+ }
75
+ //# sourceMappingURL=resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.js","sourceRoot":"","sources":["../../src/mcp/resources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,MAAM,CAAC,MAAM,mBAAmB,GAAG,aAAa,CAAC;AACjD,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,mBAAmB,OAAO,CAAC;AAChE,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,mBAAmB,SAAS,CAAC;AAmBpE,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED,MAAM,oBAAoB,GAAyB;IACjD;QACE,GAAG,EAAE,kBAAkB;QACvB,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EACT,+IAA+I;QACjJ,QAAQ,EAAE,kBAAkB;KAC7B;IACD;QACE,GAAG,EAAE,oBAAoB;QACzB,IAAI,EAAE,kCAAkC;QACxC,WAAW,EACT,8HAA8H;QAChI,QAAQ,EAAE,eAAe;KAC1B;CACF,CAAC;AAEF,MAAM,UAAU,gBAAgB;IAC9B,OAAO,oBAAoB,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,SAAS,GAAW,OAAO,CAAC,GAAG,EAAE;IACjE,OAAO;QACL,QAAQ,EAAE;YACR;gBACE,GAAG,EAAE,kBAAkB;gBACvB,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;aACpD;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,SAAS,GAAW,OAAO,CAAC,GAAG,EAAE;IACnE,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IAC/D,MAAM,cAAc,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IAE/C,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAC;IACvF,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,GAAG,wBAAwB,CAAC;IAClC,CAAC;IAED,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,IAAI,GAAG,uFAAuF,IAAI,EAAE,CAAC;IACvG,CAAC;IAED,OAAO;QACL,QAAQ,EAAE;YACR;gBACE,GAAG,EAAE,oBAAoB;gBACzB,QAAQ,EAAE,eAAe;gBACzB,IAAI;aACL;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,GAAW,EACX,SAAS,GAAW,OAAO,CAAC,GAAG,EAAE;IAEjC,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,kBAAkB;YACrB,OAAO,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACtC,KAAK,oBAAoB;YACvB,OAAO,mBAAmB,CAAC,SAAS,CAAC,CAAC;QACxC;YACE,MAAM,IAAI,gBAAgB,CAAC,+BAA+B,GAAG,IAAI,CAAC,CAAC;IACvE,CAAC;AACH,CAAC"}
@@ -0,0 +1,22 @@
1
+ export declare const MCP_PROTOCOL_VERSION = "2024-11-05";
2
+ export declare const MCP_SERVER_VERSION = "1.0.0";
3
+ export interface McpInitializeResult {
4
+ protocolVersion: string;
5
+ capabilities: {
6
+ tools: Record<string, never>;
7
+ resources: Record<string, never>;
8
+ prompts: Record<string, never>;
9
+ };
10
+ serverInfo: {
11
+ name: string;
12
+ version: string;
13
+ };
14
+ }
15
+ /**
16
+ * Processes a single newline-delimited JSON-RPC message.
17
+ * Returns the serialized response, or null when no response must be written
18
+ * (notifications and client responses).
19
+ */
20
+ export declare function processMcpMessage(rawMessage: string, targetDir?: string): Promise<string | null>;
21
+ export declare function startMcpServer(targetDir?: string): Promise<void>;
22
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,oBAAoB,eAAe,CAAC;AACjD,eAAO,MAAM,kBAAkB,UAAU,CAAC;AA6B1C,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE;QACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC7B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;KAChC,CAAC;IACF,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/C;AAuID;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,SAAS,GAAE,MAAsB,GAChC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA2ExB;AAED,wBAAsB,cAAc,CAAC,SAAS,GAAE,MAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BrF"}
@@ -0,0 +1,202 @@
1
+ import { createInterface } from "node:readline";
2
+ import { getMcpPrompt, listMcpPrompts, McpPromptError } from "./prompts.js";
3
+ import { listMcpResources, McpResourceError, readMcpResource } from "./resources.js";
4
+ import { callMcpTool, isKnownTool, listMcpTools, MCP_SERVER_NAME, } from "./tools.js";
5
+ export const MCP_PROTOCOL_VERSION = "2024-11-05";
6
+ export const MCP_SERVER_VERSION = "1.0.0";
7
+ const JSON_RPC_PARSE_ERROR = -32700;
8
+ const JSON_RPC_INVALID_REQUEST = -32600;
9
+ const JSON_RPC_METHOD_NOT_FOUND = -32601;
10
+ const JSON_RPC_INVALID_PARAMS = -32602;
11
+ const JSON_RPC_INTERNAL_ERROR = -32603;
12
+ function isObject(value) {
13
+ return typeof value === "object" && value !== null && !Array.isArray(value);
14
+ }
15
+ function success(id, result) {
16
+ return { jsonrpc: "2.0", id, result };
17
+ }
18
+ function failure(id, code, message, data) {
19
+ const error = { code, message };
20
+ if (data !== undefined) {
21
+ error.data = data;
22
+ }
23
+ return { jsonrpc: "2.0", id, error };
24
+ }
25
+ function getPromptArgs(params) {
26
+ const raw = params.arguments;
27
+ if (raw === undefined || raw === null)
28
+ return {};
29
+ if (!isObject(raw)) {
30
+ throw new McpPromptError("Parameter 'arguments' must be an object.");
31
+ }
32
+ const args = {};
33
+ for (const [key, value] of Object.entries(raw)) {
34
+ if (value === undefined || value === null)
35
+ continue;
36
+ args[key] = String(value);
37
+ }
38
+ return args;
39
+ }
40
+ function buildInitializeResult() {
41
+ return {
42
+ protocolVersion: MCP_PROTOCOL_VERSION,
43
+ capabilities: {
44
+ tools: {},
45
+ resources: {},
46
+ prompts: {},
47
+ },
48
+ serverInfo: { name: MCP_SERVER_NAME, version: MCP_SERVER_VERSION },
49
+ };
50
+ }
51
+ /**
52
+ * Resolves a JSON-RPC method to its result payload.
53
+ * Throws a JsonRpcFailure to short-circuit with an error response.
54
+ */
55
+ async function dispatchRequest(method, params, targetDir) {
56
+ switch (method) {
57
+ case "initialize":
58
+ return buildInitializeResult();
59
+ case "ping":
60
+ return {};
61
+ case "tools/list":
62
+ return { tools: listMcpTools() };
63
+ case "tools/call": {
64
+ const name = params.name;
65
+ if (typeof name !== "string" || name.trim() === "") {
66
+ throw failure(null, JSON_RPC_INVALID_PARAMS, "Parameter 'name' must be a non-empty string.");
67
+ }
68
+ if (!isKnownTool(name)) {
69
+ const result = {
70
+ content: [{ type: "text", text: `Unknown LogNexus tool: '${name}'.` }],
71
+ isError: true,
72
+ };
73
+ return result;
74
+ }
75
+ const rawArgs = params.arguments;
76
+ if (rawArgs !== undefined && rawArgs !== null && !isObject(rawArgs)) {
77
+ throw failure(null, JSON_RPC_INVALID_PARAMS, "Parameter 'arguments' must be an object.");
78
+ }
79
+ return callMcpTool(name, rawArgs ?? {}, targetDir);
80
+ }
81
+ case "resources/list":
82
+ return { resources: listMcpResources() };
83
+ case "resources/read": {
84
+ const uri = params.uri;
85
+ if (typeof uri !== "string" || uri.trim() === "") {
86
+ throw failure(null, JSON_RPC_INVALID_PARAMS, "Parameter 'uri' must be a non-empty string.");
87
+ }
88
+ try {
89
+ return readMcpResource(uri, targetDir);
90
+ }
91
+ catch (error) {
92
+ const message = error instanceof McpResourceError ? error.message : String(error);
93
+ throw failure(null, JSON_RPC_INVALID_PARAMS, message);
94
+ }
95
+ }
96
+ case "prompts/list":
97
+ return { prompts: listMcpPrompts() };
98
+ case "prompts/get": {
99
+ const name = params.name;
100
+ if (typeof name !== "string" || name.trim() === "") {
101
+ throw failure(null, JSON_RPC_INVALID_PARAMS, "Parameter 'name' must be a non-empty string.");
102
+ }
103
+ let prompt;
104
+ try {
105
+ prompt = getMcpPrompt(name, getPromptArgs(params));
106
+ }
107
+ catch (error) {
108
+ const message = error instanceof McpPromptError ? error.message : String(error);
109
+ throw failure(null, JSON_RPC_INVALID_PARAMS, message);
110
+ }
111
+ return prompt;
112
+ }
113
+ default:
114
+ throw failure(null, JSON_RPC_METHOD_NOT_FOUND, `Method not found: ${method}`);
115
+ }
116
+ }
117
+ /**
118
+ * Processes a single newline-delimited JSON-RPC message.
119
+ * Returns the serialized response, or null when no response must be written
120
+ * (notifications and client responses).
121
+ */
122
+ export async function processMcpMessage(rawMessage, targetDir = process.cwd()) {
123
+ const trimmed = rawMessage.trim();
124
+ if (trimmed === "") {
125
+ return null;
126
+ }
127
+ let parsed;
128
+ try {
129
+ parsed = JSON.parse(trimmed);
130
+ }
131
+ catch {
132
+ return JSON.stringify(failure(null, JSON_RPC_PARSE_ERROR, "Parse error: invalid JSON payload."));
133
+ }
134
+ if (!isObject(parsed)) {
135
+ return JSON.stringify(failure(null, JSON_RPC_INVALID_REQUEST, "Invalid Request: expected a JSON object."));
136
+ }
137
+ const hasMethod = typeof parsed.method === "string";
138
+ const isNotification = hasMethod && !("id" in parsed);
139
+ if (!isNotification && !("method" in parsed)) {
140
+ return null;
141
+ }
142
+ const request = parsed;
143
+ const rawId = request.id;
144
+ const id = typeof rawId === "string" || typeof rawId === "number" ? rawId : null;
145
+ if (!hasMethod || request.method.trim() === "") {
146
+ if (isNotification)
147
+ return null;
148
+ return JSON.stringify(failure(id, JSON_RPC_INVALID_REQUEST, "Invalid Request: 'method' must be a string."));
149
+ }
150
+ const method = request.method;
151
+ if ("jsonrpc" in parsed && parsed.jsonrpc !== "2.0") {
152
+ if (isNotification)
153
+ return null;
154
+ return JSON.stringify(failure(id, JSON_RPC_INVALID_REQUEST, "Invalid Request: 'jsonrpc' must be \"2.0\"."));
155
+ }
156
+ let params = {};
157
+ if (request.params !== undefined && request.params !== null) {
158
+ if (!isObject(request.params)) {
159
+ if (isNotification)
160
+ return null;
161
+ return JSON.stringify(failure(id, JSON_RPC_INVALID_PARAMS, "Invalid params: 'params' must be an object."));
162
+ }
163
+ params = request.params;
164
+ }
165
+ if (isNotification) {
166
+ return null;
167
+ }
168
+ try {
169
+ const result = await dispatchRequest(method, params, targetDir);
170
+ return JSON.stringify(success(id, result));
171
+ }
172
+ catch (error) {
173
+ if (isObject(error) && isObject(error.error) && typeof error.error.code === "number") {
174
+ const payload = error;
175
+ return JSON.stringify({ ...payload, id });
176
+ }
177
+ const message = error instanceof Error ? error.message : String(error);
178
+ return JSON.stringify(failure(id, JSON_RPC_INTERNAL_ERROR, `Internal error: ${message}`));
179
+ }
180
+ }
181
+ export async function startMcpServer(targetDir = process.cwd()) {
182
+ const rl = createInterface({ input: process.stdin, terminal: false });
183
+ process.stderr.write(`${MCP_SERVER_NAME} MCP server v${MCP_SERVER_VERSION} listening on stdio (protocol ${MCP_PROTOCOL_VERSION}) — cwd: ${targetDir}\n`);
184
+ let queue = Promise.resolve();
185
+ rl.on("line", (line) => {
186
+ queue = queue
187
+ .then(async () => {
188
+ const response = await processMcpMessage(line, targetDir);
189
+ if (response !== null) {
190
+ process.stdout.write(`${response}\n`);
191
+ }
192
+ })
193
+ .catch((error) => {
194
+ const message = error instanceof Error ? error.message : String(error);
195
+ process.stderr.write(`Failed to process MCP message: ${message}\n`);
196
+ });
197
+ });
198
+ await new Promise((resolve) => {
199
+ rl.on("close", () => resolve());
200
+ });
201
+ }
202
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAqB,MAAM,cAAc,CAAC;AAC/F,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACrF,OAAO,EACL,WAAW,EACX,WAAW,EACX,YAAY,EACZ,eAAe,GAEhB,MAAM,YAAY,CAAC;AAEpB,MAAM,CAAC,MAAM,oBAAoB,GAAG,YAAY,CAAC;AACjD,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAE1C,MAAM,oBAAoB,GAAG,CAAC,KAAK,CAAC;AACpC,MAAM,wBAAwB,GAAG,CAAC,KAAK,CAAC;AACxC,MAAM,yBAAyB,GAAG,CAAC,KAAK,CAAC;AACzC,MAAM,uBAAuB,GAAG,CAAC,KAAK,CAAC;AACvC,MAAM,uBAAuB,GAAG,CAAC,KAAK,CAAC;AAiCvC,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,OAAO,CAAC,EAAoB,EAAE,MAAe;IACpD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,OAAO,CACd,EAAoB,EACpB,IAAY,EACZ,OAAe,EACf,IAAc;IAEd,MAAM,KAAK,GAA4B,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IACzD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;IACpB,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,aAAa,CAAC,MAA+B;IACpD,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC;IAC7B,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IACjD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,cAAc,CAAC,0CAA0C,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,IAAI,GAA2B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;YAAE,SAAS;QACpD,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,qBAAqB;IAC5B,OAAO;QACL,eAAe,EAAE,oBAAoB;QACrC,YAAY,EAAE;YACZ,KAAK,EAAE,EAAE;YACT,SAAS,EAAE,EAAE;YACb,OAAO,EAAE,EAAE;SACZ;QACD,UAAU,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,kBAAkB,EAAE;KACnE,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,eAAe,CAC5B,MAAc,EACd,MAA+B,EAC/B,SAAiB;IAEjB,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,YAAY;YACf,OAAO,qBAAqB,EAAE,CAAC;QAEjC,KAAK,MAAM;YACT,OAAO,EAAE,CAAC;QAEZ,KAAK,YAAY;YACf,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,CAAC;QAEnC,KAAK,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YACzB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBACnD,MAAM,OAAO,CACX,IAAI,EACJ,uBAAuB,EACvB,8CAA8C,CAC/C,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvB,MAAM,MAAM,GAAmB;oBAC7B,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,2BAA2B,IAAI,IAAI,EAAE,CAAC;oBACtE,OAAO,EAAE,IAAI;iBACd,CAAC;gBACF,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC;YACjC,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACpE,MAAM,OAAO,CAAC,IAAI,EAAE,uBAAuB,EAAE,0CAA0C,CAAC,CAAC;YAC3F,CAAC;YACD,OAAO,WAAW,CAAC,IAAI,EAAG,OAA+C,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;QAC9F,CAAC;QAED,KAAK,gBAAgB;YACnB,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,EAAE,CAAC;QAE3C,KAAK,gBAAgB,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;YACvB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBACjD,MAAM,OAAO,CAAC,IAAI,EAAE,uBAAuB,EAAE,6CAA6C,CAAC,CAAC;YAC9F,CAAC;YACD,IAAI,CAAC;gBACH,OAAO,eAAe,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YACzC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,KAAK,YAAY,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAClF,MAAM,OAAO,CAAC,IAAI,EAAE,uBAAuB,EAAE,OAAO,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;QAED,KAAK,cAAc;YACjB,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,CAAC;QAEvC,KAAK,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YACzB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBACnD,MAAM,OAAO,CACX,IAAI,EACJ,uBAAuB,EACvB,8CAA8C,CAC/C,CAAC;YACJ,CAAC;YACD,IAAI,MAAoB,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;YACrD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,KAAK,YAAY,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChF,MAAM,OAAO,CAAC,IAAI,EAAE,uBAAuB,EAAE,OAAO,CAAC,CAAC;YACxD,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAED;YACE,MAAM,OAAO,CAAC,IAAI,EAAE,yBAAyB,EAAE,qBAAqB,MAAM,EAAE,CAAC,CAAC;IAClF,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,UAAkB,EAClB,SAAS,GAAW,OAAO,CAAC,GAAG,EAAE;IAEjC,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;IAClC,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,SAAS,CACnB,OAAO,CAAC,IAAI,EAAE,oBAAoB,EAAE,oCAAoC,CAAC,CAC1E,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC,SAAS,CACnB,OAAO,CAAC,IAAI,EAAE,wBAAwB,EAAE,0CAA0C,CAAC,CACpF,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC;IACpD,MAAM,cAAc,GAAG,SAAS,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC;IAEtD,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC,QAAQ,IAAI,MAAM,CAAC,EAAE,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,MAAmC,CAAC;IACpD,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,CAAC;IACzB,MAAM,EAAE,GACN,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAExE,IAAI,CAAC,SAAS,IAAK,OAAO,CAAC,MAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3D,IAAI,cAAc;YAAE,OAAO,IAAI,CAAC;QAChC,OAAO,IAAI,CAAC,SAAS,CACnB,OAAO,CAAC,EAAE,EAAE,wBAAwB,EAAE,6CAA6C,CAAC,CACrF,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAE9B,IAAI,SAAS,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;QACpD,IAAI,cAAc;YAAE,OAAO,IAAI,CAAC;QAChC,OAAO,IAAI,CAAC,SAAS,CACnB,OAAO,CAAC,EAAE,EAAE,wBAAwB,EAAE,6CAA6C,CAAC,CACrF,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,GAA4B,EAAE,CAAC;IACzC,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAC5D,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,IAAI,cAAc;gBAAE,OAAO,IAAI,CAAC;YAChC,OAAO,IAAI,CAAC,SAAS,CACnB,OAAO,CAAC,EAAE,EAAE,uBAAuB,EAAE,6CAA6C,CAAC,CACpF,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC1B,CAAC;IAED,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrF,MAAM,OAAO,GAAG,KAAkC,CAAC;YACnD,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,uBAAuB,EAAE,mBAAmB,OAAO,EAAE,CAAC,CAAC,CAAC;IAC5F,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,SAAS,GAAW,OAAO,CAAC,GAAG,EAAE;IACpE,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAEtE,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,eAAe,gBAAgB,kBAAkB,iCAAiC,oBAAoB,YAAY,SAAS,IAAI,CACnI,CAAC;IAEF,IAAI,KAAK,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAE7C,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACrB,KAAK,GAAG,KAAK;aACV,IAAI,CAAC,KAAK,IAAI,EAAE;YACf,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAC1D,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,QAAQ,IAAI,CAAC,CAAC;YACxC,CAAC;QACH,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YACxB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,OAAO,IAAI,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,26 @@
1
+ export declare const MCP_SERVER_NAME = "lognexus";
2
+ export interface ToolDefinition {
3
+ name: string;
4
+ title: string;
5
+ description: string;
6
+ inputSchema: {
7
+ type: "object";
8
+ properties: Record<string, unknown>;
9
+ required?: string[];
10
+ };
11
+ }
12
+ export interface ToolTextContent {
13
+ type: "text";
14
+ text: string;
15
+ }
16
+ export interface ToolCallResult {
17
+ content: ToolTextContent[];
18
+ isError?: boolean;
19
+ }
20
+ export declare class McpToolError extends Error {
21
+ constructor(message: string);
22
+ }
23
+ export declare function listMcpTools(): ToolDefinition[];
24
+ export declare function isKnownTool(name: string): boolean;
25
+ export declare function callMcpTool(name: string, args?: Record<string, unknown>, targetDir?: string): Promise<ToolCallResult>;
26
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,eAAe,aAAa,CAAC;AAE1C,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,YAAa,SAAQ,KAAK;IACrC,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AA+GD,wBAAgB,YAAY,IAAI,cAAc,EAAE,CAE/C;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD;AAwCD,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAClC,SAAS,GAAE,MAAsB,GAChC,OAAO,CAAC,cAAc,CAAC,CAsDzB"}
@@ -0,0 +1,197 @@
1
+ import { attachCurrentStateToCommit } from "../notes/attach.js";
2
+ import { getNote } from "../notes/notes.js";
3
+ import { clearState, finishSubtask, loadState, setSubtask } from "../state/manager.js";
4
+ import { syncStateFromGit } from "../state/sync.js";
5
+ import { getProjectStatus } from "../status.js";
6
+ export const MCP_SERVER_NAME = "lognexus";
7
+ export class McpToolError extends Error {
8
+ constructor(message) {
9
+ super(message);
10
+ this.name = "McpToolError";
11
+ }
12
+ }
13
+ const TOOL_DEFINITIONS = [
14
+ {
15
+ name: "lognexus_status",
16
+ title: "LogNexus project status",
17
+ description: "Inspect the current Git branch, whether the directory is a Git repository, the active issue, the routing mode and the recommended model tier.",
18
+ inputSchema: {
19
+ type: "object",
20
+ properties: {},
21
+ },
22
+ },
23
+ {
24
+ name: "lognexus_state_get",
25
+ title: "Get agent state",
26
+ description: "Return the persistent LogNexus agent state (.lognexus/state.json): active issue, current subtask, completed subtasks and last synchronization timestamp.",
27
+ inputSchema: {
28
+ type: "object",
29
+ properties: {},
30
+ },
31
+ },
32
+ {
33
+ name: "lognexus_state_sync",
34
+ title: "Sync state from Git",
35
+ description: "Synchronize the persistent state from the current Git branch and GitHub metadata, then return the updated state.",
36
+ inputSchema: {
37
+ type: "object",
38
+ properties: {},
39
+ },
40
+ },
41
+ {
42
+ name: "lognexus_state_set_task",
43
+ title: "Set active subtask",
44
+ description: "Mark a subtask as in progress (equivalent to 'lognexus state set-task <id> [title]') and return the updated state.",
45
+ inputSchema: {
46
+ type: "object",
47
+ properties: {
48
+ taskId: {
49
+ type: "string",
50
+ description: "Subtask identifier, e.g. 'T1'.",
51
+ },
52
+ title: {
53
+ type: "string",
54
+ description: "Optional human-readable subtask title.",
55
+ },
56
+ },
57
+ required: ["taskId"],
58
+ },
59
+ },
60
+ {
61
+ name: "lognexus_state_finish_task",
62
+ title: "Finish subtask",
63
+ description: "Mark a subtask as completed (equivalent to 'lognexus state finish-task <id>') and return the updated state.",
64
+ inputSchema: {
65
+ type: "object",
66
+ properties: {
67
+ taskId: {
68
+ type: "string",
69
+ description: "Subtask identifier, e.g. 'T1'.",
70
+ },
71
+ },
72
+ required: ["taskId"],
73
+ },
74
+ },
75
+ {
76
+ name: "lognexus_state_clear",
77
+ title: "Clear agent state",
78
+ description: "Reset the persistent LogNexus agent state to empty (equivalent to 'lognexus state clear').",
79
+ inputSchema: {
80
+ type: "object",
81
+ properties: {},
82
+ },
83
+ },
84
+ {
85
+ name: "lognexus_note_show",
86
+ title: "Show Git Note",
87
+ description: "Read the LogNexus Git Note (refs/notes/lognexus) attached to a commit and return its parsed JSON payload. Defaults to HEAD.",
88
+ inputSchema: {
89
+ type: "object",
90
+ properties: {
91
+ commitRef: {
92
+ type: "string",
93
+ description: "Git commit reference (SHA, branch, tag or HEAD). Defaults to HEAD.",
94
+ },
95
+ },
96
+ },
97
+ },
98
+ {
99
+ name: "lognexus_note_attach",
100
+ title: "Attach Git Note",
101
+ description: "Attach the current LogNexus state as a Git Note (refs/notes/lognexus) to a commit. Defaults to HEAD.",
102
+ inputSchema: {
103
+ type: "object",
104
+ properties: {
105
+ commitRef: {
106
+ type: "string",
107
+ description: "Git commit reference (SHA, branch, tag or HEAD). Defaults to HEAD.",
108
+ },
109
+ },
110
+ },
111
+ },
112
+ ];
113
+ export function listMcpTools() {
114
+ return TOOL_DEFINITIONS;
115
+ }
116
+ export function isKnownTool(name) {
117
+ return TOOL_DEFINITIONS.some((tool) => tool.name === name);
118
+ }
119
+ function textResult(value) {
120
+ const text = typeof value === "string" ? value : JSON.stringify(value, null, 2);
121
+ return { content: [{ type: "text", text }] };
122
+ }
123
+ function errorResult(message) {
124
+ return { content: [{ type: "text", text: message }], isError: true };
125
+ }
126
+ function readStringArg(args, key, options = {}) {
127
+ const value = args[key];
128
+ if (value === undefined || value === null) {
129
+ if (options.required) {
130
+ throw new McpToolError(`Missing required argument: '${key}'.`);
131
+ }
132
+ return undefined;
133
+ }
134
+ if (typeof value !== "string") {
135
+ throw new McpToolError(`Argument '${key}' must be a string.`);
136
+ }
137
+ const trimmed = value.trim();
138
+ if (trimmed === "") {
139
+ if (options.required) {
140
+ throw new McpToolError(`Argument '${key}' must be a non-empty string.`);
141
+ }
142
+ return undefined;
143
+ }
144
+ return trimmed;
145
+ }
146
+ function resolveCommitRef(args) {
147
+ return readStringArg(args, "commitRef") ?? "HEAD";
148
+ }
149
+ export async function callMcpTool(name, args = {}, targetDir = process.cwd()) {
150
+ try {
151
+ switch (name) {
152
+ case "lognexus_status":
153
+ return textResult(getProjectStatus(targetDir));
154
+ case "lognexus_state_get":
155
+ return textResult(loadState(targetDir));
156
+ case "lognexus_state_sync":
157
+ return textResult(syncStateFromGit(targetDir));
158
+ case "lognexus_state_set_task": {
159
+ const taskId = readStringArg(args, "taskId", { required: true });
160
+ const title = readStringArg(args, "title") ?? "";
161
+ return textResult(setSubtask(taskId, title, undefined, targetDir));
162
+ }
163
+ case "lognexus_state_finish_task": {
164
+ const taskId = readStringArg(args, "taskId", { required: true });
165
+ return textResult(finishSubtask(taskId, targetDir));
166
+ }
167
+ case "lognexus_state_clear": {
168
+ const cleared = clearState(targetDir);
169
+ return {
170
+ content: [
171
+ { type: "text", text: "LogNexus state cleared." },
172
+ { type: "text", text: JSON.stringify(cleared, null, 2) },
173
+ ],
174
+ };
175
+ }
176
+ case "lognexus_note_show": {
177
+ const commitRef = resolveCommitRef(args);
178
+ const note = getNote(commitRef, { cwd: targetDir });
179
+ if (note === null) {
180
+ return errorResult(`No LogNexus note found for commit '${commitRef}'.`);
181
+ }
182
+ return textResult(note);
183
+ }
184
+ case "lognexus_note_attach": {
185
+ const commitRef = resolveCommitRef(args);
186
+ return textResult(attachCurrentStateToCommit(commitRef, { cwd: targetDir }));
187
+ }
188
+ default:
189
+ return errorResult(`Unknown LogNexus tool: '${name}'.`);
190
+ }
191
+ }
192
+ catch (error) {
193
+ const message = error instanceof Error ? error.message : String(error);
194
+ return errorResult(`Tool '${name}' failed: ${message}`);
195
+ }
196
+ }
197
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { type NoteOptions } from "./notes.js";
2
+ export interface GitNotePayload {
3
+ $schema: string;
4
+ generator: string;
5
+ version: string;
6
+ timestamp: string;
7
+ issue: {
8
+ id: number;
9
+ title: string;
10
+ } | null;
11
+ subtask: {
12
+ id: string;
13
+ title: string;
14
+ contract?: unknown;
15
+ } | null;
16
+ tier: string;
17
+ }
18
+ export declare function buildStateNotePayload(targetDir?: string): GitNotePayload;
19
+ export declare function attachCurrentStateToCommit(commitRef?: string, options?: NoteOptions): GitNotePayload;
20
+ //# sourceMappingURL=attach.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attach.d.ts","sourceRoot":"","sources":["../../src/notes/attach.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAE1D,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC5C,OAAO,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,GAAG,IAAI,CAAC;IACT,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,qBAAqB,CAAC,SAAS,GAAE,MAAsB,GAAG,cAAc,CAkBvF;AAED,wBAAgB,0BAA0B,CACxC,SAAS,GAAE,MAAe,EAC1B,OAAO,GAAE,WAAgB,GACxB,cAAc,CAKhB"}
@@ -0,0 +1,27 @@
1
+ import { loadState } from "../state/manager.js";
2
+ import { attachNote } from "./notes.js";
3
+ export function buildStateNotePayload(targetDir = process.cwd()) {
4
+ const state = loadState(targetDir);
5
+ return {
6
+ $schema: "https://lognexus.digital-lake.ai/schemas/git-note-v1.json",
7
+ generator: "LogNexus",
8
+ version: "1.0.0",
9
+ timestamp: new Date().toISOString(),
10
+ issue: state.activeIssue ? { id: state.activeIssue.id, title: state.activeIssue.title } : null,
11
+ subtask: state.currentSubtask
12
+ ? {
13
+ id: state.currentSubtask.id,
14
+ title: state.currentSubtask.title,
15
+ contract: state.currentSubtask.contract,
16
+ }
17
+ : null,
18
+ tier: state.activeIssue?.tier ?? "tier-3",
19
+ };
20
+ }
21
+ export function attachCurrentStateToCommit(commitRef = "HEAD", options = {}) {
22
+ const payload = buildStateNotePayload(options.cwd);
23
+ const serialized = JSON.stringify(payload, null, 2);
24
+ attachNote(serialized, commitRef, options);
25
+ return payload;
26
+ }
27
+ //# sourceMappingURL=attach.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attach.js","sourceRoot":"","sources":["../../src/notes/attach.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAoB,MAAM,YAAY,CAAC;AAgB1D,MAAM,UAAU,qBAAqB,CAAC,SAAS,GAAW,OAAO,CAAC,GAAG,EAAE;IACrE,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IAEnC,OAAO;QACL,OAAO,EAAE,2DAA2D;QACpE,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,OAAO;QAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI;QAC9F,OAAO,EAAE,KAAK,CAAC,cAAc;YAC3B,CAAC,CAAC;gBACE,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,EAAE;gBAC3B,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK;gBACjC,QAAQ,EAAE,KAAK,CAAC,cAAc,CAAC,QAAQ;aACxC;YACH,CAAC,CAAC,IAAI;QACR,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,IAAI,IAAI,QAAQ;KAC1C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,SAAS,GAAW,MAAM,EAC1B,OAAO,GAAgB,EAAE;IAEzB,MAAM,OAAO,GAAG,qBAAqB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACpD,UAAU,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC3C,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,14 @@
1
+ export declare const DEFAULT_NOTES_REF = "refs/notes/lognexus";
2
+ export interface NoteOptions {
3
+ ref?: string;
4
+ cwd?: string;
5
+ }
6
+ export declare function attachNote(content: string, commitRef?: string, options?: NoteOptions): void;
7
+ export declare function getNote(commitRef?: string, options?: NoteOptions): string | null;
8
+ export declare function listNotes(options?: NoteOptions): Array<{
9
+ commitSha: string;
10
+ noteBlob: string;
11
+ }>;
12
+ export declare function pushNotes(remote?: string, options?: NoteOptions): boolean;
13
+ export declare function fetchNotes(remote?: string, options?: NoteOptions): boolean;
14
+ //# sourceMappingURL=notes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notes.d.ts","sourceRoot":"","sources":["../../src/notes/notes.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,iBAAiB,wBAAwB,CAAC;AAEvD,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,EACf,SAAS,GAAE,MAAe,EAC1B,OAAO,GAAE,WAAgB,GACxB,IAAI,CAWN;AAED,wBAAgB,OAAO,CAAC,SAAS,GAAE,MAAe,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,GAAG,IAAI,CAc5F;AAED,wBAAgB,SAAS,CACvB,OAAO,GAAE,WAAgB,GACxB,KAAK,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAuBhD;AAED,wBAAgB,SAAS,CAAC,MAAM,GAAE,MAAiB,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAcvF;AAED,wBAAgB,UAAU,CAAC,MAAM,GAAE,MAAiB,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAcxF"}