@navbook/cli 0.1.2 → 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.
Files changed (167) hide show
  1. package/dist/commands/complete.js +124 -0
  2. package/dist/commands/complete.js.map +1 -0
  3. package/dist/{cli/commands → commands}/compose.js +5 -3
  4. package/dist/commands/compose.js.map +1 -0
  5. package/dist/commands/doctor.js +56 -0
  6. package/dist/commands/doctor.js.map +1 -0
  7. package/dist/commands/entity.js +235 -0
  8. package/dist/commands/entity.js.map +1 -0
  9. package/dist/commands/feature.js +202 -0
  10. package/dist/commands/feature.js.map +1 -0
  11. package/dist/commands/init.js +23 -0
  12. package/dist/commands/init.js.map +1 -0
  13. package/dist/{cli/commands → commands}/install.js +1 -2
  14. package/dist/commands/install.js.map +1 -0
  15. package/dist/commands/issue.js +89 -0
  16. package/dist/commands/issue.js.map +1 -0
  17. package/dist/commands/policy.js +49 -0
  18. package/dist/commands/policy.js.map +1 -0
  19. package/dist/commands/pr.js +262 -0
  20. package/dist/commands/pr.js.map +1 -0
  21. package/dist/context.js +21 -0
  22. package/dist/context.js.map +1 -0
  23. package/dist/{cli/editor.js → editor.js} +1 -1
  24. package/dist/editor.js.map +1 -0
  25. package/dist/errors.js.map +1 -0
  26. package/dist/install/completions.js.map +1 -0
  27. package/dist/{cli/install → install}/hook.js +1 -1
  28. package/dist/install/hook.js.map +1 -0
  29. package/dist/{cli/main.js → main.js} +10 -0
  30. package/dist/main.js.map +1 -0
  31. package/dist/{cli/program.js → program.js} +161 -23
  32. package/dist/program.js.map +1 -0
  33. package/dist/{cli/prompt.js → prompt.js} +11 -0
  34. package/dist/prompt.js.map +1 -0
  35. package/dist/render/colors.js.map +1 -0
  36. package/dist/render/detail.js +197 -0
  37. package/dist/render/detail.js.map +1 -0
  38. package/dist/render/table.js.map +1 -0
  39. package/dist/sort.js +77 -0
  40. package/dist/sort.js.map +1 -0
  41. package/package.json +15 -21
  42. package/README.md +0 -165
  43. package/dist/cli/commands/complete.d.ts +0 -9
  44. package/dist/cli/commands/complete.js +0 -72
  45. package/dist/cli/commands/complete.js.map +0 -1
  46. package/dist/cli/commands/compose.d.ts +0 -27
  47. package/dist/cli/commands/compose.js.map +0 -1
  48. package/dist/cli/commands/doctor.d.ts +0 -14
  49. package/dist/cli/commands/doctor.js +0 -127
  50. package/dist/cli/commands/doctor.js.map +0 -1
  51. package/dist/cli/commands/entity.d.ts +0 -55
  52. package/dist/cli/commands/entity.js +0 -209
  53. package/dist/cli/commands/entity.js.map +0 -1
  54. package/dist/cli/commands/init.d.ts +0 -11
  55. package/dist/cli/commands/init.js +0 -39
  56. package/dist/cli/commands/init.js.map +0 -1
  57. package/dist/cli/commands/install.d.ts +0 -17
  58. package/dist/cli/commands/install.js.map +0 -1
  59. package/dist/cli/commands/issue.d.ts +0 -12
  60. package/dist/cli/commands/issue.js +0 -42
  61. package/dist/cli/commands/issue.js.map +0 -1
  62. package/dist/cli/commands/pr.d.ts +0 -64
  63. package/dist/cli/commands/pr.js +0 -466
  64. package/dist/cli/commands/pr.js.map +0 -1
  65. package/dist/cli/commit-flow.d.ts +0 -27
  66. package/dist/cli/commit-flow.js +0 -47
  67. package/dist/cli/commit-flow.js.map +0 -1
  68. package/dist/cli/context.d.ts +0 -39
  69. package/dist/cli/context.js +0 -93
  70. package/dist/cli/context.js.map +0 -1
  71. package/dist/cli/editor.d.ts +0 -23
  72. package/dist/cli/editor.js.map +0 -1
  73. package/dist/cli/errors.d.ts +0 -17
  74. package/dist/cli/errors.js.map +0 -1
  75. package/dist/cli/history-checks.d.ts +0 -21
  76. package/dist/cli/history-checks.js +0 -134
  77. package/dist/cli/history-checks.js.map +0 -1
  78. package/dist/cli/install/completions.d.ts +0 -19
  79. package/dist/cli/install/completions.js.map +0 -1
  80. package/dist/cli/install/hook.d.ts +0 -20
  81. package/dist/cli/install/hook.js.map +0 -1
  82. package/dist/cli/main.d.ts +0 -14
  83. package/dist/cli/main.js.map +0 -1
  84. package/dist/cli/program.d.ts +0 -23
  85. package/dist/cli/program.js.map +0 -1
  86. package/dist/cli/prompt.d.ts +0 -22
  87. package/dist/cli/prompt.js.map +0 -1
  88. package/dist/cli/render/colors.d.ts +0 -13
  89. package/dist/cli/render/colors.js.map +0 -1
  90. package/dist/cli/render/detail.d.ts +0 -10
  91. package/dist/cli/render/detail.js +0 -105
  92. package/dist/cli/render/detail.js.map +0 -1
  93. package/dist/cli/render/table.d.ts +0 -19
  94. package/dist/cli/render/table.js.map +0 -1
  95. package/dist/cli/resolve.d.ts +0 -17
  96. package/dist/cli/resolve.js +0 -68
  97. package/dist/cli/resolve.js.map +0 -1
  98. package/dist/cli/workspace.d.ts +0 -52
  99. package/dist/cli/workspace.js +0 -178
  100. package/dist/cli/workspace.js.map +0 -1
  101. package/dist/core/comments.d.ts +0 -31
  102. package/dist/core/comments.js +0 -80
  103. package/dist/core/comments.js.map +0 -1
  104. package/dist/core/files.d.ts +0 -88
  105. package/dist/core/files.js +0 -441
  106. package/dist/core/files.js.map +0 -1
  107. package/dist/core/frontmatter.d.ts +0 -63
  108. package/dist/core/frontmatter.js +0 -149
  109. package/dist/core/frontmatter.js.map +0 -1
  110. package/dist/core/id.d.ts +0 -46
  111. package/dist/core/id.js +0 -66
  112. package/dist/core/id.js.map +0 -1
  113. package/dist/core/index.d.ts +0 -19
  114. package/dist/core/index.js +0 -20
  115. package/dist/core/index.js.map +0 -1
  116. package/dist/core/json.d.ts +0 -18
  117. package/dist/core/json.js +0 -51
  118. package/dist/core/json.js.map +0 -1
  119. package/dist/core/ops.d.ts +0 -92
  120. package/dist/core/ops.js +0 -173
  121. package/dist/core/ops.js.map +0 -1
  122. package/dist/core/person.d.ts +0 -20
  123. package/dist/core/person.js +0 -50
  124. package/dist/core/person.js.map +0 -1
  125. package/dist/core/query.d.ts +0 -30
  126. package/dist/core/query.js +0 -106
  127. package/dist/core/query.js.map +0 -1
  128. package/dist/core/refs.d.ts +0 -12
  129. package/dist/core/refs.js +0 -36
  130. package/dist/core/refs.js.map +0 -1
  131. package/dist/core/slug.d.ts +0 -22
  132. package/dist/core/slug.js +0 -40
  133. package/dist/core/slug.js.map +0 -1
  134. package/dist/core/time.d.ts +0 -14
  135. package/dist/core/time.js +0 -37
  136. package/dist/core/time.js.map +0 -1
  137. package/dist/core/tree.d.ts +0 -94
  138. package/dist/core/tree.js +0 -237
  139. package/dist/core/tree.js.map +0 -1
  140. package/dist/core/validate.d.ts +0 -55
  141. package/dist/core/validate.js +0 -312
  142. package/dist/core/validate.js.map +0 -1
  143. package/dist/git/config.d.ts +0 -12
  144. package/dist/git/config.js +0 -27
  145. package/dist/git/config.js.map +0 -1
  146. package/dist/git/exec.d.ts +0 -35
  147. package/dist/git/exec.js +0 -58
  148. package/dist/git/exec.js.map +0 -1
  149. package/dist/git/history.d.ts +0 -35
  150. package/dist/git/history.js +0 -82
  151. package/dist/git/history.js.map +0 -1
  152. package/dist/git/index-ops.d.ts +0 -20
  153. package/dist/git/index-ops.js +0 -45
  154. package/dist/git/index-ops.js.map +0 -1
  155. package/dist/git/merge.d.ts +0 -27
  156. package/dist/git/merge.js +0 -57
  157. package/dist/git/merge.js.map +0 -1
  158. package/dist/git/refscan.d.ts +0 -32
  159. package/dist/git/refscan.js +0 -82
  160. package/dist/git/refscan.js.map +0 -1
  161. package/dist/git/repo.d.ts +0 -45
  162. package/dist/git/repo.js +0 -95
  163. package/dist/git/repo.js.map +0 -1
  164. /package/dist/{cli/errors.js → errors.js} +0 -0
  165. /package/dist/{cli/install → install}/completions.js +0 -0
  166. /package/dist/{cli/render → render}/colors.js +0 -0
  167. /package/dist/{cli/render → render}/table.js +0 -0
@@ -0,0 +1,202 @@
1
+ /**
2
+ * `nav feature <verb>` — spec 04 §4.3.
3
+ *
4
+ * A feature has no lifecycle and no discussion, so it borrows none of the
5
+ * shared entity verbs: what it can be asked is what it is, what documents
6
+ * describe it, and what has happened to it.
7
+ */
8
+ import { addSpec, applyFeatureEdit, commitReport, createFeature, currentAuthor, featureCommits, featureJson, featureMembers, findFeature, loadRepo, newFeatureFile, newSpecFile, prepareOpen, referencedFeatures, requireSpecFileName, resolveFeature, resolveFeatureForEdit, revalidateFeatureFile, specFileName, specJson, toNdjson, validateFeature, validateSpec, } from "@navbook/core";
9
+ import { openInEditor } from "../editor.js";
10
+ import { fail } from "../errors.js";
11
+ import { renderTable } from "../render/table.js";
12
+ import { composeFile } from "./compose.js";
13
+ export function cmdFeatureOpen(ctx, title, opts) {
14
+ if (title.trim() === "")
15
+ fail("a feature needs a title");
16
+ const { created } = prepareOpen(ctx);
17
+ const composed = composeFile(ctx, {
18
+ ...(opts.message === undefined ? {} : { message: opts.message }),
19
+ bufferName: "NAVBOOK_FEATURE.md",
20
+ noun: "feature",
21
+ // A feature is named by its title; the documents beside it carry the detail.
22
+ allowEmptyBody: true,
23
+ render: (body) => newFeatureFile({ title, author: currentAuthor(ctx), created, ...(body ? { body } : {}) }),
24
+ validate: validateFeature,
25
+ });
26
+ const { slug, dirPath, run } = createFeature(ctx, {
27
+ content: composed.content,
28
+ ...(opts.slug === undefined ? {} : { slug: opts.slug }),
29
+ fallbackTitle: title,
30
+ }, { commit: opts.commit });
31
+ ctx.stdout.write(`Created ${ctx.navDir}/${dirPath}/ (${slug})\n`);
32
+ if (opts.commit)
33
+ ctx.stdout.write(`${commitReport(run)}\n`);
34
+ }
35
+ /* --------------------------------------------------------------------- list */
36
+ export function cmdFeatureList(ctx, opts) {
37
+ const repo = loadRepo(ctx, { comments: "none" });
38
+ const rows = repo.features.map((feature) => {
39
+ const attached = featureMembers(repo, feature.slug);
40
+ return { feature, entities: [...attached.issues, ...attached.prs] };
41
+ });
42
+ if (opts.json) {
43
+ if (rows.length === 0)
44
+ return;
45
+ const objects = rows.map(({ feature, entities }) => featureJson(ctx.navDir, feature, memberIds(entities)));
46
+ ctx.stdout.write(`${toNdjson(objects)}\n`);
47
+ return;
48
+ }
49
+ if (rows.length === 0) {
50
+ ctx.stdout.write("No features yet.\n");
51
+ return;
52
+ }
53
+ const columns = [
54
+ { header: "slug" },
55
+ { header: "title", flexible: true, minWidth: 20 },
56
+ { header: "specs" },
57
+ { header: "open" },
58
+ { header: "closed" },
59
+ ];
60
+ const cells = rows.map(({ feature, entities }) => [
61
+ feature.slug,
62
+ feature.title,
63
+ String(feature.specs.length),
64
+ String(entities.filter((entity) => entity.status === "open").length),
65
+ String(entities.filter((entity) => entity.status !== "open").length),
66
+ ]);
67
+ ctx.stdout.write(`${renderTable(columns, cells, { colors: ctx.colors, width: terminalWidth(ctx) })}\n`);
68
+ }
69
+ /**
70
+ * The `issues` and `prs` keys a feature's JSON carries.
71
+ *
72
+ * Both `list` and `show` emit them, and both emit IDs: a key must not change
73
+ * type between commands, which is what makes the projection worth diffing
74
+ * across implementations (spec 04 §4.2).
75
+ */
76
+ function memberIds(entities) {
77
+ return {
78
+ issues: entities.filter((e) => e.kind === "issue").map((e) => e.id),
79
+ prs: entities.filter((e) => e.kind === "pr").map((e) => e.id),
80
+ };
81
+ }
82
+ export function cmdFeatureShow(ctx, slug, opts) {
83
+ const repo = loadRepo(ctx, { comments: "none" });
84
+ const feature = resolveFeature(repo, slug);
85
+ const attached = featureMembers(repo, feature.slug);
86
+ if (opts.json) {
87
+ ctx.stdout.write(`${JSON.stringify(featureJson(ctx.navDir, feature, memberIds([...attached.issues, ...attached.prs])))}\n`);
88
+ return;
89
+ }
90
+ const c = ctx.colors;
91
+ const lines = [c.bold(feature.slug), ""];
92
+ const label = (text) => c.dim(`${text}:`.padEnd(11));
93
+ lines.push(`${label("title")}${feature.title}`);
94
+ if (typeof feature.fm.author === "string")
95
+ lines.push(`${label("author")}${feature.fm.author}`);
96
+ if (typeof feature.fm.created === "string")
97
+ lines.push(`${label("created")}${feature.fm.created}`);
98
+ lines.push(`${label("path")}${ctx.navDir}/${feature.dirPath}`);
99
+ const summary = feature.body.trim();
100
+ if (summary !== "")
101
+ lines.push("", summary);
102
+ lines.push("", c.dim(`specs (${feature.specs.length}):`));
103
+ if (feature.specs.length === 0)
104
+ lines.push(c.dim(" none"));
105
+ for (const spec of feature.specs) {
106
+ lines.push(` ${spec.fileName.padEnd(28)}${spec.title}`);
107
+ }
108
+ const entities = [...attached.issues, ...attached.prs];
109
+ lines.push("", c.dim(`issues and pull requests (${entities.length}):`));
110
+ if (entities.length === 0)
111
+ lines.push(c.dim(" none"));
112
+ for (const entity of entities) {
113
+ lines.push(` #${entity.id} ${entity.status.padEnd(7)}${entity.title}`);
114
+ }
115
+ const limit = opts.commits ?? 10;
116
+ if (limit > 0) {
117
+ const commits = featureCommits(ctx, feature, attached, { limit });
118
+ lines.push("", c.dim(`recent commits (${commits.length}):`));
119
+ if (commits.length === 0)
120
+ lines.push(c.dim(" none"));
121
+ for (const commit of commits) {
122
+ lines.push(` ${c.dim(commit.sha.slice(0, 8))} ${commit.subject}`);
123
+ }
124
+ }
125
+ ctx.stdout.write(`${lines.join("\n")}\n`);
126
+ }
127
+ /* --------------------------------------------------------------------- edit */
128
+ export function cmdFeatureEdit(ctx, slug, opts) {
129
+ editInPlace(ctx, slug, undefined, opts);
130
+ }
131
+ export function cmdSpecAdd(ctx, slug, title, opts) {
132
+ if (title.trim() === "")
133
+ fail("a specification document needs a title");
134
+ // Resolved first: being told the feature does not exist is worth much more
135
+ // before an editor has been filled in than after.
136
+ const feature = findFeature(ctx, slug);
137
+ const fileName = requireSpecFileName(opts.file ?? specFileName(title));
138
+ const composed = composeFile(ctx, {
139
+ ...(opts.message === undefined ? {} : { message: opts.message }),
140
+ bufferName: "NAVBOOK_SPEC.md",
141
+ noun: "specification document",
142
+ render: (body) => newSpecFile({ title, body }),
143
+ validate: validateSpec,
144
+ });
145
+ const added = addSpec(ctx, feature.slug, { content: composed.content, fileName }, { commit: opts.commit });
146
+ ctx.stdout.write(`Created ${ctx.navDir}/${added.path}\n`);
147
+ if (opts.commit)
148
+ ctx.stdout.write(`${commitReport(added.run)}\n`);
149
+ }
150
+ export function cmdSpecEdit(ctx, slug, file, opts) {
151
+ editInPlace(ctx, slug, file, opts);
152
+ }
153
+ export function cmdSpecList(ctx, slug, opts) {
154
+ const feature = findFeature(ctx, slug);
155
+ if (opts.json) {
156
+ if (feature.specs.length === 0)
157
+ return;
158
+ const objects = feature.specs.map((spec) => specJson(ctx.navDir, feature, spec));
159
+ ctx.stdout.write(`${toNdjson(objects)}\n`);
160
+ return;
161
+ }
162
+ if (feature.specs.length === 0) {
163
+ ctx.stdout.write(`Feature '${feature.slug}' has no specification documents yet.\n`);
164
+ return;
165
+ }
166
+ const columns = [{ header: "file" }, { header: "title", flexible: true, minWidth: 20 }];
167
+ const rows = feature.specs.map((spec) => [spec.fileName, spec.title]);
168
+ ctx.stdout.write(`${renderTable(columns, rows, { colors: ctx.colors, width: terminalWidth(ctx) })}\n`);
169
+ }
170
+ /* ------------------------------------------------------------------ helpers */
171
+ /** Open a feature file or one of its documents in `$EDITOR` and record it. */
172
+ function editInPlace(ctx, slug, fileName, opts) {
173
+ const target = resolveFeatureForEdit(ctx, slug, fileName);
174
+ openInEditor(ctx, target.path);
175
+ const problems = revalidateFeatureFile(target.path, target.spec !== undefined);
176
+ if (problems.length > 0) {
177
+ fail(`${ctx.navDir}/${target.filePath} is no longer valid; it was left as you saved it`, problems.map((problem) => ` ${problem}`));
178
+ }
179
+ const run = applyFeatureEdit(ctx, target, { commit: opts.commit });
180
+ ctx.stdout.write(`Edited ${ctx.navDir}/${target.filePath}\n`);
181
+ if (opts.commit)
182
+ ctx.stdout.write(`${commitReport(run)}\n`);
183
+ }
184
+ function terminalWidth(ctx) {
185
+ const columns = ctx.stdout.columns;
186
+ return typeof columns === "number" && columns > 0 ? columns : undefined;
187
+ }
188
+ /**
189
+ * Feature slugs offered for completion: those that exist, and those named.
190
+ *
191
+ * A slug an entity names but no directory holds is offered too — it is what
192
+ * somebody typed, and completing it is how they find the typo (D14).
193
+ */
194
+ export function featureSlugs(ctx) {
195
+ try {
196
+ return referencedFeatures(loadRepo(ctx, { comments: "none" }));
197
+ }
198
+ catch {
199
+ return [];
200
+ }
201
+ }
202
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature.js","sourceRoot":"","sources":["../../src/commands/feature.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * `nav init` and `nav id` — the repository-level utilities of spec 04 §4.3.
3
+ */
4
+ import { commitReport, initWorkspace, mintIds } from "@navbook/core";
5
+ /** Create the Navbook skeleton. */
6
+ export function cmdInit(ctx, opts) {
7
+ const result = initWorkspace(ctx, { commit: opts.commit });
8
+ ctx.stdout.write(`Created ${ctx.navDir}/\n`);
9
+ if (opts.commit) {
10
+ ctx.stdout.write(`${commitReport(result)}\n`);
11
+ }
12
+ else {
13
+ // Say so plainly: a later --commit refuses to run while this is staged.
14
+ ctx.stdout.write("The skeleton is staged; commit it, or re-run with --commit.\n");
15
+ }
16
+ ctx.stdout.write(`Next: nav issue open "Something is broken"\n`);
17
+ }
18
+ /** Mint and print fresh IDs, for hand-editors and scripts. */
19
+ export function cmdId(ctx, opts) {
20
+ for (const id of mintIds(ctx, opts.count ?? 1))
21
+ ctx.stdout.write(`${id}\n`);
22
+ }
23
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAIrE,mCAAmC;AACnC,MAAM,UAAU,OAAO,CAAC,GAAQ,EAAE,IAAiB;IACjD,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3D,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC;IAC7C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;SAAM,CAAC;QACN,wEAAwE;QACxE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAC;IACpF,CAAC;IACD,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;AACnE,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,KAAK,CAAC,GAAQ,EAAE,IAAwB;IACtD,KAAK,MAAM,EAAE,IAAI,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAC9E,CAAC"}
@@ -5,8 +5,7 @@
5
5
  * happens without printing the exact action first: the `git config` command to
6
6
  * be run, the hook path, the completions file.
7
7
  */
8
- import { ALIAS_DEFAULT, aliasCommand, DIRECTORY_RENAMES_KEY, readGlobal, readLocal, setLocal, unsetGlobal, unsetLocal, } from "../../git/config.js";
9
- import { git } from "../../git/exec.js";
8
+ import { ALIAS_DEFAULT, aliasCommand, DIRECTORY_RENAMES_KEY, git, readGlobal, readLocal, setLocal, unsetGlobal, unsetLocal, } from "@navbook/core";
10
9
  import { fail } from "../errors.js";
11
10
  import { completionNote, completionPath, completionScript, detectShell, installCompletions, isShell, uninstallCompletions, } from "../install/completions.js";
12
11
  import { hookPath, installHook, isInstalled, uninstallHook } from "../install/hook.js";
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * `nav issue <verb>` — spec 04 §4.3.
3
+ */
4
+ import { commitReport, currentAuthor, executeIssueLink, findParentIssue, isCalendarDate, newIssueFile, openIssue, planIssueLink, prepareOpen, unlinkIssue, validateIssue, } from "@navbook/core";
5
+ import { fail } from "../errors.js";
6
+ import { askYesNo } from "../prompt.js";
7
+ import { composeFile } from "./compose.js";
8
+ export function cmdIssueOpen(ctx, title, opts) {
9
+ if (title.trim() === "")
10
+ fail("an issue needs a title");
11
+ // Refused here rather than left to the file's own validation, for the reason
12
+ // `--parent` is resolved here: being told a flag will not do is worth much
13
+ // more before an editor has been filled in than after.
14
+ if (opts.rank !== undefined && !Number.isFinite(opts.rank))
15
+ fail("--rank must be a number");
16
+ if (opts.deadline !== undefined && !isCalendarDate(opts.deadline)) {
17
+ fail("--deadline must be a calendar date, as YYYY-MM-DD");
18
+ }
19
+ const { created } = prepareOpen(ctx);
20
+ // Resolved before anything is composed: being told the parent does not exist
21
+ // is worth much more before an editor has been filled in than after.
22
+ const parent = opts.parent === undefined ? undefined : findParentIssue(ctx, opts.parent);
23
+ const composed = composeFile(ctx, {
24
+ message: opts.message,
25
+ bufferName: "NAVBOOK_ISSUE.md",
26
+ noun: "issue",
27
+ render: (body) => newIssueFile({
28
+ title,
29
+ author: currentAuthor(ctx),
30
+ created,
31
+ body,
32
+ labels: opts.label,
33
+ assignee: opts.assignee,
34
+ milestone: opts.milestone,
35
+ features: opts.feature,
36
+ rank: opts.rank,
37
+ deadline: opts.deadline,
38
+ parent: parent?.id,
39
+ }),
40
+ validate: validateIssue,
41
+ });
42
+ const result = openIssue(ctx, { content: composed.content, fallbackTitle: title }, { commit: opts.commit });
43
+ const { id, dirPath, run } = result;
44
+ ctx.stdout.write(`Created ${ctx.navDir}/${dirPath}/ (#${id})\n`);
45
+ // What the file ended up saying, which an editor session may have changed.
46
+ if (result.parent) {
47
+ ctx.stdout.write(`Filed under #${result.parent.id} ${result.parent.title}\n`);
48
+ }
49
+ if (opts.commit)
50
+ ctx.stdout.write(`${commitReport(run)}\n`);
51
+ }
52
+ /**
53
+ * File one issue under another — spec 04 §4.3.
54
+ *
55
+ * An issue that already has a parent is being moved, not merely linked, and
56
+ * that changes a structure somebody else may be reading, so it is confirmed
57
+ * first. As everywhere else, an unanswerable question counts as "no".
58
+ */
59
+ export function cmdIssueLink(ctx, prefix, opts) {
60
+ const link = planIssueLink(ctx, prefix, opts.parent, { commit: opts.commit });
61
+ const { child, parent, previousParentId, previousParent } = link;
62
+ if (previousParentId !== undefined && !opts.force) {
63
+ const from = previousParent
64
+ ? `#${previousParent.id} ${previousParent.title}`
65
+ : `#${previousParentId} (not in this tree)`;
66
+ ctx.stdout.write(`#${child.id} is already a subtask of ${from}\n`);
67
+ if (!askYesNo(ctx, `Move it under #${parent.id} instead? [y/N] `)) {
68
+ fail(`#${child.id} was not moved`);
69
+ }
70
+ }
71
+ const run = executeIssueLink(ctx, link, { commit: opts.commit });
72
+ ctx.stdout.write(`Filed #${child.id} under #${parent.id} ${parent.title}\n`);
73
+ // An issue that was claiming the subtask without its agreement stops here,
74
+ // and nothing else in the run would have told the user that happened.
75
+ for (const lister of link.unexpectedListers) {
76
+ ctx.stdout.write(`Removed #${child.id} from the subtasks of #${lister.id} ${lister.title}\n`);
77
+ }
78
+ if (opts.commit)
79
+ ctx.stdout.write(`${commitReport(run)}\n`);
80
+ }
81
+ export function cmdIssueUnlink(ctx, prefix, opts) {
82
+ const { child, parentId, run } = unlinkIssue(ctx, prefix, { commit: opts.commit });
83
+ ctx.stdout.write(parentId === undefined
84
+ ? `Unlinked #${child.id}\n`
85
+ : `Unlinked #${child.id} from #${parentId}\n`);
86
+ if (opts.commit)
87
+ ctx.stdout.write(`${commitReport(run)}\n`);
88
+ }
89
+ //# sourceMappingURL=issue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue.js","sourceRoot":"","sources":["../../src/commands/issue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Saying what the review policy counts, and what it is short of.
3
+ *
4
+ * Shared by every verb that reads the policy, so a pull request short of two
5
+ * approvals is described in the same words wherever it is mentioned. Nothing
6
+ * here refuses anything: spec 02 §2.7 forbids acting on a review state, and
7
+ * §2.10 keeps a declared policy inside that. These are sentences, not gates.
8
+ */
9
+ import { NAV_MARKER } from "@navbook/core";
10
+ /** Warn about a marker whose policy could not be read; D15 is the full report. */
11
+ export function warnPolicyProblems(ctx, reading) {
12
+ for (const problem of reading.problems) {
13
+ ctx.stderr.write(`${ctx.colors.yellow("warning:")} ${ctx.navDir}/${NAV_MARKER}: ${problem}; using the default\n`);
14
+ }
15
+ }
16
+ /**
17
+ * What stands between a pull request and its policy, or null when nothing does.
18
+ *
19
+ * Only asked of a repository that declared a policy: a decision of `pending`
20
+ * where nobody asked for anything is not a shortfall, and saying so on every
21
+ * merge would be noise about a project that never opted in.
22
+ */
23
+ export function describeShortfall(summary) {
24
+ const blockers = summary.reviewers
25
+ .filter((entry) => entry.state === "request-changes")
26
+ .map((entry) => entry.person);
27
+ if (blockers.length > 0)
28
+ return `changes requested by ${blockers.join(", ")}`;
29
+ const { given, required } = summary.approvals;
30
+ if (given >= required)
31
+ return null;
32
+ return `${given} of ${required} required approval${required === 1 ? "" : "s"}`;
33
+ }
34
+ /**
35
+ * Decide how a merge should treat an unmet policy.
36
+ *
37
+ * Kept apart from the merge itself so every combination can be checked without
38
+ * a repository or a terminal, and so the one rule that matters is visible in
39
+ * one place: no combination returns a refusal. `--yes` proceeds, a terminal is
40
+ * asked, and everything else says its piece and proceeds — because a pipeline
41
+ * that stopped for a question nobody can answer would be the gate spec 02 §2.7
42
+ * forbids, arrived at by accident rather than on purpose.
43
+ */
44
+ export function mergeAction(situation) {
45
+ if (situation.shortfall === null || situation.assumeYes)
46
+ return "proceed";
47
+ return situation.interactive ? "ask" : "warn-and-proceed";
48
+ }
49
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/commands/policy.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAgD,MAAM,eAAe,CAAC;AAGzF,kFAAkF;AAClF,MAAM,UAAU,kBAAkB,CAAC,GAAQ,EAAE,OAA4B;IACvE,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACvC,GAAG,CAAC,MAAM,CAAC,KAAK,CACd,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,MAAM,IAAI,UAAU,KAAK,OAAO,uBAAuB,CAChG,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAsB;IACtD,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS;SAC/B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,iBAAiB,CAAC;SACpD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAChC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,wBAAwB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAE9E,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC;IAC9C,IAAI,KAAK,IAAI,QAAQ;QAAE,OAAO,IAAI,CAAC;IACnC,OAAO,GAAG,KAAK,OAAO,QAAQ,qBAAqB,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AACjF,CAAC;AAcD;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW,CAAC,SAAyB;IACnD,IAAI,SAAS,CAAC,SAAS,KAAK,IAAI,IAAI,SAAS,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1E,OAAO,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC;AAC5D,CAAC"}