orbitmap 0.1.0

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 (114) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +200 -0
  3. package/dist/api-client.d.ts +234 -0
  4. package/dist/api-client.js +401 -0
  5. package/dist/api-client.js.map +1 -0
  6. package/dist/commands/agents.d.ts +3 -0
  7. package/dist/commands/agents.js +44 -0
  8. package/dist/commands/agents.js.map +1 -0
  9. package/dist/commands/assign.d.ts +5 -0
  10. package/dist/commands/assign.js +44 -0
  11. package/dist/commands/assign.js.map +1 -0
  12. package/dist/commands/context.d.ts +4 -0
  13. package/dist/commands/context.js +37 -0
  14. package/dist/commands/context.js.map +1 -0
  15. package/dist/commands/create.d.ts +12 -0
  16. package/dist/commands/create.js +54 -0
  17. package/dist/commands/create.js.map +1 -0
  18. package/dist/commands/dep.d.ts +11 -0
  19. package/dist/commands/dep.js +56 -0
  20. package/dist/commands/dep.js.map +1 -0
  21. package/dist/commands/doc-import.d.ts +9 -0
  22. package/dist/commands/doc-import.js +97 -0
  23. package/dist/commands/doc-import.js.map +1 -0
  24. package/dist/commands/doc-patch.d.ts +16 -0
  25. package/dist/commands/doc-patch.js +142 -0
  26. package/dist/commands/doc-patch.js.map +1 -0
  27. package/dist/commands/doc-share.d.ts +14 -0
  28. package/dist/commands/doc-share.js +60 -0
  29. package/dist/commands/doc-share.js.map +1 -0
  30. package/dist/commands/doc-update.d.ts +6 -0
  31. package/dist/commands/doc-update.js +64 -0
  32. package/dist/commands/doc-update.js.map +1 -0
  33. package/dist/commands/doc.d.ts +6 -0
  34. package/dist/commands/doc.js +108 -0
  35. package/dist/commands/doc.js.map +1 -0
  36. package/dist/commands/docs-cache.d.ts +11 -0
  37. package/dist/commands/docs-cache.js +119 -0
  38. package/dist/commands/docs-cache.js.map +1 -0
  39. package/dist/commands/docs.d.ts +6 -0
  40. package/dist/commands/docs.js +35 -0
  41. package/dist/commands/docs.js.map +1 -0
  42. package/dist/commands/get.d.ts +8 -0
  43. package/dist/commands/get.js +102 -0
  44. package/dist/commands/get.js.map +1 -0
  45. package/dist/commands/ideas.d.ts +23 -0
  46. package/dist/commands/ideas.js +155 -0
  47. package/dist/commands/ideas.js.map +1 -0
  48. package/dist/commands/init.d.ts +7 -0
  49. package/dist/commands/init.js +175 -0
  50. package/dist/commands/init.js.map +1 -0
  51. package/dist/commands/issues.d.ts +32 -0
  52. package/dist/commands/issues.js +206 -0
  53. package/dist/commands/issues.js.map +1 -0
  54. package/dist/commands/log.d.ts +6 -0
  55. package/dist/commands/log.js +47 -0
  56. package/dist/commands/log.js.map +1 -0
  57. package/dist/commands/login.d.ts +3 -0
  58. package/dist/commands/login.js +48 -0
  59. package/dist/commands/login.js.map +1 -0
  60. package/dist/commands/logout.d.ts +1 -0
  61. package/dist/commands/logout.js +13 -0
  62. package/dist/commands/logout.js.map +1 -0
  63. package/dist/commands/orbit.d.ts +18 -0
  64. package/dist/commands/orbit.js +159 -0
  65. package/dist/commands/orbit.js.map +1 -0
  66. package/dist/commands/overview.d.ts +4 -0
  67. package/dist/commands/overview.js +56 -0
  68. package/dist/commands/overview.js.map +1 -0
  69. package/dist/commands/projects.d.ts +3 -0
  70. package/dist/commands/projects.js +28 -0
  71. package/dist/commands/projects.js.map +1 -0
  72. package/dist/commands/setup-agent.d.ts +3 -0
  73. package/dist/commands/setup-agent.js +178 -0
  74. package/dist/commands/setup-agent.js.map +1 -0
  75. package/dist/commands/start.d.ts +4 -0
  76. package/dist/commands/start.js +38 -0
  77. package/dist/commands/start.js.map +1 -0
  78. package/dist/commands/status.d.ts +5 -0
  79. package/dist/commands/status.js +54 -0
  80. package/dist/commands/status.js.map +1 -0
  81. package/dist/commands/subtask.d.ts +7 -0
  82. package/dist/commands/subtask.js +26 -0
  83. package/dist/commands/subtask.js.map +1 -0
  84. package/dist/commands/task-edit-content.d.ts +7 -0
  85. package/dist/commands/task-edit-content.js +45 -0
  86. package/dist/commands/task-edit-content.js.map +1 -0
  87. package/dist/commands/task.d.ts +66 -0
  88. package/dist/commands/task.js +92 -0
  89. package/dist/commands/task.js.map +1 -0
  90. package/dist/commands/tasks.d.ts +7 -0
  91. package/dist/commands/tasks.js +35 -0
  92. package/dist/commands/tasks.js.map +1 -0
  93. package/dist/commands/vibes.d.ts +27 -0
  94. package/dist/commands/vibes.js +142 -0
  95. package/dist/commands/vibes.js.map +1 -0
  96. package/dist/config.d.ts +14 -0
  97. package/dist/config.js +34 -0
  98. package/dist/config.js.map +1 -0
  99. package/dist/doc-cache.d.ts +24 -0
  100. package/dist/doc-cache.js +116 -0
  101. package/dist/doc-cache.js.map +1 -0
  102. package/dist/errors.d.ts +16 -0
  103. package/dist/errors.js +26 -0
  104. package/dist/errors.js.map +1 -0
  105. package/dist/index.d.ts +2 -0
  106. package/dist/index.js +705 -0
  107. package/dist/index.js.map +1 -0
  108. package/dist/oauth.d.ts +42 -0
  109. package/dist/oauth.js +207 -0
  110. package/dist/oauth.js.map +1 -0
  111. package/dist/output.d.ts +4 -0
  112. package/dist/output.js +66 -0
  113. package/dist/output.js.map +1 -0
  114. package/package.json +50 -0
@@ -0,0 +1,45 @@
1
+ import { createClient } from '../api-client.js';
2
+ import { formatOutput, printError, printSuccess } from '../output.js';
3
+ export async function taskEditContentCommand(taskId, options) {
4
+ if (!options.title && !options.description && !options.agentInstructions) {
5
+ const msg = 'At least one of --title, --description, or --agent-instructions must be provided.';
6
+ if (options.json) {
7
+ console.error(JSON.stringify({ error: { message: msg } }));
8
+ }
9
+ else {
10
+ console.error(`Error: ${msg}`);
11
+ }
12
+ process.exitCode = 1;
13
+ return;
14
+ }
15
+ try {
16
+ const client = await createClient(options.project);
17
+ const body = {};
18
+ if (options.title)
19
+ body.title = options.title;
20
+ if (options.description)
21
+ body.description = options.description;
22
+ if (options.agentInstructions)
23
+ body.agent_instructions = options.agentInstructions;
24
+ const response = (await client.editTaskContent(taskId, body));
25
+ if (options.json) {
26
+ console.log(formatOutput(response, true));
27
+ return;
28
+ }
29
+ const fields = response.data.updated_fields?.join(', ') ?? Object.keys(body).join(', ');
30
+ printSuccess(`Task content updated (${fields}).`, false);
31
+ const task = response.data.task;
32
+ if (task) {
33
+ console.log(`\nTitle: ${task.title}`);
34
+ if (task.description)
35
+ console.log(`Description: ${task.description}`);
36
+ if (task.agent_instructions)
37
+ console.log(`Agent Instructions: ${task.agent_instructions}`);
38
+ }
39
+ }
40
+ catch (error) {
41
+ printError(error, options.json);
42
+ process.exitCode = 1;
43
+ }
44
+ }
45
+ //# sourceMappingURL=task-edit-content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-edit-content.js","sourceRoot":"","sources":["../../src/commands/task-edit-content.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAetE,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAAc,EACd,OAMC;IAED,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;QACzE,MAAM,GAAG,GAAG,mFAAmF,CAAC;QAChG,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAEnD,MAAM,IAAI,GAA0E,EAAE,CAAC;QACvF,IAAI,OAAO,CAAC,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC9C,IAAI,OAAO,CAAC,WAAW;YAAE,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QAChE,IAAI,OAAO,CAAC,iBAAiB;YAAE,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;QAEnF,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAwB,CAAC;QAErF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxF,YAAY,CAAC,yBAAyB,MAAM,IAAI,EAAE,KAAK,CAAC,CAAC;QAEzD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAChC,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YACtC,IAAI,IAAI,CAAC,WAAW;gBAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACtE,IAAI,IAAI,CAAC,kBAAkB;gBAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -0,0 +1,66 @@
1
+ interface DocEntry {
2
+ id: string;
3
+ title: string;
4
+ slug: string;
5
+ type: string;
6
+ _shared: boolean;
7
+ _workspace?: boolean;
8
+ context?: string | null;
9
+ sections_count?: number;
10
+ }
11
+ interface TaskDetailResponse {
12
+ data: {
13
+ task: {
14
+ id: string;
15
+ project_id: string;
16
+ parent_task_id: string | null;
17
+ agent_id: string | null;
18
+ title: string;
19
+ description: string | null;
20
+ status: string;
21
+ priority: string;
22
+ delivery_status: string | null;
23
+ agent_instructions: string | null;
24
+ branch_name: string | null;
25
+ sort_order: number;
26
+ estimated_effort: string | null;
27
+ created_at: string;
28
+ updated_at: string;
29
+ task_number: string;
30
+ display_number: string;
31
+ };
32
+ logs: Array<{
33
+ id: string;
34
+ type: string;
35
+ content: string;
36
+ metadata: Record<string, unknown>;
37
+ created_at: string;
38
+ }>;
39
+ subtasks: Array<{
40
+ id: string;
41
+ title: string;
42
+ status: string;
43
+ priority: string;
44
+ sort_order: number;
45
+ }>;
46
+ project: {
47
+ name: string;
48
+ git_url: string | null;
49
+ default_branch: string;
50
+ agent_instructions_template: string | null;
51
+ workspace?: {
52
+ id: string;
53
+ name: string;
54
+ slug: string;
55
+ } | null;
56
+ };
57
+ available_docs: DocEntry[];
58
+ workspace_knowledge?: DocEntry[];
59
+ };
60
+ }
61
+ export declare function printTaskDetail(response: TaskDetailResponse): void;
62
+ export declare function taskCommand(idOrNumber: string, options: {
63
+ json: boolean;
64
+ project?: string;
65
+ }): Promise<void>;
66
+ export {};
@@ -0,0 +1,92 @@
1
+ import { createClient } from '../api-client.js';
2
+ import { formatOutput, printError, formatTable } from '../output.js';
3
+ function isObjectNumber(id) {
4
+ return /^([A-Z]{2}-)?[a-z0-9]{6}$/.test(id);
5
+ }
6
+ function stripPrefix(id) {
7
+ return id.replace(/^[A-Z]{2}-/, '');
8
+ }
9
+ function formatDocLine(d) {
10
+ let line = `${d.title} (${d.type}`;
11
+ if (d.sections_count !== undefined)
12
+ line += `, ${d.sections_count} sections`;
13
+ line += ')';
14
+ if (d.context)
15
+ line += ` — ${d.context}`;
16
+ return line;
17
+ }
18
+ export function printTaskDetail(response) {
19
+ const { task, logs, subtasks, project, available_docs, workspace_knowledge } = response.data;
20
+ const displayNum = task.display_number ?? task.task_number;
21
+ console.log(`Task: ${task.title} [${displayNum}]`);
22
+ console.log(`Status: ${task.status} Priority: ${task.priority}`);
23
+ if (task.delivery_status)
24
+ console.log(`Delivery: ${task.delivery_status}`);
25
+ if (task.branch_name)
26
+ console.log(`Branch: ${task.branch_name}`);
27
+ if (task.estimated_effort)
28
+ console.log(`Effort: ${task.estimated_effort}`);
29
+ // Show project with optional workspace info
30
+ if (project.workspace) {
31
+ console.log(`Project: ${project.name} (workspace: ${project.workspace.name})`);
32
+ }
33
+ else {
34
+ console.log(`Project: ${project.name}`);
35
+ }
36
+ if (task.description) {
37
+ console.log(`\nDescription:\n${task.description}`);
38
+ }
39
+ if (task.agent_instructions) {
40
+ console.log(`\nAgent Instructions:\n${task.agent_instructions}`);
41
+ }
42
+ if (subtasks.length > 0) {
43
+ console.log(`\nSubtasks (${subtasks.length}):`);
44
+ console.log(formatTable(['#', 'Title', 'Status', 'Priority'], subtasks.map((s, i) => [
45
+ String(i + 1),
46
+ s.title,
47
+ s.status,
48
+ s.priority,
49
+ ])));
50
+ }
51
+ if (logs.length > 0) {
52
+ console.log(`\nLogs (${logs.length}):`);
53
+ for (const log of logs) {
54
+ const ts = log.created_at.replace('T', ' ').replace(/\+.*$/, '');
55
+ console.log(` [${log.type}] ${ts} — ${log.content}`);
56
+ }
57
+ }
58
+ if (available_docs.length > 0) {
59
+ console.log(`\nProject Knowledge (${available_docs.length}):`);
60
+ for (const d of available_docs) {
61
+ console.log(` - ${formatDocLine(d)}`);
62
+ }
63
+ }
64
+ if (workspace_knowledge && workspace_knowledge.length > 0) {
65
+ console.log(`\nWorkspace Knowledge (${workspace_knowledge.length}):`);
66
+ for (const d of workspace_knowledge) {
67
+ console.log(` - ${formatDocLine(d)}`);
68
+ }
69
+ }
70
+ }
71
+ export async function taskCommand(idOrNumber, options) {
72
+ try {
73
+ const client = await createClient(options.project);
74
+ let response;
75
+ if (isObjectNumber(idOrNumber)) {
76
+ response = (await client.getTaskByNumber(stripPrefix(idOrNumber)));
77
+ }
78
+ else {
79
+ response = (await client.getTask(idOrNumber));
80
+ }
81
+ if (options.json) {
82
+ console.log(formatOutput(response, true));
83
+ return;
84
+ }
85
+ printTaskDetail(response);
86
+ }
87
+ catch (error) {
88
+ printError(error, options.json);
89
+ process.exitCode = 1;
90
+ }
91
+ }
92
+ //# sourceMappingURL=task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/commands/task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAgErE,SAAS,cAAc,CAAC,EAAU;IAChC,OAAO,2BAA2B,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,WAAW,CAAC,EAAU;IAC7B,OAAO,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,aAAa,CAAC,CAAW;IAChC,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC,CAAC,cAAc,KAAK,SAAS;QAAE,IAAI,IAAI,KAAK,CAAC,CAAC,cAAc,WAAW,CAAC;IAC7E,IAAI,IAAI,GAAG,CAAC;IACZ,IAAI,CAAC,CAAC,OAAO;QAAE,IAAI,IAAI,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;IACzC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAA4B;IAC1D,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC;IAE7F,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,WAAW,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,KAAK,KAAK,UAAU,GAAG,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,MAAM,eAAe,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAClE,IAAI,IAAI,CAAC,eAAe;QAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;IAC3E,IAAI,IAAI,CAAC,WAAW;QAAE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACjE,IAAI,IAAI,CAAC,gBAAgB;QAAE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAE3E,4CAA4C;IAC5C,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,IAAI,gBAAgB,OAAO,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC;IACjF,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,eAAe,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CACT,WAAW,CACT,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,EACpC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACrB,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;YACb,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,QAAQ;SACX,CAAC,CACH,CACF,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QACxC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,EAAE,GAAG,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACjE,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,EAAE,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,wBAAwB,cAAc,CAAC,MAAM,IAAI,CAAC,CAAC;QAC/D,KAAK,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,IAAI,mBAAmB,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,0BAA0B,mBAAmB,CAAC,MAAM,IAAI,CAAC,CAAC;QACtE,KAAK,MAAM,CAAC,IAAI,mBAAmB,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,UAAkB,EAClB,OAA4C;IAE5C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,QAA4B,CAAC;QAEjC,IAAI,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,eAAe,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAuB,CAAC;QAC3F,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAuB,CAAC;QACtE,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;QAED,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function tasksCommand(options: {
2
+ json: boolean;
3
+ project?: string;
4
+ status?: string;
5
+ priority?: string;
6
+ orbit?: string;
7
+ }): Promise<void>;
@@ -0,0 +1,35 @@
1
+ import { createClient } from '../api-client.js';
2
+ import { formatOutput, printError, formatTable } from '../output.js';
3
+ export async function tasksCommand(options) {
4
+ try {
5
+ const client = await createClient(options.project);
6
+ const response = (await client.getTasks({
7
+ status: options.status,
8
+ priority: options.priority,
9
+ orbit: options.orbit,
10
+ }));
11
+ if (options.json) {
12
+ console.log(formatOutput(response, true));
13
+ return;
14
+ }
15
+ const tasks = response.data;
16
+ if (tasks.length === 0) {
17
+ console.log('No tasks found.');
18
+ return;
19
+ }
20
+ console.log(`Tasks (${response.meta.count}):\n`);
21
+ const hasDelivery = tasks.some((t) => t.delivery_status);
22
+ const headers = hasDelivery
23
+ ? ['#', 'Title', 'Status', 'Delivery', 'Priority', 'Effort']
24
+ : ['#', 'Title', 'Status', 'Priority', 'Effort'];
25
+ const rows = tasks.map((t) => hasDelivery
26
+ ? [t.display_number ?? t.task_number, t.title, t.status, t.delivery_status ?? '', t.priority, t.estimated_effort ?? '']
27
+ : [t.display_number ?? t.task_number, t.title, t.status, t.priority, t.estimated_effort ?? '']);
28
+ console.log(formatTable(headers, rows));
29
+ }
30
+ catch (error) {
31
+ printError(error, options.json);
32
+ process.exitCode = 1;
33
+ }
34
+ }
35
+ //# sourceMappingURL=tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/commands/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAsBrE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAMlC;IACC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC;YACtC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAkB,CAAC;QAErB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC;QAE5B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,UAAU,QAAQ,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,CAAC;QACjD,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,WAAW;YACzB,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC;YAC5D,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC3B,WAAW;YACT,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,eAAe,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,gBAAgB,IAAI,EAAE,CAAC;YACvH,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,gBAAgB,IAAI,EAAE,CAAC,CACjG,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -0,0 +1,27 @@
1
+ export declare function vibeLogCommand(options: {
2
+ json: boolean;
3
+ project?: string;
4
+ content: string;
5
+ type: string;
6
+ title?: string;
7
+ task?: string;
8
+ }): Promise<void>;
9
+ export declare function vibeListCommand(options: {
10
+ json: boolean;
11
+ project?: string;
12
+ type?: string;
13
+ since?: string;
14
+ limit?: string;
15
+ }): Promise<void>;
16
+ export declare function vibeShowCommand(id: string, options: {
17
+ json: boolean;
18
+ project?: string;
19
+ }): Promise<void>;
20
+ export declare function vibeUpdateCommand(id: string, options: {
21
+ json: boolean;
22
+ project?: string;
23
+ type?: string;
24
+ title?: string;
25
+ content?: string;
26
+ metadata?: string;
27
+ }): Promise<void>;
@@ -0,0 +1,142 @@
1
+ import { createClient } from '../api-client.js';
2
+ import { formatOutput, printError, printSuccess, formatTable } from '../output.js';
3
+ const VALID_VIBE_TYPES = ['note', 'code_change', 'decision', 'discovery', 'idea', 'exploration', 'fix'];
4
+ // ── Commands ──
5
+ export async function vibeLogCommand(options) {
6
+ if (!VALID_VIBE_TYPES.includes(options.type)) {
7
+ const msg = `Invalid vibe type "${options.type}". Valid: ${VALID_VIBE_TYPES.join(', ')}`;
8
+ if (options.json) {
9
+ console.error(JSON.stringify({ error: { message: msg } }));
10
+ }
11
+ else {
12
+ console.error(`Error: ${msg}`);
13
+ }
14
+ process.exitCode = 1;
15
+ return;
16
+ }
17
+ try {
18
+ const client = await createClient(options.project);
19
+ const response = (await client.logVibe({
20
+ content: options.content,
21
+ type: options.type,
22
+ title: options.title,
23
+ task_id: options.task,
24
+ }));
25
+ if (options.json) {
26
+ console.log(formatOutput(response, true));
27
+ return;
28
+ }
29
+ printSuccess(`Logged vibe (${response.data.type}) with ID ${response.data.id}.`, false);
30
+ }
31
+ catch (error) {
32
+ printError(error, options.json);
33
+ process.exitCode = 1;
34
+ }
35
+ }
36
+ export async function vibeListCommand(options) {
37
+ try {
38
+ const client = await createClient(options.project);
39
+ const response = (await client.listVibes({
40
+ type: options.type,
41
+ since: options.since,
42
+ limit: options.limit,
43
+ }));
44
+ if (options.json) {
45
+ console.log(formatOutput(response, true));
46
+ return;
47
+ }
48
+ const vibes = response.data;
49
+ if (vibes.length === 0) {
50
+ console.log('No vibes found.');
51
+ return;
52
+ }
53
+ console.log(`Vibes (${response.meta.count}):\n`);
54
+ console.log(formatTable(['Type', 'Title / Content', 'Author', 'Created'], vibes.map((v) => [
55
+ v.type,
56
+ v.title ?? v.content.slice(0, 60) + (v.content.length > 60 ? '...' : ''),
57
+ v.author ? (typeof v.author === 'object' ? v.author.name : v.author) : '',
58
+ v.created_at.replace('T', ' ').replace(/\+.*$/, ''),
59
+ ])));
60
+ }
61
+ catch (error) {
62
+ printError(error, options.json);
63
+ process.exitCode = 1;
64
+ }
65
+ }
66
+ export async function vibeShowCommand(id, options) {
67
+ try {
68
+ const client = await createClient(options.project);
69
+ const response = (await client.getVibe(id));
70
+ if (options.json) {
71
+ console.log(formatOutput(response, true));
72
+ return;
73
+ }
74
+ const vibe = response.data;
75
+ console.log(`Vibe: ${vibe.title ?? '(untitled)'} [${vibe.type}]`);
76
+ if (vibe.author) {
77
+ const authorName = typeof vibe.author === 'object' ? vibe.author.name : vibe.author;
78
+ console.log(`Author: ${authorName}`);
79
+ }
80
+ if (vibe.task_id)
81
+ console.log(`Task: ${vibe.task_id}`);
82
+ console.log(`\nContent:\n${vibe.content}`);
83
+ if (vibe.metadata && Object.keys(vibe.metadata).length > 0) {
84
+ console.log(`\nMetadata:\n${JSON.stringify(vibe.metadata, null, 2)}`);
85
+ }
86
+ console.log(`\nCreated: ${vibe.created_at.replace('T', ' ').replace(/\+.*$/, '')}`);
87
+ console.log(`Updated: ${vibe.updated_at.replace('T', ' ').replace(/\+.*$/, '')}`);
88
+ }
89
+ catch (error) {
90
+ printError(error, options.json);
91
+ process.exitCode = 1;
92
+ }
93
+ }
94
+ export async function vibeUpdateCommand(id, options) {
95
+ let metadata;
96
+ if (options.metadata) {
97
+ try {
98
+ metadata = JSON.parse(options.metadata);
99
+ }
100
+ catch {
101
+ const msg = 'Invalid JSON in --metadata option';
102
+ if (options.json) {
103
+ console.error(JSON.stringify({ error: { message: msg } }));
104
+ }
105
+ else {
106
+ console.error(`Error: ${msg}`);
107
+ }
108
+ process.exitCode = 1;
109
+ return;
110
+ }
111
+ }
112
+ if (options.type && !VALID_VIBE_TYPES.includes(options.type)) {
113
+ const msg = `Invalid vibe type "${options.type}". Valid: ${VALID_VIBE_TYPES.join(', ')}`;
114
+ if (options.json) {
115
+ console.error(JSON.stringify({ error: { message: msg } }));
116
+ }
117
+ else {
118
+ console.error(`Error: ${msg}`);
119
+ }
120
+ process.exitCode = 1;
121
+ return;
122
+ }
123
+ try {
124
+ const client = await createClient(options.project);
125
+ const response = (await client.updateVibe(id, {
126
+ type: options.type,
127
+ title: options.title,
128
+ content: options.content,
129
+ metadata,
130
+ }));
131
+ if (options.json) {
132
+ console.log(formatOutput(response, true));
133
+ return;
134
+ }
135
+ printSuccess(`Vibe ${response.data.id} updated.`, false);
136
+ }
137
+ catch (error) {
138
+ printError(error, options.json);
139
+ process.exitCode = 1;
140
+ }
141
+ }
142
+ //# sourceMappingURL=vibes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vibes.js","sourceRoot":"","sources":["../../src/commands/vibes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface OrbitMapConfig {
2
+ api_url?: string;
3
+ api_key?: string;
4
+ project_id?: string;
5
+ }
6
+ export declare function loadConfig(): Promise<OrbitMapConfig>;
7
+ export declare function saveConfig(config: OrbitMapConfig): Promise<void>;
8
+ export interface ResolvedAuth {
9
+ apiKey: string;
10
+ apiUrl: string;
11
+ projectId?: string;
12
+ }
13
+ export declare function resolveAuth(): Promise<ResolvedAuth>;
14
+ export declare function resolveProjectId(explicit?: string, envOrConfig?: string): string | undefined;
package/dist/config.js ADDED
@@ -0,0 +1,34 @@
1
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
2
+ import { homedir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ const CONFIG_DIR = join(homedir(), '.orbitmap');
5
+ const CONFIG_FILE = join(CONFIG_DIR, 'config.json');
6
+ export async function loadConfig() {
7
+ try {
8
+ const raw = await readFile(CONFIG_FILE, 'utf-8');
9
+ return JSON.parse(raw);
10
+ }
11
+ catch {
12
+ return {};
13
+ }
14
+ }
15
+ export async function saveConfig(config) {
16
+ await mkdir(CONFIG_DIR, { recursive: true });
17
+ await writeFile(CONFIG_FILE, JSON.stringify(config, null, 2) + '\n', 'utf-8');
18
+ }
19
+ export async function resolveAuth() {
20
+ const config = await loadConfig();
21
+ const apiKey = process.env['ORBITMAP_API_KEY'] || config.api_key;
22
+ const apiUrl = process.env['ORBITMAP_API_URL'] ||
23
+ config.api_url ||
24
+ 'https://orbitmap-main-x5n6qz.laravel.cloud/api/agent';
25
+ if (!apiKey) {
26
+ throw new Error('Missing API key. Set ORBITMAP_API_KEY env var or run `orbitmap init`.');
27
+ }
28
+ const projectId = process.env['ORBITMAP_PROJECT_ID'] || config.project_id;
29
+ return { apiKey, apiUrl, projectId };
30
+ }
31
+ export function resolveProjectId(explicit, envOrConfig) {
32
+ return explicit || process.env['ORBITMAP_PROJECT_ID'] || envOrConfig;
33
+ }
34
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAQjC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAChD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAsB;IACrD,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AAChF,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAElC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC;IACjE,MAAM,MAAM,GACV,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;QAC/B,MAAM,CAAC,OAAO;QACd,sDAAsD,CAAC;IAEzD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,uEAAuE,CACxE,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC;IAE1E,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,QAAiB,EACjB,WAAoB;IAEpB,OAAO,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,WAAW,CAAC;AACvE,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { OrbitMapClient } from './api-client.js';
2
+ export interface ManifestEntry {
3
+ doc_id: string;
4
+ version: number;
5
+ downloaded_at: string;
6
+ last_accessed: string;
7
+ size_bytes: number;
8
+ file: string;
9
+ }
10
+ export type Manifest = Record<string, ManifestEntry>;
11
+ export interface DownloadResult {
12
+ filePath: string;
13
+ version: number;
14
+ cached: boolean;
15
+ slug: string;
16
+ }
17
+ export declare function getCacheDir(): string;
18
+ export declare function readManifest(): Manifest;
19
+ export declare function writeManifest(manifest: Manifest): void;
20
+ export declare function ensureGitignore(): void;
21
+ export declare function downloadDocument(client: OrbitMapClient, idOrSlug: string): Promise<DownloadResult>;
22
+ export declare function cleanupCache(availableDocSlugs: string[]): {
23
+ removed: string[];
24
+ };
@@ -0,0 +1,116 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync, statSync } from 'node:fs';
2
+ import { join, dirname } from 'node:path';
3
+ const CACHE_DIR = join('.orbitmap', 'docs');
4
+ const MANIFEST_FILE = '.manifest.json';
5
+ const STALE_DAYS = 7;
6
+ export function getCacheDir() {
7
+ return CACHE_DIR;
8
+ }
9
+ export function readManifest() {
10
+ const manifestPath = join(CACHE_DIR, MANIFEST_FILE);
11
+ if (!existsSync(manifestPath))
12
+ return {};
13
+ try {
14
+ return JSON.parse(readFileSync(manifestPath, 'utf-8'));
15
+ }
16
+ catch {
17
+ return {};
18
+ }
19
+ }
20
+ export function writeManifest(manifest) {
21
+ const manifestPath = join(CACHE_DIR, MANIFEST_FILE);
22
+ mkdirSync(dirname(manifestPath), { recursive: true });
23
+ writeFileSync(manifestPath, JSON.stringify(manifest, null, 2), 'utf-8');
24
+ }
25
+ export function ensureGitignore() {
26
+ const gitignorePath = '.gitignore';
27
+ const entry = '.orbitmap/';
28
+ if (existsSync(gitignorePath)) {
29
+ const content = readFileSync(gitignorePath, 'utf-8');
30
+ if (content.includes(entry))
31
+ return;
32
+ const separator = content.endsWith('\n') ? '' : '\n';
33
+ writeFileSync(gitignorePath, `${content}${separator}${entry}\n`, 'utf-8');
34
+ }
35
+ else {
36
+ writeFileSync(gitignorePath, `${entry}\n`, 'utf-8');
37
+ }
38
+ }
39
+ export async function downloadDocument(client, idOrSlug) {
40
+ const response = (await client.getDocument(idOrSlug, 'file'));
41
+ const doc = response.data;
42
+ const slug = doc.slug;
43
+ const manifest = readManifest();
44
+ const existing = manifest[slug];
45
+ // Version match — skip download
46
+ if (existing && existing.version === doc.version) {
47
+ const filePath = join(CACHE_DIR, existing.file);
48
+ if (existsSync(filePath)) {
49
+ existing.last_accessed = new Date().toISOString();
50
+ writeManifest(manifest);
51
+ return { filePath, version: doc.version, cached: true, slug };
52
+ }
53
+ }
54
+ // Need to download
55
+ mkdirSync(CACHE_DIR, { recursive: true });
56
+ ensureGitignore();
57
+ const fileName = `${slug}.md`;
58
+ const filePath = join(CACHE_DIR, fileName);
59
+ if (doc.download_url) {
60
+ const res = await fetch(doc.download_url);
61
+ if (!res.ok) {
62
+ throw new Error(`Download failed: HTTP ${res.status}`);
63
+ }
64
+ const content = await res.text();
65
+ writeFileSync(filePath, content, 'utf-8');
66
+ }
67
+ else if (doc.content !== undefined) {
68
+ // Fallback to inline content
69
+ writeFileSync(filePath, doc.content, 'utf-8');
70
+ }
71
+ else {
72
+ throw new Error(`API returned neither download_url nor content for ${idOrSlug}`);
73
+ }
74
+ const size = statSync(filePath).size;
75
+ const now = new Date().toISOString();
76
+ manifest[slug] = {
77
+ doc_id: doc.id,
78
+ version: doc.version,
79
+ downloaded_at: now,
80
+ last_accessed: now,
81
+ size_bytes: size,
82
+ file: fileName,
83
+ };
84
+ writeManifest(manifest);
85
+ return { filePath, version: doc.version, cached: false, slug };
86
+ }
87
+ export function cleanupCache(availableDocSlugs) {
88
+ const manifest = readManifest();
89
+ const slugSet = new Set(availableDocSlugs);
90
+ const now = Date.now();
91
+ const staleMs = STALE_DAYS * 24 * 60 * 60 * 1000;
92
+ const removed = [];
93
+ for (const [slug, entry] of Object.entries(manifest)) {
94
+ if (slugSet.has(slug))
95
+ continue;
96
+ const lastAccessed = new Date(entry.last_accessed).getTime();
97
+ if (now - lastAccessed <= staleMs)
98
+ continue;
99
+ // Stale and not in available docs — remove
100
+ const filePath = join(CACHE_DIR, entry.file);
101
+ try {
102
+ if (existsSync(filePath))
103
+ unlinkSync(filePath);
104
+ }
105
+ catch {
106
+ // ignore file deletion errors
107
+ }
108
+ delete manifest[slug];
109
+ removed.push(slug);
110
+ }
111
+ if (removed.length > 0) {
112
+ writeManifest(manifest);
113
+ }
114
+ return { removed };
115
+ }
116
+ //# sourceMappingURL=doc-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc-cache.js","sourceRoot":"","sources":["../src/doc-cache.ts"],"names":[],"mappings":"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"}