@unbrained/pm-web 2026.9.1 → 2026.9.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 2026.9.5 - 2026-09-05
4
+
5
+ ### Fixed
6
+
7
+ - The catalog completeness gate cannot fail in CI, and a package it should have caught has been missing since it was created ([pm-web-z1vm](https://github.com/unbraind/pm-web/blob/main/.agents/pm/issues/pm-web-z1vm.toon))
8
+
3
9
  ## 2026.9.1 - 2026-09-01
4
10
 
5
11
  ### Other
package/dist/index.js CHANGED
@@ -262,7 +262,7 @@ function processAlive(pid) {
262
262
  }
263
263
  export default defineExtension({
264
264
  name: "pm-web",
265
- version: "2026.9.1",
265
+ version: "2026.9.5",
266
266
  activate(api) {
267
267
  // -----------------------------------------------------------------------
268
268
  // Command: pm web [--port <port>] [--detach]
@@ -0,0 +1,115 @@
1
+ /**
2
+ * The fleet's own account of which pm extensions exist, and how the catalog
3
+ * completeness gate reads it in an environment without the sibling packages.
4
+ *
5
+ * pm-web must offer every pm package that exists, so the catalog needs a gate
6
+ * asserting the converse of "every catalog entry is real": that every real
7
+ * extension is catalogued. The authoritative answer lives in the sibling
8
+ * package directories, and a standalone CI checkout of pm-web has none of them.
9
+ * A gate that reads them directly therefore skips itself precisely where it
10
+ * guards the merge.
11
+ *
12
+ * The resolution is a committed snapshot, generated from the live fleet and
13
+ * read by the gate. The snapshot is an input, never the source of truth: a
14
+ * companion assertion re-derives it from the siblings wherever they resolve, so
15
+ * a snapshot that stopped matching the fleet fails loudly instead of quietly
16
+ * narrowing what CI checks.
17
+ */
18
+ /** Repository-relative location of the committed fleet snapshot. */
19
+ export declare const FLEET_SNAPSHOT_PATH = "test/fleet-extensions.snapshot.json";
20
+ /**
21
+ * A directory the derivation could not read as it expected.
22
+ *
23
+ * Returned rather than swallowed. A silent skip is the failure mode this whole
24
+ * mechanism exists to remove: an extension omitted because its manifest failed
25
+ * to parse looks exactly like an extension that is not there, and because the
26
+ * generator and the freshness assertion run the *same* derivation, both would
27
+ * agree on the same wrong answer and neither would report it.
28
+ */
29
+ export interface FleetProblem {
30
+ /** Directory the problem was found in. */
31
+ name: string;
32
+ /** What could not be read, in terms a reader can act on. */
33
+ reason: string;
34
+ }
35
+ /**
36
+ * What the fleet directories alone can say about one extension.
37
+ *
38
+ * Split from {@link FleetExtension} deliberately: every field here is derivable
39
+ * offline from files on disk, which is what the freshness assertion can
40
+ * re-derive and compare. Registry state cannot be, so it lives only on the
41
+ * snapshot type.
42
+ */
43
+ export interface LocalFleetExtension {
44
+ /** Directory and package name, e.g. `pm-ado`. */
45
+ name: string;
46
+ /** The manifest's description, which a product extension's catalog entry mirrors exactly. */
47
+ description: string;
48
+ /**
49
+ * The package.json description.
50
+ *
51
+ * An authoring template's catalog entry mirrors this rather than the manifest
52
+ * description: the manifest carries a longer, capability-enumerating blurb
53
+ * that is too verbose for a one-line catalog card, while package.json holds
54
+ * the concise summary. Both are captured so the gate can apply the same rule
55
+ * the live-fleet assertion does without knowing anything about categories.
56
+ */
57
+ packageDescription: string;
58
+ /** Capability names the manifest declares, sorted for a stable comparison. */
59
+ capabilities: string[];
60
+ /**
61
+ * Whether the package declares `publishConfig`.
62
+ *
63
+ * A local, offline signal of *intent* to publish. It is deliberately not the
64
+ * thing the catalog's `availability` is checked against, because it answers
65
+ * the wrong question: a package can declare `publishConfig` and be absent
66
+ * from npm, which is exactly how this fleet came to have a catalog entry
67
+ * promising an install for a package the registry answers 404 for.
68
+ */
69
+ publishable: boolean;
70
+ }
71
+ /** One fleet extension as the committed snapshot records it. */
72
+ export interface FleetExtension extends LocalFleetExtension {
73
+ /**
74
+ * Whether the npm registry actually serves this package.
75
+ *
76
+ * Recorded at generation time, when the network is available and regenerating
77
+ * the snapshot is a deliberate act, so the offline gate can assert against a
78
+ * fact rather than a proxy. Generation refuses to write when the registry
79
+ * could not be reached, so this is never a guess: an unreachable registry
80
+ * would otherwise relabel every package as unpublished the moment a runner
81
+ * lost the network.
82
+ */
83
+ npmPublished: boolean;
84
+ }
85
+ /** The filesystem calls {@link readFleetExtensions} needs, injected so the
86
+ * derivation can be exercised against a synthetic tree. */
87
+ export interface FleetFs {
88
+ existsSync: (p: string) => boolean;
89
+ readdirSync: (p: string, options: {
90
+ withFileTypes: true;
91
+ }) => {
92
+ name: string;
93
+ isDirectory: () => boolean;
94
+ }[];
95
+ readFileSync: (p: string, encoding: "utf8") => string;
96
+ }
97
+ /**
98
+ * Derive every pm extension present under `fleetRoot`.
99
+ *
100
+ * A directory is a pm extension exactly when it ships a `manifest.json`
101
+ * declaring a non-empty `capabilities` array. That rule is the definition
102
+ * rather than a heuristic: it is what makes a package installable into pm at
103
+ * all, so deriving membership from it cannot drift from reality the way a
104
+ * second hardcoded list would.
105
+ *
106
+ * @param fleetRoot - Directory holding the sibling package directories.
107
+ * @param fs - Filesystem accessors to read the tree with.
108
+ * @returns Every extension found, sorted by name; empty when the fleet root
109
+ * holds none, which callers must treat as "not resolvable here"
110
+ * rather than as "the fleet is empty".
111
+ */
112
+ export declare function readFleetExtensions(fleetRoot: string, fs: FleetFs): {
113
+ extensions: LocalFleetExtension[];
114
+ problems: FleetProblem[];
115
+ };
@@ -0,0 +1,99 @@
1
+ /**
2
+ * The fleet's own account of which pm extensions exist, and how the catalog
3
+ * completeness gate reads it in an environment without the sibling packages.
4
+ *
5
+ * pm-web must offer every pm package that exists, so the catalog needs a gate
6
+ * asserting the converse of "every catalog entry is real": that every real
7
+ * extension is catalogued. The authoritative answer lives in the sibling
8
+ * package directories, and a standalone CI checkout of pm-web has none of them.
9
+ * A gate that reads them directly therefore skips itself precisely where it
10
+ * guards the merge.
11
+ *
12
+ * The resolution is a committed snapshot, generated from the live fleet and
13
+ * read by the gate. The snapshot is an input, never the source of truth: a
14
+ * companion assertion re-derives it from the siblings wherever they resolve, so
15
+ * a snapshot that stopped matching the fleet fails loudly instead of quietly
16
+ * narrowing what CI checks.
17
+ */
18
+ /** Repository-relative location of the committed fleet snapshot. */
19
+ export const FLEET_SNAPSHOT_PATH = "test/fleet-extensions.snapshot.json";
20
+ /**
21
+ * Directories under the fleet root that are not extensions of the CLI.
22
+ *
23
+ * `pm-web` is the host and cannot install itself; `pm-cli` is the CLI rather
24
+ * than an extension of it.
25
+ */
26
+ const CATALOG_HOSTS = new Set(["pm-web", "pm-cli"]);
27
+ /**
28
+ * Derive every pm extension present under `fleetRoot`.
29
+ *
30
+ * A directory is a pm extension exactly when it ships a `manifest.json`
31
+ * declaring a non-empty `capabilities` array. That rule is the definition
32
+ * rather than a heuristic: it is what makes a package installable into pm at
33
+ * all, so deriving membership from it cannot drift from reality the way a
34
+ * second hardcoded list would.
35
+ *
36
+ * @param fleetRoot - Directory holding the sibling package directories.
37
+ * @param fs - Filesystem accessors to read the tree with.
38
+ * @returns Every extension found, sorted by name; empty when the fleet root
39
+ * holds none, which callers must treat as "not resolvable here"
40
+ * rather than as "the fleet is empty".
41
+ */
42
+ export function readFleetExtensions(fleetRoot, fs) {
43
+ if (!fs.existsSync(fleetRoot))
44
+ return { extensions: [], problems: [] };
45
+ const found = [];
46
+ const problems = [];
47
+ for (const entry of fs.readdirSync(fleetRoot, { withFileTypes: true })) {
48
+ if (!entry.isDirectory() || !entry.name.startsWith("pm-") || CATALOG_HOSTS.has(entry.name))
49
+ continue;
50
+ const manifestPath = `${fleetRoot}/${entry.name}/manifest.json`;
51
+ if (!fs.existsSync(manifestPath))
52
+ continue;
53
+ let manifest;
54
+ try {
55
+ manifest = JSON.parse(fs.readFileSync(manifestPath, "utf8"));
56
+ }
57
+ catch {
58
+ // A manifest that exists and does not parse is a defect in that package,
59
+ // not evidence that it is not an extension. Reporting it is the whole
60
+ // point: skipping silently is indistinguishable from absence.
61
+ problems.push({ name: entry.name, reason: "manifest.json exists but is not valid JSON" });
62
+ continue;
63
+ }
64
+ const capabilities = manifest.capabilities;
65
+ if (!Array.isArray(capabilities)) {
66
+ problems.push({ name: entry.name, reason: "manifest.json declares no capabilities array" });
67
+ continue;
68
+ }
69
+ if (capabilities.length === 0)
70
+ continue;
71
+ let publishable = false;
72
+ let packageDescription = "";
73
+ const packageJsonPath = `${fleetRoot}/${entry.name}/package.json`;
74
+ if (fs.existsSync(packageJsonPath)) {
75
+ try {
76
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
77
+ publishable = packageJson.publishConfig !== undefined;
78
+ packageDescription =
79
+ typeof packageJson.description === "string" ? packageJson.description : "";
80
+ }
81
+ catch {
82
+ publishable = false;
83
+ problems.push({ name: entry.name, reason: "package.json exists but is not valid JSON" });
84
+ }
85
+ }
86
+ found.push({
87
+ name: entry.name,
88
+ description: typeof manifest.description === "string" ? manifest.description : "",
89
+ packageDescription,
90
+ capabilities: [...capabilities].map(String).sort(),
91
+ publishable,
92
+ });
93
+ }
94
+ return {
95
+ extensions: found.sort((a, b) => a.name.localeCompare(b.name)),
96
+ problems: problems.sort((a, b) => a.name.localeCompare(b.name)),
97
+ };
98
+ }
99
+ //# sourceMappingURL=fleet-snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fleet-snapshot.js","sourceRoot":"","sources":["../../src/services/fleet-snapshot.ts"],"names":[],"mappings":"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"}
@@ -47,6 +47,25 @@ export const PACKAGE_CATALOG = [
47
47
  category: "extension",
48
48
  requiresService: { name: "Neo4j", optional: true },
49
49
  },
50
+ {
51
+ name: "pm-ado",
52
+ npmSpec: "npm:pm-ado",
53
+ title: "Azure DevOps",
54
+ description: "Azure DevOps work-item sync for pm-cli. Every remote write carries a System.Rev assertion in its JSON Patch document, so a concurrent edit is rejected atomically instead of silently overwritten - the compare-and-swap that lets many agents sync one project at once. Maps work item revisions onto pm item history, typed work item relations onto pm parent and dependency kinds, and batches reads through the work item batch endpoint.",
55
+ capabilities: ["commands", "schema", "importers", "hooks", "preflight"],
56
+ category: "extension",
57
+ // Release-gated behind vars.PM_RELEASE_APPROVED and absent from npm, so no
58
+ // install spec resolves. Listed rather than hidden: a user reading the fleet
59
+ // on GitHub can plainly see this package, and omitting it would make the
60
+ // catalogue look complete while the UI never mentioned it.
61
+ availability: "unreleased",
62
+ requiresCredentials: [
63
+ {
64
+ label: "Azure DevOps credentials (organization URL, project, and a personal access token)",
65
+ envVars: ["ADO_ORG_URL", "ADO_PROJECT", "ADO_TOKEN"],
66
+ },
67
+ ],
68
+ },
50
69
  {
51
70
  name: "pm-beads",
52
71
  npmSpec: "npm:pm-beads",
@@ -1 +1 @@
1
- {"version":3,"file":"package-catalog.js","sourceRoot":"","sources":["../../src/services/package-catalog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"package-catalog.js","sourceRoot":"","sources":["../../src/services/package-catalog.ts"],"names":[],"mappings":"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"}
package/manifest.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pm-web",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.5",
4
4
  "description": "Full web UI for pm-cli — browse, create, update, search and manage pm projects in the browser. Self-hosted via Docker or Node.js.",
5
5
  "author": "@unbraind",
6
6
  "entry": "./dist/index.js",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-web",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.5",
4
4
  "description": "Full web UI for pm-cli — browse, create, update, search and manage pm projects in the browser. Self-hosted via Docker or Node.js.",
5
5
  "type": "module",
6
6
  "files": [
@@ -25,6 +25,7 @@
25
25
  "docstring": "node scripts/docstring-gate.ts",
26
26
  "audit:prod": "node --input-type=module -e \"import { spawnSync } from 'node:child_process'; import { devNull } from 'node:os'; const env = { ...process.env, npm_config_userconfig: devNull, NPM_CONFIG_USERCONFIG: devNull }; for (const key of Object.keys(env)) if (key.toLowerCase() === 'npm_config_allow_scripts') delete env[key]; const win = process.platform === 'win32'; const r = spawnSync(win ? 'npm.cmd' : 'npm', ['audit', '--omit=dev', '--ignore-scripts'], { stdio: 'inherit', env, shell: win }); process.exit(r.status ?? 1);\"",
27
27
  "accept:packed": "node scripts/accept-packed.ts",
28
+ "fleet:snapshot": "node scripts/generate-fleet-snapshot.ts",
28
29
  "pack:dry-run": "npm pack --dry-run",
29
30
  "changelog": "pm-changelog --pm-root .agents/pm --pm-arg=--output-budget --pm-arg=unbounded --pm-arg=--output-limit --pm-arg=unbounded --mode prepend --output CHANGELOG.md --release-version-from-package --date-from-version --since-previous-tag --until-release-tag --item-url-base https://github.com/unbraind/pm-web/blob/main/.agents/pm --respect-item-release --pm-bin ./node_modules/.bin/pm",
30
31
  "changelog:full": "pm-changelog --pm-root .agents/pm --pm-arg=--output-budget --pm-arg=unbounded --pm-arg=--output-limit --pm-arg=unbounded --mode replace --output CHANGELOG.md --all-release-tags --release-version-from-package --date-from-version --item-url-base https://github.com/unbraind/pm-web/blob/main/.agents/pm --respect-item-release --pm-bin ./node_modules/.bin/pm",