document360-engine 0.1.1 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +10 -16
- package/README.md +1 -1
- package/dist/config.d.ts +21 -0
- package/dist/d360/apiLog.d.ts +22 -0
- package/dist/d360/client.d.ts +16 -0
- package/dist/d360/environments.d.ts +2 -0
- package/dist/d360/tools.d.ts +15 -0
- package/dist/d360/wire.d.ts +32 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +28 -16
- package/dist/lib/suggestGen.d.ts +7 -0
- package/dist/lib/writerMode.d.ts +18 -0
- package/dist/scope/inventory.d.ts +19 -0
- package/dist/session.d.ts +18 -0
- package/dist/sync/categoryMap.d.ts +39 -0
- package/dist/sync/docsRoot.d.ts +8 -0
- package/dist/sync/frontmatter.d.ts +10 -0
- package/dist/sync/hash.d.ts +7 -0
- package/dist/sync/index.d.ts +8 -0
- package/dist/sync/pull.d.ts +41 -0
- package/dist/sync/remote.d.ts +37 -0
- package/dist/sync/status.d.ts +27 -0
- package/dist/sync/types.d.ts +22 -0
- package/package.json +3 -3
- package/skills/CLAUDE.md +38 -2
- package/skills/analyze-codebase/SKILL.md +35 -17
- package/skills/d360-markdown/SKILL.md +99 -0
- package/skills/gap-analysis/SKILL.md +75 -0
- package/skills/publish-to-d360/SKILL.md +3 -2
- package/skills/write-article/SKILL.md +7 -0
- package/dist/config.js +0 -62
- package/dist/config.js.map +0 -1
- package/dist/d360/client.js +0 -136
- package/dist/d360/client.js.map +0 -1
- package/dist/d360/environments.js +0 -54
- package/dist/d360/environments.js.map +0 -1
- package/dist/d360/oauth.js +0 -162
- package/dist/d360/oauth.js.map +0 -1
- package/dist/d360/profile.js +0 -31
- package/dist/d360/profile.js.map +0 -1
- package/dist/d360/tokenStore.js +0 -50
- package/dist/d360/tokenStore.js.map +0 -1
- package/dist/d360/tools.js +0 -335
- package/dist/d360/tools.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/auth.js +0 -25
- package/dist/lib/auth.js.map +0 -1
- package/dist/lib/messageQueue.js +0 -40
- package/dist/lib/messageQueue.js.map +0 -1
- package/dist/lib/paths.js +0 -35
- package/dist/lib/paths.js.map +0 -1
- package/dist/lib/sessionStore.js +0 -100
- package/dist/lib/sessionStore.js.map +0 -1
- package/dist/lib/titleGen.js +0 -64
- package/dist/lib/titleGen.js.map +0 -1
- package/dist/session.js +0 -190
- package/dist/session.js.map +0 -1
- package/skills/audit-docs/SKILL.md +0 -48
package/dist/d360/tools.js
DELETED
|
@@ -1,335 +0,0 @@
|
|
|
1
|
-
import { readFileSync } from 'node:fs';
|
|
2
|
-
import { basename, isAbsolute, resolve } from 'node:path';
|
|
3
|
-
import { createSdkMcpServer, tool } from '@anthropic-ai/claude-agent-sdk';
|
|
4
|
-
import { z } from 'zod';
|
|
5
|
-
import { d360Get, d360GetAll, d360Patch, d360Post, d360Upload, resolveProjectId, D360AuthError } from './client.js';
|
|
6
|
-
const PROJECTS = '/v3/projects';
|
|
7
|
-
const p = (projectId) => `${PROJECTS}/${projectId}`;
|
|
8
|
-
function ok(data) {
|
|
9
|
-
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
10
|
-
}
|
|
11
|
-
function fail(err) {
|
|
12
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
13
|
-
return { content: [{ type: 'text', text: msg }], isError: true };
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Build the in-process Document360 tool server for the active profile. Project resolves
|
|
17
|
-
* per-call: explicit arg → profile.project.projectId → the logged-in token's doc360_project_id claim.
|
|
18
|
-
* Write tools are gated by opts.writesAllowed (production safety).
|
|
19
|
-
*/
|
|
20
|
-
export function buildD360ToolServer(active, opts) {
|
|
21
|
-
const ctx = { profile: active.name, connection: active.connection };
|
|
22
|
-
const configProjectId = active.project.projectId;
|
|
23
|
-
const defaultWorkspaceId = active.project.workspaceId;
|
|
24
|
-
const project = () => resolveProjectId(ctx, configProjectId);
|
|
25
|
-
const workspace = (given) => {
|
|
26
|
-
const w = given ?? defaultWorkspaceId;
|
|
27
|
-
if (!w)
|
|
28
|
-
throw new Error('No workspace_id given and none in the profile. Call d360_list_workspaces first.');
|
|
29
|
-
return w;
|
|
30
|
-
};
|
|
31
|
-
/** Returns a fail() result if writes are blocked on a production profile, else null. */
|
|
32
|
-
const writeBlocked = () => opts.writesAllowed
|
|
33
|
-
? null
|
|
34
|
-
: fail(`Refusing to write to PRODUCTION profile "${active.name}". Authorize this session first: ` +
|
|
35
|
-
`run /allow-prod in the REPL, or pass --yes in one-shot/CI.`);
|
|
36
|
-
const context = tool('d360_context', 'Report the active Document360 connection: profile name, environment, project/workspace id, and whether it is a production profile. Call this before maintaining d360-category-map.json so you scope IDs to the right profile.', {}, async () => {
|
|
37
|
-
try {
|
|
38
|
-
return ok({
|
|
39
|
-
profile: active.name,
|
|
40
|
-
environment: active.connection.name,
|
|
41
|
-
production: active.production,
|
|
42
|
-
projectId: configProjectId ?? resolveProjectId(ctx),
|
|
43
|
-
workspaceId: defaultWorkspaceId ?? null,
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
catch (e) {
|
|
47
|
-
return fail(e);
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
const listProjects = tool('d360_list_projects', 'List all Document360 projects the signed-in user can access (id, name, sub-domain, status).', {}, async () => {
|
|
51
|
-
try {
|
|
52
|
-
return ok(await d360GetAll(ctx, PROJECTS));
|
|
53
|
-
}
|
|
54
|
-
catch (e) {
|
|
55
|
-
return fail(e);
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
const listWorkspaces = tool('d360_list_workspaces', 'List workspaces (project versions) for the current project. Each has id, name, slug, is_default, workspace_type.', { project_id: z.string().optional().describe('Defaults to the logged-in/config project.') }, async (args) => {
|
|
59
|
-
try {
|
|
60
|
-
return ok(await d360GetAll(ctx, `${p(args.project_id ?? project())}/workspaces`));
|
|
61
|
-
}
|
|
62
|
-
catch (e) {
|
|
63
|
-
return fail(e);
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
const listCategories = tool('d360_list_categories', 'List categories in a workspace (the folder structure for articles).', {
|
|
67
|
-
workspace_id: z.string().optional().describe('Defaults to d360.workspaceId in config.'),
|
|
68
|
-
project_id: z.string().optional(),
|
|
69
|
-
}, async (args) => {
|
|
70
|
-
try {
|
|
71
|
-
const workspaceId = args.workspace_id ?? defaultWorkspaceId;
|
|
72
|
-
if (!workspaceId)
|
|
73
|
-
return fail('No workspace_id given and none in config. Call d360_list_workspaces first.');
|
|
74
|
-
return ok(await d360GetAll(ctx, `${p(args.project_id ?? project())}/workspaces/${workspaceId}/categories`));
|
|
75
|
-
}
|
|
76
|
-
catch (e) {
|
|
77
|
-
return fail(e);
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
|
-
const listArticles = tool('d360_list_articles', 'List articles in a workspace (id, title, status, category). Use to see existing docs before writing.', {
|
|
81
|
-
workspace_id: z.string().optional().describe('Defaults to d360.workspaceId in config.'),
|
|
82
|
-
project_id: z.string().optional(),
|
|
83
|
-
}, async (args) => {
|
|
84
|
-
try {
|
|
85
|
-
const workspaceId = args.workspace_id ?? defaultWorkspaceId;
|
|
86
|
-
if (!workspaceId)
|
|
87
|
-
return fail('No workspace_id given and none in config. Call d360_list_workspaces first.');
|
|
88
|
-
return ok(await d360GetAll(ctx, `${p(args.project_id ?? project())}/workspaces/${workspaceId}/articles`));
|
|
89
|
-
}
|
|
90
|
-
catch (e) {
|
|
91
|
-
return fail(e);
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
const getArticle = tool('d360_get_article', 'Get a single article including its content. content_mode=raw returns the stored markdown source (best for editing); display returns processed content.', {
|
|
95
|
-
article_id: z.string(),
|
|
96
|
-
content_mode: z.enum(['raw', 'display']).optional().describe('raw = stored markdown source (default), display = processed.'),
|
|
97
|
-
published: z.boolean().optional().describe('Read the published version instead of the latest draft.'),
|
|
98
|
-
project_id: z.string().optional(),
|
|
99
|
-
}, async (args) => {
|
|
100
|
-
try {
|
|
101
|
-
return ok(await d360Get(ctx, `${p(args.project_id ?? project())}/articles/${args.article_id}`, {
|
|
102
|
-
query: { content_mode: args.content_mode, published: args.published },
|
|
103
|
-
}));
|
|
104
|
-
}
|
|
105
|
-
catch (e) {
|
|
106
|
-
return fail(e);
|
|
107
|
-
}
|
|
108
|
-
});
|
|
109
|
-
const aiQuery = tool('d360_ai_query', "Ask Document360's AI search over a workspace's published content. Returns an answer grounded in existing articles — use to check what's already documented.", {
|
|
110
|
-
query: z.string(),
|
|
111
|
-
workspace_id: z.string().optional().describe('Defaults to d360.workspaceId in config.'),
|
|
112
|
-
project_id: z.string().optional(),
|
|
113
|
-
}, async (args) => {
|
|
114
|
-
try {
|
|
115
|
-
const workspaceId = args.workspace_id ?? defaultWorkspaceId;
|
|
116
|
-
if (!workspaceId)
|
|
117
|
-
return fail('No workspace_id given and none in config. Call d360_list_workspaces first.');
|
|
118
|
-
return ok(await d360Post(ctx, `${p(args.project_id ?? project())}/workspaces/ai/query`, {
|
|
119
|
-
body: { query: args.query, workspace_id: workspaceId },
|
|
120
|
-
}));
|
|
121
|
-
}
|
|
122
|
-
catch (e) {
|
|
123
|
-
return fail(e);
|
|
124
|
-
}
|
|
125
|
-
});
|
|
126
|
-
// ---- write tools (gated by writesAllowed) ----
|
|
127
|
-
const createCategory = tool('d360_create_category', 'Create a category (a docs folder). Returns the new category id.', {
|
|
128
|
-
name: z.string(),
|
|
129
|
-
workspace_id: z.string().optional(),
|
|
130
|
-
parent_category_id: z.string().optional().describe('Omit for a top-level category.'),
|
|
131
|
-
content: z.string().optional(),
|
|
132
|
-
slug: z.string().optional(),
|
|
133
|
-
order: z.number().optional(),
|
|
134
|
-
project_id: z.string().optional(),
|
|
135
|
-
}, async (args) => {
|
|
136
|
-
const blocked = writeBlocked();
|
|
137
|
-
if (blocked)
|
|
138
|
-
return blocked;
|
|
139
|
-
try {
|
|
140
|
-
return ok(await d360Post(ctx, `${p(args.project_id ?? project())}/categories`, {
|
|
141
|
-
body: {
|
|
142
|
-
name: args.name,
|
|
143
|
-
workspace_id: workspace(args.workspace_id),
|
|
144
|
-
parent_category_id: args.parent_category_id,
|
|
145
|
-
content: args.content,
|
|
146
|
-
slug: args.slug,
|
|
147
|
-
order: args.order,
|
|
148
|
-
// Markdown-only by product decision (matches articles).
|
|
149
|
-
content_type: 'markdown',
|
|
150
|
-
},
|
|
151
|
-
}));
|
|
152
|
-
}
|
|
153
|
-
catch (e) {
|
|
154
|
-
return fail(e);
|
|
155
|
-
}
|
|
156
|
-
});
|
|
157
|
-
const createArticle = tool('d360_create_article', 'Create a DRAFT article in a category. The body is always Markdown (product rule — we never create WYSIWYG/Block articles). Returns the new article id. Does not publish.', {
|
|
158
|
-
title: z.string(),
|
|
159
|
-
category_id: z.string(),
|
|
160
|
-
content: z.string().optional().describe('Markdown body.'),
|
|
161
|
-
workspace_id: z.string().optional(),
|
|
162
|
-
slug: z.string().optional(),
|
|
163
|
-
order: z.number().optional(),
|
|
164
|
-
project_id: z.string().optional(),
|
|
165
|
-
}, async (args) => {
|
|
166
|
-
const blocked = writeBlocked();
|
|
167
|
-
if (blocked)
|
|
168
|
-
return blocked;
|
|
169
|
-
try {
|
|
170
|
-
// articles/bulk with a single item is the create path. content_type is
|
|
171
|
-
// hardcoded to 'markdown' by product decision — Document360 articles are
|
|
172
|
-
// markdown-only for control + simplicity (no WYSIWYG/Block).
|
|
173
|
-
return ok(await d360Post(ctx, `${p(args.project_id ?? project())}/articles/bulk`, {
|
|
174
|
-
body: {
|
|
175
|
-
articles: [
|
|
176
|
-
{
|
|
177
|
-
title: args.title,
|
|
178
|
-
category_id: args.category_id,
|
|
179
|
-
workspace_id: workspace(args.workspace_id),
|
|
180
|
-
content: args.content,
|
|
181
|
-
slug: args.slug,
|
|
182
|
-
order: args.order,
|
|
183
|
-
content_type: 'markdown',
|
|
184
|
-
},
|
|
185
|
-
],
|
|
186
|
-
},
|
|
187
|
-
}));
|
|
188
|
-
}
|
|
189
|
-
catch (e) {
|
|
190
|
-
return fail(e);
|
|
191
|
-
}
|
|
192
|
-
});
|
|
193
|
-
const updateArticle = tool('d360_update_article', 'Update an article\'s title/content/category. Edits the latest draft by default; set auto_fork to safely edit a published article (creates a new draft version).', {
|
|
194
|
-
article_id: z.string(),
|
|
195
|
-
title: z.string().optional(),
|
|
196
|
-
content: z.string().optional().describe('Markdown body.'),
|
|
197
|
-
category_id: z.string().optional(),
|
|
198
|
-
hidden: z.boolean().optional(),
|
|
199
|
-
version_number: z.number().optional(),
|
|
200
|
-
auto_fork: z.boolean().optional().describe('If the target version is published, fork a new draft instead of erroring.'),
|
|
201
|
-
project_id: z.string().optional(),
|
|
202
|
-
}, async (args) => {
|
|
203
|
-
const blocked = writeBlocked();
|
|
204
|
-
if (blocked)
|
|
205
|
-
return blocked;
|
|
206
|
-
try {
|
|
207
|
-
const { article_id, project_id, ...body } = args;
|
|
208
|
-
return ok(await d360Patch(ctx, `${p(project_id ?? project())}/articles/${article_id}`, { body }));
|
|
209
|
-
}
|
|
210
|
-
catch (e) {
|
|
211
|
-
return fail(e);
|
|
212
|
-
}
|
|
213
|
-
});
|
|
214
|
-
const forkArticle = tool('d360_fork_article', 'Fork a published article into a new draft version — the safe way to start editing live content.', { article_id: z.string(), project_id: z.string().optional() }, async (args) => {
|
|
215
|
-
const blocked = writeBlocked();
|
|
216
|
-
if (blocked)
|
|
217
|
-
return blocked;
|
|
218
|
-
try {
|
|
219
|
-
return ok(await d360Post(ctx, `${p(args.project_id ?? project())}/articles/${args.article_id}/fork`));
|
|
220
|
-
}
|
|
221
|
-
catch (e) {
|
|
222
|
-
return fail(e);
|
|
223
|
-
}
|
|
224
|
-
});
|
|
225
|
-
const publishArticle = tool('d360_publish_article', 'Publish an article version. This makes the draft live to readers — only call when the user explicitly asks to publish.', {
|
|
226
|
-
article_id: z.string(),
|
|
227
|
-
version_number: z.number(),
|
|
228
|
-
workspace_id: z.string().optional(),
|
|
229
|
-
message: z.string().optional(),
|
|
230
|
-
project_id: z.string().optional(),
|
|
231
|
-
}, async (args) => {
|
|
232
|
-
const blocked = writeBlocked();
|
|
233
|
-
if (blocked)
|
|
234
|
-
return blocked;
|
|
235
|
-
try {
|
|
236
|
-
return ok(await d360Post(ctx, `${p(args.project_id ?? project())}/articles/${args.article_id}/publish`, {
|
|
237
|
-
body: { workspace_id: workspace(args.workspace_id), version_number: args.version_number, message: args.message },
|
|
238
|
-
}));
|
|
239
|
-
}
|
|
240
|
-
catch (e) {
|
|
241
|
-
return fail(e);
|
|
242
|
-
}
|
|
243
|
-
});
|
|
244
|
-
const unpublishArticle = tool('d360_unpublish_article', 'Unpublish an article, reverting it to draft (removes it from readers).', {
|
|
245
|
-
article_id: z.string(),
|
|
246
|
-
version_number: z.number().optional(),
|
|
247
|
-
workspace_id: z.string().optional(),
|
|
248
|
-
project_id: z.string().optional(),
|
|
249
|
-
}, async (args) => {
|
|
250
|
-
const blocked = writeBlocked();
|
|
251
|
-
if (blocked)
|
|
252
|
-
return blocked;
|
|
253
|
-
try {
|
|
254
|
-
return ok(await d360Post(ctx, `${p(args.project_id ?? project())}/articles/${args.article_id}/unpublish`, {
|
|
255
|
-
body: { workspace_id: workspace(args.workspace_id), version_number: args.version_number },
|
|
256
|
-
}));
|
|
257
|
-
}
|
|
258
|
-
catch (e) {
|
|
259
|
-
return fail(e);
|
|
260
|
-
}
|
|
261
|
-
});
|
|
262
|
-
const uploadDriveFile = tool('d360_upload_drive_file', 'Upload a local file (e.g. a captured screenshot PNG) to Drive and return its URL for embedding in an article. Uploads to the default folder unless folder_id is given.', {
|
|
263
|
-
file_path: z.string().describe('Local path to the file (absolute, or relative to the repo).'),
|
|
264
|
-
folder_id: z.string().optional(),
|
|
265
|
-
title: z.string().optional(),
|
|
266
|
-
project_id: z.string().optional(),
|
|
267
|
-
}, async (args) => {
|
|
268
|
-
const blocked = writeBlocked();
|
|
269
|
-
if (blocked)
|
|
270
|
-
return blocked;
|
|
271
|
-
try {
|
|
272
|
-
const pid = args.project_id ?? project();
|
|
273
|
-
const filePath = isAbsolute(args.file_path) ? args.file_path : resolve(process.cwd(), args.file_path);
|
|
274
|
-
let folderId = args.folder_id;
|
|
275
|
-
if (!folderId) {
|
|
276
|
-
const def = await d360Get(ctx, `${p(pid)}/drive/folders/default`);
|
|
277
|
-
folderId = def?.id;
|
|
278
|
-
if (!folderId)
|
|
279
|
-
return fail('Could not resolve the default Drive folder.');
|
|
280
|
-
}
|
|
281
|
-
const bytes = readFileSync(filePath);
|
|
282
|
-
const form = new FormData();
|
|
283
|
-
// NOTE: field name 'file' is unverified against staging (spec models the
|
|
284
|
-
// multipart body loosely) — confirm during the dogfood; adjust if rejected.
|
|
285
|
-
form.append('file', new Blob([bytes]), args.title ?? basename(filePath));
|
|
286
|
-
return ok(await d360Upload(ctx, `${p(pid)}/drive/folders/${folderId}/files`, form));
|
|
287
|
-
}
|
|
288
|
-
catch (e) {
|
|
289
|
-
return fail(e);
|
|
290
|
-
}
|
|
291
|
-
});
|
|
292
|
-
const searchDrive = tool('d360_search_drive', 'Search Drive files (e.g. to reuse an already-uploaded screenshot instead of uploading a duplicate).', {
|
|
293
|
-
search_keyword: z.string().optional(),
|
|
294
|
-
allow_images_only: z.boolean().optional(),
|
|
295
|
-
project_id: z.string().optional(),
|
|
296
|
-
}, async (args) => {
|
|
297
|
-
try {
|
|
298
|
-
return ok(await d360GetAll(ctx, `${p(args.project_id ?? project())}/drive/search`, {
|
|
299
|
-
query: { search_keyword: args.search_keyword, allow_images_only: args.allow_images_only },
|
|
300
|
-
}));
|
|
301
|
-
}
|
|
302
|
-
catch (e) {
|
|
303
|
-
return fail(e);
|
|
304
|
-
}
|
|
305
|
-
});
|
|
306
|
-
return createSdkMcpServer({
|
|
307
|
-
name: 'document360',
|
|
308
|
-
version: '0.2.0',
|
|
309
|
-
instructions: 'First-party Document360 tools. The signed-in user\'s permissions apply server-side. ' +
|
|
310
|
-
'Project/workspace default from the active profile; pass ids explicitly to override. ' +
|
|
311
|
-
'Create articles as DRAFTS; only call d360_publish_article when the user explicitly asks to publish. ' +
|
|
312
|
-
'All articles are Markdown — the tools enforce this; never attempt WYSIWYG/Block content. ' +
|
|
313
|
-
'To edit a published article, fork it (d360_fork_article) or update with auto_fork. ' +
|
|
314
|
-
'Auth errors mean the session expired — tell the user to run: d360-writer login.',
|
|
315
|
-
tools: [
|
|
316
|
-
context,
|
|
317
|
-
listProjects,
|
|
318
|
-
listWorkspaces,
|
|
319
|
-
listCategories,
|
|
320
|
-
listArticles,
|
|
321
|
-
getArticle,
|
|
322
|
-
aiQuery,
|
|
323
|
-
createCategory,
|
|
324
|
-
createArticle,
|
|
325
|
-
updateArticle,
|
|
326
|
-
forkArticle,
|
|
327
|
-
publishArticle,
|
|
328
|
-
unpublishArticle,
|
|
329
|
-
uploadDriveFile,
|
|
330
|
-
searchDrive,
|
|
331
|
-
],
|
|
332
|
-
});
|
|
333
|
-
}
|
|
334
|
-
export { D360AuthError };
|
|
335
|
-
//# sourceMappingURL=tools.js.map
|
package/dist/d360/tools.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/d360/tools.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,uFAAuF;AACvF,qFAAqF;AACrF,6BAA6B;AAE7B,cAAc,cAAc,CAAC,CAAC,kEAAkE;AAChG,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
|
package/dist/lib/auth.js
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { existsSync } from 'node:fs';
|
|
2
|
-
import { homedir } from 'node:os';
|
|
3
|
-
import { join } from 'node:path';
|
|
4
|
-
export const AUTH_MODES = ['auto', 'api', 'subscription'];
|
|
5
|
-
function hasStoredLogin() {
|
|
6
|
-
if (process.env.CLAUDE_CODE_OAUTH_TOKEN)
|
|
7
|
-
return true;
|
|
8
|
-
return existsSync(join(homedir(), '.claude', '.credentials.json'));
|
|
9
|
-
}
|
|
10
|
-
export function resolveAuth(mode) {
|
|
11
|
-
const hasKey = Boolean(process.env.ANTHROPIC_API_KEY);
|
|
12
|
-
if (mode === 'api') {
|
|
13
|
-
return hasKey ? { kind: 'api' } : { kind: 'none' };
|
|
14
|
-
}
|
|
15
|
-
if (mode === 'subscription') {
|
|
16
|
-
// The SDK-spawned engine inherits our env; drop the key so it can't win.
|
|
17
|
-
delete process.env.ANTHROPIC_API_KEY;
|
|
18
|
-
return { kind: 'subscription', stored: hasStoredLogin() };
|
|
19
|
-
}
|
|
20
|
-
// auto
|
|
21
|
-
if (hasKey)
|
|
22
|
-
return { kind: 'api' };
|
|
23
|
-
return { kind: 'subscription', stored: hasStoredLogin() };
|
|
24
|
-
}
|
|
25
|
-
//# sourceMappingURL=auth.js.map
|
package/dist/lib/auth.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,MAAM,CAAC,MAAM,UAAU,GAAwB,CAAC,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;AAS/E,SAAS,cAAc;IACrB,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB;QAAE,OAAO,IAAI,CAAC;IACrD,OAAO,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAc;IACxC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAEtD,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACrD,CAAC;IAED,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;QAC5B,yEAAyE;QACzE,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QACrC,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,CAAC;IAC5D,CAAC;IAED,OAAO;IACP,IAAI,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACnC,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,CAAC;AAC5D,CAAC"}
|
package/dist/lib/messageQueue.js
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
export class UserMessageQueue {
|
|
2
|
-
resolvers = [];
|
|
3
|
-
buffer = [];
|
|
4
|
-
closed = false;
|
|
5
|
-
push(content) {
|
|
6
|
-
if (this.closed)
|
|
7
|
-
return;
|
|
8
|
-
const msg = {
|
|
9
|
-
type: 'user',
|
|
10
|
-
message: { role: 'user', content },
|
|
11
|
-
parent_tool_use_id: null,
|
|
12
|
-
};
|
|
13
|
-
const resolver = this.resolvers.shift();
|
|
14
|
-
if (resolver)
|
|
15
|
-
resolver(msg);
|
|
16
|
-
else
|
|
17
|
-
this.buffer.push(msg);
|
|
18
|
-
}
|
|
19
|
-
close() {
|
|
20
|
-
this.closed = true;
|
|
21
|
-
for (const r of this.resolvers)
|
|
22
|
-
r(null);
|
|
23
|
-
this.resolvers = [];
|
|
24
|
-
}
|
|
25
|
-
async *[Symbol.asyncIterator]() {
|
|
26
|
-
while (true) {
|
|
27
|
-
if (this.buffer.length > 0) {
|
|
28
|
-
yield this.buffer.shift();
|
|
29
|
-
continue;
|
|
30
|
-
}
|
|
31
|
-
if (this.closed)
|
|
32
|
-
return;
|
|
33
|
-
const next = await new Promise(r => this.resolvers.push(r));
|
|
34
|
-
if (next === null)
|
|
35
|
-
return;
|
|
36
|
-
yield next;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
//# sourceMappingURL=messageQueue.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"messageQueue.js","sourceRoot":"","sources":["../../src/lib/messageQueue.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,gBAAgB;IACnB,SAAS,GAAgD,EAAE,CAAC;IAC5D,MAAM,GAAqB,EAAE,CAAC;IAC9B,MAAM,GAAG,KAAK,CAAC;IAEvB,IAAI,CAAC,OAAe;QAClB,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,MAAM,GAAG,GAAmB;YAC1B,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;YAClC,kBAAkB,EAAE,IAAI;SACzB,CAAC;QACF,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACxC,IAAI,QAAQ;YAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;;YACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS;YAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;QAC3B,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAG,CAAC;gBAC3B,SAAS;YACX,CAAC;YACD,IAAI,IAAI,CAAC,MAAM;gBAAE,OAAO;YACxB,MAAM,IAAI,GAAG,MAAM,IAAI,OAAO,CAAwB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACnF,IAAI,IAAI,KAAK,IAAI;gBAAE,OAAO;YAC1B,MAAM,IAAI,CAAC;QACb,CAAC;IACH,CAAC;CACF"}
|
package/dist/lib/paths.js
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { homedir } from 'node:os';
|
|
2
|
-
import { join, dirname } from 'node:path';
|
|
3
|
-
import { fileURLToPath } from 'node:url';
|
|
4
|
-
import { existsSync, mkdirSync } from 'node:fs';
|
|
5
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
-
const __dirname = dirname(__filename);
|
|
7
|
-
export function packageRoot() {
|
|
8
|
-
return join(__dirname, '..', '..');
|
|
9
|
-
}
|
|
10
|
-
export function packageSkillsDir() {
|
|
11
|
-
return join(packageRoot(), 'skills');
|
|
12
|
-
}
|
|
13
|
-
export function userDir() {
|
|
14
|
-
return join(homedir(), '.document360-writer');
|
|
15
|
-
}
|
|
16
|
-
export function userConfigPath() {
|
|
17
|
-
return join(userDir(), 'config.json');
|
|
18
|
-
}
|
|
19
|
-
export function userMcpConfigPath() {
|
|
20
|
-
return join(userDir(), 'mcp.json');
|
|
21
|
-
}
|
|
22
|
-
export function sessionsFilePath() {
|
|
23
|
-
return join(userDir(), 'sessions.json');
|
|
24
|
-
}
|
|
25
|
-
export function projectConfigPath(cwd = process.cwd()) {
|
|
26
|
-
return join(cwd, '.d360-writer.json');
|
|
27
|
-
}
|
|
28
|
-
export function projectSkillsDir(cwd = process.cwd()) {
|
|
29
|
-
return join(cwd, '.d360-writer', 'skills');
|
|
30
|
-
}
|
|
31
|
-
export function ensureDir(path) {
|
|
32
|
-
if (!existsSync(path))
|
|
33
|
-
mkdirSync(path, { recursive: true });
|
|
34
|
-
}
|
|
35
|
-
//# sourceMappingURL=paths.js.map
|
package/dist/lib/paths.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEhD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,MAAM,UAAU,WAAW;IACzB,OAAO,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,qBAAqB,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,eAAe,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC3D,OAAO,IAAI,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC1D,OAAO,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,CAAC"}
|
package/dist/lib/sessionStore.js
DELETED
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
-
import { sessionsFilePath, userDir, ensureDir } from './paths.js';
|
|
3
|
-
const MAX_RECORDS = 100;
|
|
4
|
-
export function loadSessions() {
|
|
5
|
-
const path = sessionsFilePath();
|
|
6
|
-
if (!existsSync(path))
|
|
7
|
-
return [];
|
|
8
|
-
try {
|
|
9
|
-
const parsed = JSON.parse(readFileSync(path, 'utf8'));
|
|
10
|
-
return Array.isArray(parsed) ? parsed : [];
|
|
11
|
-
}
|
|
12
|
-
catch {
|
|
13
|
-
return [];
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
function saveSessions(records) {
|
|
17
|
-
ensureDir(userDir());
|
|
18
|
-
const sorted = [...records].sort((a, b) => b.updatedAt.localeCompare(a.updatedAt)).slice(0, MAX_RECORDS);
|
|
19
|
-
writeFileSync(sessionsFilePath(), JSON.stringify(sorted, null, 2));
|
|
20
|
-
}
|
|
21
|
-
export function upsertSession(rec) {
|
|
22
|
-
const records = loadSessions().filter(r => r.uuid !== rec.uuid);
|
|
23
|
-
records.push(rec);
|
|
24
|
-
saveSessions(records);
|
|
25
|
-
}
|
|
26
|
-
export function getSession(uuid) {
|
|
27
|
-
return loadSessions().find(r => r.uuid === uuid);
|
|
28
|
-
}
|
|
29
|
-
export function listSessions(cwd) {
|
|
30
|
-
return loadSessions()
|
|
31
|
-
.filter(r => r.cwd === cwd)
|
|
32
|
-
.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
|
|
33
|
-
}
|
|
34
|
-
/** Exact name match first, then unique name-prefix, then unique uuid-prefix. */
|
|
35
|
-
export function findByName(cwd, name) {
|
|
36
|
-
const sessions = listSessions(cwd);
|
|
37
|
-
const lower = name.toLowerCase();
|
|
38
|
-
const exact = sessions.find(r => r.name.toLowerCase() === lower);
|
|
39
|
-
if (exact)
|
|
40
|
-
return exact;
|
|
41
|
-
const prefix = sessions.filter(r => r.name.toLowerCase().startsWith(lower));
|
|
42
|
-
if (prefix.length === 1)
|
|
43
|
-
return prefix[0];
|
|
44
|
-
const byUuid = sessions.filter(r => r.uuid.startsWith(name));
|
|
45
|
-
if (byUuid.length === 1)
|
|
46
|
-
return byUuid[0];
|
|
47
|
-
return undefined;
|
|
48
|
-
}
|
|
49
|
-
export function touchSession(uuid) {
|
|
50
|
-
const records = loadSessions();
|
|
51
|
-
const rec = records.find(r => r.uuid === uuid);
|
|
52
|
-
if (!rec)
|
|
53
|
-
return;
|
|
54
|
-
rec.updatedAt = new Date().toISOString();
|
|
55
|
-
saveSessions(records);
|
|
56
|
-
}
|
|
57
|
-
export function renameSession(uuid, name) {
|
|
58
|
-
const records = loadSessions();
|
|
59
|
-
const rec = records.find(r => r.uuid === uuid);
|
|
60
|
-
if (!rec)
|
|
61
|
-
return false;
|
|
62
|
-
rec.name = name;
|
|
63
|
-
rec.renamed = true;
|
|
64
|
-
rec.updatedAt = new Date().toISOString();
|
|
65
|
-
saveSessions(records);
|
|
66
|
-
return true;
|
|
67
|
-
}
|
|
68
|
-
/** Apply an auto-generated title. No-op if the user already renamed the session. */
|
|
69
|
-
export function setTitle(uuid, title) {
|
|
70
|
-
const records = loadSessions();
|
|
71
|
-
const rec = records.find(r => r.uuid === uuid);
|
|
72
|
-
if (!rec || rec.renamed)
|
|
73
|
-
return;
|
|
74
|
-
rec.name = title;
|
|
75
|
-
rec.titled = true;
|
|
76
|
-
saveSessions(records);
|
|
77
|
-
}
|
|
78
|
-
export function slugify(text, maxWords = 6) {
|
|
79
|
-
const words = text
|
|
80
|
-
.toLowerCase()
|
|
81
|
-
.replace(/[^a-z0-9\s-]/g, '')
|
|
82
|
-
.split(/\s+/)
|
|
83
|
-
.filter(Boolean)
|
|
84
|
-
.slice(0, maxWords);
|
|
85
|
-
return words.join('-') || 'session';
|
|
86
|
-
}
|
|
87
|
-
export function relativeTime(iso) {
|
|
88
|
-
const ms = Date.now() - new Date(iso).getTime();
|
|
89
|
-
const min = Math.floor(ms / 60_000);
|
|
90
|
-
if (min < 1)
|
|
91
|
-
return 'just now';
|
|
92
|
-
if (min < 60)
|
|
93
|
-
return `${min}m ago`;
|
|
94
|
-
const hr = Math.floor(min / 60);
|
|
95
|
-
if (hr < 24)
|
|
96
|
-
return `${hr}h ago`;
|
|
97
|
-
const day = Math.floor(hr / 24);
|
|
98
|
-
return `${day}d ago`;
|
|
99
|
-
}
|
|
100
|
-
//# sourceMappingURL=sessionStore.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sessionStore.js","sourceRoot":"","sources":["../../src/lib/sessionStore.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/titleGen.js
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { query } from '@anthropic-ai/claude-agent-sdk';
|
|
2
|
-
const TIMEOUT_MS = 60_000;
|
|
3
|
-
/**
|
|
4
|
-
* One-shot background Haiku call to title a session, Claude Code-style.
|
|
5
|
-
* Goes through the Agent SDK (not the raw API) so it works in both API-key
|
|
6
|
-
* and subscription auth modes. Returns null on any failure — callers keep
|
|
7
|
-
* the slug fallback.
|
|
8
|
-
*/
|
|
9
|
-
export async function generateTitle(firstPrompt, cwd) {
|
|
10
|
-
try {
|
|
11
|
-
const result = await Promise.race([run(firstPrompt, cwd), timeout()]);
|
|
12
|
-
return result;
|
|
13
|
-
}
|
|
14
|
-
catch {
|
|
15
|
-
return null;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
async function run(firstPrompt, cwd) {
|
|
19
|
-
const q = query({
|
|
20
|
-
prompt: [
|
|
21
|
-
'Generate a short session title for a documentation-writing session that started with this request:',
|
|
22
|
-
'',
|
|
23
|
-
firstPrompt.slice(0, 500),
|
|
24
|
-
'',
|
|
25
|
-
'Reply with ONLY the title: 3-6 words, lowercase, kebab-case, no quotes, no punctuation.',
|
|
26
|
-
].join('\n'),
|
|
27
|
-
options: {
|
|
28
|
-
cwd,
|
|
29
|
-
model: 'haiku',
|
|
30
|
-
maxTurns: 1,
|
|
31
|
-
settingSources: [],
|
|
32
|
-
systemPrompt: 'You generate terse kebab-case session titles. Output only the title, nothing else.',
|
|
33
|
-
allowedTools: [],
|
|
34
|
-
},
|
|
35
|
-
});
|
|
36
|
-
for await (const msg of q) {
|
|
37
|
-
const m = msg;
|
|
38
|
-
if (m.type === 'result') {
|
|
39
|
-
if (m.subtype === 'success' && typeof m.result === 'string') {
|
|
40
|
-
return sanitize(m.result);
|
|
41
|
-
}
|
|
42
|
-
return null;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
return null;
|
|
46
|
-
}
|
|
47
|
-
function timeout() {
|
|
48
|
-
return new Promise(resolve => setTimeout(() => resolve(null), TIMEOUT_MS).unref());
|
|
49
|
-
}
|
|
50
|
-
function sanitize(raw) {
|
|
51
|
-
const title = raw
|
|
52
|
-
.trim()
|
|
53
|
-
.toLowerCase()
|
|
54
|
-
.replace(/[^a-z0-9\s-]/g, '')
|
|
55
|
-
.replace(/\s+/g, '-')
|
|
56
|
-
.replace(/-+/g, '-')
|
|
57
|
-
.replace(/^-|-$/g, '')
|
|
58
|
-
.split('-')
|
|
59
|
-
.slice(0, 8)
|
|
60
|
-
.join('-')
|
|
61
|
-
.slice(0, 60);
|
|
62
|
-
return title.length >= 3 ? title : null;
|
|
63
|
-
}
|
|
64
|
-
//# sourceMappingURL=titleGen.js.map
|