ai-spector 0.3.1 → 0.3.2
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/README.md +136 -14
- package/dist/cli.js +97 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/comments.d.ts +41 -0
- package/dist/commands/comments.d.ts.map +1 -0
- package/dist/commands/comments.js +138 -0
- package/dist/commands/comments.js.map +1 -0
- package/dist/commands/init.d.ts +4 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +22 -5
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/sync-cursor.d.ts +6 -0
- package/dist/commands/sync-cursor.d.ts.map +1 -0
- package/dist/commands/sync-cursor.js +18 -0
- package/dist/commands/sync-cursor.js.map +1 -0
- package/dist/comments/anchor.d.ts +16 -0
- package/dist/comments/anchor.d.ts.map +1 -0
- package/dist/comments/anchor.js +59 -0
- package/dist/comments/anchor.js.map +1 -0
- package/dist/comments/inbox.d.ts +83 -0
- package/dist/comments/inbox.d.ts.map +1 -0
- package/dist/comments/inbox.js +180 -0
- package/dist/comments/inbox.js.map +1 -0
- package/dist/comments/paths.d.ts +12 -0
- package/dist/comments/paths.d.ts.map +1 -0
- package/dist/comments/paths.js +54 -0
- package/dist/comments/paths.js.map +1 -0
- package/dist/comments/plan.d.ts +20 -0
- package/dist/comments/plan.d.ts.map +1 -0
- package/dist/comments/plan.js +62 -0
- package/dist/comments/plan.js.map +1 -0
- package/dist/comments/storage.d.ts +30 -0
- package/dist/comments/storage.d.ts.map +1 -0
- package/dist/comments/storage.js +272 -0
- package/dist/comments/storage.js.map +1 -0
- package/dist/comments/types.d.ts +54 -0
- package/dist/comments/types.d.ts.map +1 -0
- package/dist/comments/types.js +2 -0
- package/dist/comments/types.js.map +1 -0
- package/dist/config/load.d.ts +2 -0
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +4 -0
- package/dist/config/load.js.map +1 -1
- package/dist/postinstall.d.ts +3 -0
- package/dist/postinstall.d.ts.map +1 -0
- package/dist/postinstall.js +44 -0
- package/dist/postinstall.js.map +1 -0
- package/package.json +3 -5
- package/scaffold/{.cursor → cursor}/commands/_workflow.md +7 -3
- package/scaffold/cursor/commands/resolve-comments.md +145 -0
- package/scaffold/cursor/skills/_skill-router.md +22 -0
- package/scaffold/cursor/skills/ai-spector/SKILL.md +47 -0
- package/scaffold/cursor/skills/ai-spector-generate/SKILL.md +41 -0
- package/scaffold/cursor/skills/ai-spector-graph/SKILL.md +39 -0
- package/scaffold/cursor/skills/ai-spector-resolve-comments/SKILL.md +42 -0
- package/scaffold/.cursor/skills/ai-spector/SKILL.md +0 -62
- /package/scaffold/{.cursor → cursor}/commands/_cli-failures.md +0 -0
- /package/scaffold/{.cursor → cursor}/commands/_generate-graph.md +0 -0
- /package/scaffold/{.cursor → cursor}/commands/_graph.md +0 -0
- /package/scaffold/{.cursor → cursor}/commands/_prerequisites.md +0 -0
- /package/scaffold/{.cursor → cursor}/commands/analyze.md +0 -0
- /package/scaffold/{.cursor → cursor}/commands/generate-basic-design.md +0 -0
- /package/scaffold/{.cursor → cursor}/commands/generate-detail-design.md +0 -0
- /package/scaffold/{.cursor → cursor}/commands/generate-srs.md +0 -0
- /package/scaffold/{.cursor → cursor}/commands/graph-impact.md +0 -0
- /package/scaffold/{.cursor → cursor}/commands/impact.md +0 -0
- /package/scaffold/{.cursor → cursor}/commands/index.md +0 -0
- /package/scaffold/{.cursor → cursor}/commands/link-graph.md +0 -0
- /package/scaffold/{.cursor → cursor}/commands/summary.md +0 -0
- /package/scaffold/{.cursor → cursor}/commands/sync-graph.md +0 -0
- /package/scaffold/{.cursor → cursor}/commands/validate-graph.md +0 -0
- /package/scaffold/{.cursor → cursor}/commands/visualize-graph.md +0 -0
- /package/scaffold/{.cursor → cursor}/mcp.json +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/comments/plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EACL,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,GAGpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EACL,cAAc,EACd,SAAS,EACT,WAAW,EACX,2BAA2B,GAC5B,MAAM,cAAc,CAAC;AAQtB,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,IAAuB;IAEvB,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC;QAChC,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,MAAM;KAC9B,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,MAAM,2BAA2B,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACnF,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACxC,OAAO,mBAAmB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;AAClD,CAAC;AAWD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAsB;IAEtB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ;QAC1B,CAAC,CAAC,MAAM,SAAS,CACb,IAAI,CAAC,WAAW,EAChB,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,EACnC,IAAI,CAAC,QAAQ,CACd;QACH,CAAC,CAAC,MAAM,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAE1D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,IAAI,CAAC,QAAQ;YACX,CAAC,CAAC,qBAAqB,IAAI,CAAC,QAAQ,UAAU,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;YACnF,CAAC,CAAC,qBAAqB,IAAI,CAAC,QAAQ,EAAE,CACzC,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,oBAAoB,CACvC,IAAI,CAAC,WAAW,EAChB,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,MAAM,CAAC,SAAS,EACvB,MAAM,CAAC,MAAM,CAAC,OAAO,CACtB,CAAC;IAEF,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,IAAI,YAAsE,CAAC;IAE3E,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,oBAAoB,CAAC,CAAC,EAAE;YACtC,IAAI,EAAE,MAAM,EAAE,OAAO,IAAI,MAAM,CAAC,OAAO,IAAI,SAAS;YACpD,OAAO,EAAE,MAAM,EAAE,OAAO;YACxB,aAAa,EAAE,MAAM,EAAE,aAAa;YACpC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW;SAChC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,OAAO,EAAE,CAAC;YACZ,YAAY,GAAG,OAAO,CAAC;YACvB,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACpD,MAAM,GAAG,aAAa,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,gBAAgB,EAAE,KAAK,CAAC,CAAC;YAC/D,MAAM,CAAC,YAAY,GAAG,OAAO,CAAC;QAChC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,iEAAiE;IACnE,CAAC;IAED,OAAO,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,KAAmB,EACnB,KAAa;IAEb,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACvB,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAC7B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,CAClD,CAAC;IACF,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAmB,EAAE,QAAgB;IACnE,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAAE,MAAM,CAAC;AAClE,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ThreadDetail, ThreadStatus, ThreadSummary } from "./types.js";
|
|
2
|
+
export interface ListThreadsOptions {
|
|
3
|
+
projectRoot: string;
|
|
4
|
+
filePath?: string;
|
|
5
|
+
status?: ThreadStatus | "all";
|
|
6
|
+
}
|
|
7
|
+
export interface ResolveThreadOptions {
|
|
8
|
+
projectRoot: string;
|
|
9
|
+
logicalPath: string;
|
|
10
|
+
threadId: string;
|
|
11
|
+
resolvedBy?: number | string;
|
|
12
|
+
resolvedInCommitSha?: string;
|
|
13
|
+
dryRun?: boolean;
|
|
14
|
+
/** Expected meta_data.json version for optimistic locking */
|
|
15
|
+
expectedVersion?: number;
|
|
16
|
+
}
|
|
17
|
+
export interface ResolveThreadResult {
|
|
18
|
+
thread: ThreadSummary;
|
|
19
|
+
commitMessageSuggestion: string;
|
|
20
|
+
dryRun: boolean;
|
|
21
|
+
}
|
|
22
|
+
export declare function listThreads(opts: ListThreadsOptions): Promise<ThreadSummary[]>;
|
|
23
|
+
export declare function getThread(projectRoot: string, logicalPath: string, threadId: string): Promise<ThreadDetail | null>;
|
|
24
|
+
export declare function findThreadById(projectRoot: string, threadId: string): Promise<ThreadDetail | null>;
|
|
25
|
+
export declare function resolveThread(opts: ResolveThreadOptions): Promise<ResolveThreadResult>;
|
|
26
|
+
export declare function getGitHeadSha(projectRoot: string): Promise<string | null>;
|
|
27
|
+
/** First non-deleted comment body per thread (for inbox previews). */
|
|
28
|
+
export declare function loadCommentBodiesForThreads(projectRoot: string, threads: ThreadSummary[]): Promise<Map<string, string>>;
|
|
29
|
+
export declare function formatThreadListText(threads: ThreadSummary[]): string;
|
|
30
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/comments/storage.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAGV,YAAY,EAEZ,YAAY,EACZ,aAAa,EACd,MAAM,YAAY,CAAC;AAIpB,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,YAAY,GAAG,KAAK,CAAC;CAC/B;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,6DAA6D;IAC7D,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,aAAa,CAAC;IACtB,uBAAuB,EAAE,MAAM,CAAC;IAChC,MAAM,EAAE,OAAO,CAAC;CACjB;AAoID,wBAAsB,WAAW,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CA8BpF;AAED,wBAAsB,SAAS,CAC7B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAmB9B;AAED,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAO9B;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,mBAAmB,CAAC,CA8D9B;AAED,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAW/E;AAED,sEAAsE;AACtE,wBAAsB,2BAA2B,CAC/C,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,aAAa,EAAE,GACvB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAU9B;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM,CAiBrE"}
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { readdir, readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { basename, dirname, join, relative } from "node:path";
|
|
4
|
+
import { promisify } from "node:util";
|
|
5
|
+
import { pathExists, readJson, writeJson } from "../util/fs.js";
|
|
6
|
+
import { logicalPathToDocPath, normalizeLogicalPath, threadDirRel, threadEventsRel, threadMetaRel, } from "./paths.js";
|
|
7
|
+
const exec = promisify(execFile);
|
|
8
|
+
function isThreadMeta(raw) {
|
|
9
|
+
if (!raw || typeof raw !== "object") {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
const m = raw;
|
|
13
|
+
return (typeof m.threadId === "string" &&
|
|
14
|
+
typeof m.filePath === "string" &&
|
|
15
|
+
typeof m.status === "string" &&
|
|
16
|
+
typeof m.version === "number" &&
|
|
17
|
+
m.anchor != null &&
|
|
18
|
+
typeof m.anchor.startLine === "number");
|
|
19
|
+
}
|
|
20
|
+
function isCommentBody(raw) {
|
|
21
|
+
if (!raw || typeof raw !== "object") {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
const c = raw;
|
|
25
|
+
return typeof c.commentId === "string" && typeof c.body === "string";
|
|
26
|
+
}
|
|
27
|
+
async function readEvents(eventsPath) {
|
|
28
|
+
if (!(await pathExists(eventsPath))) {
|
|
29
|
+
return [];
|
|
30
|
+
}
|
|
31
|
+
const raw = await readFile(eventsPath, "utf8");
|
|
32
|
+
const events = [];
|
|
33
|
+
for (const line of raw.split("\n")) {
|
|
34
|
+
const trimmed = line.trim();
|
|
35
|
+
if (!trimmed) {
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
events.push(JSON.parse(trimmed));
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
/* skip malformed lines */
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return events;
|
|
46
|
+
}
|
|
47
|
+
async function countCommentFiles(threadDir) {
|
|
48
|
+
let count = 0;
|
|
49
|
+
const entries = await readdir(threadDir, { withFileTypes: true });
|
|
50
|
+
for (const ent of entries) {
|
|
51
|
+
if (!ent.isFile()) {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
if (ent.name === "meta_data.json" || ent.name === "events.jsonl") {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
count += 1;
|
|
58
|
+
}
|
|
59
|
+
return count;
|
|
60
|
+
}
|
|
61
|
+
async function loadCommentBodies(threadDir) {
|
|
62
|
+
const comments = [];
|
|
63
|
+
const entries = await readdir(threadDir, { withFileTypes: true });
|
|
64
|
+
for (const ent of entries) {
|
|
65
|
+
if (!ent.isFile()) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (ent.name === "meta_data.json" || ent.name === "events.jsonl") {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
const raw = await readJson(join(threadDir, ent.name));
|
|
72
|
+
if (isCommentBody(raw)) {
|
|
73
|
+
comments.push(raw);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
comments.sort((a, b) => a.createdAt.localeCompare(b.createdAt));
|
|
77
|
+
return comments;
|
|
78
|
+
}
|
|
79
|
+
function toSummary(projectRoot, logicalPath, meta, replyCount) {
|
|
80
|
+
const threadDir = threadDirRel(logicalPath, meta.threadId);
|
|
81
|
+
return {
|
|
82
|
+
...meta,
|
|
83
|
+
replyCount,
|
|
84
|
+
threadDir,
|
|
85
|
+
docPath: logicalPathToDocPath(meta.filePath),
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
async function discoverThreadMetas(projectRoot) {
|
|
89
|
+
const commentsRoot = join(projectRoot, "comments");
|
|
90
|
+
if (!(await pathExists(commentsRoot))) {
|
|
91
|
+
return [];
|
|
92
|
+
}
|
|
93
|
+
const found = [];
|
|
94
|
+
async function walk(dir) {
|
|
95
|
+
let entries;
|
|
96
|
+
try {
|
|
97
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
for (const ent of entries) {
|
|
103
|
+
const abs = join(dir, ent.name);
|
|
104
|
+
if (ent.isDirectory()) {
|
|
105
|
+
await walk(abs);
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (ent.name !== "meta_data.json") {
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
const threadDir = dirname(abs);
|
|
112
|
+
const threadId = basename(threadDir);
|
|
113
|
+
const logicalPath = relative(commentsRoot, dirname(threadDir)).replace(/\\/g, "/");
|
|
114
|
+
found.push({ logicalPath, threadId, metaPath: abs });
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
await walk(commentsRoot);
|
|
118
|
+
return found;
|
|
119
|
+
}
|
|
120
|
+
export async function listThreads(opts) {
|
|
121
|
+
const fileFilter = opts.filePath ? normalizeLogicalPath(opts.filePath) : undefined;
|
|
122
|
+
const statusFilter = opts.status ?? "open";
|
|
123
|
+
const discovered = await discoverThreadMetas(opts.projectRoot);
|
|
124
|
+
const summaries = [];
|
|
125
|
+
for (const item of discovered) {
|
|
126
|
+
if (fileFilter && normalizeLogicalPath(item.logicalPath) !== fileFilter) {
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
const meta = await readJson(item.metaPath);
|
|
130
|
+
if (!isThreadMeta(meta)) {
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (statusFilter !== "all" && meta.status !== statusFilter) {
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
const replyCount = await countCommentFiles(dirname(item.metaPath));
|
|
137
|
+
summaries.push(toSummary(opts.projectRoot, item.logicalPath, meta, replyCount));
|
|
138
|
+
}
|
|
139
|
+
summaries.sort((a, b) => {
|
|
140
|
+
const lineDiff = a.anchor.startLine - b.anchor.startLine;
|
|
141
|
+
if (lineDiff !== 0) {
|
|
142
|
+
return lineDiff;
|
|
143
|
+
}
|
|
144
|
+
return a.updatedAt.localeCompare(b.updatedAt);
|
|
145
|
+
});
|
|
146
|
+
return summaries;
|
|
147
|
+
}
|
|
148
|
+
export async function getThread(projectRoot, logicalPath, threadId) {
|
|
149
|
+
const lp = normalizeLogicalPath(logicalPath);
|
|
150
|
+
const metaPath = join(projectRoot, threadMetaRel(lp, threadId));
|
|
151
|
+
if (!(await pathExists(metaPath))) {
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
const meta = await readJson(metaPath);
|
|
155
|
+
if (!isThreadMeta(meta)) {
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
const threadDir = join(projectRoot, threadDirRel(lp, threadId));
|
|
159
|
+
const replyCount = await countCommentFiles(threadDir);
|
|
160
|
+
const comments = await loadCommentBodies(threadDir);
|
|
161
|
+
const events = await readEvents(join(threadDir, "events.jsonl"));
|
|
162
|
+
return {
|
|
163
|
+
...toSummary(projectRoot, lp, meta, replyCount),
|
|
164
|
+
comments,
|
|
165
|
+
events,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
export async function findThreadById(projectRoot, threadId) {
|
|
169
|
+
const discovered = await discoverThreadMetas(projectRoot);
|
|
170
|
+
const match = discovered.find((d) => d.threadId === threadId);
|
|
171
|
+
if (!match) {
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
return getThread(projectRoot, match.logicalPath, threadId);
|
|
175
|
+
}
|
|
176
|
+
export async function resolveThread(opts) {
|
|
177
|
+
const lp = normalizeLogicalPath(opts.logicalPath);
|
|
178
|
+
const metaPath = join(opts.projectRoot, threadMetaRel(lp, opts.threadId));
|
|
179
|
+
if (!(await pathExists(metaPath))) {
|
|
180
|
+
throw new Error(`Thread not found: comments/${lp}/${opts.threadId}/meta_data.json`);
|
|
181
|
+
}
|
|
182
|
+
const meta = await readJson(metaPath);
|
|
183
|
+
if (opts.expectedVersion != null && meta.version !== opts.expectedVersion) {
|
|
184
|
+
throw new Error(`Stale thread version: expected ${opts.expectedVersion}, found ${meta.version}. Re-read meta_data.json and retry.`);
|
|
185
|
+
}
|
|
186
|
+
if (meta.status === "resolved") {
|
|
187
|
+
throw new Error(`Thread ${opts.threadId} is already resolved.`);
|
|
188
|
+
}
|
|
189
|
+
const commitSha = opts.resolvedInCommitSha?.trim() || (await getGitHeadSha(opts.projectRoot));
|
|
190
|
+
const now = new Date().toISOString();
|
|
191
|
+
const resolvedBy = opts.resolvedBy ?? "local";
|
|
192
|
+
const nextVersion = meta.version + 1;
|
|
193
|
+
const updated = {
|
|
194
|
+
...meta,
|
|
195
|
+
status: "resolved",
|
|
196
|
+
resolvedAt: now,
|
|
197
|
+
resolvedBy,
|
|
198
|
+
resolvedInCommitSha: commitSha,
|
|
199
|
+
updatedAt: now,
|
|
200
|
+
version: nextVersion,
|
|
201
|
+
};
|
|
202
|
+
const event = {
|
|
203
|
+
at: now,
|
|
204
|
+
type: "resolved",
|
|
205
|
+
resolvedInCommitSha: commitSha ?? undefined,
|
|
206
|
+
by: resolvedBy,
|
|
207
|
+
};
|
|
208
|
+
const threadDir = join(opts.projectRoot, threadDirRel(lp, opts.threadId));
|
|
209
|
+
const eventsPath = join(opts.projectRoot, threadEventsRel(lp, opts.threadId));
|
|
210
|
+
const commitMessageSuggestion = `resolve comment thread ${opts.threadId} on ${meta.filePath} ` +
|
|
211
|
+
`(lines ${meta.anchor.startLine}-${meta.anchor.endLine})`;
|
|
212
|
+
if (!opts.dryRun) {
|
|
213
|
+
await writeJson(metaPath, updated);
|
|
214
|
+
const line = `${JSON.stringify(event)}\n`;
|
|
215
|
+
if (await pathExists(eventsPath)) {
|
|
216
|
+
await writeFile(eventsPath, line, { flag: "a" });
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
await writeFile(eventsPath, line, "utf8");
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
const replyCount = await countCommentFiles(threadDir);
|
|
223
|
+
return {
|
|
224
|
+
thread: toSummary(opts.projectRoot, lp, updated, replyCount),
|
|
225
|
+
commitMessageSuggestion,
|
|
226
|
+
dryRun: opts.dryRun === true,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
export async function getGitHeadSha(projectRoot) {
|
|
230
|
+
try {
|
|
231
|
+
const { stdout } = await exec("git", ["rev-parse", "HEAD"], {
|
|
232
|
+
cwd: projectRoot,
|
|
233
|
+
encoding: "utf8",
|
|
234
|
+
});
|
|
235
|
+
const sha = stdout.trim();
|
|
236
|
+
return sha || null;
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
return null;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
/** First non-deleted comment body per thread (for inbox previews). */
|
|
243
|
+
export async function loadCommentBodiesForThreads(projectRoot, threads) {
|
|
244
|
+
const map = new Map();
|
|
245
|
+
for (const t of threads) {
|
|
246
|
+
const detail = await getThread(projectRoot, t.filePath, t.threadId);
|
|
247
|
+
const first = detail?.comments.find((c) => !c.deletedAt);
|
|
248
|
+
if (first) {
|
|
249
|
+
map.set(t.threadId, first.body);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return map;
|
|
253
|
+
}
|
|
254
|
+
export function formatThreadListText(threads) {
|
|
255
|
+
if (threads.length === 0) {
|
|
256
|
+
return "No comment threads found.";
|
|
257
|
+
}
|
|
258
|
+
const lines = threads.map((t) => {
|
|
259
|
+
const doc = t.docPath ?? "(unknown doc path)";
|
|
260
|
+
return [
|
|
261
|
+
`${t.threadId}`,
|
|
262
|
+
` file: ${t.filePath} → ${doc}`,
|
|
263
|
+
` status: ${t.status} | lines ${t.anchor.startLine}-${t.anchor.endLine} | lang ${t.anchor.language}`,
|
|
264
|
+
` branch: ${t.originBranch} | replies: ${t.replyCount}`,
|
|
265
|
+
t.anchor.lineExcerpt ? ` excerpt: ${t.anchor.lineExcerpt}` : null,
|
|
266
|
+
]
|
|
267
|
+
.filter(Boolean)
|
|
268
|
+
.join("\n");
|
|
269
|
+
});
|
|
270
|
+
return lines.join("\n\n");
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/comments/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export type ThreadStatus = "open" | "resolved";
|
|
2
|
+
export type AnchorState = "active" | "drifted" | "missing";
|
|
3
|
+
export interface CommentAnchor {
|
|
4
|
+
branchName: string;
|
|
5
|
+
baseCommitSha: string;
|
|
6
|
+
filePath: string;
|
|
7
|
+
language: string;
|
|
8
|
+
startLine: number;
|
|
9
|
+
endLine: number;
|
|
10
|
+
lineExcerpt?: string;
|
|
11
|
+
anchorState?: AnchorState;
|
|
12
|
+
}
|
|
13
|
+
export interface ThreadMeta {
|
|
14
|
+
threadId: string;
|
|
15
|
+
filePath: string;
|
|
16
|
+
originBranch: string;
|
|
17
|
+
status: ThreadStatus;
|
|
18
|
+
version: number;
|
|
19
|
+
createdAt: string;
|
|
20
|
+
updatedAt: string;
|
|
21
|
+
createdBy: number | string;
|
|
22
|
+
resolvedAt: string | null;
|
|
23
|
+
resolvedBy: number | string | null;
|
|
24
|
+
resolvedInCommitSha: string | null;
|
|
25
|
+
anchor: CommentAnchor;
|
|
26
|
+
}
|
|
27
|
+
export interface CommentBody {
|
|
28
|
+
commentId: string;
|
|
29
|
+
threadId: string;
|
|
30
|
+
body: string;
|
|
31
|
+
authorId: number | string;
|
|
32
|
+
createdAt: string;
|
|
33
|
+
parentCommentId: string | null;
|
|
34
|
+
editedAt: string | null;
|
|
35
|
+
deletedAt: string | null;
|
|
36
|
+
}
|
|
37
|
+
export type CommentEventType = "thread_created" | "reply_added" | "comment_edited" | "comment_deleted" | "resolved" | "reopened";
|
|
38
|
+
export interface CommentEvent {
|
|
39
|
+
at: string;
|
|
40
|
+
type: CommentEventType;
|
|
41
|
+
by?: number | string;
|
|
42
|
+
commentId?: string;
|
|
43
|
+
resolvedInCommitSha?: string;
|
|
44
|
+
}
|
|
45
|
+
export interface ThreadSummary extends ThreadMeta {
|
|
46
|
+
replyCount: number;
|
|
47
|
+
threadDir: string;
|
|
48
|
+
docPath: string | null;
|
|
49
|
+
}
|
|
50
|
+
export interface ThreadDetail extends ThreadSummary {
|
|
51
|
+
comments: CommentBody[];
|
|
52
|
+
events: CommentEvent[];
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/comments/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,UAAU,CAAC;AAE/C,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAE3D,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACnC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,MAAM,EAAE,aAAa,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,MAAM,gBAAgB,GACxB,gBAAgB,GAChB,aAAa,GACb,gBAAgB,GAChB,iBAAiB,GACjB,UAAU,GACV,UAAU,CAAC;AAEf,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,gBAAgB,CAAC;IACvB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,aAAc,SAAQ,UAAU;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,YAAa,SAAQ,aAAa;IACjD,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,MAAM,EAAE,YAAY,EAAE,CAAC;CACxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/comments/types.ts"],"names":[],"mappings":""}
|
package/dist/config/load.d.ts
CHANGED
|
@@ -3,6 +3,8 @@ import type { DocflowConfig, DocumentsManifest } from "./types.js";
|
|
|
3
3
|
export declare function packageBundleRoot(): string;
|
|
4
4
|
/** Bundled project scaffold for `ai-spector init`. */
|
|
5
5
|
export declare function scaffoldBundleRoot(): string;
|
|
6
|
+
/** Cursor commands/skills/MCP bundled under scaffold (not `.cursor/` — root gitignore). */
|
|
7
|
+
export declare function scaffoldCursorBundleRoot(): string;
|
|
6
8
|
export declare function findProjectRoot(start?: string): string;
|
|
7
9
|
export declare function loadDocflowConfig(root?: string): Promise<{
|
|
8
10
|
root: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/config/load.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAKnE,mEAAmE;AACnE,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,sDAAsD;AACtD,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,eAAe,CAAC,KAAK,SAAgB,GAAG,MAAM,CAkB7D;AAgBD,wBAAsB,iBAAiB,CACrC,IAAI,SAAoB,GACvB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,aAAa,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAYtE;AAED,mFAAmF;AACnF,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,aAAa,GACpB,MAAM,CAER;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,4BAA4B,IAAI,MAAM,CAErD;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC;IACrD,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,iBAAiB,CAAC;CAC7B,CAAC,CASD;AAED,wBAAsB,2BAA2B,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAS9E"}
|
|
1
|
+
{"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/config/load.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAKnE,mEAAmE;AACnE,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,sDAAsD;AACtD,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,2FAA2F;AAC3F,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD;AAED,wBAAgB,eAAe,CAAC,KAAK,SAAgB,GAAG,MAAM,CAkB7D;AAgBD,wBAAsB,iBAAiB,CACrC,IAAI,SAAoB,GACvB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,aAAa,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAYtE;AAED,mFAAmF;AACnF,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,aAAa,GACpB,MAAM,CAER;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,4BAA4B,IAAI,MAAM,CAErD;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC;IACrD,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,iBAAiB,CAAC;CAC7B,CAAC,CASD;AAED,wBAAsB,2BAA2B,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAS9E"}
|
package/dist/config/load.js
CHANGED
|
@@ -11,6 +11,10 @@ export function packageBundleRoot() {
|
|
|
11
11
|
export function scaffoldBundleRoot() {
|
|
12
12
|
return join(packageBundleRoot(), "scaffold");
|
|
13
13
|
}
|
|
14
|
+
/** Cursor commands/skills/MCP bundled under scaffold (not `.cursor/` — root gitignore). */
|
|
15
|
+
export function scaffoldCursorBundleRoot() {
|
|
16
|
+
return join(scaffoldBundleRoot(), "cursor");
|
|
17
|
+
}
|
|
14
18
|
export function findProjectRoot(start = process.cwd()) {
|
|
15
19
|
let dir = resolve(start);
|
|
16
20
|
for (;;) {
|
package/dist/config/load.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/config/load.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/config/load.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postinstall.d.ts","sourceRoot":"","sources":["../src/postinstall.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* After npm install: refresh .cursor/ when project is already initialized.
|
|
4
|
+
* Uses INIT_CWD (directory where npm install was run).
|
|
5
|
+
*/
|
|
6
|
+
import { dirname, join, resolve } from "node:path";
|
|
7
|
+
import { existsSync } from "node:fs";
|
|
8
|
+
import { pathToFileURL } from "node:url";
|
|
9
|
+
import { syncCursorToProject } from "./commands/sync-cursor.js";
|
|
10
|
+
function findInitializedRoot(start) {
|
|
11
|
+
let dir = resolve(start);
|
|
12
|
+
for (;;) {
|
|
13
|
+
if (existsSync(join(dir, ".ai-spector", "docflow.config.json"))) {
|
|
14
|
+
return dir;
|
|
15
|
+
}
|
|
16
|
+
const parent = dirname(dir);
|
|
17
|
+
if (parent === dir) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
dir = parent;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
async function main() {
|
|
24
|
+
const start = process.env.INIT_CWD ?? process.cwd();
|
|
25
|
+
const root = findInitializedRoot(start);
|
|
26
|
+
if (!root) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
await syncCursorToProject(root);
|
|
31
|
+
process.stderr.write(`[ai-spector] Refreshed .cursor/commands and .cursor/skills — restart Cursor to load new skills.\n`);
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
35
|
+
process.stderr.write(`[ai-spector] postinstall sync-cursor skipped: ${msg}\n`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const entry = process.argv[1];
|
|
39
|
+
if (entry && import.meta.url === pathToFileURL(entry).href) {
|
|
40
|
+
main().catch(() => {
|
|
41
|
+
/* never fail npm install */
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=postinstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postinstall.js","sourceRoot":"","sources":["../src/postinstall.ts"],"names":[],"mappings":";AACA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,SAAS,mBAAmB,CAAC,KAAa;IACxC,IAAI,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IACzB,SAAS,CAAC;QACR,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,qBAAqB,CAAC,CAAC,EAAE,CAAC;YAChE,OAAO,GAAG,CAAC;QACb,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACpD,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,mGAAmG,CACpG,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iDAAiD,GAAG,IAAI,CAAC,CAAC;IACjF,CAAC;AACH,CAAC;AAED,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC9B,IAAI,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,aAAa,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3D,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;QAChB,4BAA4B;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ai-spector",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.2",
|
|
4
4
|
"description": "Cursor-first documentation workflow: traceability graph, SRS/basic/detail design templates, and ai-spector CLI",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -25,9 +25,6 @@
|
|
|
25
25
|
"engines": {
|
|
26
26
|
"node": ">=20"
|
|
27
27
|
},
|
|
28
|
-
"publishConfig": {
|
|
29
|
-
"access": "public"
|
|
30
|
-
},
|
|
31
28
|
"files": [
|
|
32
29
|
"dist",
|
|
33
30
|
"schemas",
|
|
@@ -54,7 +51,8 @@
|
|
|
54
51
|
"analyze": "node dist/cli.js -r example analyze",
|
|
55
52
|
"graph:validate": "node dist/cli.js -r example graph validate",
|
|
56
53
|
"graph:merge": "node dist/cli.js -r example graph merge --from-knowledge",
|
|
57
|
-
"graph:visualize": "node dist/cli.js -r example graph visualize --open"
|
|
54
|
+
"graph:visualize": "node dist/cli.js -r example graph visualize --open",
|
|
55
|
+
"ai-spector": "node dist/cli.js"
|
|
58
56
|
},
|
|
59
57
|
"dependencies": {
|
|
60
58
|
"ajv": "^8.17.1",
|
|
@@ -11,9 +11,11 @@ npm install ai-spector
|
|
|
11
11
|
npx ai-spector init
|
|
12
12
|
```
|
|
13
13
|
|
|
14
|
-
Add source material under `docs/data-source/`, open the project in Cursor, **reload MCP** (Graphify is in `.cursor/mcp.json` from `init`), and enable
|
|
14
|
+
Add source material under `docs/data-source/`, open the project in Cursor, **reload MCP** (Graphify is in `.cursor/mcp.json` from `init`), and **enable all ai-spector skills** (see `.cursor/skills/_skill-router.md`).
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
Skills auto-route when you ask in natural language (e.g. “resolve this comment”, “generate SRS”). Slash commands still work and take priority.
|
|
17
|
+
|
|
18
|
+
## Day-to-day (slash commands or natural language)
|
|
17
19
|
|
|
18
20
|
| Step | You run | Agent runs (CLI) |
|
|
19
21
|
|------|---------|------------------|
|
|
@@ -25,6 +27,7 @@ Add source material under `docs/data-source/`, open the project in Cursor, **rel
|
|
|
25
27
|
| 5 | **`/generate-basic-design`** [paths or request] — same targeting + waves as SRS (`generate-basic-design.md`) |
|
|
26
28
|
| 6 | **`/generate-detail-design`** | same `graph query` pattern |
|
|
27
29
|
| After edits | **`/impact`** [what changed] | Empty args → `git diff` + resolve seeds; else describe change → `graph impact <id> --json` (or `--git` / `--file`) |
|
|
30
|
+
| Review comments | **`/resolve-comments`** [pick or file] | `comments inbox` (show table only) → plan → apply → **one commit: doc + comment meta** (amend) → push |
|
|
28
31
|
| Inspect graph | **`/visualize-graph`** | `graph visualize --open` |
|
|
29
32
|
|
|
30
33
|
**Any step fails?** Agent reports the error and fix steps, then you re-run the **same** slash command. The agent does not bypass CLI with manual graph edits or folder-wide doc reads.
|
|
@@ -48,5 +51,6 @@ docs/data-source/ ← add files
|
|
|
48
51
|
| Validate errors | **`/validate-graph`** — agent explains each `[ERROR]` and fixes or guides you |
|
|
49
52
|
| Empty SRS / wrong context | **`/analyze`** then **`/generate-srs`** — not “read all docs manually” |
|
|
50
53
|
| Unsure what regen | **`/impact`** (current git diff, selection, path, or short description) |
|
|
54
|
+
| Comment resolve incomplete | Missing doc in commit — amend must include **both** `docs/…` and `comments/…/`; see [resolve-comments.md](./resolve-comments.md) |
|
|
51
55
|
|
|
52
|
-
Details: [_cli-failures.md](./_cli-failures.md). CLI reference: [_graph.md](./_graph.md). Prerequisites: [_prerequisites.md](./_prerequisites.md).
|
|
56
|
+
Details: [_cli-failures.md](./_cli-failures.md). CLI reference: [_graph.md](./_graph.md). Skills: [../skills/_skill-router.md](../skills/_skill-router.md). Prerequisites: [_prerequisites.md](./_prerequisites.md).
|