ndrstnd 0.1.1 → 0.2.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/CHANGELOG.md +41 -0
- package/README.md +6 -0
- package/dist/server/analysis-core.d.ts +4 -4
- package/dist/server/analysis-core.js +244 -56
- package/dist/server/analysis-core.js.map +1 -1
- package/dist/server/analyze.d.ts +13 -0
- package/dist/server/analyze.js +102 -28
- package/dist/server/analyze.js.map +1 -1
- package/dist/server/cli.js +47 -11
- package/dist/server/cli.js.map +1 -1
- package/dist/server/diagnostic.d.ts +34 -0
- package/dist/server/diagnostic.js +155 -0
- package/dist/server/diagnostic.js.map +1 -0
- package/dist/shared/analysis-schema.js +8 -8
- package/dist/shared/analysis-schema.js.map +1 -1
- package/dist/shared/diagnostic-schema.d.ts +572 -0
- package/dist/shared/diagnostic-schema.js +83 -0
- package/dist/shared/diagnostic-schema.js.map +1 -0
- package/package.json +3 -2
- package/src/skill-assets/ndrstnd/SKILL.md +4 -3
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { DIAGNOSTIC_ARTIFACT_VERSION, DiagnosticArtifactSchema, } from "../shared/diagnostic-schema.js";
|
|
6
|
+
export function textMetadata(value) {
|
|
7
|
+
return { length: value.length, sha256: sha256(value) };
|
|
8
|
+
}
|
|
9
|
+
export function responseMetadata(response, extracted) {
|
|
10
|
+
return {
|
|
11
|
+
...textMetadata(response),
|
|
12
|
+
extractedLength: extracted.length,
|
|
13
|
+
extractedSha256: sha256(extracted),
|
|
14
|
+
fenced: response.includes("```"),
|
|
15
|
+
candidateStartsWithObject: extracted.trimStart().startsWith("{"),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export function activitySnapshot(activity) {
|
|
19
|
+
return activity === undefined ? undefined : { ...activity };
|
|
20
|
+
}
|
|
21
|
+
/** Writes a shareable failure trace without persisting prompts, diffs, environment variables, or agent output by default. */
|
|
22
|
+
export async function writeDiagnosticArtifact(options) {
|
|
23
|
+
const repoPath = options.input?.repoPath;
|
|
24
|
+
const includeAgentOutput = options.includeAgentOutput === true;
|
|
25
|
+
const rawAgentResponses = includeAgentOutput
|
|
26
|
+
? options.failure.attempts.flatMap((attempt, index) => attempt.rawResponse === undefined ? [] : [{ turn: index + 1, response: attempt.rawResponse }])
|
|
27
|
+
: [];
|
|
28
|
+
const artifact = DiagnosticArtifactSchema.parse({
|
|
29
|
+
kind: "ndrstnd-analysis-diagnostic",
|
|
30
|
+
version: DIAGNOSTIC_ARTIFACT_VERSION,
|
|
31
|
+
createdAt: (options.now ?? new Date()).toISOString(),
|
|
32
|
+
tool: {
|
|
33
|
+
version: options.toolVersion,
|
|
34
|
+
node: process.versions.node,
|
|
35
|
+
platform: process.platform,
|
|
36
|
+
arch: process.arch,
|
|
37
|
+
},
|
|
38
|
+
command: {
|
|
39
|
+
name: "review",
|
|
40
|
+
args: redactCommandArgs(options.commandArgs, repoPath),
|
|
41
|
+
},
|
|
42
|
+
agent: options.agent === undefined ? undefined : {
|
|
43
|
+
id: options.agent.id,
|
|
44
|
+
name: options.agent.name,
|
|
45
|
+
command: options.agent.command,
|
|
46
|
+
},
|
|
47
|
+
scope: repoPath === undefined || options.input === undefined ? undefined : diagnosticScope(options.input),
|
|
48
|
+
failure: {
|
|
49
|
+
phase: options.failure.phase,
|
|
50
|
+
message: redactText(options.failure.message, repoPath),
|
|
51
|
+
},
|
|
52
|
+
attempts: options.failure.attempts.map((attempt) => diagnosticAttempt(attempt, repoPath)),
|
|
53
|
+
sensitiveDataIncluded: rawAgentResponses.length > 0,
|
|
54
|
+
rawAgentResponses: rawAgentResponses.length === 0 ? undefined : rawAgentResponses,
|
|
55
|
+
nextSteps: diagnosticNextSteps(),
|
|
56
|
+
});
|
|
57
|
+
await mkdir(options.directory, { recursive: true, mode: 0o700 });
|
|
58
|
+
const filename = `ndrstnd-diagnostic-${fileTimestamp(artifact.createdAt)}-${randomUUID().slice(0, 8)}.json`;
|
|
59
|
+
const path = join(options.directory, filename);
|
|
60
|
+
await writeFile(path, `${JSON.stringify(artifact, null, 2)}\n`, { encoding: "utf8", mode: 0o600, flag: "wx" });
|
|
61
|
+
return path;
|
|
62
|
+
}
|
|
63
|
+
export function formatDiagnosticInstructions(artifactPath, writeError) {
|
|
64
|
+
const lines = ["To report this problem:"];
|
|
65
|
+
if (artifactPath !== undefined) {
|
|
66
|
+
lines.push(`1. Keep the diagnostic artifact unchanged: ${artifactPath}`);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
lines.push("1. Save the complete terminal output because no diagnostic artifact could be written.");
|
|
70
|
+
}
|
|
71
|
+
lines.push(artifactPath === undefined
|
|
72
|
+
? "2. Share that terminal output and the exact ndrstnd command; for a review, include the selected agent and base."
|
|
73
|
+
: "2. Share that artifact and the exact ndrstnd review command, including the selected agent and base.");
|
|
74
|
+
lines.push("3. If the failure needs agent-output details, rerun with --diagnostic-include-agent-output and share that file only through a private channel.");
|
|
75
|
+
lines.push("4. Do not include credentials, tokens, or repository contents unless they are requested through a secure channel.");
|
|
76
|
+
if (writeError !== undefined)
|
|
77
|
+
lines.push(`Diagnostic artifact write failed: ${writeError}`);
|
|
78
|
+
return lines.join("\n");
|
|
79
|
+
}
|
|
80
|
+
function diagnosticAttempt(attempt, repoPath) {
|
|
81
|
+
return {
|
|
82
|
+
kind: attempt.kind,
|
|
83
|
+
durationMs: Math.max(0, Math.round(attempt.durationMs)),
|
|
84
|
+
prompt: attempt.prompt,
|
|
85
|
+
response: attempt.response,
|
|
86
|
+
activity: attempt.activity,
|
|
87
|
+
validation: attempt.validation === undefined ? undefined : {
|
|
88
|
+
phase: attempt.validation.phase,
|
|
89
|
+
message: redactText(attempt.validation.message, repoPath),
|
|
90
|
+
},
|
|
91
|
+
error: attempt.error === undefined ? undefined : redactText(attempt.error, repoPath),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function diagnosticScope(input) {
|
|
95
|
+
const hunkCounts = new Map();
|
|
96
|
+
for (const hunk of input.hunks)
|
|
97
|
+
hunkCounts.set(hunk.fileId, (hunkCounts.get(hunk.fileId) ?? 0) + 1);
|
|
98
|
+
const meaningfulFileCount = input.files.filter((file) => file.signal === "meaningful").length;
|
|
99
|
+
return {
|
|
100
|
+
repoPath: "<repo>",
|
|
101
|
+
targetRef: redactText(input.targetRef, input.repoPath),
|
|
102
|
+
baseRef: redactText(input.baseRef, input.repoPath),
|
|
103
|
+
mergeBase: redactText(input.mergeBase, input.repoPath),
|
|
104
|
+
includesWorkingTree: input.includesWorkingTree === true,
|
|
105
|
+
inputHash: sha256(JSON.stringify(input)),
|
|
106
|
+
fileCount: input.files.length,
|
|
107
|
+
meaningfulFileCount,
|
|
108
|
+
hunkCount: input.hunks.length,
|
|
109
|
+
files: input.files.map((file) => ({
|
|
110
|
+
path: redactText(file.path, input.repoPath),
|
|
111
|
+
status: file.status,
|
|
112
|
+
binary: file.binary,
|
|
113
|
+
signal: file.signal,
|
|
114
|
+
signalReason: file.signalReason === undefined ? undefined : redactText(file.signalReason, input.repoPath),
|
|
115
|
+
hunkCount: hunkCounts.get(file.id) ?? 0,
|
|
116
|
+
})),
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function redactCommandArgs(args, repoPath) {
|
|
120
|
+
const redacted = [];
|
|
121
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
122
|
+
const argument = args[index];
|
|
123
|
+
if (argument === "--repo" || argument === "--conversation") {
|
|
124
|
+
redacted.push(argument, argument === "--repo" ? "<repo>" : "<conversation>");
|
|
125
|
+
index += 1;
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
redacted.push(redactText(argument, repoPath));
|
|
129
|
+
}
|
|
130
|
+
return redacted;
|
|
131
|
+
}
|
|
132
|
+
function redactText(value, repoPath) {
|
|
133
|
+
let redacted = value;
|
|
134
|
+
if (repoPath !== undefined && repoPath !== "")
|
|
135
|
+
redacted = redacted.split(repoPath).join("<repo>");
|
|
136
|
+
const home = homedir();
|
|
137
|
+
if (home !== "")
|
|
138
|
+
redacted = redacted.split(home).join("<home>");
|
|
139
|
+
return redacted.slice(0, 8_000);
|
|
140
|
+
}
|
|
141
|
+
function diagnosticNextSteps() {
|
|
142
|
+
return [
|
|
143
|
+
"Keep this JSON artifact unchanged when sharing it with the ndrstnd maintainer.",
|
|
144
|
+
"Include the exact review command, selected agent, and intended base/target scope.",
|
|
145
|
+
"Use --diagnostic-include-agent-output only for a private escalation when the maintainer asks for the raw response.",
|
|
146
|
+
"Remove credentials or tokens before sharing; the default artifact intentionally excludes prompts, diffs, environment variables, and raw responses.",
|
|
147
|
+
];
|
|
148
|
+
}
|
|
149
|
+
function fileTimestamp(value) {
|
|
150
|
+
return value.replace(/[:.]/g, "-").replace(/Z$/, "");
|
|
151
|
+
}
|
|
152
|
+
function sha256(value) {
|
|
153
|
+
return createHash("sha256").update(value).digest("hex");
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=diagnostic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostic.js","sourceRoot":"","sources":["../../src/server/diagnostic.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,9 +5,9 @@ export const ChapterSchema = z.object({
|
|
|
5
5
|
id: z.string().min(1).max(80),
|
|
6
6
|
title: z.string().min(1).max(120),
|
|
7
7
|
kind: z.enum(["feature", "decision", "behavior", "non_functional", "risk", "test", "other"]),
|
|
8
|
-
synopsis: z.string().min(1).max(
|
|
9
|
-
before: z.string().max(
|
|
10
|
-
after: z.string().max(
|
|
8
|
+
synopsis: z.string().min(1).max(1_200),
|
|
9
|
+
before: z.string().max(900).optional(),
|
|
10
|
+
after: z.string().max(900).optional(),
|
|
11
11
|
confidence: z.enum(["high", "medium", "low"]),
|
|
12
12
|
attention: AttentionSchema,
|
|
13
13
|
riskCategories: z.array(RiskCategorySchema),
|
|
@@ -16,10 +16,10 @@ export const ChapterSchema = z.object({
|
|
|
16
16
|
export const AnalysisStepSchema = z.object({
|
|
17
17
|
id: z.string().min(1).max(80),
|
|
18
18
|
title: z.string().min(1).max(120),
|
|
19
|
-
goal: z.string().min(1).max(
|
|
20
|
-
youNowHave: z.string().min(1).max(
|
|
19
|
+
goal: z.string().min(1).max(900),
|
|
20
|
+
youNowHave: z.string().min(1).max(900),
|
|
21
21
|
deferred: z.array(z.object({
|
|
22
|
-
concern: z.string().min(1).max(
|
|
22
|
+
concern: z.string().min(1).max(700),
|
|
23
23
|
resolvedByStepId: z.string().min(1).max(80).optional(),
|
|
24
24
|
})),
|
|
25
25
|
dependsOn: z.array(z.string().min(1).max(80)),
|
|
@@ -35,10 +35,10 @@ export const TestExecutionSchema = z.object({
|
|
|
35
35
|
source: z.enum(["conversation", "repository"]),
|
|
36
36
|
});
|
|
37
37
|
export const AnalysisDocumentSchema = z.object({
|
|
38
|
-
summary: z.string().min(1).max(
|
|
38
|
+
summary: z.string().min(1).max(1_600),
|
|
39
39
|
chapters: z.array(ChapterSchema),
|
|
40
40
|
steps: z.array(AnalysisStepSchema),
|
|
41
|
-
omittedGroups: z.array(z.object({ title: z.string().min(1).max(
|
|
41
|
+
omittedGroups: z.array(z.object({ title: z.string().min(1).max(240), reason: z.string().min(1).max(700), evidenceIds: z.array(z.string().min(1)).min(1) })),
|
|
42
42
|
unclassifiedEvidenceIds: z.array(z.string().min(1)),
|
|
43
43
|
/** Reviewer-critical new-file line ranges per evidence ID; they drive the focused excerpts at the Evidence zoom. */
|
|
44
44
|
focus: z.record(z.string().min(1), z.array(FocusRangeSchema).min(1).max(5)).optional(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analysis-schema.js","sourceRoot":"","sources":["../../src/shared/analysis-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC;AAC5G,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;AAE5F,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;IAC7B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACjC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5F,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"analysis-schema.js","sourceRoot":"","sources":["../../src/shared/analysis-schema.ts"],"names":[],"mappings":"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"}
|