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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/README.md +46 -3
  2. package/dist/audit/audit.d.ts +19 -0
  3. package/dist/audit/audit.d.ts.map +1 -0
  4. package/dist/audit/audit.js +168 -0
  5. package/dist/audit/audit.js.map +1 -0
  6. package/dist/cli.js +281 -4
  7. package/dist/cli.js.map +1 -1
  8. package/dist/doctor.d.ts.map +1 -1
  9. package/dist/doctor.js +1 -1
  10. package/dist/doctor.js.map +1 -1
  11. package/dist/index.d.ts +12 -1
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +12 -1
  14. package/dist/index.js.map +1 -1
  15. package/dist/mcp/prompts.d.ts +30 -0
  16. package/dist/mcp/prompts.d.ts.map +1 -0
  17. package/dist/mcp/prompts.js +150 -0
  18. package/dist/mcp/prompts.js.map +1 -0
  19. package/dist/mcp/resources.d.ts +25 -0
  20. package/dist/mcp/resources.d.ts.map +1 -0
  21. package/dist/mcp/resources.js +75 -0
  22. package/dist/mcp/resources.js.map +1 -0
  23. package/dist/mcp/server.d.ts +22 -0
  24. package/dist/mcp/server.d.ts.map +1 -0
  25. package/dist/mcp/server.js +202 -0
  26. package/dist/mcp/server.js.map +1 -0
  27. package/dist/mcp/tools.d.ts +26 -0
  28. package/dist/mcp/tools.d.ts.map +1 -0
  29. package/dist/mcp/tools.js +260 -0
  30. package/dist/mcp/tools.js.map +1 -0
  31. package/dist/notes/attach.d.ts +20 -0
  32. package/dist/notes/attach.d.ts.map +1 -0
  33. package/dist/notes/attach.js +27 -0
  34. package/dist/notes/attach.js.map +1 -0
  35. package/dist/notes/notes.d.ts +14 -0
  36. package/dist/notes/notes.d.ts.map +1 -0
  37. package/dist/notes/notes.js +82 -0
  38. package/dist/notes/notes.js.map +1 -0
  39. package/dist/scaffold.d.ts +1 -0
  40. package/dist/scaffold.d.ts.map +1 -1
  41. package/dist/scaffold.js +11 -11
  42. package/dist/scaffold.js.map +1 -1
  43. package/dist/state/manager.d.ts +9 -0
  44. package/dist/state/manager.d.ts.map +1 -0
  45. package/dist/state/manager.js +72 -0
  46. package/dist/state/manager.js.map +1 -0
  47. package/dist/state/schema.d.ts +111 -0
  48. package/dist/state/schema.d.ts.map +1 -0
  49. package/dist/state/schema.js +31 -0
  50. package/dist/state/schema.js.map +1 -0
  51. package/dist/state/sync.d.ts +8 -0
  52. package/dist/state/sync.d.ts.map +1 -0
  53. package/dist/state/sync.js +79 -0
  54. package/dist/state/sync.js.map +1 -0
  55. package/dist/timeline/timeline.d.ts +23 -0
  56. package/dist/timeline/timeline.d.ts.map +1 -0
  57. package/dist/timeline/timeline.js +257 -0
  58. package/dist/timeline/timeline.js.map +1 -0
  59. package/package.json +1 -1
@@ -0,0 +1,260 @@
1
+ import { auditBranch, formatAuditResult } from "../audit/audit.js";
2
+ import { attachCurrentStateToCommit } from "../notes/attach.js";
3
+ import { getNote } from "../notes/notes.js";
4
+ import { clearState, finishSubtask, loadState, setSubtask } from "../state/manager.js";
5
+ import { syncStateFromGit } from "../state/sync.js";
6
+ import { getProjectStatus } from "../status.js";
7
+ import { getJourneyTimeline } from "../timeline/timeline.js";
8
+ export const MCP_SERVER_NAME = "lognexus";
9
+ export class McpToolError extends Error {
10
+ constructor(message) {
11
+ super(message);
12
+ this.name = "McpToolError";
13
+ }
14
+ }
15
+ const TOOL_DEFINITIONS = [
16
+ {
17
+ name: "lognexus_status",
18
+ title: "LogNexus project status",
19
+ description: "Inspect the current Git branch, whether the directory is a Git repository, the active issue, the routing mode and the recommended model tier.",
20
+ inputSchema: {
21
+ type: "object",
22
+ properties: {},
23
+ },
24
+ },
25
+ {
26
+ name: "lognexus_state_get",
27
+ title: "Get agent state",
28
+ description: "Return the persistent LogNexus agent state (.lognexus/state.json): active issue, current subtask, completed subtasks and last synchronization timestamp.",
29
+ inputSchema: {
30
+ type: "object",
31
+ properties: {},
32
+ },
33
+ },
34
+ {
35
+ name: "lognexus_state_sync",
36
+ title: "Sync state from Git",
37
+ description: "Synchronize the persistent state from the current Git branch and GitHub metadata, then return the updated state.",
38
+ inputSchema: {
39
+ type: "object",
40
+ properties: {},
41
+ },
42
+ },
43
+ {
44
+ name: "lognexus_state_set_task",
45
+ title: "Set active subtask",
46
+ description: "Mark a subtask as in progress (equivalent to 'lognexus state set-task <id> [title]') and return the updated state.",
47
+ inputSchema: {
48
+ type: "object",
49
+ properties: {
50
+ taskId: {
51
+ type: "string",
52
+ description: "Subtask identifier, e.g. 'T1'.",
53
+ },
54
+ title: {
55
+ type: "string",
56
+ description: "Optional human-readable subtask title.",
57
+ },
58
+ },
59
+ required: ["taskId"],
60
+ },
61
+ },
62
+ {
63
+ name: "lognexus_state_finish_task",
64
+ title: "Finish subtask",
65
+ description: "Mark a subtask as completed (equivalent to 'lognexus state finish-task <id>') and return the updated state.",
66
+ inputSchema: {
67
+ type: "object",
68
+ properties: {
69
+ taskId: {
70
+ type: "string",
71
+ description: "Subtask identifier, e.g. 'T1'.",
72
+ },
73
+ },
74
+ required: ["taskId"],
75
+ },
76
+ },
77
+ {
78
+ name: "lognexus_state_clear",
79
+ title: "Clear agent state",
80
+ description: "Reset the persistent LogNexus agent state to empty (equivalent to 'lognexus state clear').",
81
+ inputSchema: {
82
+ type: "object",
83
+ properties: {},
84
+ },
85
+ },
86
+ {
87
+ name: "lognexus_note_show",
88
+ title: "Show Git Note",
89
+ description: "Read the LogNexus Git Note (refs/notes/lognexus) attached to a commit and return its parsed JSON payload. Defaults to HEAD.",
90
+ inputSchema: {
91
+ type: "object",
92
+ properties: {
93
+ commitRef: {
94
+ type: "string",
95
+ description: "Git commit reference (SHA, branch, tag or HEAD). Defaults to HEAD.",
96
+ },
97
+ },
98
+ },
99
+ },
100
+ {
101
+ name: "lognexus_note_attach",
102
+ title: "Attach Git Note",
103
+ description: "Attach the current LogNexus state as a Git Note (refs/notes/lognexus) to a commit. Defaults to HEAD.",
104
+ inputSchema: {
105
+ type: "object",
106
+ properties: {
107
+ commitRef: {
108
+ type: "string",
109
+ description: "Git commit reference (SHA, branch, tag or HEAD). Defaults to HEAD.",
110
+ },
111
+ },
112
+ },
113
+ },
114
+ {
115
+ name: "lognexus_timeline",
116
+ title: "Journey Timeline",
117
+ description: "Reconstruct the branch Journey Timeline against a base branch: commit list enriched with Git Notes, subtask IDs, tiers and Authored-by/Reviewed-by trailers, rendered as a Markdown table, JSON or a PR body draft.",
118
+ inputSchema: {
119
+ type: "object",
120
+ properties: {
121
+ baseBranch: {
122
+ type: "string",
123
+ description: "Base branch to compare against. Defaults to 'main' with origin fallback.",
124
+ },
125
+ format: {
126
+ type: "string",
127
+ enum: ["table", "json", "pr-body"],
128
+ description: "Output format. Defaults to 'table'.",
129
+ },
130
+ },
131
+ },
132
+ },
133
+ {
134
+ name: "lognexus_audit",
135
+ title: "Traceability audit",
136
+ description: "Audit the branch commits against the LogNexus review gate: commit format, Authored-by trailer, Git Note presence, subtask file contracts and reviewer/author separation.",
137
+ inputSchema: {
138
+ type: "object",
139
+ properties: {
140
+ baseBranch: {
141
+ type: "string",
142
+ description: "Base branch to compare against. Defaults to 'main' with origin fallback.",
143
+ },
144
+ },
145
+ },
146
+ },
147
+ ];
148
+ export function listMcpTools() {
149
+ return TOOL_DEFINITIONS;
150
+ }
151
+ export function isKnownTool(name) {
152
+ return TOOL_DEFINITIONS.some((tool) => tool.name === name);
153
+ }
154
+ function textResult(value) {
155
+ const text = typeof value === "string" ? value : JSON.stringify(value, null, 2);
156
+ return { content: [{ type: "text", text }] };
157
+ }
158
+ function errorResult(message) {
159
+ return { content: [{ type: "text", text: message }], isError: true };
160
+ }
161
+ function readStringArg(args, key, options = {}) {
162
+ const value = args[key];
163
+ if (value === undefined || value === null) {
164
+ if (options.required) {
165
+ throw new McpToolError(`Missing required argument: '${key}'.`);
166
+ }
167
+ return undefined;
168
+ }
169
+ if (typeof value !== "string") {
170
+ throw new McpToolError(`Argument '${key}' must be a string.`);
171
+ }
172
+ const trimmed = value.trim();
173
+ if (trimmed === "") {
174
+ if (options.required) {
175
+ throw new McpToolError(`Argument '${key}' must be a non-empty string.`);
176
+ }
177
+ return undefined;
178
+ }
179
+ return trimmed;
180
+ }
181
+ function resolveCommitRef(args) {
182
+ return readStringArg(args, "commitRef") ?? "HEAD";
183
+ }
184
+ const TIMELINE_FORMATS = ["table", "json", "pr-body"];
185
+ function resolveTimelineFormat(args) {
186
+ const raw = readStringArg(args, "format");
187
+ if (raw === undefined)
188
+ return "table";
189
+ if (!TIMELINE_FORMATS.includes(raw)) {
190
+ throw new McpToolError(`Argument 'format' must be one of: ${TIMELINE_FORMATS.join(", ")}. Got '${raw}'.`);
191
+ }
192
+ return raw;
193
+ }
194
+ function resolveBaseBranch(args) {
195
+ return readStringArg(args, "baseBranch") ?? "main";
196
+ }
197
+ export async function callMcpTool(name, args = {}, targetDir = process.cwd()) {
198
+ try {
199
+ switch (name) {
200
+ case "lognexus_status":
201
+ return textResult(getProjectStatus(targetDir));
202
+ case "lognexus_state_get":
203
+ return textResult(loadState(targetDir));
204
+ case "lognexus_state_sync":
205
+ return textResult(syncStateFromGit(targetDir));
206
+ case "lognexus_state_set_task": {
207
+ const taskId = readStringArg(args, "taskId", { required: true });
208
+ const title = readStringArg(args, "title") ?? "";
209
+ return textResult(setSubtask(taskId, title, undefined, targetDir));
210
+ }
211
+ case "lognexus_state_finish_task": {
212
+ const taskId = readStringArg(args, "taskId", { required: true });
213
+ return textResult(finishSubtask(taskId, targetDir));
214
+ }
215
+ case "lognexus_state_clear": {
216
+ const cleared = clearState(targetDir);
217
+ return {
218
+ content: [
219
+ { type: "text", text: "LogNexus state cleared." },
220
+ { type: "text", text: JSON.stringify(cleared, null, 2) },
221
+ ],
222
+ };
223
+ }
224
+ case "lognexus_note_show": {
225
+ const commitRef = resolveCommitRef(args);
226
+ const note = getNote(commitRef, { cwd: targetDir });
227
+ if (note === null) {
228
+ return errorResult(`No LogNexus note found for commit '${commitRef}'.`);
229
+ }
230
+ return textResult(note);
231
+ }
232
+ case "lognexus_note_attach": {
233
+ const commitRef = resolveCommitRef(args);
234
+ return textResult(attachCurrentStateToCommit(commitRef, { cwd: targetDir }));
235
+ }
236
+ case "lognexus_timeline": {
237
+ const baseBranch = resolveBaseBranch(args);
238
+ const format = resolveTimelineFormat(args);
239
+ const timeline = getJourneyTimeline(baseBranch, targetDir);
240
+ if (format === "json")
241
+ return textResult(timeline);
242
+ if (format === "pr-body")
243
+ return textResult(timeline.prBodyDraft);
244
+ return textResult(timeline.markdownTable);
245
+ }
246
+ case "lognexus_audit": {
247
+ const baseBranch = resolveBaseBranch(args);
248
+ const result = auditBranch(baseBranch, targetDir);
249
+ return textResult(`${JSON.stringify(result, null, 2)}\n\n${formatAuditResult(result)}`);
250
+ }
251
+ default:
252
+ return errorResult(`Unknown LogNexus tool: '${name}'.`);
253
+ }
254
+ }
255
+ catch (error) {
256
+ const message = error instanceof Error ? error.message : String(error);
257
+ return errorResult(`Tool '${name}' failed: ${message}`);
258
+ }
259
+ }
260
+ //# 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"}
@@ -0,0 +1,82 @@
1
+ import { execSync } from "node:child_process";
2
+ export const DEFAULT_NOTES_REF = "refs/notes/lognexus";
3
+ export function attachNote(content, commitRef = "HEAD", options = {}) {
4
+ const ref = options.ref ?? DEFAULT_NOTES_REF;
5
+ const cwd = options.cwd ?? process.cwd();
6
+ // Pass note content via stdin (-F -) for 100% reliable cross-platform escaping
7
+ execSync(`git notes --ref="${ref}" add -f -F - ${commitRef}`, {
8
+ input: content,
9
+ cwd,
10
+ encoding: "utf8",
11
+ stdio: ["pipe", "pipe", "pipe"],
12
+ });
13
+ }
14
+ export function getNote(commitRef = "HEAD", options = {}) {
15
+ const ref = options.ref ?? DEFAULT_NOTES_REF;
16
+ const cwd = options.cwd ?? process.cwd();
17
+ try {
18
+ const output = execSync(`git notes --ref="${ref}" show ${commitRef}`, {
19
+ cwd,
20
+ encoding: "utf8",
21
+ stdio: ["pipe", "pipe", "pipe"],
22
+ });
23
+ return output.trim();
24
+ }
25
+ catch {
26
+ return null;
27
+ }
28
+ }
29
+ export function listNotes(options = {}) {
30
+ const ref = options.ref ?? DEFAULT_NOTES_REF;
31
+ const cwd = options.cwd ?? process.cwd();
32
+ try {
33
+ const raw = execSync(`git notes --ref="${ref}" list`, {
34
+ cwd,
35
+ encoding: "utf8",
36
+ stdio: ["pipe", "pipe", "pipe"],
37
+ }).trim();
38
+ if (!raw)
39
+ return [];
40
+ return raw.split("\n").map((line) => {
41
+ const parts = line.trim().split(/\s+/);
42
+ return {
43
+ noteBlob: parts[0],
44
+ commitSha: parts[1],
45
+ };
46
+ });
47
+ }
48
+ catch {
49
+ return [];
50
+ }
51
+ }
52
+ export function pushNotes(remote = "origin", options = {}) {
53
+ const ref = options.ref ?? DEFAULT_NOTES_REF;
54
+ const cwd = options.cwd ?? process.cwd();
55
+ try {
56
+ execSync(`git push ${remote} ${ref}`, {
57
+ cwd,
58
+ encoding: "utf8",
59
+ stdio: ["pipe", "pipe", "pipe"],
60
+ });
61
+ return true;
62
+ }
63
+ catch {
64
+ return false;
65
+ }
66
+ }
67
+ export function fetchNotes(remote = "origin", options = {}) {
68
+ const ref = options.ref ?? DEFAULT_NOTES_REF;
69
+ const cwd = options.cwd ?? process.cwd();
70
+ try {
71
+ execSync(`git fetch ${remote} ${ref}:${ref}`, {
72
+ cwd,
73
+ encoding: "utf8",
74
+ stdio: ["pipe", "pipe", "pipe"],
75
+ });
76
+ return true;
77
+ }
78
+ catch {
79
+ return false;
80
+ }
81
+ }
82
+ //# sourceMappingURL=notes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notes.js","sourceRoot":"","sources":["../../src/notes/notes.ts"],"names":[],"mappings":"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"}
@@ -2,5 +2,6 @@ export interface InitResult {
2
2
  created: string[];
3
3
  skipped: string[];
4
4
  }
5
+ export declare const DEFAULT_ROUTING_TEMPLATE = "# Model-Tier Routing Configuration\n\n# Modes: confirm (pause and prompt) | warn (banner only) | off (silent)\nrouting: confirm\n\n# Operational Tier Taxonomy (Advisory across Claude, OpenAI, Gemini, DeepSeek)\n# tier-1 (Reasoning / Arch / Review): Claude Opus, OpenAI o3/GPT, Gemini Pro, DeepSeek R1\n# tier-2 (Context / Triage / Discovery): Claude Sonnet, GPT-4.1, Gemini Flash/Pro (1M), DeepSeek V3\n# tier-3 (Scoped Execution / Commits): Claude Haiku, GPT-4o-mini, DeepSeek Chat (V3), Gemini Flash\n";
5
6
  export declare function initProject(targetDir?: string): InitResult;
6
7
  //# sourceMappingURL=scaffold.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAgB,WAAW,CAAC,SAAS,GAAE,MAAsB,GAAG,UAAU,CA8BzE"}
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,eAAO,MAAM,wBAAwB,4fASpC,CAAC;AAEF,wBAAgB,WAAW,CAAC,SAAS,GAAE,MAAsB,GAAG,UAAU,CAoBzE"}
package/dist/scaffold.js CHANGED
@@ -1,5 +1,15 @@
1
1
  import { existsSync, mkdirSync, writeFileSync } from "node:fs";
2
2
  import { join } from "node:path";
3
+ export const DEFAULT_ROUTING_TEMPLATE = `# Model-Tier Routing Configuration
4
+
5
+ # Modes: confirm (pause and prompt) | warn (banner only) | off (silent)
6
+ routing: confirm
7
+
8
+ # Operational Tier Taxonomy (Advisory across Claude, OpenAI, Gemini, DeepSeek)
9
+ # tier-1 (Reasoning / Arch / Review): Claude Opus, OpenAI o3/GPT, Gemini Pro, DeepSeek R1
10
+ # tier-2 (Context / Triage / Discovery): Claude Sonnet, GPT-4.1, Gemini Flash/Pro (1M), DeepSeek V3
11
+ # tier-3 (Scoped Execution / Commits): Claude Haiku, GPT-4o-mini, DeepSeek Chat (V3), Gemini Flash
12
+ `;
3
13
  export function initProject(targetDir = process.cwd()) {
4
14
  const result = { created: [], skipped: [] };
5
15
  const lognexusDir = join(targetDir, ".lognexus");
@@ -12,17 +22,7 @@ export function initProject(targetDir = process.cwd()) {
12
22
  }
13
23
  const routingPath = join(lognexusDir, "routing.md");
14
24
  if (!existsSync(routingPath)) {
15
- const routingContent = `# Model-Tier Routing Configuration
16
-
17
- # Modes: confirm (pause and prompt) | warn (banner only) | off (silent)
18
- routing: confirm
19
-
20
- # Operational Tier Taxonomy (Advisory across Claude, OpenAI, Gemini, DeepSeek)
21
- # tier-1 (Reasoning / Arch / Review): Claude Opus, OpenAI o3/GPT, Gemini Pro, DeepSeek R1
22
- # tier-2 (Context / Triage / Discovery): Claude Sonnet, GPT-4.1, Gemini Flash/Pro (1M), DeepSeek V3
23
- # tier-3 (Scoped Execution / Commits): Claude Haiku, GPT-4o-mini, DeepSeek Chat (V3), Gemini Flash
24
- `;
25
- writeFileSync(routingPath, routingContent, "utf8");
25
+ writeFileSync(routingPath, DEFAULT_ROUTING_TEMPLATE, "utf8");
26
26
  result.created.push(".lognexus/routing.md");
27
27
  }
28
28
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAOjC,MAAM,UAAU,WAAW,CAAC,SAAS,GAAW,OAAO,CAAC,GAAG,EAAE;IAC3D,MAAM,MAAM,GAAe,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACxD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAEjD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACpD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,MAAM,cAAc,GAAG;;;;;;;;;CAS1B,CAAC;QACE,aAAa,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;QACnD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC9C,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAOjC,MAAM,CAAC,MAAM,wBAAwB,GAAG;;;;;;;;;CASvC,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,SAAS,GAAW,OAAO,CAAC,GAAG,EAAE;IAC3D,MAAM,MAAM,GAAe,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACxD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAEjD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACpD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,aAAa,CAAC,WAAW,EAAE,wBAAwB,EAAE,MAAM,CAAC,CAAC;QAC7D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC9C,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type LognexusState, type SubtaskContract } from "./schema.js";
2
+ export declare function getStatePath(targetDir?: string): string;
3
+ export declare function createEmptyState(): LognexusState;
4
+ export declare function loadState(targetDir?: string): LognexusState;
5
+ export declare function saveState(state: LognexusState, targetDir?: string): void;
6
+ export declare function clearState(targetDir?: string): LognexusState;
7
+ export declare function setSubtask(taskId: string, title?: string, contract?: SubtaskContract, targetDir?: string): LognexusState;
8
+ export declare function finishSubtask(taskId: string, targetDir?: string): LognexusState;
9
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/state/manager.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,aAAa,EAElB,KAAK,eAAe,EAErB,MAAM,aAAa,CAAC;AAErB,wBAAgB,YAAY,CAAC,SAAS,GAAE,MAAsB,GAAG,MAAM,CAEtE;AAED,wBAAgB,gBAAgB,IAAI,aAAa,CAQhD;AAED,wBAAgB,SAAS,CAAC,SAAS,GAAE,MAAsB,GAAG,aAAa,CAkB1E;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,aAAa,EAAE,SAAS,GAAE,MAAsB,GAAG,IAAI,CAUvF;AAED,wBAAgB,UAAU,CAAC,SAAS,GAAE,MAAsB,GAAG,aAAa,CAI3E;AAED,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAW,EAClB,QAAQ,CAAC,EAAE,eAAe,EAC1B,SAAS,GAAE,MAAsB,GAChC,aAAa,CAWf;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,MAAsB,GAAG,aAAa,CAU9F"}
@@ -0,0 +1,72 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { LognexusStateSchema, } from "./schema.js";
4
+ export function getStatePath(targetDir = process.cwd()) {
5
+ return join(targetDir, ".lognexus", "state.json");
6
+ }
7
+ export function createEmptyState() {
8
+ return {
9
+ schemaVersion: "1.0.0",
10
+ activeIssue: null,
11
+ currentSubtask: null,
12
+ completedSubtasks: [],
13
+ lastSync: new Date().toISOString(),
14
+ };
15
+ }
16
+ export function loadState(targetDir = process.cwd()) {
17
+ const filePath = getStatePath(targetDir);
18
+ if (!existsSync(filePath)) {
19
+ return createEmptyState();
20
+ }
21
+ try {
22
+ const raw = readFileSync(filePath, "utf8");
23
+ const json = JSON.parse(raw);
24
+ const parsed = LognexusStateSchema.safeParse(json);
25
+ if (parsed.success) {
26
+ return parsed.data;
27
+ }
28
+ return createEmptyState();
29
+ }
30
+ catch {
31
+ return createEmptyState();
32
+ }
33
+ }
34
+ export function saveState(state, targetDir = process.cwd()) {
35
+ const dirPath = join(targetDir, ".lognexus");
36
+ if (!existsSync(dirPath)) {
37
+ mkdirSync(dirPath, { recursive: true });
38
+ }
39
+ state.lastSync = new Date().toISOString();
40
+ const validated = LognexusStateSchema.parse(state);
41
+ const filePath = getStatePath(targetDir);
42
+ writeFileSync(filePath, JSON.stringify(validated, null, 2), "utf8");
43
+ }
44
+ export function clearState(targetDir = process.cwd()) {
45
+ const empty = createEmptyState();
46
+ saveState(empty, targetDir);
47
+ return empty;
48
+ }
49
+ export function setSubtask(taskId, title = "", contract, targetDir = process.cwd()) {
50
+ const state = loadState(targetDir);
51
+ const subtask = {
52
+ id: taskId,
53
+ title,
54
+ status: "in-progress",
55
+ contract,
56
+ };
57
+ state.currentSubtask = subtask;
58
+ saveState(state, targetDir);
59
+ return state;
60
+ }
61
+ export function finishSubtask(taskId, targetDir = process.cwd()) {
62
+ const state = loadState(targetDir);
63
+ if (!state.completedSubtasks.includes(taskId)) {
64
+ state.completedSubtasks.push(taskId);
65
+ }
66
+ if (state.currentSubtask?.id === taskId) {
67
+ state.currentSubtask = null;
68
+ }
69
+ saveState(state, targetDir);
70
+ return state;
71
+ }
72
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/state/manager.ts"],"names":[],"mappings":"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"}