@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
@@ -7,20 +7,22 @@ import { fileURLToPath } from "node:url";
7
7
  import { Command, Option } from "commander";
8
8
  import { cmdComplete } from "./commands/complete.js";
9
9
  import { cmdDoctor } from "./commands/doctor.js";
10
- import { cmdClose, cmdComment, cmdEdit, cmdList, cmdReopen, cmdShow, } from "./commands/entity.js";
10
+ import { cmdClose, cmdComment, cmdDelete, cmdEdit, cmdList, cmdReopen, cmdShow, } from "./commands/entity.js";
11
+ import { cmdFeatureEdit, cmdFeatureList, cmdFeatureOpen, cmdFeatureShow, cmdSpecAdd, cmdSpecEdit, cmdSpecList, } from "./commands/feature.js";
11
12
  import { cmdId, cmdInit } from "./commands/init.js";
12
13
  import { cmdInstall, cmdUninstall } from "./commands/install.js";
13
- import { cmdIssueOpen } from "./commands/issue.js";
14
- import { cmdPrClose, cmdPrList, cmdPrMerge, cmdPrOpen, cmdPrReview, cmdPrUpdate, } from "./commands/pr.js";
14
+ import { cmdIssueLink, cmdIssueOpen, cmdIssueUnlink } from "./commands/issue.js";
15
+ import { cmdPrClose, cmdPrList, cmdPrMerge, cmdPrOpen, cmdPrRequest, cmdPrReview, cmdPrUpdate, } from "./commands/pr.js";
16
+ import { DEFAULT_SORT, SORT_ORDERS } from "./sort.js";
15
17
  /**
16
18
  * Read straight from package.json rather than duplicating the version as a
17
19
  * literal: a hardcoded copy silently drifts the moment a release is cut
18
20
  * without updating both places (which is exactly what shipped as 0.1.1).
19
- * `../../package.json` is the package root from both `src/cli/` in dev and
20
- * `dist/cli/` after the build — the same relative depth either way.
21
+ * `../package.json` is the package root from both `src/` in dev and `dist/`
22
+ * after the build — the same relative depth either way.
21
23
  */
22
24
  function readOwnVersion() {
23
- const path = fileURLToPath(new URL("../../package.json", import.meta.url));
25
+ const path = fileURLToPath(new URL("../package.json", import.meta.url));
24
26
  const pkg = JSON.parse(readFileSync(path, "utf8"));
25
27
  return pkg.version;
26
28
  }
@@ -31,16 +33,38 @@ const QUERY_HELP = `Query terms AND together. Terms:
31
33
  assignee:EMAIL assignee address, or a fragment of its domain
32
34
  author:EMAIL author address, same matching
33
35
  milestone:M exact milestone
36
+ feature:SLUG SLUG is among the entity's features (repeatable, ANDs)
37
+ reviewer:EMAIL asked to review it; PRs only, same matching
38
+ review:DECISION pending, approved or changes-requested; PRs only
39
+ awaiting:EMAIL asked to review it and has not yet; PRs only
34
40
  WORD or "some phrase" case-insensitive substring of the title,
35
41
  description, or any comment body
36
- Same-key terms OR for single-valued fields (status, author, milestone) and AND
37
- for multi-valued ones (label, assignee). The default query is status:open.`;
38
- /** Help for `--commit`, naming the subject the verb commits under (spec 03 §3.2). */
39
- function commitHelp(kind) {
40
- return `wrap the change in a 'docs${kind ? `(${kind})` : ""}:' commit`;
42
+ Same-key terms OR for single-valued fields (status, author, milestone, review)
43
+ and AND for multi-valued ones (label, assignee, feature, reviewer, awaiting).
44
+ The default query is status:open.`;
45
+ /**
46
+ * Help for `--commit`, naming the subject the verb commits under (spec 03 §3.2).
47
+ *
48
+ * The argument is the commit's scope rather than an entity kind: `feature` is
49
+ * one of the scopes and is deliberately not one of the kinds.
50
+ */
51
+ function commitHelp(scope) {
52
+ return `wrap the change in a 'docs${scope ? `(${scope})` : ""}:' commit`;
53
+ }
54
+ /**
55
+ * Drop the implicit `help [command]` verb Commander gives every command that
56
+ * has subcommands: it prints exactly what `--help` prints, so `nav issue help
57
+ * open` and `nav issue open --help` are two spellings of one thing. `--help`
58
+ * is the one that stays.
59
+ *
60
+ * Applied at each level that has subcommands — the setting is per-command and
61
+ * deliberately not inherited, so the nouns do not pick it up from the root.
62
+ */
63
+ function withoutHelpVerb(command) {
64
+ return command.helpCommand(false);
41
65
  }
42
66
  export function buildProgram(getCtx) {
43
- const program = new Command();
67
+ const program = withoutHelpVerb(new Command());
44
68
  program
45
69
  .name("nav")
46
70
  .description("Git-native issue and pull-request tracking, stored as files in your repository")
@@ -49,7 +73,7 @@ export function buildProgram(getCtx) {
49
73
  .enablePositionalOptions();
50
74
  program
51
75
  .command("init")
52
- .description("create the .navbook/ skeleton at the repository root")
76
+ .description("create the Navbook skeleton at the repository root")
53
77
  .option("--commit", commitHelp())
54
78
  .action((opts) => cmdInit(getCtx(), opts));
55
79
  program
@@ -89,10 +113,11 @@ export function buildProgram(getCtx) {
89
113
  .action((words) => cmdComplete(getCtx(), words));
90
114
  program.addCommand(buildIssueCommand(getCtx));
91
115
  program.addCommand(buildPrCommand(getCtx));
116
+ program.addCommand(buildFeatureCommand(getCtx));
92
117
  return program;
93
118
  }
94
119
  function buildPrCommand(getCtx) {
95
- const pr = new Command("pr").description("work with pull requests");
120
+ const pr = withoutHelpVerb(new Command("pr")).description("work with pull requests");
96
121
  pr.command("open")
97
122
  .description("open a pull request from the current branch")
98
123
  .option("--target <branch>", "branch to merge into (default: the repository's default branch)")
@@ -101,7 +126,9 @@ function buildPrCommand(getCtx) {
101
126
  .option("--draft", "not yet requesting review")
102
127
  .option("--label <label>", "add a label (repeatable)", collect, [])
103
128
  .option("--assignee <email>", "assign to a person (repeatable)", collect, [])
129
+ .option("--reviewer <email>", "ask a person to review it (repeatable)", collect, [])
104
130
  .option("--milestone <name>", "milestone")
131
+ .option("--feature <slug>", "attach it to a feature (repeatable)", collect, [])
105
132
  .option("--commit", commitHelp("pr"))
106
133
  .action((opts) => cmdPrOpen(getCtx(), opts));
107
134
  pr.command("update")
@@ -109,11 +136,19 @@ function buildPrCommand(getCtx) {
109
136
  .description("append a revision pinning the current HEAD")
110
137
  .option("--commit", commitHelp("pr"))
111
138
  .action((id, opts) => cmdPrUpdate(getCtx(), id, opts));
139
+ pr.command("request")
140
+ .argument("<id>", "ID or unambiguous prefix")
141
+ .argument("<email...>", "who to ask")
142
+ .description("ask people to review a pull request")
143
+ .option("--remove", "take them off the reviewers instead")
144
+ .option("--commit", commitHelp("pr"))
145
+ .action((id, people, opts) => cmdPrRequest(getCtx(), id, people, opts));
112
146
  pr.command("review")
113
147
  .argument("<id>", "ID or unambiguous prefix")
114
148
  .description("review a pull request, bound to a specific revision")
115
149
  .option("--approve", "record an approving verdict")
116
150
  .option("--request-changes", "record a request-changes verdict")
151
+ .option("--comment", "record a verdict that judges nothing (the default)")
117
152
  .option("-m, --message <text>", "review text; without it $EDITOR is opened")
118
153
  .option("--revision <sha>", "bind to this revision instead of the latest")
119
154
  .option("--file <path>", "anchor the comment to a file")
@@ -125,10 +160,13 @@ function buildPrCommand(getCtx) {
125
160
  .description("merge a pull request into the checked-out target branch")
126
161
  .option("--no-ff", "always create a merge commit")
127
162
  .option("--continue", "finish a merge that stopped for conflict resolution")
163
+ .option("-y, --yes", "merge without asking when the review policy is not met")
128
164
  // Commander models `--no-ff` as the negation of an implicit `--ff`.
129
165
  .action((id, opts) => cmdPrMerge(getCtx(), id, { ...opts, noFf: opts.ff === false }));
130
166
  addSharedVerbs(pr, "pr", getCtx, {
131
- extraColumns: [{ header: "target", value: (entity) => stringOf(entity, "target") }],
167
+ // No extra columns here: `cmdPrList` owns the PR listing's columns, because
168
+ // it appends a `refs` one when scanning across branches.
169
+ extraColumns: [],
132
170
  runClose: (ctx, id, options) => cmdPrClose(ctx, id, options),
133
171
  configureList: (command) => {
134
172
  command.option("--all-refs", "scan all local and fetched remote branches, not just this one");
@@ -137,12 +175,73 @@ function buildPrCommand(getCtx) {
137
175
  });
138
176
  return pr;
139
177
  }
140
- function stringOf(entity, key) {
141
- const value = entity.fm[key];
142
- return typeof value === "string" ? value : "";
178
+ /**
179
+ * `nav feature` — spec 04 §4.3.
180
+ *
181
+ * None of the shared verbs appear here. A feature does not open and close, and
182
+ * it is not discussed: the discussion belongs to the issues attached to it. So
183
+ * the family is small on purpose, and `spec` groups what acts on the documents
184
+ * rather than on the feature itself.
185
+ */
186
+ function buildFeatureCommand(getCtx) {
187
+ const feature = withoutHelpVerb(new Command("feature")).description("work with features");
188
+ feature
189
+ .command("open")
190
+ .argument("<title>", "one-line name for the feature")
191
+ .description("create a feature")
192
+ .option("-m, --message <text>", "summary text; without it $EDITOR is opened")
193
+ .option("--slug <slug>", "directory name to file it under; derived from the title otherwise")
194
+ .option("--commit", commitHelp("feature"))
195
+ .action((title, opts) => cmdFeatureOpen(getCtx(), title, opts));
196
+ feature
197
+ .command("list")
198
+ .description("list features, with how much work is attached to each")
199
+ .option("--json", "one JSON object per feature, newline-delimited")
200
+ .action((opts) => cmdFeatureList(getCtx(), opts));
201
+ feature
202
+ .command("show")
203
+ .argument("<slug>", "the feature's directory name")
204
+ .description("render a feature, its documents, and what has touched it")
205
+ .option("--json", "emit a single JSON object naming its issues and pull requests")
206
+ .option("--commits <n>", "recent commits to list (default 10)", (value) => value.trim() === "" ? Number.NaN : Number(value))
207
+ .action((slug, opts) => cmdFeatureShow(getCtx(), slug, opts));
208
+ feature
209
+ .command("edit")
210
+ .argument("<slug>", "the feature's directory name")
211
+ .description("open the feature's feature.md in $EDITOR")
212
+ .option("--commit", commitHelp("feature"))
213
+ .action((slug, opts) => cmdFeatureEdit(getCtx(), slug, opts));
214
+ feature.addCommand(buildSpecCommand(getCtx));
215
+ return feature;
216
+ }
217
+ function buildSpecCommand(getCtx) {
218
+ const spec = withoutHelpVerb(new Command("spec")).description("work with a feature's specification documents");
219
+ spec
220
+ .command("add")
221
+ .argument("<slug>", "the feature's directory name")
222
+ .argument("<title>", "one-line name for the document")
223
+ .description("add a specification document to a feature")
224
+ .option("-m, --message <text>", "document text; without it $EDITOR is opened")
225
+ .option("--file <name>", "file to write it to; derived from the title otherwise")
226
+ .option("--commit", commitHelp("feature"))
227
+ .action((slug, title, opts) => cmdSpecAdd(getCtx(), slug, title, opts));
228
+ spec
229
+ .command("edit")
230
+ .argument("<slug>", "the feature's directory name")
231
+ .argument("<file>", "the document's file name")
232
+ .description("open a specification document in $EDITOR")
233
+ .option("--commit", commitHelp("feature"))
234
+ .action((slug, file, opts) => cmdSpecEdit(getCtx(), slug, file, opts));
235
+ spec
236
+ .command("list")
237
+ .argument("<slug>", "the feature's directory name")
238
+ .description("list a feature's specification documents")
239
+ .option("--json", "one JSON object per document, newline-delimited")
240
+ .action((slug, opts) => cmdSpecList(getCtx(), slug, opts));
241
+ return spec;
143
242
  }
144
243
  function buildIssueCommand(getCtx) {
145
- const issue = new Command("issue").description("work with issues");
244
+ const issue = withoutHelpVerb(new Command("issue")).description("work with issues");
146
245
  issue
147
246
  .command("open")
148
247
  .argument("<title>", "one-line summary")
@@ -151,9 +250,39 @@ function buildIssueCommand(getCtx) {
151
250
  .option("--label <label>", "add a label (repeatable)", collect, [])
152
251
  .option("--assignee <email>", "assign to a person (repeatable)", collect, [])
153
252
  .option("--milestone <name>", "milestone")
253
+ .option("--feature <slug>", "attach it to a feature (repeatable)", collect, [])
254
+ // Number rather than parseInt, and blank rather than 0, for the reason
255
+ // `--depth` does it: a value the command must refuse has to reach it
256
+ // intact rather than arrive silently rounded or defaulted.
257
+ .option("--rank <n>", "where it sits in the queue; lower first", (value) => value.trim() === "" ? Number.NaN : Number(value))
258
+ .option("--deadline <date>", "when the work is wanted, YYYY-MM-DD")
259
+ .option("--parent <id>", "file it as a subtask of an existing issue")
154
260
  .option("--commit", commitHelp("issue"))
155
261
  .action((title, opts) => cmdIssueOpen(getCtx(), title, opts));
156
- addSharedVerbs(issue, "issue", getCtx, { extraColumns: [] });
262
+ issue
263
+ .command("link")
264
+ .argument("<id>", "ID or unambiguous prefix")
265
+ .description("file the issue as a subtask of another issue")
266
+ .requiredOption("--parent <id>", "the issue it belongs under")
267
+ .option("-f, --force", "move it without asking when it already has a parent")
268
+ .option("--commit", commitHelp("issue"))
269
+ .action((id, opts) => cmdIssueLink(getCtx(), id, opts));
270
+ issue
271
+ .command("unlink")
272
+ .argument("<id>", "ID or unambiguous prefix")
273
+ .description("detach the issue from its parent")
274
+ .option("--commit", commitHelp("issue"))
275
+ .action((id, opts) => cmdIssueUnlink(getCtx(), id, opts));
276
+ addSharedVerbs(issue, "issue", getCtx, {
277
+ extraColumns: [],
278
+ configureList: (command) => command.option("--sort <order>", `listing order: ${SORT_ORDERS.join(", ")} (default ${DEFAULT_SORT})`),
279
+ configureShow: (command) =>
280
+ // Number, not parseInt: '2.5' has to reach the command as 2.5 so it can
281
+ // be refused, rather than being silently rounded to something valid.
282
+ // No default here — `cmdShow` owns it, so every caller gets the same one.
283
+ command.option("--depth <n>", "levels of subtasks to render (default 1)", (value) => value.trim() === "" ? Number.NaN : Number(value)),
284
+ configureDelete: (command) => command.option("-r, --recursive", "delete its subtasks too, to any depth"),
285
+ });
157
286
  return issue;
158
287
  }
159
288
  /** Register the verbs both nouns share, so their behavior can never drift. */
@@ -170,12 +299,13 @@ export function addSharedVerbs(parent, kind, getCtx, shared) {
170
299
  list.action((terms, opts) => shared.runList
171
300
  ? shared.runList(getCtx(), terms, { ...opts, extraColumns })
172
301
  : cmdList(getCtx(), kind, terms, { ...opts, extraColumns }));
173
- parent
302
+ const show = parent
174
303
  .command("show")
175
304
  .argument("<id>", "ID or unambiguous prefix")
176
305
  .description(`render one ${noun} and its comments`)
177
- .option("--json", "emit a single JSON object including comments")
178
- .action((id, opts) => cmdShow(getCtx(), kind, id, opts));
306
+ .option("--json", "emit a single JSON object including comments");
307
+ shared.configureShow?.(show);
308
+ show.action((id, opts) => cmdShow(getCtx(), kind, id, opts));
179
309
  parent
180
310
  .command("edit")
181
311
  .argument("<id>", "ID or unambiguous prefix")
@@ -210,6 +340,14 @@ export function addSharedVerbs(parent, kind, getCtx, shared) {
210
340
  .description(`move the ${noun} back to open/ and clear its resolution`)
211
341
  .option("--commit", commitHelp(kind))
212
342
  .action((id, opts) => cmdReopen(getCtx(), kind, id, opts));
343
+ const remove = parent
344
+ .command("delete")
345
+ .argument("<id>", "ID or unambiguous prefix")
346
+ .description(`remove the ${noun}'s directory, whatever its status`)
347
+ .option("-f, --force", "do not ask, even when the directory holds uncommitted changes")
348
+ .option("--commit", commitHelp(kind));
349
+ shared.configureDelete?.(remove);
350
+ remove.action((id, opts) => cmdDelete(getCtx(), kind, id, opts));
213
351
  }
214
352
  export function collect(value, previous) {
215
353
  return [...previous, value];
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,17 @@ export function confirmAndPerform(ctx, opts) {
23
23
  action.perform();
24
24
  return true;
25
25
  }
26
+ /**
27
+ * Whether there is somebody at a terminal to answer a question.
28
+ *
29
+ * Both ends matter: the question is written to stdout and the answer is read
30
+ * from stdin, so a run with either one redirected has nobody to ask. A caller
31
+ * that would otherwise block a pipeline on a prompt uses this to decide to
32
+ * say its piece and carry on instead.
33
+ */
34
+ export function isInteractive(ctx) {
35
+ return process.stdin.isTTY === true && ctx.stdout.isTTY === true;
36
+ }
26
37
  /** Ask a yes/no question; anything but `y`/`yes` — including EOF — is a no. */
27
38
  export function askYesNo(ctx, question) {
28
39
  ctx.stdout.write(question);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAenC,8DAA8D;AAC9D,MAAM,UAAU,iBAAiB,CAAC,GAAQ,EAAE,IAAoB;IAC9D,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;IACpC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO;QAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC;IAEjF,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,kBAAkB,CAAC,EAAE,CAAC;QAC1D,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC/B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO;QAAE,MAAM,CAAC,OAAO,EAAE,CAAC;IACpD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,GAAQ;IACpC,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC;AACnE,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,QAAQ,CAAC,GAAQ,EAAE,QAAgB;IACjD,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK;QAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9C,OAAO,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,iBAAiB;IACxB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM;QACR,CAAC;QACD,IAAI,IAAI,KAAK,CAAC;YAAE,MAAM;QACtB,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACnC,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/render/colors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,YAAY,CAAC;AAI5B,MAAM,UAAU,YAAY,CAAC,MAA2B,EAAE,GAAsB;IAC9E,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IACpE,IAAI,GAAG,CAAC,WAAW,KAAK,SAAS,IAAI,GAAG,CAAC,WAAW,KAAK,EAAE,IAAI,GAAG,CAAC,WAAW,KAAK,GAAG;QACpF,OAAO,IAAI,CAAC;IACd,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IACtC,OAAO,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAA2B,EAAE,GAAsB;IAC5E,OAAO,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,197 @@
1
+ /**
2
+ * The `show` rendering: an entity's metadata, description and comment thread.
3
+ */
4
+ import { describeReviewPolicy, NO_REVIEW_POLICY, readAssignees, readLabels, readMerged, readRank, readRevisions, reviewSummary, threadOrder, toIsoSeconds, } from "@navbook/core";
5
+ /** Render one entity with its full comment thread. */
6
+ export function renderDetail(entity, opts) {
7
+ const c = opts.colors;
8
+ const lines = [];
9
+ lines.push(`${c.bold(`#${entity.id}`)} ${entity.title}`);
10
+ const labelWidth = 11;
11
+ for (const [label, value] of metadataRows(entity, opts, c)) {
12
+ // A continuation row (empty label) is indented to line up under the value.
13
+ const cell = label === "" ? " ".repeat(labelWidth) : c.dim(`${label}:`.padEnd(labelWidth));
14
+ lines.push(`${cell}${value}`);
15
+ }
16
+ const body = entity.body.trim();
17
+ if (body !== "") {
18
+ lines.push("");
19
+ lines.push(body);
20
+ }
21
+ lines.push("");
22
+ lines.push(c.dim(`comments (${entity.comments.length}):`));
23
+ if (entity.comments.length === 0) {
24
+ lines.push(c.dim(" none"));
25
+ }
26
+ else {
27
+ for (const { comment, depth } of threadOrder(entity.comments)) {
28
+ lines.push("");
29
+ lines.push(...renderComment(comment, depth, c));
30
+ }
31
+ }
32
+ return lines.join("\n");
33
+ }
34
+ function metadataRows(entity, opts, c) {
35
+ const { navDir, links } = opts;
36
+ const rows = [];
37
+ rows.push(["status", entity.archived ? `${entity.status} (archived)` : entity.status]);
38
+ rows.push(["author", stringField(entity, "author")]);
39
+ rows.push(["created", stringField(entity, "created")]);
40
+ if (entity.kind === "pr") {
41
+ rows.push(["target", stringField(entity, "target")]);
42
+ const source = stringField(entity, "source");
43
+ if (source !== "")
44
+ rows.push(["source", source]);
45
+ if (entity.fm.draft === true)
46
+ rows.push(["draft", "yes"]);
47
+ const revisions = readRevisions(entity.fm);
48
+ revisions.forEach((revision, index) => {
49
+ rows.push([
50
+ index === 0 ? "revisions" : "",
51
+ `${index + 1}. head ${revision.head.slice(0, 12)} base ${revision.base.slice(0, 12)} ${revision.date}`,
52
+ ]);
53
+ });
54
+ const merged = readMerged(entity.fm);
55
+ if (merged) {
56
+ rows.push(["merged", `${merged.date ?? "?"} by ${merged.by ?? "?"}`]);
57
+ if (typeof merged.commit === "string")
58
+ rows.push(["", `commit ${merged.commit.slice(0, 12)}`]);
59
+ }
60
+ rows.push(...reviewRows(entity, opts.reviewPolicy ?? NO_REVIEW_POLICY, c));
61
+ }
62
+ const labels = readLabels(entity.fm);
63
+ if (labels.length > 0)
64
+ rows.push(["labels", labels.join(", ")]);
65
+ const assignees = readAssignees(entity.fm);
66
+ if (assignees.length > 0)
67
+ rows.push(["assignee", assignees.join(", ")]);
68
+ // Not through `stringField` with the rest, because a rank is a number: what
69
+ // a reader wants to see for `rank: 0` is `0`, and not the blank an absent
70
+ // key leaves. Rendered whatever the noun is, as every row here is — the keys
71
+ // §2.5 keeps for an issue are a `doctor` fault on a pull request, and a
72
+ // reader looking at one needs to see what the file actually says.
73
+ const rank = readRank(entity.fm);
74
+ if (rank !== null)
75
+ rows.push(["rank", String(rank)]);
76
+ for (const key of ["milestone", "deadline", "resolution", "duplicate-of", "superseded-by"]) {
77
+ const value = stringField(entity, key);
78
+ if (value !== "")
79
+ rows.push([key, value]);
80
+ }
81
+ rows.push(...linkRows(links, c));
82
+ rows.push(["path", `${navDir}/${entity.dirPath}/`]);
83
+ return rows;
84
+ }
85
+ /**
86
+ * Who was asked to review, what each of them said, and what that adds up to.
87
+ *
88
+ * All of it is derived from the reviews against the latest revision (spec 02
89
+ * §2.7) and none of it is in the file, which is why the rows appear only when
90
+ * there is something to say: a pull request nobody was asked to review and
91
+ * nobody reviewed shows no reviewer rows at all.
92
+ */
93
+ function reviewRows(entity, reading, c) {
94
+ const summary = reviewSummary(entity, reading.policy);
95
+ // The policy is worth stating even where nobody has reviewed: it is what
96
+ // this pull request will be read against, and a reader who has to guess
97
+ // whether one approval is enough has been told half of it.
98
+ const policy = reading.declared
99
+ ? [["policy", c.dim(describeReviewPolicy(reading.policy))]]
100
+ : [];
101
+ // The count only earns its place where more than one approval is wanted;
102
+ // "1 of 1" beside every decision is a fact nobody was missing.
103
+ const { given, required } = summary.approvals;
104
+ const counted = required > 1 ? c.dim(` (${given} of ${required} approvals)`) : "";
105
+ // A count is itself something to say, so it shows the decision even where
106
+ // nobody was asked: under a policy wanting more than one approval, the
107
+ // policy is the ask, and hiding the shortfall until somebody is named would
108
+ // be reporting silence about the one thing standing in the way.
109
+ if (summary.reviewers.length === 0 && counted === "")
110
+ return policy;
111
+ const rows = [["review", `${paintDecision(summary.decision, c)}${counted}`]];
112
+ summary.reviewers.forEach((entry, index) => {
113
+ const state = paintState(entry.state, c);
114
+ const asked = entry.volunteer ? c.dim(" (not asked)") : "";
115
+ rows.push([index === 0 ? "reviewers" : "", `${entry.person} ${state}${asked}`]);
116
+ });
117
+ return [...rows, ...policy];
118
+ }
119
+ function paintDecision(decision, c) {
120
+ if (decision === "approved")
121
+ return c.green(decision);
122
+ return decision === "changes-requested" ? c.yellow(decision) : c.dim(decision);
123
+ }
124
+ function paintState(state, c) {
125
+ if (state === "approve")
126
+ return c.green(`[${state}]`);
127
+ if (state === "request-changes")
128
+ return c.yellow(`[${state}]`);
129
+ return c.dim(`[${state}]`);
130
+ }
131
+ /**
132
+ * The decomposition links, as the file records them.
133
+ *
134
+ * A parent named but absent, and a subtask listed but claiming another parent,
135
+ * are shown as written rather than quietly dropped: what the file says is the
136
+ * thing a reader needs to see, and `nav doctor` is what explains it.
137
+ */
138
+ function linkRows(links, c) {
139
+ if (!links)
140
+ return [];
141
+ const rows = [];
142
+ if (links.parent)
143
+ rows.push(["parent", describeLink(links.parent, 0, c)]);
144
+ flatten(links.subtasks, 0).forEach(([node, depth], index) => {
145
+ rows.push([index === 0 ? "subtasks" : "", describeLink(node, depth, c)]);
146
+ });
147
+ return rows;
148
+ }
149
+ function flatten(nodes, depth) {
150
+ return nodes.flatMap((node) => [
151
+ [node, depth],
152
+ ...flatten(node.children, depth + 1),
153
+ ]);
154
+ }
155
+ function describeLink(node, depth, c) {
156
+ const head = `${" ".repeat(depth)}${c.bold(`#${node.id}`)}`;
157
+ if (node.notAnIssue)
158
+ return `${head} ${c.yellow("(a pull request, not a subtask)")}`;
159
+ if (!node.entity)
160
+ return `${head} ${c.dim("(not in this tree)")}`;
161
+ return `${head} ${node.entity.title} ${c.dim(`(${node.entity.status})`)}${note(node, c)}`;
162
+ }
163
+ function note(node, c) {
164
+ if (node.cycle)
165
+ return ` ${c.yellow("(loops back)")}`;
166
+ return node.repeated ? ` ${c.dim("(shown above)")}` : "";
167
+ }
168
+ function stringField(entity, key) {
169
+ const value = entity.fm[key];
170
+ return typeof value === "string" ? value : "";
171
+ }
172
+ function renderComment(comment, depth, c) {
173
+ const indent = " ".repeat(depth + 1);
174
+ const head = [c.bold(`#${comment.id}`), comment.author, toIsoSeconds(comment.date)];
175
+ const verdict = comment.parsed.fm.verdict;
176
+ if (typeof verdict === "string") {
177
+ // The third verdict judges nothing, so it is not painted as though it did.
178
+ const paint = verdict === "approve" ? c.green : verdict === "comment" ? c.dim : c.yellow;
179
+ head.push(paint(`[${verdict}]`));
180
+ }
181
+ const revision = comment.parsed.fm.revision;
182
+ if (typeof revision === "string")
183
+ head.push(c.dim(`@${revision.slice(0, 12)}`));
184
+ const file = comment.parsed.fm.file;
185
+ if (typeof file === "string") {
186
+ const line = comment.parsed.fm.line;
187
+ head.push(c.dim(`${file}${line === undefined ? "" : `:${line}`}`));
188
+ }
189
+ if (comment.replyTo)
190
+ head.push(c.dim(`reply to #${comment.replyTo}`));
191
+ const lines = [`${indent}${head.join(" ")}`];
192
+ for (const line of comment.body.trim().split("\n")) {
193
+ lines.push(line === "" ? "" : `${indent} ${line}`);
194
+ }
195
+ return lines;
196
+ }
197
+ //# sourceMappingURL=detail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detail.js","sourceRoot":"","sources":["../../src/render/detail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.js","sourceRoot":"","sources":["../../src/render/table.ts"],"names":[],"mappings":"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"}