@floh-solutions/pharos-cli 0.4.0 → 0.13.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 (67) hide show
  1. package/dist/cli.d.ts.map +1 -1
  2. package/dist/cli.js +418 -7
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/attach.d.ts +30 -0
  5. package/dist/commands/attach.d.ts.map +1 -0
  6. package/dist/commands/attach.js +55 -0
  7. package/dist/commands/attach.js.map +1 -0
  8. package/dist/commands/create.d.ts +35 -0
  9. package/dist/commands/create.d.ts.map +1 -0
  10. package/dist/commands/create.js +82 -0
  11. package/dist/commands/create.js.map +1 -0
  12. package/dist/commands/detach.d.ts +34 -0
  13. package/dist/commands/detach.d.ts.map +1 -0
  14. package/dist/commands/detach.js +117 -0
  15. package/dist/commands/detach.js.map +1 -0
  16. package/dist/commands/discover.d.ts +66 -0
  17. package/dist/commands/discover.d.ts.map +1 -0
  18. package/dist/commands/discover.js +128 -0
  19. package/dist/commands/discover.js.map +1 -0
  20. package/dist/commands/hooks.d.ts +24 -0
  21. package/dist/commands/hooks.d.ts.map +1 -0
  22. package/dist/commands/hooks.js +184 -0
  23. package/dist/commands/hooks.js.map +1 -0
  24. package/dist/commands/image.d.ts +44 -0
  25. package/dist/commands/image.d.ts.map +1 -0
  26. package/dist/commands/image.js +114 -0
  27. package/dist/commands/image.js.map +1 -0
  28. package/dist/commands/import.d.ts +51 -0
  29. package/dist/commands/import.d.ts.map +1 -0
  30. package/dist/commands/import.js +190 -0
  31. package/dist/commands/import.js.map +1 -0
  32. package/dist/commands/link.d.ts +40 -0
  33. package/dist/commands/link.d.ts.map +1 -0
  34. package/dist/commands/link.js +150 -0
  35. package/dist/commands/link.js.map +1 -0
  36. package/dist/commands/people.d.ts +39 -0
  37. package/dist/commands/people.d.ts.map +1 -0
  38. package/dist/commands/people.js +64 -0
  39. package/dist/commands/people.js.map +1 -0
  40. package/dist/commands/query.d.ts +43 -0
  41. package/dist/commands/query.d.ts.map +1 -0
  42. package/dist/commands/query.js +202 -0
  43. package/dist/commands/query.js.map +1 -0
  44. package/dist/commands/recycle.d.ts +10 -0
  45. package/dist/commands/recycle.d.ts.map +1 -0
  46. package/dist/commands/recycle.js +118 -0
  47. package/dist/commands/recycle.js.map +1 -0
  48. package/dist/commands/task.d.ts +13 -0
  49. package/dist/commands/task.d.ts.map +1 -1
  50. package/dist/commands/task.js +106 -4
  51. package/dist/commands/task.js.map +1 -1
  52. package/dist/commands/update.d.ts +52 -0
  53. package/dist/commands/update.d.ts.map +1 -0
  54. package/dist/commands/update.js +181 -0
  55. package/dist/commands/update.js.map +1 -0
  56. package/dist/commands/wiki.d.ts.map +1 -1
  57. package/dist/commands/wiki.js +133 -2
  58. package/dist/commands/wiki.js.map +1 -1
  59. package/dist/output.d.ts.map +1 -1
  60. package/dist/output.js +32 -2
  61. package/dist/output.js.map +1 -1
  62. package/dist/wiql-build.d.ts +92 -0
  63. package/dist/wiql-build.d.ts.map +1 -0
  64. package/dist/wiql-build.js +147 -0
  65. package/dist/wiql-build.js.map +1 -0
  66. package/package.json +2 -2
  67. package/skill/SKILL.md +388 -62
@@ -0,0 +1,118 @@
1
+ import { emit, emitText, usageError } from "../output.js";
2
+ import { approve } from "../session.js";
3
+ /**
4
+ * `pharos delete`, `restore` and `deleted` — the recycle bin.
5
+ *
6
+ * **Deleting is not destroying, and the words matter.** `DELETE
7
+ * /wit/workitems/{id}` moves an item to the project's recycle bin, from which
8
+ * anybody can restore it; only `?destroy=true` is permanent, and that needs a
9
+ * project-level permission most accounts do not have. The macOS app names its
10
+ * button "Move to Recycle Bin" rather than "Delete" for exactly this reason —
11
+ * a verb that reads as irreversible when it is not teaches people to fear the
12
+ * safe thing and, worse, to trust the unsafe one.
13
+ *
14
+ * `restore` and the recycle-bin listing are the half `az boards work-item
15
+ * delete` does not have at all, which is what makes this worth building rather
16
+ * than duplicating (#590).
17
+ *
18
+ * ## There is deliberately no way to destroy anything from here
19
+ *
20
+ * `WorkItemsApi.destroyDeleted` exists in `ado-core` and this CLI does not
21
+ * expose it. @user's call, and the reasoning is worth keeping because somebody
22
+ * will eventually propose adding it back:
23
+ *
24
+ * - **The primary consumer is an agent**, and agents learn to pass `--yes` —
25
+ * it is on every destructive verb here. A flag guarded only by convention is
26
+ * one prompt away from being satisfied.
27
+ * - **It is the only verb in the surface with no way back.** A wiki page has
28
+ * git history, a field has revisions, a deleted item has this bin.
29
+ * - It usually 403s anyway: destroying needs a project-level permission most
30
+ * accounts do not hold.
31
+ * - Nothing is gained. The bin is not a scarce resource.
32
+ *
33
+ * The web UI owns it, with an admin's own confirmation, in the place an admin
34
+ * already goes for permissions work.
35
+ */
36
+ function workItemId(raw, usage) {
37
+ if (raw === undefined)
38
+ throw usageError(usage);
39
+ if (!/^\d+$/.test(raw))
40
+ throw usageError(`"${raw}" is not a work item id.`, { given: raw });
41
+ return Number(raw);
42
+ }
43
+ export async function runDelete(io, session, positionals) {
44
+ const id = workItemId(positionals[0], "Which work item? `pharos delete <id> --yes`.");
45
+ // Read first so the refusal can QUOTE what it is about to remove. "Delete 12
46
+ // work items?" is the dialog everybody clicks through; "#225 — Complete
47
+ // handover and closeout" is the one that stops the wrong hand.
48
+ const item = await session.client.workItems.get(id);
49
+ const title = item.fields?.["System.Title"];
50
+ const subject = typeof title === "string" && title !== "" ? `#${id} — ${title}` : `#${id}`;
51
+ const stop = approve(io, session, {
52
+ what: `move ${subject} to the Recycle Bin`,
53
+ would: { id, title: title ?? null, destination: "Recycle Bin", restorable: true },
54
+ });
55
+ if (stop !== undefined)
56
+ return stop;
57
+ if (session.previewOnly) {
58
+ return emit(io, { applied: false, dryRun: true, id, title: title ?? null });
59
+ }
60
+ await session.client.workItems.delete(id);
61
+ const result = {
62
+ applied: true,
63
+ id,
64
+ title: title ?? null,
65
+ restorable: true,
66
+ hint: `Undo with \`pharos restore ${id}\`.`,
67
+ };
68
+ return session.pretty ? emitText(io, `${subject} → Recycle Bin`) : emit(io, result);
69
+ }
70
+ export async function runRestore(io, session, positionals) {
71
+ const id = workItemId(positionals[0], "Which work item? `pharos restore <id>`.");
72
+ // No --yes: restoring puts something back, which is the recoverable direction
73
+ // and the one somebody reaches for when they have just made a mistake.
74
+ if (session.previewOnly) {
75
+ return emit(io, { applied: false, dryRun: true, id });
76
+ }
77
+ const restored = await session.client.workItems.restore(id);
78
+ const result = { applied: true, id, name: restored.name ?? null };
79
+ return session.pretty ? emitText(io, `#${id} restored`) : emit(io, result);
80
+ }
81
+ export async function runDeleted(io, session, options) {
82
+ const references = await session.client.workItems.listDeleted();
83
+ // The list endpoint returns SHALLOW references — `{id, url}` and nothing more
84
+ // — so without this second call the answer is a column of bare numbers. Same
85
+ // hydrate step `query` makes after WIQL, and for the same reason: a list of
86
+ // ids answers no question anybody actually asked.
87
+ const wanted = references.slice(0, options.top).map((reference) => reference.id);
88
+ const items = await session.client.workItems.getDeletedBatch(wanted);
89
+ const result = {
90
+ count: references.length,
91
+ shown: items.length,
92
+ items: items.map((item) => ({
93
+ id: item.id,
94
+ type: item.type ?? null,
95
+ name: item.name ?? null,
96
+ deletedBy: item.deletedBy ?? null,
97
+ // Not ISO-8601 — "8/4/2026 2:37:24 PM". Passed through as the label it is
98
+ // rather than parsed, because parsing it outside a US locale swaps the day
99
+ // and month for the first twelve days of any month.
100
+ deletedDate: item.deletedDate ?? null,
101
+ })),
102
+ ...(references.length === 0 ? { note: "The Recycle Bin is empty." } : {}),
103
+ ...(references.length > items.length
104
+ ? { note: `${references.length} in the bin; naming the first ${items.length}. --top for more.` }
105
+ : {}),
106
+ };
107
+ if (!session.pretty)
108
+ return emit(io, result);
109
+ if (references.length === 0)
110
+ return emitText(io, "The Recycle Bin is empty.");
111
+ const lines = result.items.map((item) => ` #${String(item.id).padEnd(6)} ${(item.type ?? "").padEnd(10)} `
112
+ + `${(item.name ?? "(unnamed)").slice(0, 50).padEnd(50)} ${item.deletedDate ?? ""}`);
113
+ if (references.length > items.length) {
114
+ lines.push("", `${references.length} in the bin; ${items.length} shown. --top for more.`);
115
+ }
116
+ return emitText(io, lines.join("\n"));
117
+ }
118
+ //# sourceMappingURL=recycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recycle.js","sourceRoot":"","sources":["../../src/commands/recycle.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,19 @@ export interface TaskOptions {
18
18
  wikiContent: boolean;
19
19
  wikiComments: boolean;
20
20
  relatedTitles: boolean;
21
+ /**
22
+ * How many generations of children to fetch as well. `0` is this item alone,
23
+ * which is the default and what every earlier version did.
24
+ *
25
+ * **Why this exists.** The header above claims `task` is one call, and for a
26
+ * leaf it is. For an EPIC it was one call plus one per child: measured on
27
+ * Epic #39, nine calls and ~38 KB to answer one question about one epic. The
28
+ * `related[]` array already names the children, so an agent knew *what* they
29
+ * were — and still had to fetch each one to know what any of them SAID.
30
+ */
31
+ depth: number;
32
+ /** Flatten identities and drop board-extension noise — see ``compact``. */
33
+ compact: boolean;
21
34
  }
22
35
  export declare function runTask(io: Io, session: Session, positionals: readonly string[], options: TaskOptions): Promise<ExitCode>;
23
36
  //# sourceMappingURL=task.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../../src/commands/task.ts"],"names":[],"mappings":"AAEA,OAAO,EAA8B,KAAK,QAAQ,EAAE,KAAK,EAAE,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,wBAAsB,OAAO,CAC3B,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,SAAS,MAAM,EAAE,EAC9B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,QAAQ,CAAC,CAcnB"}
1
+ {"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../../src/commands/task.ts"],"names":[],"mappings":"AAEA,OAAO,EAA8B,KAAK,QAAQ,EAAE,KAAK,EAAE,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB;;;;;;;;;OASG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,OAAO,EAAE,OAAO,CAAC;CAClB;AAeD,wBAAsB,OAAO,CAC3B,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,SAAS,MAAM,EAAE,EAC9B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,QAAQ,CAAC,CAkBnB"}
@@ -1,5 +1,14 @@
1
1
  import { taskContext } from "@floh-solutions/ado-core";
2
2
  import { emit, emitText, usageError } from "../output.js";
3
+ /**
4
+ * How many child fetches are in flight at once.
5
+ *
6
+ * Six rather than unbounded: an epic with forty children would otherwise open
7
+ * forty connections and invite the rate limiter, and `taskContext` is itself
8
+ * several requests per item. Rather than a number tuned to nothing, this is the
9
+ * smallest value that keeps a typical epic (eight children) to two rounds.
10
+ */
11
+ const CHILD_CONCURRENCY = 6;
3
12
  export async function runTask(io, session, positionals, options) {
4
13
  const raw = positionals[0];
5
14
  if (raw === undefined)
@@ -7,12 +16,95 @@ export async function runTask(io, session, positionals, options) {
7
16
  if (!/^\d+$/.test(raw)) {
8
17
  throw usageError(`"${raw}" is not a work item id.`, { given: raw });
9
18
  }
10
- const context = await taskContext(session.client, Number(raw), {
19
+ const fetch = async (id) => taskContext(session.client, id, {
11
20
  includeWikiContent: options.wikiContent,
12
21
  includeWikiComments: options.wikiComments,
13
22
  includeRelatedTitles: options.relatedTitles,
14
23
  });
15
- return session.pretty ? emitText(io, render(context)) : emit(io, context);
24
+ const tree = await withChildren(await fetch(Number(raw)), options.depth, fetch);
25
+ const shaped = options.compact ? compact(tree) : tree;
26
+ return session.pretty ? emitText(io, render(shaped)) : emit(io, shaped);
27
+ }
28
+ /**
29
+ * Fetches the hierarchy under an item, breadth-first and bounded.
30
+ *
31
+ * **A child that cannot be read becomes a `problems[]` entry, not a failure.**
32
+ * One unreadable item out of forty must not cost the other thirty-nine — a
33
+ * partial tree that says what is missing is far more useful than an error, and
34
+ * it is the same rule `taskContext` already applies to a wiki page it cannot
35
+ * reach.
36
+ */
37
+ async function withChildren(context, depth, fetch) {
38
+ if (depth <= 0)
39
+ return context;
40
+ const ids = context.related
41
+ .filter((item) => item.rel === "System.LinkTypes.Hierarchy-Forward")
42
+ .map((item) => item.id);
43
+ if (ids.length === 0)
44
+ return context;
45
+ const children = [];
46
+ const problems = [];
47
+ for (let start = 0; start < ids.length; start += CHILD_CONCURRENCY) {
48
+ const batch = ids.slice(start, start + CHILD_CONCURRENCY);
49
+ const settled = await Promise.all(batch.map(async (id) => {
50
+ try {
51
+ return await withChildren(await fetch(id), depth - 1, fetch);
52
+ }
53
+ catch (error) {
54
+ problems.push(`child #${id} could not be read: ${error instanceof Error ? error.message : String(error)}`);
55
+ return undefined;
56
+ }
57
+ }));
58
+ for (const child of settled)
59
+ if (child !== undefined)
60
+ children.push(child);
61
+ }
62
+ return {
63
+ ...context,
64
+ children,
65
+ problems: problems.length === 0 ? context.problems : [...context.problems, ...problems],
66
+ };
67
+ }
68
+ /**
69
+ * The same context with the parts no agent reads taken out.
70
+ *
71
+ * **Measured, on work item #40: 2,466 of 10,367 bytes — 24% — were identity
72
+ * blobs.** `System.CreatedBy` and its three siblings each carry `url`,
73
+ * `_links.avatar.href`, `imageUrl`, `descriptor` and a GUID, and what gets used
74
+ * is `displayName`. Over the nine calls an epic used to cost, that is some nine
75
+ * kilobytes of avatar URLs.
76
+ *
77
+ * Two rules, and deliberately only two — this trims noise, it does not decide
78
+ * which FIELDS matter:
79
+ *
80
+ * - an object with a `displayName` collapses to that string. The `--pretty`
81
+ * renderer has always done this (see ``identity``); the JSON path simply
82
+ * never did.
83
+ * - `WEF_…` keys go. They are the board extension's own per-team markers —
84
+ * `WEF_<guid>_Kanban.Column` — and they are already in `System.BoardColumn`.
85
+ *
86
+ * Nothing else is dropped. A field bag that quietly loses fields would be worse
87
+ * than a large one, because the loss is invisible at the point it matters.
88
+ */
89
+ function compact(context) {
90
+ const fields = {};
91
+ for (const [name, value] of Object.entries(context.fields)) {
92
+ if (name.startsWith("WEF_"))
93
+ continue;
94
+ if (typeof value === "object" && value !== null) {
95
+ const display = value.displayName;
96
+ if (typeof display === "string") {
97
+ fields[name] = display;
98
+ continue;
99
+ }
100
+ }
101
+ fields[name] = value;
102
+ }
103
+ return {
104
+ ...context,
105
+ fields,
106
+ ...(context.children === undefined ? {} : { children: context.children.map(compact) }),
107
+ };
16
108
  }
17
109
  /**
18
110
  * The human rendering.
@@ -22,7 +114,7 @@ export async function runTask(io, session, positionals, options) {
22
114
  * LAST and never omitted — a context with a silent hole in it is worse than no
23
115
  * context, because it is reasoned from confidently.
24
116
  */
25
- function render(context) {
117
+ function render(context, indent = "") {
26
118
  const field = (name) => {
27
119
  const value = context.fields[name];
28
120
  return typeof value === "string" && value.trim() !== "" ? value : undefined;
@@ -94,7 +186,17 @@ function render(context) {
94
186
  for (const problem of context.problems)
95
187
  lines.push(` - ${problem}`);
96
188
  }
97
- return lines.join("\n");
189
+ // The children LAST and set off by a rule, so a long epic still reads as one
190
+ // item followed by its parts rather than as an undifferentiated wall.
191
+ if (context.children !== undefined && context.children.length > 0) {
192
+ lines.push("", `${"=".repeat(60)}`, `## Children of #${context.id} (${context.children.length})`);
193
+ for (const child of context.children) {
194
+ lines.push("", "-".repeat(60), render(child, `${indent} `));
195
+ }
196
+ }
197
+ return indent === ""
198
+ ? lines.join("\n")
199
+ : lines.map((line) => (line === "" ? line : `${indent}${line}`)).join("\n");
98
200
  }
99
201
  /** `System.LinkTypes.Hierarchy-Forward` reads as `Child`. */
100
202
  function shortRel(rel) {
@@ -1 +1 @@
1
- {"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/commands/task.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/commands/task.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { type WorkItem } from "@floh-solutions/ado-core";
2
+ import { type ExitCode, type Io } from "../output.js";
3
+ import type { Session } from "../session.js";
4
+ /**
5
+ * `pharos update <id>` — change a field, safely.
6
+ *
7
+ * **This verb is why the Azure DevOps MCP server can be removed.** The MCP was
8
+ * the only way to set a state or a priority from here, and it authenticates
9
+ * through the Azure CLI — which opens a browser, which makes any session that
10
+ * touches it non-autonomous. That was the whole cost.
11
+ *
12
+ * ## It is safer than the thing it replaces
13
+ *
14
+ * The MCP's patch op enum is `add | replace | remove`. There is no `test`, so
15
+ * **every MCP write is last-write-wins**: it cannot express "apply this only if
16
+ * the item is still at the revision I read". This reads the item, then applies
17
+ * the change under `test` on `/rev` (PLAN.md §9, and the reason `ado-core`
18
+ * exists at all). A teammate who wrote between the read and the write gets a
19
+ * `conflict` back rather than silently losing their edit.
20
+ *
21
+ * ## Why it is not behind `--yes`
22
+ *
23
+ * A field edit is an ordinary edit, like posting a comment — Azure DevOps keeps
24
+ * every revision, so nothing here is unrecoverable. Putting the most common verb
25
+ * on a board (moving a state when the work moves) behind a confirmation flag
26
+ * teaches people to pass `--yes` reflexively, which is how the flag stops
27
+ * meaning anything on the verbs where it matters. `--dry-run` is supported for
28
+ * when you want to look first.
29
+ */
30
+ export interface UpdateCommandOptions {
31
+ state: string | undefined;
32
+ priority: string | undefined;
33
+ assignee: string | undefined;
34
+ title: string | undefined;
35
+ /** `Name=value`, repeatable. The escape hatch for every other field. */
36
+ fields: readonly string[];
37
+ /** Pin the revision explicitly instead of reading it in this command. */
38
+ expectRev: number | undefined;
39
+ }
40
+ /**
41
+ * Named fields, and the reference names they actually are.
42
+ *
43
+ * Exported because `pharos create` reads the same map. One definition means
44
+ * `--state` cannot come to mean different things on the two verbs that both
45
+ * take it — and a session that has learned one has learned the other.
46
+ */
47
+ export declare const SHORTHAND: Record<string, string>;
48
+ export declare function runUpdate(io: Io, session: Session, positionals: readonly string[], options: UpdateCommandOptions): Promise<ExitCode>;
49
+ /** Exported for the attach command, which shares the id-parsing rule. */
50
+ export declare function workItemId(raw: string | undefined, usage: string): number;
51
+ export type { WorkItem };
52
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqC,KAAK,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAE5F,OAAO,EAAuC,KAAK,QAAQ,EAAE,KAAK,EAAE,EAAE,MAAM,cAAc,CAAC;AAC3F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,wEAAwE;IACxE,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,yEAAyE;IACzE,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAK5C,CAAC;AAEF,wBAAsB,SAAS,CAC7B,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,SAAS,MAAM,EAAE,EAC9B,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,QAAQ,CAAC,CAuEnB;AAuHD,yEAAyE;AACzE,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIzE;AAED,YAAY,EAAE,QAAQ,EAAE,CAAC"}
@@ -0,0 +1,181 @@
1
+ import { setField } from "@floh-solutions/ado-core";
2
+ import { EXIT_OK, emit, emitText, usageError } from "../output.js";
3
+ /**
4
+ * Named fields, and the reference names they actually are.
5
+ *
6
+ * Exported because `pharos create` reads the same map. One definition means
7
+ * `--state` cannot come to mean different things on the two verbs that both
8
+ * take it — and a session that has learned one has learned the other.
9
+ */
10
+ export const SHORTHAND = {
11
+ state: "System.State",
12
+ priority: "Microsoft.VSTS.Common.Priority",
13
+ assignee: "System.AssignedTo",
14
+ title: "System.Title",
15
+ };
16
+ export async function runUpdate(io, session, positionals, options) {
17
+ const raw = positionals[0];
18
+ if (raw === undefined)
19
+ throw usageError("Which work item? `pharos update <id> --state Doing`.");
20
+ if (!/^\d+$/.test(raw))
21
+ throw usageError(`"${raw}" is not a work item id.`, { given: raw });
22
+ const id = Number(raw);
23
+ const wanted = collect(options);
24
+ if (wanted.size === 0) {
25
+ throw usageError("Nothing to change. Pass --state, --priority, --assignee, --title, or --field Name=value.", { fields: Object.keys(SHORTHAND) });
26
+ }
27
+ // Read first, for two reasons: the revision the write is guarded on, and the
28
+ // before-values. A diff nobody can see is a write nobody can check.
29
+ const before = await session.client.workItems.get(id);
30
+ // AFTER the read, because a state is only valid for a TYPE. Measured live and
31
+ // it is why this moved: `--state "In Progress"` passed a flat check — the
32
+ // project really does have that state, on Test Suite — and then 400'd,
33
+ // because #225 is a Task and a Task has To Do, Doing, Done. Checking against
34
+ // the whole project is the same guess the caller was making, one layer down.
35
+ await assertStateExists(session, options.state, before);
36
+ const rev = options.expectRev ?? before.rev;
37
+ if (rev === undefined) {
38
+ throw usageError(`Work item #${id} did not report a revision, so the write cannot be guarded. Pass `
39
+ + "--expect-rev to override.");
40
+ }
41
+ const changes = [...wanted].map(([field, value]) => ({
42
+ field,
43
+ from: readable(before.fields?.[field]),
44
+ to: value,
45
+ }));
46
+ // A change already applied is not a change. Worth saying rather than writing:
47
+ // a no-op PATCH still bumps System.Rev, which invalidates every other cached
48
+ // revision against this item for no reason at all.
49
+ const moving = changes.filter((change) => change.from !== change.to);
50
+ if (moving.length === 0) {
51
+ return emitOrText(io, session, {
52
+ applied: false,
53
+ id,
54
+ rev,
55
+ unchanged: true,
56
+ changes,
57
+ message: "Already set to that. Nothing was written.",
58
+ });
59
+ }
60
+ if (session.previewOnly) {
61
+ return emitOrText(io, session, { applied: false, dryRun: true, id, rev, changes: moving });
62
+ }
63
+ const ops = moving.map((change) => setField(change.field, change.to));
64
+ const after = await session.client.workItems.updateWithRev(id, rev, ops, {
65
+ suppressNotifications: true,
66
+ });
67
+ return emitOrText(io, session, {
68
+ applied: true,
69
+ id,
70
+ rev: after.rev,
71
+ previousRev: rev,
72
+ changes: moving,
73
+ });
74
+ }
75
+ /**
76
+ * Refuse a state **this item's type** does not have, with the list attached.
77
+ *
78
+ * Two things matter and both were learned the hard way on a live board.
79
+ *
80
+ * **WHERE.** Without this the write goes out, Azure DevOps answers 400 with a
81
+ * sentence about supported values, and a session that cannot see the list
82
+ * guesses again — the single biggest retry cause in this CLI.
83
+ *
84
+ * **AGAINST WHAT.** The first version checked the state against the whole
85
+ * project and was wrong in the most convincing way available: `--state "In
86
+ * Progress"` sailed through, because that state genuinely exists — on Test
87
+ * Suite — and then 400'd, because the item was a Task. A project-wide check is
88
+ * the caller's own guess with an extra call in front of it. States belong to
89
+ * types.
90
+ *
91
+ * A failure to READ the catalogue is not a failure to update: if the types call
92
+ * 403s this says nothing and the write proceeds on its own merits. A validator
93
+ * that can block a legitimate write when it is the validator that is broken is
94
+ * worse than no validator.
95
+ */
96
+ async function assertStateExists(session, state, item) {
97
+ if (state === undefined || state === "")
98
+ return;
99
+ const type = item.fields?.["System.WorkItemType"];
100
+ if (typeof type !== "string" || type === "")
101
+ return;
102
+ let states;
103
+ try {
104
+ const catalog = await session.client.workItemTypes.states();
105
+ const forType = catalog.byType.get(type);
106
+ if (forType === undefined)
107
+ return;
108
+ states = [...forType.open, ...forType.terminal];
109
+ }
110
+ catch {
111
+ return;
112
+ }
113
+ if (states.length === 0)
114
+ return;
115
+ if (states.some((candidate) => candidate.toLowerCase() === state.toLowerCase()))
116
+ return;
117
+ throw usageError(`A ${type} has no state called "${state}". Run \`pharos types --type ${type}\` — states `
118
+ + "belong to a work item type, so a state that exists elsewhere in the project is still "
119
+ + "not one this item can take.", { given: state, type, states: [...states].sort() });
120
+ }
121
+ /** The requested changes, shorthand and `--field` merged, later wins. */
122
+ function collect(options) {
123
+ const wanted = new Map();
124
+ for (const [flag, field] of Object.entries(SHORTHAND)) {
125
+ const value = options[flag];
126
+ if (typeof value === "string" && value !== "")
127
+ wanted.set(field, value);
128
+ }
129
+ for (const pair of options.fields) {
130
+ // Split on the FIRST `=` only: a value can legitimately contain one, and a
131
+ // reference name never does.
132
+ const at = pair.indexOf("=");
133
+ if (at <= 0) {
134
+ throw usageError(`--field wants Name=value, not "${pair}".`, {
135
+ example: "--field Microsoft.VSTS.Scheduling.RemainingWork=3",
136
+ });
137
+ }
138
+ wanted.set(pair.slice(0, at).trim(), pair.slice(at + 1));
139
+ }
140
+ return wanted;
141
+ }
142
+ /**
143
+ * A field's current value as a string, for the before/after.
144
+ *
145
+ * Identities come back as objects and numbers as numbers; comparing those to a
146
+ * command-line string without flattening would report every write as a change,
147
+ * including the ones that are not.
148
+ */
149
+ function readable(value) {
150
+ if (value === undefined || value === null)
151
+ return "";
152
+ if (typeof value === "object") {
153
+ const display = value.displayName;
154
+ if (typeof display === "string")
155
+ return display;
156
+ return JSON.stringify(value);
157
+ }
158
+ return String(value);
159
+ }
160
+ function emitOrText(io, session, result) {
161
+ if (!session.pretty)
162
+ return emit(io, result);
163
+ const lines = [`#${result.id} · rev ${result.rev ?? "?"}`];
164
+ for (const change of result.changes) {
165
+ lines.push(` ${change.field}: ${change.from === "" ? "(empty)" : change.from} → ${change.to}`);
166
+ }
167
+ if (result.applied === false) {
168
+ lines.push("", typeof result["message"] === "string" ? result["message"] : "Nothing written.");
169
+ }
170
+ emitText(io, lines.join("\n"));
171
+ return EXIT_OK;
172
+ }
173
+ /** Exported for the attach command, which shares the id-parsing rule. */
174
+ export function workItemId(raw, usage) {
175
+ if (raw === undefined)
176
+ throw usageError(usage);
177
+ if (!/^\d+$/.test(raw))
178
+ throw usageError(`"${raw}" is not a work item id.`, { given: raw });
179
+ return Number(raw);
180
+ }
181
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"wiki.d.ts","sourceRoot":"","sources":["../../src/commands/wiki.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoB,KAAK,QAAQ,EAAE,KAAK,EAAE,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EAAW,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAEtD;;;;;;;;;;;;;GAaG;AAEH,wBAAsB,OAAO,CAC3B,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,SAAS,MAAM,EAAE,EAC9B,KAAK,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACtC,OAAO,CAAC,QAAQ,CAAC,CAoBnB"}
1
+ {"version":3,"file":"wiki.d.ts","sourceRoot":"","sources":["../../src/commands/wiki.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoB,KAAK,QAAQ,EAAE,KAAK,EAAE,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EAAW,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAEtD;;;;;;;;;;;;;GAaG;AAEH,wBAAsB,OAAO,CAC3B,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,SAAS,MAAM,EAAE,EAC9B,KAAK,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACtC,OAAO,CAAC,QAAQ,CAAC,CA+BnB"}