@navbook/cli 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/dist/commands/complete.js +124 -0
- package/dist/commands/complete.js.map +1 -0
- package/dist/{cli/commands → commands}/compose.js +5 -3
- package/dist/commands/compose.js.map +1 -0
- package/dist/commands/doctor.js +56 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/entity.js +235 -0
- package/dist/commands/entity.js.map +1 -0
- package/dist/commands/feature.js +202 -0
- package/dist/commands/feature.js.map +1 -0
- package/dist/commands/init.js +23 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/{cli/commands → commands}/install.js +1 -2
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/issue.js +89 -0
- package/dist/commands/issue.js.map +1 -0
- package/dist/commands/policy.js +49 -0
- package/dist/commands/policy.js.map +1 -0
- package/dist/commands/pr.js +262 -0
- package/dist/commands/pr.js.map +1 -0
- package/dist/context.js +21 -0
- package/dist/context.js.map +1 -0
- package/dist/{cli/editor.js → editor.js} +1 -1
- package/dist/editor.js.map +1 -0
- package/dist/errors.js.map +1 -0
- package/dist/install/completions.js.map +1 -0
- package/dist/{cli/install → install}/hook.js +1 -1
- package/dist/install/hook.js.map +1 -0
- package/dist/{cli/main.js → main.js} +10 -0
- package/dist/main.js.map +1 -0
- package/dist/program.js +356 -0
- package/dist/program.js.map +1 -0
- package/dist/{cli/prompt.js → prompt.js} +11 -0
- package/dist/prompt.js.map +1 -0
- package/dist/render/colors.js.map +1 -0
- package/dist/render/detail.js +197 -0
- package/dist/render/detail.js.map +1 -0
- package/dist/render/table.js.map +1 -0
- package/dist/sort.js +77 -0
- package/dist/sort.js.map +1 -0
- package/package.json +15 -21
- package/README.md +0 -165
- package/dist/cli/commands/complete.d.ts +0 -9
- package/dist/cli/commands/complete.js +0 -72
- package/dist/cli/commands/complete.js.map +0 -1
- package/dist/cli/commands/compose.d.ts +0 -27
- package/dist/cli/commands/compose.js.map +0 -1
- package/dist/cli/commands/doctor.d.ts +0 -14
- package/dist/cli/commands/doctor.js +0 -127
- package/dist/cli/commands/doctor.js.map +0 -1
- package/dist/cli/commands/entity.d.ts +0 -55
- package/dist/cli/commands/entity.js +0 -209
- package/dist/cli/commands/entity.js.map +0 -1
- package/dist/cli/commands/init.d.ts +0 -11
- package/dist/cli/commands/init.js +0 -39
- package/dist/cli/commands/init.js.map +0 -1
- package/dist/cli/commands/install.d.ts +0 -17
- package/dist/cli/commands/install.js.map +0 -1
- package/dist/cli/commands/issue.d.ts +0 -12
- package/dist/cli/commands/issue.js +0 -42
- package/dist/cli/commands/issue.js.map +0 -1
- package/dist/cli/commands/pr.d.ts +0 -64
- package/dist/cli/commands/pr.js +0 -466
- package/dist/cli/commands/pr.js.map +0 -1
- package/dist/cli/commit-flow.d.ts +0 -27
- package/dist/cli/commit-flow.js +0 -47
- package/dist/cli/commit-flow.js.map +0 -1
- package/dist/cli/context.d.ts +0 -39
- package/dist/cli/context.js +0 -93
- package/dist/cli/context.js.map +0 -1
- package/dist/cli/editor.d.ts +0 -23
- package/dist/cli/editor.js.map +0 -1
- package/dist/cli/errors.d.ts +0 -17
- package/dist/cli/errors.js.map +0 -1
- package/dist/cli/history-checks.d.ts +0 -21
- package/dist/cli/history-checks.js +0 -134
- package/dist/cli/history-checks.js.map +0 -1
- package/dist/cli/install/completions.d.ts +0 -19
- package/dist/cli/install/completions.js.map +0 -1
- package/dist/cli/install/hook.d.ts +0 -20
- package/dist/cli/install/hook.js.map +0 -1
- package/dist/cli/main.d.ts +0 -14
- package/dist/cli/main.js.map +0 -1
- package/dist/cli/program.d.ts +0 -23
- package/dist/cli/program.js +0 -204
- package/dist/cli/program.js.map +0 -1
- package/dist/cli/prompt.d.ts +0 -22
- package/dist/cli/prompt.js.map +0 -1
- package/dist/cli/render/colors.d.ts +0 -13
- package/dist/cli/render/colors.js.map +0 -1
- package/dist/cli/render/detail.d.ts +0 -10
- package/dist/cli/render/detail.js +0 -105
- package/dist/cli/render/detail.js.map +0 -1
- package/dist/cli/render/table.d.ts +0 -19
- package/dist/cli/render/table.js.map +0 -1
- package/dist/cli/resolve.d.ts +0 -17
- package/dist/cli/resolve.js +0 -68
- package/dist/cli/resolve.js.map +0 -1
- package/dist/cli/workspace.d.ts +0 -52
- package/dist/cli/workspace.js +0 -178
- package/dist/cli/workspace.js.map +0 -1
- package/dist/core/comments.d.ts +0 -31
- package/dist/core/comments.js +0 -80
- package/dist/core/comments.js.map +0 -1
- package/dist/core/files.d.ts +0 -88
- package/dist/core/files.js +0 -441
- package/dist/core/files.js.map +0 -1
- package/dist/core/frontmatter.d.ts +0 -63
- package/dist/core/frontmatter.js +0 -149
- package/dist/core/frontmatter.js.map +0 -1
- package/dist/core/id.d.ts +0 -46
- package/dist/core/id.js +0 -66
- package/dist/core/id.js.map +0 -1
- package/dist/core/index.d.ts +0 -19
- package/dist/core/index.js +0 -20
- package/dist/core/index.js.map +0 -1
- package/dist/core/json.d.ts +0 -18
- package/dist/core/json.js +0 -51
- package/dist/core/json.js.map +0 -1
- package/dist/core/ops.d.ts +0 -92
- package/dist/core/ops.js +0 -173
- package/dist/core/ops.js.map +0 -1
- package/dist/core/person.d.ts +0 -20
- package/dist/core/person.js +0 -50
- package/dist/core/person.js.map +0 -1
- package/dist/core/query.d.ts +0 -30
- package/dist/core/query.js +0 -106
- package/dist/core/query.js.map +0 -1
- package/dist/core/refs.d.ts +0 -12
- package/dist/core/refs.js +0 -36
- package/dist/core/refs.js.map +0 -1
- package/dist/core/slug.d.ts +0 -22
- package/dist/core/slug.js +0 -40
- package/dist/core/slug.js.map +0 -1
- package/dist/core/time.d.ts +0 -14
- package/dist/core/time.js +0 -37
- package/dist/core/time.js.map +0 -1
- package/dist/core/tree.d.ts +0 -94
- package/dist/core/tree.js +0 -237
- package/dist/core/tree.js.map +0 -1
- package/dist/core/validate.d.ts +0 -55
- package/dist/core/validate.js +0 -312
- package/dist/core/validate.js.map +0 -1
- package/dist/git/config.d.ts +0 -12
- package/dist/git/config.js +0 -27
- package/dist/git/config.js.map +0 -1
- package/dist/git/exec.d.ts +0 -35
- package/dist/git/exec.js +0 -58
- package/dist/git/exec.js.map +0 -1
- package/dist/git/history.d.ts +0 -35
- package/dist/git/history.js +0 -82
- package/dist/git/history.js.map +0 -1
- package/dist/git/index-ops.d.ts +0 -20
- package/dist/git/index-ops.js +0 -45
- package/dist/git/index-ops.js.map +0 -1
- package/dist/git/merge.d.ts +0 -27
- package/dist/git/merge.js +0 -57
- package/dist/git/merge.js.map +0 -1
- package/dist/git/refscan.d.ts +0 -32
- package/dist/git/refscan.js +0 -82
- package/dist/git/refscan.js.map +0 -1
- package/dist/git/repo.d.ts +0 -45
- package/dist/git/repo.js +0 -95
- package/dist/git/repo.js.map +0 -1
- /package/dist/{cli/errors.js → errors.js} +0 -0
- /package/dist/{cli/install → install}/completions.js +0 -0
- /package/dist/{cli/render → render}/colors.js +0 -0
- /package/dist/{cli/render → render}/table.js +0 -0
package/dist/core/tree.d.ts
DELETED
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The in-memory model of a `.navbook/` tree — spec 02 §2.1.
|
|
3
|
-
*
|
|
4
|
-
* Input is a flat map of paths (relative to `.navbook/`) to file contents, so
|
|
5
|
-
* the model works equally well over a working tree, a git index, or the blobs
|
|
6
|
-
* of a branch that is not checked out.
|
|
7
|
-
*/
|
|
8
|
-
import { type ParsedFile } from "./files.ts";
|
|
9
|
-
export type NavTree = ReadonlyMap<string, string>;
|
|
10
|
-
export type EntityKind = "issue" | "pr";
|
|
11
|
-
export type Status = "open" | "closed" | "merged";
|
|
12
|
-
export declare const ISSUE_STATUSES: readonly Status[];
|
|
13
|
-
export declare const PR_STATUSES: readonly Status[];
|
|
14
|
-
export interface CommentRecord {
|
|
15
|
-
id: string;
|
|
16
|
-
fileName: string;
|
|
17
|
-
/** Path relative to `.navbook/`. */
|
|
18
|
-
path: string;
|
|
19
|
-
stamp: string;
|
|
20
|
-
date: Date;
|
|
21
|
-
author: string;
|
|
22
|
-
replyTo?: string;
|
|
23
|
-
body: string;
|
|
24
|
-
parsed: ParsedFile;
|
|
25
|
-
}
|
|
26
|
-
export interface EntityRecord {
|
|
27
|
-
kind: EntityKind;
|
|
28
|
-
id: string;
|
|
29
|
-
slug: string;
|
|
30
|
-
dirName: string;
|
|
31
|
-
status: Status;
|
|
32
|
-
/** True when the entity lives under `.navbook/archive/` (spec 03 §3.6). */
|
|
33
|
-
archived: boolean;
|
|
34
|
-
archiveYear?: string;
|
|
35
|
-
/** Directory path relative to `.navbook/`. */
|
|
36
|
-
dirPath: string;
|
|
37
|
-
/** Path of `issue.md` or `pr.md`, relative to `.navbook/`. */
|
|
38
|
-
filePath: string;
|
|
39
|
-
parsed: ParsedFile;
|
|
40
|
-
fm: Record<string, unknown>;
|
|
41
|
-
body: string;
|
|
42
|
-
title: string;
|
|
43
|
-
comments: CommentRecord[];
|
|
44
|
-
/** Extra files inside the entity directory, preserved untouched (§2.1). */
|
|
45
|
-
extraFiles: string[];
|
|
46
|
-
}
|
|
47
|
-
export interface StructuralProblem {
|
|
48
|
-
path: string;
|
|
49
|
-
message: string;
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* An entity directory whose name is well formed but which has no `issue.md` /
|
|
53
|
-
* `pr.md`. The usual cause is a comment stranded by a merge (spec 03 §3.3.1);
|
|
54
|
-
* recording the stray files lets `doctor --fix` reunite them with their entity.
|
|
55
|
-
*/
|
|
56
|
-
export interface OrphanDirectory {
|
|
57
|
-
kind: EntityKind;
|
|
58
|
-
id: string;
|
|
59
|
-
dirName: string;
|
|
60
|
-
dirPath: string;
|
|
61
|
-
status: Status;
|
|
62
|
-
archived: boolean;
|
|
63
|
-
/** Comment files found under the orphaned directory. */
|
|
64
|
-
commentPaths: string[];
|
|
65
|
-
}
|
|
66
|
-
export interface Repo {
|
|
67
|
-
issues: EntityRecord[];
|
|
68
|
-
prs: EntityRecord[];
|
|
69
|
-
/** Every entity by ID; when IDs collide the first one encountered wins. */
|
|
70
|
-
byId: Map<string, EntityRecord>;
|
|
71
|
-
/** Grammar and layout faults found while walking the tree (doctor check D1). */
|
|
72
|
-
problems: StructuralProblem[];
|
|
73
|
-
/** Well-named directories that hold no entity file (spec 03 §3.3.1). */
|
|
74
|
-
orphans: OrphanDirectory[];
|
|
75
|
-
/** False when the caller deliberately skipped reading comment files. */
|
|
76
|
-
commentsLoaded: boolean;
|
|
77
|
-
/** Paths that were tolerated but not interpreted (reserved names, §2.10). */
|
|
78
|
-
reserved: string[];
|
|
79
|
-
}
|
|
80
|
-
/** Build a {@link Repo} from a flat path→content map. */
|
|
81
|
-
export declare function parseTree(files: NavTree, opts?: {
|
|
82
|
-
commentsLoaded?: boolean;
|
|
83
|
-
}): Repo;
|
|
84
|
-
/** Every entity in the repository, issues first. */
|
|
85
|
-
export declare function allEntities(repo: Repo): EntityRecord[];
|
|
86
|
-
/** Every ID in the repository: entities and comments alike (doctor check D3). */
|
|
87
|
-
export declare function allIds(repo: Repo): {
|
|
88
|
-
id: string;
|
|
89
|
-
path: string;
|
|
90
|
-
}[];
|
|
91
|
-
/** Directory path for an entity of the given kind, status and directory name. */
|
|
92
|
-
export declare function statusDir(kind: EntityKind, status: Status): string;
|
|
93
|
-
/** Locate an entity by exact ID across both kinds. */
|
|
94
|
-
export declare function findById(repo: Repo, id: string): EntityRecord | undefined;
|
package/dist/core/tree.js
DELETED
|
@@ -1,237 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The in-memory model of a `.navbook/` tree — spec 02 §2.1.
|
|
3
|
-
*
|
|
4
|
-
* Input is a flat map of paths (relative to `.navbook/`) to file contents, so
|
|
5
|
-
* the model works equally well over a working tree, a git index, or the blobs
|
|
6
|
-
* of a branch that is not checked out.
|
|
7
|
-
*/
|
|
8
|
-
import { parseCommentFileName } from "./comments.js";
|
|
9
|
-
import { parseFile } from "./files.js";
|
|
10
|
-
import { parseDirName } from "./slug.js";
|
|
11
|
-
export const ISSUE_STATUSES = ["open", "closed"];
|
|
12
|
-
export const PR_STATUSES = ["open", "merged", "closed"];
|
|
13
|
-
/** Build a {@link Repo} from a flat path→content map. */
|
|
14
|
-
export function parseTree(files, opts = {}) {
|
|
15
|
-
const problems = [];
|
|
16
|
-
const reserved = [];
|
|
17
|
-
const drafts = new Map();
|
|
18
|
-
for (const path of [...files.keys()].sort()) {
|
|
19
|
-
classify(path, drafts, problems, reserved);
|
|
20
|
-
}
|
|
21
|
-
const issues = [];
|
|
22
|
-
const prs = [];
|
|
23
|
-
const byId = new Map();
|
|
24
|
-
const orphans = [];
|
|
25
|
-
for (const draft of [...drafts.values()].sort((a, b) => (a.dirPath < b.dirPath ? -1 : 1))) {
|
|
26
|
-
const record = materialize(draft, files, problems, orphans);
|
|
27
|
-
if (!record)
|
|
28
|
-
continue;
|
|
29
|
-
(record.kind === "issue" ? issues : prs).push(record);
|
|
30
|
-
if (!byId.has(record.id))
|
|
31
|
-
byId.set(record.id, record);
|
|
32
|
-
}
|
|
33
|
-
return {
|
|
34
|
-
issues,
|
|
35
|
-
prs,
|
|
36
|
-
byId,
|
|
37
|
-
problems,
|
|
38
|
-
orphans,
|
|
39
|
-
commentsLoaded: opts.commentsLoaded !== false,
|
|
40
|
-
reserved,
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
function classify(path, drafts, problems, reserved) {
|
|
44
|
-
const segments = path.split("/");
|
|
45
|
-
const base = segments[segments.length - 1];
|
|
46
|
-
if (base === ".gitkeep")
|
|
47
|
-
return;
|
|
48
|
-
let rest = segments;
|
|
49
|
-
let archived = false;
|
|
50
|
-
let archiveYear;
|
|
51
|
-
if (segments[0] === "archive") {
|
|
52
|
-
if (segments.length < 2)
|
|
53
|
-
return;
|
|
54
|
-
archived = true;
|
|
55
|
-
archiveYear = segments[1];
|
|
56
|
-
rest = segments.slice(2);
|
|
57
|
-
if (rest.length === 0)
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
const root = rest[0];
|
|
61
|
-
if (root === undefined)
|
|
62
|
-
return;
|
|
63
|
-
if (root !== "issues" && root !== "prs") {
|
|
64
|
-
// Reserved and unknown names are tolerated and preserved untouched (§2.10).
|
|
65
|
-
reserved.push(path);
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
const kind = root === "issues" ? "issue" : "pr";
|
|
69
|
-
const allowed = kind === "issue" ? ISSUE_STATUSES : PR_STATUSES;
|
|
70
|
-
const status = rest[1];
|
|
71
|
-
if (status === undefined)
|
|
72
|
-
return;
|
|
73
|
-
if (!allowed.includes(status)) {
|
|
74
|
-
problems.push({
|
|
75
|
-
path,
|
|
76
|
-
message: `'${root}/' must contain only ${allowed.map((s) => `${s}/`).join(", ")} (§2.1)`,
|
|
77
|
-
});
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
const dirName = rest[2];
|
|
81
|
-
if (dirName === undefined)
|
|
82
|
-
return;
|
|
83
|
-
if (rest.length === 3) {
|
|
84
|
-
problems.push({
|
|
85
|
-
path,
|
|
86
|
-
message: `'${root}/${status}/' must contain entity directories, not files (§2.1)`,
|
|
87
|
-
});
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
if (!parseDirName(dirName)) {
|
|
91
|
-
problems.push({
|
|
92
|
-
path,
|
|
93
|
-
message: `entity directory name '${dirName}' does not match <id>-<slug> (§2.3)`,
|
|
94
|
-
});
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
const dirPath = segments.slice(0, segments.length - (rest.length - 3)).join("/");
|
|
98
|
-
const key = dirPath;
|
|
99
|
-
let draft = drafts.get(key);
|
|
100
|
-
if (!draft) {
|
|
101
|
-
draft = {
|
|
102
|
-
kind,
|
|
103
|
-
status: status,
|
|
104
|
-
archived,
|
|
105
|
-
archiveYear,
|
|
106
|
-
dirPath,
|
|
107
|
-
dirName,
|
|
108
|
-
comments: new Map(),
|
|
109
|
-
extraFiles: [],
|
|
110
|
-
};
|
|
111
|
-
drafts.set(key, draft);
|
|
112
|
-
}
|
|
113
|
-
const inner = rest.slice(3);
|
|
114
|
-
const expectedFile = kind === "issue" ? "issue.md" : "pr.md";
|
|
115
|
-
if (inner.length === 1 && inner[0] === expectedFile) {
|
|
116
|
-
draft.entityFile = path;
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
if (inner.length === 2 && inner[0] === "comments") {
|
|
120
|
-
const name = inner[1];
|
|
121
|
-
if (!parseCommentFileName(name)) {
|
|
122
|
-
problems.push({
|
|
123
|
-
path,
|
|
124
|
-
message: `comment filename '${name}' does not match <timestamp>-<id>.md (§2.6)`,
|
|
125
|
-
});
|
|
126
|
-
return;
|
|
127
|
-
}
|
|
128
|
-
draft.comments.set(name, path);
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
draft.extraFiles.push(path);
|
|
132
|
-
}
|
|
133
|
-
function materialize(draft, files, problems, orphans) {
|
|
134
|
-
const parsedName = parseDirName(draft.dirName);
|
|
135
|
-
if (!parsedName)
|
|
136
|
-
return null;
|
|
137
|
-
const expectedFile = draft.kind === "issue" ? "issue.md" : "pr.md";
|
|
138
|
-
if (!draft.entityFile) {
|
|
139
|
-
problems.push({
|
|
140
|
-
path: draft.dirPath,
|
|
141
|
-
message: `entity directory is missing its ${expectedFile} (§2.1)`,
|
|
142
|
-
});
|
|
143
|
-
orphans.push({
|
|
144
|
-
kind: draft.kind,
|
|
145
|
-
id: parsedName.id,
|
|
146
|
-
dirName: draft.dirName,
|
|
147
|
-
dirPath: draft.dirPath,
|
|
148
|
-
status: draft.status,
|
|
149
|
-
archived: draft.archived,
|
|
150
|
-
commentPaths: [...draft.comments.values()].sort(),
|
|
151
|
-
});
|
|
152
|
-
return null;
|
|
153
|
-
}
|
|
154
|
-
const text = files.get(draft.entityFile) ?? "";
|
|
155
|
-
let parsed;
|
|
156
|
-
try {
|
|
157
|
-
parsed = parseFile(text);
|
|
158
|
-
}
|
|
159
|
-
catch (error) {
|
|
160
|
-
problems.push({
|
|
161
|
-
path: draft.entityFile,
|
|
162
|
-
message: error instanceof Error ? error.message : String(error),
|
|
163
|
-
});
|
|
164
|
-
return null;
|
|
165
|
-
}
|
|
166
|
-
const comments = [];
|
|
167
|
-
for (const name of [...draft.comments.keys()].sort()) {
|
|
168
|
-
const path = draft.comments.get(name);
|
|
169
|
-
const meta = parseCommentFileName(name);
|
|
170
|
-
if (!meta)
|
|
171
|
-
continue;
|
|
172
|
-
let commentParsed;
|
|
173
|
-
try {
|
|
174
|
-
commentParsed = parseFile(files.get(path) ?? "");
|
|
175
|
-
}
|
|
176
|
-
catch (error) {
|
|
177
|
-
problems.push({
|
|
178
|
-
path,
|
|
179
|
-
message: error instanceof Error ? error.message : String(error),
|
|
180
|
-
});
|
|
181
|
-
continue;
|
|
182
|
-
}
|
|
183
|
-
const replyTo = commentParsed.fm["reply-to"];
|
|
184
|
-
const commentAuthor = commentParsed.fm.author;
|
|
185
|
-
comments.push({
|
|
186
|
-
id: meta.id,
|
|
187
|
-
fileName: name,
|
|
188
|
-
path,
|
|
189
|
-
stamp: meta.stamp,
|
|
190
|
-
date: meta.date,
|
|
191
|
-
author: typeof commentAuthor === "string" ? commentAuthor : "",
|
|
192
|
-
replyTo: typeof replyTo === "string" ? replyTo : undefined,
|
|
193
|
-
body: commentParsed.body,
|
|
194
|
-
parsed: commentParsed,
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
return {
|
|
198
|
-
kind: draft.kind,
|
|
199
|
-
id: parsedName.id,
|
|
200
|
-
slug: parsedName.slug,
|
|
201
|
-
dirName: draft.dirName,
|
|
202
|
-
status: draft.status,
|
|
203
|
-
archived: draft.archived,
|
|
204
|
-
archiveYear: draft.archiveYear,
|
|
205
|
-
dirPath: draft.dirPath,
|
|
206
|
-
filePath: draft.entityFile,
|
|
207
|
-
parsed,
|
|
208
|
-
fm: parsed.fm,
|
|
209
|
-
body: parsed.body,
|
|
210
|
-
title: typeof parsed.fm.title === "string" ? parsed.fm.title : "",
|
|
211
|
-
comments,
|
|
212
|
-
extraFiles: draft.extraFiles.sort(),
|
|
213
|
-
};
|
|
214
|
-
}
|
|
215
|
-
/** Every entity in the repository, issues first. */
|
|
216
|
-
export function allEntities(repo) {
|
|
217
|
-
return [...repo.issues, ...repo.prs];
|
|
218
|
-
}
|
|
219
|
-
/** Every ID in the repository: entities and comments alike (doctor check D3). */
|
|
220
|
-
export function allIds(repo) {
|
|
221
|
-
const out = [];
|
|
222
|
-
for (const entity of allEntities(repo)) {
|
|
223
|
-
out.push({ id: entity.id, path: entity.dirPath });
|
|
224
|
-
for (const comment of entity.comments)
|
|
225
|
-
out.push({ id: comment.id, path: comment.path });
|
|
226
|
-
}
|
|
227
|
-
return out;
|
|
228
|
-
}
|
|
229
|
-
/** Directory path for an entity of the given kind, status and directory name. */
|
|
230
|
-
export function statusDir(kind, status) {
|
|
231
|
-
return `${kind === "issue" ? "issues" : "prs"}/${status}`;
|
|
232
|
-
}
|
|
233
|
-
/** Locate an entity by exact ID across both kinds. */
|
|
234
|
-
export function findById(repo, id) {
|
|
235
|
-
return repo.byId.get(id);
|
|
236
|
-
}
|
|
237
|
-
//# sourceMappingURL=tree.js.map
|
package/dist/core/tree.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tree.js","sourceRoot":"","sources":["../../src/core/tree.ts"],"names":[],"mappings":"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"}
|
package/dist/core/validate.d.ts
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Format validation — the `nav doctor` checks of spec 04 §4.3.
|
|
3
|
-
*
|
|
4
|
-
* Checks D1–D6 and D8 are decidable from the tree alone and live here. D7, D9
|
|
5
|
-
* and D10 need git archaeology; their tree-side halves live here and the
|
|
6
|
-
* history queries are supplied by the CLI.
|
|
7
|
-
*/
|
|
8
|
-
import { type Revision } from "./files.ts";
|
|
9
|
-
import type { FileOp } from "./ops.ts";
|
|
10
|
-
import { type EntityRecord, type NavTree, type Repo } from "./tree.ts";
|
|
11
|
-
export declare const CHECKS: readonly ["D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "D10"];
|
|
12
|
-
export type Check = (typeof CHECKS)[number];
|
|
13
|
-
export type Level = "error" | "warning";
|
|
14
|
-
export interface Diagnostic {
|
|
15
|
-
check: Check;
|
|
16
|
-
level: Level;
|
|
17
|
-
/** Path relative to `.navbook/`, or "" for repository-wide findings. */
|
|
18
|
-
path: string;
|
|
19
|
-
message: string;
|
|
20
|
-
/** Mechanical repair offered by `doctor --fix`. */
|
|
21
|
-
fix?: FileOp[];
|
|
22
|
-
}
|
|
23
|
-
export declare const CHECK_LEVEL: Record<Check, Level>;
|
|
24
|
-
export interface ValidateOptions {
|
|
25
|
-
/** Commit messages to scan for `Refs:`/`Closes:` trailers (check D8). */
|
|
26
|
-
commitMessages?: readonly string[];
|
|
27
|
-
}
|
|
28
|
-
/** Run every tree-decidable check. */
|
|
29
|
-
export declare function validateTree(files: NavTree, opts?: ValidateOptions): Diagnostic[];
|
|
30
|
-
/** Run every tree-decidable check against an already-parsed repository. */
|
|
31
|
-
export declare function validateRepo(repo: Repo, opts?: ValidateOptions): Diagnostic[];
|
|
32
|
-
/** Stable ordering: by check, then path, then message. */
|
|
33
|
-
export declare function sortDiagnostics(diagnostics: Diagnostic[]): Diagnostic[];
|
|
34
|
-
/** True when any diagnostic is an error (drives exit code 2). */
|
|
35
|
-
export declare function hasErrors(diagnostics: readonly Diagnostic[]): boolean;
|
|
36
|
-
/**
|
|
37
|
-
* D7: each historical `revisions` list must be a prefix of the next one.
|
|
38
|
-
* `versionsOldestFirst` holds the list as it stood in each commit that touched
|
|
39
|
-
* the file, oldest first.
|
|
40
|
-
*/
|
|
41
|
-
export declare function checkRevisionsAppendOnly(versionsOldestFirst: readonly Revision[][]): {
|
|
42
|
-
ok: true;
|
|
43
|
-
} | {
|
|
44
|
-
ok: false;
|
|
45
|
-
index: number;
|
|
46
|
-
message: string;
|
|
47
|
-
};
|
|
48
|
-
/** D10: is a frontmatter timestamp implausible next to the commit that added it? */
|
|
49
|
-
export declare function checkTimestampSkew(frontmatterIso: Date, gitAuthoredIso: Date, thresholdHours: number): boolean;
|
|
50
|
-
/** Where a merged-but-unarchived pull request should be moved (check D9). */
|
|
51
|
-
export declare function planD9Fix(entity: EntityRecord): FileOp[];
|
|
52
|
-
/** Validate a bare entity directory name, used by `doctor` on hand-made trees. */
|
|
53
|
-
export declare function isValidEntityDirName(name: string): boolean;
|
|
54
|
-
/** Validate a bare comment filename. */
|
|
55
|
-
export declare function isValidCommentFileName(name: string): boolean;
|