@appport/assessment 0.0.0-stage → 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/CHANGELOG.md +10 -0
- package/README.md +45 -2
- package/dist/analyze.d.ts +40 -0
- package/dist/analyze.d.ts.map +1 -0
- package/dist/analyze.js +932 -0
- package/dist/analyze.js.map +1 -0
- package/dist/artifact.d.ts +363 -0
- package/dist/artifact.d.ts.map +1 -0
- package/dist/artifact.js +260 -0
- package/dist/artifact.js.map +1 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +162 -0
- package/dist/cli.js.map +1 -0
- package/dist/files.d.ts +53 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +219 -0
- package/dist/files.js.map +1 -0
- package/dist/go.d.ts +103 -0
- package/dist/go.d.ts.map +1 -0
- package/dist/go.js +448 -0
- package/dist/go.js.map +1 -0
- package/dist/http.d.ts +22 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +306 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/js.d.ts +115 -0
- package/dist/js.d.ts.map +1 -0
- package/dist/js.js +681 -0
- package/dist/js.js.map +1 -0
- package/dist/proposal.d.ts +29 -0
- package/dist/proposal.d.ts.map +1 -0
- package/dist/proposal.js +129 -0
- package/dist/proposal.js.map +1 -0
- package/dist/proto.d.ts +69 -0
- package/dist/proto.d.ts.map +1 -0
- package/dist/proto.js +422 -0
- package/dist/proto.js.map +1 -0
- package/package.json +40 -3
- package/schemas/application-assessment-2.schema.json +1467 -0
- package/schemas/application-assessment.schema.json +1424 -0
package/dist/files.js
ADDED
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The repository walker: which files an assessment reads, and which it does not and why.
|
|
3
|
+
*
|
|
4
|
+
* Safety properties (docs in spec/assessment-1.md §4):
|
|
5
|
+
* - Only paths inside the supplied root are read. Symbolic links are never followed, whether they point inside or outside
|
|
6
|
+
* the root; each is reported as skipped.
|
|
7
|
+
* - Nothing is written, executed or fetched. Git identity is read from `.git` files, never by running `git`.
|
|
8
|
+
* - Every file is either scanned or reported as skipped with a reason; nothing is dropped silently.
|
|
9
|
+
* - Paths in results are repository-relative with `/` separators, and all lists are sorted, so results never depend on
|
|
10
|
+
* filesystem traversal order.
|
|
11
|
+
*/
|
|
12
|
+
import { closeSync, constants, fstatSync, lstatSync, openSync, readFileSync, readSync, readdirSync, realpathSync } from "node:fs";
|
|
13
|
+
import { join, relative, resolve, sep } from "node:path";
|
|
14
|
+
/** Directories never descended into: dependencies, vendored code, build output and VCS metadata. */
|
|
15
|
+
export const DEFAULT_EXCLUDED_DIRECTORIES = [".git", ".hg", ".svn", "node_modules", "vendor", "dist", "build", "out", "target", ".next", ".turbo", "coverage", "__pycache__", ".venv"];
|
|
16
|
+
/** Files larger than this are not read. */
|
|
17
|
+
export const DEFAULT_MAX_FILE_BYTES = 1_048_576;
|
|
18
|
+
export class RepositoryError extends Error {
|
|
19
|
+
constructor(message) {
|
|
20
|
+
super(message);
|
|
21
|
+
this.name = "RepositoryError";
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const toPosix = (p) => p.split(sep).join("/");
|
|
25
|
+
/** Resolves and checks the repository root. */
|
|
26
|
+
export function repositoryRoot(path) {
|
|
27
|
+
let root;
|
|
28
|
+
try {
|
|
29
|
+
root = realpathSync(resolve(path));
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
throw new RepositoryError(`repository path does not exist: ${path}`);
|
|
33
|
+
}
|
|
34
|
+
if (!lstatSync(root).isDirectory())
|
|
35
|
+
throw new RepositoryError(`repository path is not a directory: ${path}`);
|
|
36
|
+
return root;
|
|
37
|
+
}
|
|
38
|
+
/** True when `absolute` lies inside `root` (or is it). */
|
|
39
|
+
export function isInside(root, absolute) {
|
|
40
|
+
const rel = relative(root, absolute);
|
|
41
|
+
return rel === "" || (!rel.startsWith("..") && !rel.startsWith(sep) && !/^[A-Za-z]:/.test(rel));
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* A minimal `.gitignore` interpreter for the root file: blank lines and comments, `dir/` patterns, `*`/`?` globs, and
|
|
45
|
+
* leading-`/` anchoring. Negation (`!`), `**` and character classes are not interpreted; such patterns are returned as
|
|
46
|
+
* unsupported and not applied, so a file they would exclude is scanned and the limitation is reported.
|
|
47
|
+
*/
|
|
48
|
+
export function parseIgnore(text) {
|
|
49
|
+
const matchers = [];
|
|
50
|
+
const unsupported = [];
|
|
51
|
+
for (const raw of text.split(/\r?\n/)) {
|
|
52
|
+
const line = raw.trim();
|
|
53
|
+
if (!line || line.startsWith("#"))
|
|
54
|
+
continue;
|
|
55
|
+
if (line.startsWith("!") || line.includes("**") || /\[.*\]/.test(line) || line.includes("\\")) {
|
|
56
|
+
unsupported.push(line);
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
const directoryOnly = line.endsWith("/");
|
|
60
|
+
let pattern = directoryOnly ? line.slice(0, -1) : line;
|
|
61
|
+
const anchored = pattern.startsWith("/") || pattern.includes("/");
|
|
62
|
+
pattern = pattern.replace(/^\//, "");
|
|
63
|
+
const source = pattern.split("").map((c) => (c === "*" ? "[^/]*" : c === "?" ? "[^/]" : c.replace(/[.+^${}()|]/g, "\\$&"))).join("");
|
|
64
|
+
const regex = new RegExp(anchored ? `^${source}$` : `(^|/)${source}$`);
|
|
65
|
+
matchers.push((path, isDirectory) => (!directoryOnly || isDirectory) && regex.test(path));
|
|
66
|
+
}
|
|
67
|
+
return { matchers, unsupported };
|
|
68
|
+
}
|
|
69
|
+
/** Whether a file's leading bytes contain a NUL, the conventional binary test. */
|
|
70
|
+
function isBinary(absolute) {
|
|
71
|
+
const fd = openSync(absolute, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0));
|
|
72
|
+
try {
|
|
73
|
+
const buffer = Buffer.alloc(8000);
|
|
74
|
+
const read = readSync(fd, buffer, 0, buffer.length, 0);
|
|
75
|
+
return buffer.subarray(0, read).includes(0);
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
closeSync(fd);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/** Walks the repository deterministically. */
|
|
82
|
+
export function walkRepository(root, options = {}) {
|
|
83
|
+
const maxBytes = options.maxFileBytes ?? DEFAULT_MAX_FILE_BYTES;
|
|
84
|
+
const excluded = new Set(options.excludedDirectories ?? DEFAULT_EXCLUDED_DIRECTORIES);
|
|
85
|
+
const files = [];
|
|
86
|
+
const skipped = [];
|
|
87
|
+
let ignore = { matchers: [], unsupported: [] };
|
|
88
|
+
try {
|
|
89
|
+
const gitignore = join(root, ".gitignore");
|
|
90
|
+
if (lstatSync(gitignore).isFile())
|
|
91
|
+
ignore = parseIgnore(readFileSync(gitignore, "utf8"));
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
/* no root .gitignore */
|
|
95
|
+
}
|
|
96
|
+
const ignored = (path, isDirectory) => ignore.matchers.some((m) => m(path, isDirectory));
|
|
97
|
+
const visit = (directory) => {
|
|
98
|
+
let entries;
|
|
99
|
+
try {
|
|
100
|
+
entries = readdirSync(directory).sort();
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
skipped.push({ path: toPosix(relative(root, directory)) || ".", reason: "unreadable" });
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
for (const name of entries) {
|
|
107
|
+
const absolute = join(directory, name);
|
|
108
|
+
const path = toPosix(relative(root, absolute));
|
|
109
|
+
let stat;
|
|
110
|
+
try {
|
|
111
|
+
stat = lstatSync(absolute);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
skipped.push({ path, reason: "unreadable" });
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
if (stat.isSymbolicLink()) {
|
|
118
|
+
skipped.push({ path, reason: "symlink" });
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
if (stat.isDirectory()) {
|
|
122
|
+
if (excluded.has(name))
|
|
123
|
+
skipped.push({ path, reason: "excluded-directory" });
|
|
124
|
+
else if (ignored(path, true))
|
|
125
|
+
skipped.push({ path, reason: "ignored" });
|
|
126
|
+
else
|
|
127
|
+
visit(absolute);
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (!stat.isFile()) {
|
|
131
|
+
skipped.push({ path, reason: "special-file" });
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (ignored(path, false)) {
|
|
135
|
+
skipped.push({ path, reason: "ignored" });
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
if (stat.size > maxBytes) {
|
|
139
|
+
skipped.push({ path, reason: "too-large" });
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
try {
|
|
143
|
+
if (isBinary(absolute)) {
|
|
144
|
+
skipped.push({ path, reason: "binary" });
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
skipped.push({ path, reason: "unreadable" });
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
files.push({ path, size: stat.size });
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
visit(root);
|
|
156
|
+
const order = (a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0);
|
|
157
|
+
return { files: files.sort(order), skipped: skipped.sort(order), unsupportedIgnorePatterns: [...ignore.unsupported].sort() };
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Reads a repository file as UTF-8, refusing anything that is not a regular file inside the root at the moment it is
|
|
161
|
+
* opened (the descriptor is checked, so a file replaced by a link after the walk is not followed).
|
|
162
|
+
*/
|
|
163
|
+
export function readRepositoryFile(root, path) {
|
|
164
|
+
const absolute = resolve(root, path);
|
|
165
|
+
if (!isInside(root, absolute))
|
|
166
|
+
throw new RepositoryError(`path escapes the repository root: ${path}`);
|
|
167
|
+
if (lstatSync(absolute).isSymbolicLink())
|
|
168
|
+
throw new RepositoryError(`refusing to follow a symbolic link: ${path}`);
|
|
169
|
+
const fd = openSync(absolute, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0));
|
|
170
|
+
try {
|
|
171
|
+
if (!fstatSync(fd).isFile())
|
|
172
|
+
throw new RepositoryError(`not a regular file: ${path}`);
|
|
173
|
+
return readFileSync(fd, "utf8");
|
|
174
|
+
}
|
|
175
|
+
finally {
|
|
176
|
+
closeSync(fd);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/** The repository's identity from `.git` files, if present. Never runs git; credentials in remote URLs are removed. */
|
|
180
|
+
export function gitIdentity(root) {
|
|
181
|
+
const git = join(root, ".git");
|
|
182
|
+
try {
|
|
183
|
+
if (!lstatSync(git).isDirectory())
|
|
184
|
+
return {};
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
return {};
|
|
188
|
+
}
|
|
189
|
+
const read = (p) => {
|
|
190
|
+
try {
|
|
191
|
+
const absolute = join(git, p);
|
|
192
|
+
if (lstatSync(absolute).isSymbolicLink())
|
|
193
|
+
return undefined;
|
|
194
|
+
return readFileSync(absolute, "utf8");
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
return undefined;
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
const out = {};
|
|
201
|
+
const head = read("HEAD")?.trim();
|
|
202
|
+
if (head?.startsWith("ref: ")) {
|
|
203
|
+
out.ref = head.slice(5);
|
|
204
|
+
const direct = read(out.ref)?.trim();
|
|
205
|
+
const packed = read("packed-refs")?.split("\n").find((l) => l.endsWith(` ${out.ref}`))?.split(" ")[0];
|
|
206
|
+
const revision = direct ?? packed;
|
|
207
|
+
if (revision && /^[0-9a-f]{40,64}$/.test(revision))
|
|
208
|
+
out.revision = revision;
|
|
209
|
+
}
|
|
210
|
+
else if (head && /^[0-9a-f]{40,64}$/.test(head)) {
|
|
211
|
+
out.revision = head;
|
|
212
|
+
}
|
|
213
|
+
const config = read("config");
|
|
214
|
+
const origin = config?.match(/\[remote "origin"\][^[]*?url\s*=\s*(\S+)/)?.[1];
|
|
215
|
+
if (origin)
|
|
216
|
+
out.repository = origin.replace(/^(https?:\/\/)[^@/]+@/, "$1");
|
|
217
|
+
return out;
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"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"}
|
package/dist/go.d.ts
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A static reader for Go source: tokens, top-level declarations and the facts inside function bodies. It does not
|
|
3
|
+
* type-check, resolve generics, evaluate constants or build an AST beyond what the assessment needs, and it never runs
|
|
4
|
+
* the Go toolchain. What it does not understand is reported, not guessed (spec/assessment-1.md §5.2).
|
|
5
|
+
*/
|
|
6
|
+
export interface Token {
|
|
7
|
+
kind: "ident" | "string" | "rune" | "number" | "punct";
|
|
8
|
+
value: string;
|
|
9
|
+
line: number;
|
|
10
|
+
/** Last line of the token; differs from `line` only for raw strings. */
|
|
11
|
+
endLine: number;
|
|
12
|
+
}
|
|
13
|
+
export declare class SourceSyntaxError extends Error {
|
|
14
|
+
readonly line: number;
|
|
15
|
+
constructor(message: string, line: number);
|
|
16
|
+
}
|
|
17
|
+
/** Tokenizes Go source. Comments are dropped; an unterminated literal or comment is a syntax error. */
|
|
18
|
+
export declare function tokenizeGo(text: string): Token[];
|
|
19
|
+
/** The generated-code marker Go tooling recognizes (`go help generate`). */
|
|
20
|
+
export declare const GENERATED_HEADER: RegExp;
|
|
21
|
+
export declare function isGeneratedGo(text: string): boolean;
|
|
22
|
+
export interface GoImport {
|
|
23
|
+
/** The local name: the alias, or the last path element (a guess for packages whose name differs from it). */
|
|
24
|
+
name: string;
|
|
25
|
+
path: string;
|
|
26
|
+
line: number;
|
|
27
|
+
aliased: boolean;
|
|
28
|
+
}
|
|
29
|
+
export interface GoFunction {
|
|
30
|
+
name: string;
|
|
31
|
+
/** Receiver type name without pointer or type parameters, for methods. */
|
|
32
|
+
receiverType?: string;
|
|
33
|
+
receiverName?: string;
|
|
34
|
+
params: string;
|
|
35
|
+
results: string;
|
|
36
|
+
startLine: number;
|
|
37
|
+
endLine: number;
|
|
38
|
+
/** Token index range of the body, `{` … `}` inclusive; absent for a declaration without a body. */
|
|
39
|
+
body?: [number, number];
|
|
40
|
+
}
|
|
41
|
+
export interface GoField {
|
|
42
|
+
name: string;
|
|
43
|
+
type: string;
|
|
44
|
+
embedded: boolean;
|
|
45
|
+
line: number;
|
|
46
|
+
}
|
|
47
|
+
export interface GoType {
|
|
48
|
+
name: string;
|
|
49
|
+
kind: "struct" | "interface" | "other";
|
|
50
|
+
fields: GoField[];
|
|
51
|
+
/** Interface method names. */
|
|
52
|
+
methods: string[];
|
|
53
|
+
/** Interface method signatures, parameters and results as source text. */
|
|
54
|
+
signatures: Array<{
|
|
55
|
+
name: string;
|
|
56
|
+
params: string;
|
|
57
|
+
results: string;
|
|
58
|
+
}>;
|
|
59
|
+
startLine: number;
|
|
60
|
+
endLine: number;
|
|
61
|
+
}
|
|
62
|
+
export interface GoValueDecl {
|
|
63
|
+
name: string;
|
|
64
|
+
keyword: "var" | "const";
|
|
65
|
+
startLine: number;
|
|
66
|
+
endLine: number;
|
|
67
|
+
range: [number, number];
|
|
68
|
+
}
|
|
69
|
+
export interface GoFile {
|
|
70
|
+
packageName: string;
|
|
71
|
+
imports: GoImport[];
|
|
72
|
+
functions: GoFunction[];
|
|
73
|
+
types: GoType[];
|
|
74
|
+
values: GoValueDecl[];
|
|
75
|
+
tokens: Token[];
|
|
76
|
+
}
|
|
77
|
+
/** Parses the declarations of one Go file. */
|
|
78
|
+
export declare function parseGo(source: string): GoFile;
|
|
79
|
+
export interface Call {
|
|
80
|
+
/** The selector chain: `["s", "Store", "GetMemo"]` for `s.Store.GetMemo(…)`, `["f"]` for `f(…)`. */
|
|
81
|
+
chain: string[];
|
|
82
|
+
line: number;
|
|
83
|
+
}
|
|
84
|
+
export interface BodyFacts {
|
|
85
|
+
calls: Call[];
|
|
86
|
+
/** Two-element selectors that are not calls, e.g. `codes.NotFound`. */
|
|
87
|
+
selectors: Call[];
|
|
88
|
+
strings: Array<{
|
|
89
|
+
value: string;
|
|
90
|
+
line: number;
|
|
91
|
+
endLine: number;
|
|
92
|
+
}>;
|
|
93
|
+
/** Lines of `go` statements. */
|
|
94
|
+
goStatements: number[];
|
|
95
|
+
}
|
|
96
|
+
/** The calls, selectors, string literals and `go` statements in a token range. */
|
|
97
|
+
export declare function bodyFacts(tokens: Token[], [from, to]: [number, number]): BodyFacts;
|
|
98
|
+
/**
|
|
99
|
+
* The parameter (or result) types of a signature, with names removed: `ctx context.Context, a, b int` →
|
|
100
|
+
* `["context.Context", "int", "int"]`. Go requires a list to name all of its parameters or none.
|
|
101
|
+
*/
|
|
102
|
+
export declare function signatureTypes(list: string): string[];
|
|
103
|
+
//# sourceMappingURL=go.d.ts.map
|
package/dist/go.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"go.d.ts","sourceRoot":"","sources":["../src/go.ts"],"names":[],"mappings":"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"}
|