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.
- package/LICENSE +21 -0
- package/README.md +200 -0
- package/dist/api-client.d.ts +234 -0
- package/dist/api-client.js +401 -0
- package/dist/api-client.js.map +1 -0
- package/dist/commands/agents.d.ts +3 -0
- package/dist/commands/agents.js +44 -0
- package/dist/commands/agents.js.map +1 -0
- package/dist/commands/assign.d.ts +5 -0
- package/dist/commands/assign.js +44 -0
- package/dist/commands/assign.js.map +1 -0
- package/dist/commands/context.d.ts +4 -0
- package/dist/commands/context.js +37 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/create.d.ts +12 -0
- package/dist/commands/create.js +54 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/dep.d.ts +11 -0
- package/dist/commands/dep.js +56 -0
- package/dist/commands/dep.js.map +1 -0
- package/dist/commands/doc-import.d.ts +9 -0
- package/dist/commands/doc-import.js +97 -0
- package/dist/commands/doc-import.js.map +1 -0
- package/dist/commands/doc-patch.d.ts +16 -0
- package/dist/commands/doc-patch.js +142 -0
- package/dist/commands/doc-patch.js.map +1 -0
- package/dist/commands/doc-share.d.ts +14 -0
- package/dist/commands/doc-share.js +60 -0
- package/dist/commands/doc-share.js.map +1 -0
- package/dist/commands/doc-update.d.ts +6 -0
- package/dist/commands/doc-update.js +64 -0
- package/dist/commands/doc-update.js.map +1 -0
- package/dist/commands/doc.d.ts +6 -0
- package/dist/commands/doc.js +108 -0
- package/dist/commands/doc.js.map +1 -0
- package/dist/commands/docs-cache.d.ts +11 -0
- package/dist/commands/docs-cache.js +119 -0
- package/dist/commands/docs-cache.js.map +1 -0
- package/dist/commands/docs.d.ts +6 -0
- package/dist/commands/docs.js +35 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/commands/get.d.ts +8 -0
- package/dist/commands/get.js +102 -0
- package/dist/commands/get.js.map +1 -0
- package/dist/commands/ideas.d.ts +23 -0
- package/dist/commands/ideas.js +155 -0
- package/dist/commands/ideas.js.map +1 -0
- package/dist/commands/init.d.ts +7 -0
- package/dist/commands/init.js +175 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/issues.d.ts +32 -0
- package/dist/commands/issues.js +206 -0
- package/dist/commands/issues.js.map +1 -0
- package/dist/commands/log.d.ts +6 -0
- package/dist/commands/log.js +47 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.js +48 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +1 -0
- package/dist/commands/logout.js +13 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/orbit.d.ts +18 -0
- package/dist/commands/orbit.js +159 -0
- package/dist/commands/orbit.js.map +1 -0
- package/dist/commands/overview.d.ts +4 -0
- package/dist/commands/overview.js +56 -0
- package/dist/commands/overview.js.map +1 -0
- package/dist/commands/projects.d.ts +3 -0
- package/dist/commands/projects.js +28 -0
- package/dist/commands/projects.js.map +1 -0
- package/dist/commands/setup-agent.d.ts +3 -0
- package/dist/commands/setup-agent.js +178 -0
- package/dist/commands/setup-agent.js.map +1 -0
- package/dist/commands/start.d.ts +4 -0
- package/dist/commands/start.js +38 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +5 -0
- package/dist/commands/status.js +54 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/subtask.d.ts +7 -0
- package/dist/commands/subtask.js +26 -0
- package/dist/commands/subtask.js.map +1 -0
- package/dist/commands/task-edit-content.d.ts +7 -0
- package/dist/commands/task-edit-content.js +45 -0
- package/dist/commands/task-edit-content.js.map +1 -0
- package/dist/commands/task.d.ts +66 -0
- package/dist/commands/task.js +92 -0
- package/dist/commands/task.js.map +1 -0
- package/dist/commands/tasks.d.ts +7 -0
- package/dist/commands/tasks.js +35 -0
- package/dist/commands/tasks.js.map +1 -0
- package/dist/commands/vibes.d.ts +27 -0
- package/dist/commands/vibes.js +142 -0
- package/dist/commands/vibes.js.map +1 -0
- package/dist/config.d.ts +14 -0
- package/dist/config.js +34 -0
- package/dist/config.js.map +1 -0
- package/dist/doc-cache.d.ts +24 -0
- package/dist/doc-cache.js +116 -0
- package/dist/doc-cache.js.map +1 -0
- package/dist/errors.d.ts +16 -0
- package/dist/errors.js +26 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +705 -0
- package/dist/index.js.map +1 -0
- package/dist/oauth.d.ts +42 -0
- package/dist/oauth.js +207 -0
- package/dist/oauth.js.map +1 -0
- package/dist/output.d.ts +4 -0
- package/dist/output.js +66 -0
- package/dist/output.js.map +1 -0
- 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":"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"}
|
|
@@ -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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"}
|
package/dist/config.d.ts
ADDED
|
@@ -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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"}
|