@orkestrel/scaffold 0.0.63 → 0.0.65

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 (57) hide show
  1. package/README.md +29 -104
  2. package/dist/bin/main.js +95 -27
  3. package/dist/bin/main.js.map +1 -1
  4. package/dist/host/AGENTS.md +2 -2
  5. package/dist/host/CLAUDE.md +6 -0
  6. package/dist/host/agents/orchestration.md +23 -15
  7. package/dist/host/agents/skills/enterprise-bootstrap/SKILL.md +184 -177
  8. package/dist/host/agents/skills/enterprise-bootstrap/references/bootstrap-reference.md +314 -91
  9. package/dist/host/agents/skills/enterprise-bootstrap/references/color-modes.md +241 -0
  10. package/dist/host/agents/skills/enterprise-bootstrap/references/components.md +83 -36
  11. package/dist/host/agents/skills/enterprise-bootstrap/references/frontend-design.md +297 -98
  12. package/dist/host/agents/skills/enterprise-bootstrap/references/inputs.md +25 -14
  13. package/dist/host/agents/skills/enterprise-bootstrap/references/inspection.md +216 -128
  14. package/dist/host/agents/skills/enterprise-bootstrap/references/responsive-layout.md +187 -0
  15. package/dist/host/agents/skills/enterprise-bootstrap/references/utilities.md +109 -20
  16. package/dist/host/agents/skills/orkestrel-debrief/references/field-testing.md +5 -5
  17. package/dist/host/agents/skills/orkestrel-falsify/references/reconcile.md +1 -1
  18. package/dist/host/agents/skills/orkestrel-publish/SKILL.md +15 -15
  19. package/dist/host/agents/skills/orkestrel-publish/references/wave.md +43 -17
  20. package/dist/host/agents/skills/orkestrel-publish/references/window.md +41 -16
  21. package/dist/host/claude/agents/orkestrel.md +56 -56
  22. package/dist/host/claude/agents/reviewer.md +13 -0
  23. package/dist/host/claude/rules/architecture.md +51 -45
  24. package/dist/host/claude/rules/documentation.md +18 -1
  25. package/dist/host/claude/rules/portability.md +2 -0
  26. package/dist/host/claude/rules/quality.md +1 -1
  27. package/dist/host/claude/rules/tests.md +12 -11
  28. package/dist/host/claude/rules/typescript.md +5 -0
  29. package/dist/host/claude/rules/workspace.md +25 -20
  30. package/dist/host/claude/rules/writing.md +4 -0
  31. package/dist/host/claude/settings.json +1 -1
  32. package/dist/host/claude/skills/enterprise-bootstrap/SKILL.md +10 -9
  33. package/dist/host/codex/agents/orkestrel.toml +3 -3
  34. package/dist/host/codex/agents/reviewer.toml +4 -2
  35. package/dist/host/configs/helpers.ts +311 -2
  36. package/dist/host/configs/policy.ts +1100 -51
  37. package/dist/host/dotfiles/oxlintrc.json +72 -1
  38. package/dist/host/guides/guide.md +749 -222
  39. package/dist/host/guides/scaffold.md +529 -394
  40. package/dist/host/manifest.json +53 -40
  41. package/dist/host/scripts/ollama.sh +322 -13
  42. package/dist/host/tests/config.test.ts +1200 -16
  43. package/dist/host/tests/policy.test.ts +157 -173
  44. package/dist/host/tests/setupPolicy.ts +522 -1007
  45. package/dist/src/core/index.cjs +402 -287
  46. package/dist/src/core/index.cjs.map +1 -1
  47. package/dist/src/core/index.d.cts +160 -128
  48. package/dist/src/core/index.d.ts +160 -128
  49. package/dist/src/core/index.js +400 -286
  50. package/dist/src/core/index.js.map +1 -1
  51. package/dist/src/server/index.cjs +28 -21
  52. package/dist/src/server/index.cjs.map +1 -1
  53. package/dist/src/server/index.d.cts +38 -33
  54. package/dist/src/server/index.d.ts +38 -33
  55. package/dist/src/server/index.js +28 -21
  56. package/dist/src/server/index.js.map +1 -1
  57. package/package.json +18 -19
@@ -1,18 +1,18 @@
1
- import { Audit } from '@orkestrel/scaffold';
2
- import { CatalogEntry } from '@orkestrel/scaffold';
3
- import { Dependency } from '@orkestrel/scaffold';
4
- import { EmitterErrorHandler } from '@orkestrel/emitter';
5
- import { EmitterHooks } from '@orkestrel/emitter';
6
- import { EmitterInterface } from '@orkestrel/emitter';
7
- import { Group } from '@orkestrel/scaffold';
8
- import { Guard } from '@orkestrel/contract';
9
- import { HostFile } from '@orkestrel/scaffold';
10
- import { Lookup } from '@orkestrel/scaffold';
11
- import { ManifestRegionSet } from '@orkestrel/scaffold';
12
- import { Mirror } from '@orkestrel/scaffold';
13
- import { Plan } from '@orkestrel/scaffold';
14
- import { Release } from '@orkestrel/scaffold';
15
- import { Snapshot } from '@orkestrel/scaffold';
1
+ import type { Audit } from '@orkestrel/scaffold';
2
+ import type { CatalogEntry } from '@orkestrel/scaffold';
3
+ import type { Dependency } from '@orkestrel/scaffold';
4
+ import type { EmitterErrorHandler } from '@orkestrel/emitter';
5
+ import type { EmitterHooks } from '@orkestrel/emitter';
6
+ import type { EmitterInterface } from '@orkestrel/emitter';
7
+ import type { Group } from '@orkestrel/scaffold';
8
+ import type { Guard } from '@orkestrel/contract';
9
+ import type { HostFile } from '@orkestrel/scaffold';
10
+ import type { Lookup } from '@orkestrel/scaffold';
11
+ import type { ManifestRegionSet } from '@orkestrel/scaffold';
12
+ import type { Mirror } from '@orkestrel/scaffold';
13
+ import type { Plan } from '@orkestrel/scaffold';
14
+ import type { Release } from '@orkestrel/scaffold';
15
+ import type { Snapshot } from '@orkestrel/scaffold';
16
16
 
17
17
  /**
18
18
  * Matches the Git branch syntax the repository endpoint accepts.
@@ -1052,7 +1052,9 @@ export declare function matchesSensitivePath(path: string): boolean;
1052
1052
  * declare const plan: Plan
1053
1053
  *
1054
1054
  * const materializer = new Materializer({ host: './dist/host' })
1055
- * materializer.materialize(plan, './packages/router')
1055
+ * const result = materializer.materialize(plan, './packages/router')
1056
+ *
1057
+ * result.written // every path created
1056
1058
  * materializer.destroy()
1057
1059
  * ```
1058
1060
  */
@@ -1093,8 +1095,7 @@ export declare class Materializer implements MaterializerInterface {
1093
1095
  *
1094
1096
  * @param plan - The compiled plan to compare.
1095
1097
  * @param target - The directory to inspect.
1096
- * @returns One finding per hydrated planned path, plus the foreign files
1097
- * beneath owned host roots and inside the instruction canon.
1098
+ * @returns Findings for hydrated planned paths and selected foreign candidates.
1098
1099
  * @throws {@link ScaffoldError} coded `INVALID` when an argument is not the
1099
1100
  * exact shape, `TARGET` when the host or target cannot be read within its
1100
1101
  * bounds, and `DESTROYED` after teardown.
@@ -1102,10 +1103,10 @@ export declare class Materializer implements MaterializerInterface {
1102
1103
  * @remarks
1103
1104
  * Host directories expand before the target is read, so this method and
1104
1105
  * {@link repair} compare the same paths with the same ownership. Foreign
1105
- * candidates are files beneath those expanded roots and files the target holds
1106
- * at a `CANON_PATHS` member, each in a group the plan selects; a file outside
1107
- * both populations never becomes a deletion candidate merely because its group
1108
- * is selected.
1106
+ * candidates are files beneath those expanded roots and files the target holds at
1107
+ * a `CANON_PATHS` member. A
1108
+ * file outside these populations never becomes a deletion candidate merely
1109
+ * because its group is selected.
1109
1110
  *
1110
1111
  * The canon is staged for reading rather than for a target, so a copy of one of
1111
1112
  * its paths sitting in a target is a superseded artifact and reports foreign. A
@@ -1238,13 +1239,12 @@ export declare class Materializer implements MaterializerInterface {
1238
1239
  * recovery mechanism, so a path it cannot restore is not one this verb takes.
1239
1240
  * A tree carrying uncommitted work is refused whole for the same reason.
1240
1241
  *
1241
- * One candidate list carries both foreign populations {@link audit} reports, so
1242
- * a superseded instruction copy the target holds inside the canon is deleted in
1243
- * the same transaction as a stray beneath an owned root. Membership decides it,
1244
- * never byte identity: a copy a release behind no longer matches the bytes the
1245
- * canon now stages, and matching bytes is exactly how such a copy would be
1246
- * spared. An untracked leftover is left where it sits and stays a finding, which
1247
- * is the seam a maintainer keeps a git-ignored file in.
1242
+ * The candidate list carries every foreign population {@link audit} reports. A
1243
+ * superseded instruction copy inside the canon and a stray beneath an owned root
1244
+ * therefore follow the same transaction rules.
1245
+ * Membership decides it, never byte identity. An untracked leftover stays in
1246
+ * place and remains a finding, which is the seam a maintainer uses to keep a
1247
+ * git-ignored file.
1248
1248
  *
1249
1249
  * The whole call refuses when the preview disagrees with the re-derivation on
1250
1250
  * any foreign finding, including one the deletion itself would skip, because a
@@ -1312,7 +1312,11 @@ export declare class Materializer implements MaterializerInterface {
1312
1312
  *
1313
1313
  * @param plan - The compiled plan to compare.
1314
1314
  * @param target - The directory to inspect.
1315
- * @returns One finding per hydrated planned path, plus foreign files beneath owned host roots.
1315
+ * @returns Findings for hydrated planned paths and selected foreign candidates.
1316
+ *
1317
+ * @remarks
1318
+ * Foreign candidates are files beneath expanded host roots and files held at a
1319
+ * selected instruction-canon path.
1316
1320
  */
1317
1321
  audit(plan: Plan, target: string): Audit;
1318
1322
  /**
@@ -1391,7 +1395,6 @@ export declare class Materializer implements MaterializerInterface {
1391
1395
  * unlinked, so a failure part way through restores what it already took.
1392
1396
  * The package's own source and application trees are never candidates,
1393
1397
  * whatever the audit reports.
1394
- *
1395
1398
  * The whole audit is guarded before any of it is read, so an audit produced by
1396
1399
  * an earlier version of this package is refused at runtime rather than only at
1397
1400
  * compile time. Only foreign findings are candidates and those never carried
@@ -1987,11 +1990,11 @@ export declare class Materializer implements MaterializerInterface {
1987
1990
  * such a path is skipped. A path either list names itself is curated data
1988
1991
  * rather than discovery, so it is staged or the stage is refused.
1989
1992
  *
1990
- * @example
1993
+ * @example Vendored data root
1991
1994
  * ```ts
1992
1995
  * import { stageHost } from '@orkestrel/scaffold/server'
1993
1996
  *
1994
- * stageHost(process.cwd(), 'dist/host').length // the files staged
1997
+ * stageHost(process.cwd(), 'dist/host') // one ManifestEntry per file staged
1995
1998
  * ```
1996
1999
  */
1997
2000
  export declare function stageHost(checkout: string, host: string): readonly ManifestEntry[];
@@ -2079,6 +2082,8 @@ export declare class Materializer implements MaterializerInterface {
2079
2082
  *
2080
2083
  * const upstream = new Upstream({ registry: { timeout: 5_000 } })
2081
2084
  * const releases = await upstream.lookup([{ name: '@orkestrel/emitter', range: '^0.0.5' }])
2085
+ *
2086
+ * releases.filter((release) => release.lookup === 'found')
2082
2087
  * upstream.destroy()
2083
2088
  * ```
2084
2089
  */
@@ -1,18 +1,18 @@
1
- import { Audit } from '@orkestrel/scaffold';
2
- import { CatalogEntry } from '@orkestrel/scaffold';
3
- import { Dependency } from '@orkestrel/scaffold';
4
- import { EmitterErrorHandler } from '@orkestrel/emitter';
5
- import { EmitterHooks } from '@orkestrel/emitter';
6
- import { EmitterInterface } from '@orkestrel/emitter';
7
- import { Group } from '@orkestrel/scaffold';
8
- import { Guard } from '@orkestrel/contract';
9
- import { HostFile } from '@orkestrel/scaffold';
10
- import { Lookup } from '@orkestrel/scaffold';
11
- import { ManifestRegionSet } from '@orkestrel/scaffold';
12
- import { Mirror } from '@orkestrel/scaffold';
13
- import { Plan } from '@orkestrel/scaffold';
14
- import { Release } from '@orkestrel/scaffold';
15
- import { Snapshot } from '@orkestrel/scaffold';
1
+ import type { Audit } from '@orkestrel/scaffold';
2
+ import type { CatalogEntry } from '@orkestrel/scaffold';
3
+ import type { Dependency } from '@orkestrel/scaffold';
4
+ import type { EmitterErrorHandler } from '@orkestrel/emitter';
5
+ import type { EmitterHooks } from '@orkestrel/emitter';
6
+ import type { EmitterInterface } from '@orkestrel/emitter';
7
+ import type { Group } from '@orkestrel/scaffold';
8
+ import type { Guard } from '@orkestrel/contract';
9
+ import type { HostFile } from '@orkestrel/scaffold';
10
+ import type { Lookup } from '@orkestrel/scaffold';
11
+ import type { ManifestRegionSet } from '@orkestrel/scaffold';
12
+ import type { Mirror } from '@orkestrel/scaffold';
13
+ import type { Plan } from '@orkestrel/scaffold';
14
+ import type { Release } from '@orkestrel/scaffold';
15
+ import type { Snapshot } from '@orkestrel/scaffold';
16
16
 
17
17
  /**
18
18
  * Matches the Git branch syntax the repository endpoint accepts.
@@ -1052,7 +1052,9 @@ export declare function matchesSensitivePath(path: string): boolean;
1052
1052
  * declare const plan: Plan
1053
1053
  *
1054
1054
  * const materializer = new Materializer({ host: './dist/host' })
1055
- * materializer.materialize(plan, './packages/router')
1055
+ * const result = materializer.materialize(plan, './packages/router')
1056
+ *
1057
+ * result.written // every path created
1056
1058
  * materializer.destroy()
1057
1059
  * ```
1058
1060
  */
@@ -1093,8 +1095,7 @@ export declare class Materializer implements MaterializerInterface {
1093
1095
  *
1094
1096
  * @param plan - The compiled plan to compare.
1095
1097
  * @param target - The directory to inspect.
1096
- * @returns One finding per hydrated planned path, plus the foreign files
1097
- * beneath owned host roots and inside the instruction canon.
1098
+ * @returns Findings for hydrated planned paths and selected foreign candidates.
1098
1099
  * @throws {@link ScaffoldError} coded `INVALID` when an argument is not the
1099
1100
  * exact shape, `TARGET` when the host or target cannot be read within its
1100
1101
  * bounds, and `DESTROYED` after teardown.
@@ -1102,10 +1103,10 @@ export declare class Materializer implements MaterializerInterface {
1102
1103
  * @remarks
1103
1104
  * Host directories expand before the target is read, so this method and
1104
1105
  * {@link repair} compare the same paths with the same ownership. Foreign
1105
- * candidates are files beneath those expanded roots and files the target holds
1106
- * at a `CANON_PATHS` member, each in a group the plan selects; a file outside
1107
- * both populations never becomes a deletion candidate merely because its group
1108
- * is selected.
1106
+ * candidates are files beneath those expanded roots and files the target holds at
1107
+ * a `CANON_PATHS` member. A
1108
+ * file outside these populations never becomes a deletion candidate merely
1109
+ * because its group is selected.
1109
1110
  *
1110
1111
  * The canon is staged for reading rather than for a target, so a copy of one of
1111
1112
  * its paths sitting in a target is a superseded artifact and reports foreign. A
@@ -1238,13 +1239,12 @@ export declare class Materializer implements MaterializerInterface {
1238
1239
  * recovery mechanism, so a path it cannot restore is not one this verb takes.
1239
1240
  * A tree carrying uncommitted work is refused whole for the same reason.
1240
1241
  *
1241
- * One candidate list carries both foreign populations {@link audit} reports, so
1242
- * a superseded instruction copy the target holds inside the canon is deleted in
1243
- * the same transaction as a stray beneath an owned root. Membership decides it,
1244
- * never byte identity: a copy a release behind no longer matches the bytes the
1245
- * canon now stages, and matching bytes is exactly how such a copy would be
1246
- * spared. An untracked leftover is left where it sits and stays a finding, which
1247
- * is the seam a maintainer keeps a git-ignored file in.
1242
+ * The candidate list carries every foreign population {@link audit} reports. A
1243
+ * superseded instruction copy inside the canon and a stray beneath an owned root
1244
+ * therefore follow the same transaction rules.
1245
+ * Membership decides it, never byte identity. An untracked leftover stays in
1246
+ * place and remains a finding, which is the seam a maintainer uses to keep a
1247
+ * git-ignored file.
1248
1248
  *
1249
1249
  * The whole call refuses when the preview disagrees with the re-derivation on
1250
1250
  * any foreign finding, including one the deletion itself would skip, because a
@@ -1312,7 +1312,11 @@ export declare class Materializer implements MaterializerInterface {
1312
1312
  *
1313
1313
  * @param plan - The compiled plan to compare.
1314
1314
  * @param target - The directory to inspect.
1315
- * @returns One finding per hydrated planned path, plus foreign files beneath owned host roots.
1315
+ * @returns Findings for hydrated planned paths and selected foreign candidates.
1316
+ *
1317
+ * @remarks
1318
+ * Foreign candidates are files beneath expanded host roots and files held at a
1319
+ * selected instruction-canon path.
1316
1320
  */
1317
1321
  audit(plan: Plan, target: string): Audit;
1318
1322
  /**
@@ -1391,7 +1395,6 @@ export declare class Materializer implements MaterializerInterface {
1391
1395
  * unlinked, so a failure part way through restores what it already took.
1392
1396
  * The package's own source and application trees are never candidates,
1393
1397
  * whatever the audit reports.
1394
- *
1395
1398
  * The whole audit is guarded before any of it is read, so an audit produced by
1396
1399
  * an earlier version of this package is refused at runtime rather than only at
1397
1400
  * compile time. Only foreign findings are candidates and those never carried
@@ -1987,11 +1990,11 @@ export declare class Materializer implements MaterializerInterface {
1987
1990
  * such a path is skipped. A path either list names itself is curated data
1988
1991
  * rather than discovery, so it is staged or the stage is refused.
1989
1992
  *
1990
- * @example
1993
+ * @example Vendored data root
1991
1994
  * ```ts
1992
1995
  * import { stageHost } from '@orkestrel/scaffold/server'
1993
1996
  *
1994
- * stageHost(process.cwd(), 'dist/host').length // the files staged
1997
+ * stageHost(process.cwd(), 'dist/host') // one ManifestEntry per file staged
1995
1998
  * ```
1996
1999
  */
1997
2000
  export declare function stageHost(checkout: string, host: string): readonly ManifestEntry[];
@@ -2079,6 +2082,8 @@ export declare class Materializer implements MaterializerInterface {
2079
2082
  *
2080
2083
  * const upstream = new Upstream({ registry: { timeout: 5_000 } })
2081
2084
  * const releases = await upstream.lookup([{ name: '@orkestrel/emitter', range: '^0.0.5' }])
2085
+ *
2086
+ * releases.filter((release) => release.lookup === 'found')
2082
2087
  * upstream.destroy()
2083
2088
  * ```
2084
2089
  */
@@ -1834,11 +1834,11 @@ function stageBytes(host, root, destinations) {
1834
1834
  * such a path is skipped. A path either list names itself is curated data
1835
1835
  * rather than discovery, so it is staged or the stage is refused.
1836
1836
  *
1837
- * @example
1837
+ * @example Vendored data root
1838
1838
  * ```ts
1839
1839
  * import { stageHost } from '@orkestrel/scaffold/server'
1840
1840
  *
1841
- * stageHost(process.cwd(), 'dist/host').length // the files staged
1841
+ * stageHost(process.cwd(), 'dist/host') // one ManifestEntry per file staged
1842
1842
  * ```
1843
1843
  */
1844
1844
  function stageHost(checkout, host) {
@@ -2727,7 +2727,9 @@ var WriteTransaction = class {
2727
2727
  * declare const plan: Plan
2728
2728
  *
2729
2729
  * const materializer = new Materializer({ host: './dist/host' })
2730
- * materializer.materialize(plan, './packages/router')
2730
+ * const result = materializer.materialize(plan, './packages/router')
2731
+ *
2732
+ * result.written // every path created
2731
2733
  * materializer.destroy()
2732
2734
  * ```
2733
2735
  */
@@ -2802,8 +2804,7 @@ var Materializer = class {
2802
2804
  *
2803
2805
  * @param plan - The compiled plan to compare.
2804
2806
  * @param target - The directory to inspect.
2805
- * @returns One finding per hydrated planned path, plus the foreign files
2806
- * beneath owned host roots and inside the instruction canon.
2807
+ * @returns Findings for hydrated planned paths and selected foreign candidates.
2807
2808
  * @throws {@link ScaffoldError} coded `INVALID` when an argument is not the
2808
2809
  * exact shape, `TARGET` when the host or target cannot be read within its
2809
2810
  * bounds, and `DESTROYED` after teardown.
@@ -2811,10 +2812,10 @@ var Materializer = class {
2811
2812
  * @remarks
2812
2813
  * Host directories expand before the target is read, so this method and
2813
2814
  * {@link repair} compare the same paths with the same ownership. Foreign
2814
- * candidates are files beneath those expanded roots and files the target holds
2815
- * at a `CANON_PATHS` member, each in a group the plan selects; a file outside
2816
- * both populations never becomes a deletion candidate merely because its group
2817
- * is selected.
2815
+ * candidates are files beneath those expanded roots and files the target holds at
2816
+ * a `CANON_PATHS` member. A
2817
+ * file outside these populations never becomes a deletion candidate merely
2818
+ * because its group is selected.
2818
2819
  *
2819
2820
  * The canon is staged for reading rather than for a target, so a copy of one of
2820
2821
  * its paths sitting in a target is a superseded artifact and reports foreign. A
@@ -3019,13 +3020,12 @@ var Materializer = class {
3019
3020
  * recovery mechanism, so a path it cannot restore is not one this verb takes.
3020
3021
  * A tree carrying uncommitted work is refused whole for the same reason.
3021
3022
  *
3022
- * One candidate list carries both foreign populations {@link audit} reports, so
3023
- * a superseded instruction copy the target holds inside the canon is deleted in
3024
- * the same transaction as a stray beneath an owned root. Membership decides it,
3025
- * never byte identity: a copy a release behind no longer matches the bytes the
3026
- * canon now stages, and matching bytes is exactly how such a copy would be
3027
- * spared. An untracked leftover is left where it sits and stays a finding, which
3028
- * is the seam a maintainer keeps a git-ignored file in.
3023
+ * The candidate list carries every foreign population {@link audit} reports. A
3024
+ * superseded instruction copy inside the canon and a stray beneath an owned root
3025
+ * therefore follow the same transaction rules.
3026
+ * Membership decides it, never byte identity. An untracked leftover stays in
3027
+ * place and remains a finding, which is the seam a maintainer uses to keep a
3028
+ * git-ignored file.
3029
3029
  *
3030
3030
  * The whole call refuses when the preview disagrees with the re-derivation on
3031
3031
  * any foreign finding, including one the deletion itself would skip, because a
@@ -3497,22 +3497,26 @@ var Materializer = class {
3497
3497
  `\`${entry.name}\``,
3498
3498
  this.#cell(entry.note),
3499
3499
  "",
3500
+ "",
3500
3501
  ""
3501
3502
  ];
3502
3503
  const layer = placed.get(entry.name);
3503
3504
  const edges = entry.dependencies.map((dependency) => `\`${dependency.name}\` \`${dependency.range}\``).join(", ");
3505
+ const peers = entry.peers.map((dependency) => `\`${dependency.name}\` \`${dependency.range}\``).join(", ");
3504
3506
  return [
3505
3507
  `\`${entry.name}\``,
3506
3508
  `\`${entry.version}\``,
3507
3509
  layer === void 0 ? "" : `L${String(layer)}`,
3508
- edges
3510
+ edges,
3511
+ peers
3509
3512
  ];
3510
3513
  });
3511
3514
  const headers = [
3512
3515
  "Package",
3513
3516
  "Version",
3514
3517
  "Layer",
3515
- "Runtime dependencies"
3518
+ "Runtime dependencies",
3519
+ "Peer dependencies"
3516
3520
  ];
3517
3521
  const widths = headers.map((header, column) => {
3518
3522
  let width = Math.max(3, header.length);
@@ -3603,6 +3607,8 @@ var Materializer = class {
3603
3607
  *
3604
3608
  * const upstream = new Upstream({ registry: { timeout: 5_000 } })
3605
3609
  * const releases = await upstream.lookup([{ name: '@orkestrel/emitter', range: '^0.0.5' }])
3610
+ *
3611
+ * releases.filter((release) => release.lookup === 'found')
3606
3612
  * upstream.destroy()
3607
3613
  * ```
3608
3614
  */
@@ -3989,7 +3995,8 @@ var Upstream = class {
3989
3995
  name,
3990
3996
  lookup: "found",
3991
3997
  version,
3992
- dependencies: this.#edges(outcome.content, version)
3998
+ dependencies: this.#edges(outcome.content, version, "dependencies"),
3999
+ peers: this.#edges(outcome.content, version, "peerDependencies")
3993
4000
  };
3994
4001
  return {
3995
4002
  name,
@@ -3997,14 +4004,14 @@ var Upstream = class {
3997
4004
  note: outcome.lookup === "found" ? UNREADABLE_VERSION_NOTE : outcome.note
3998
4005
  };
3999
4006
  }
4000
- #edges(content, version) {
4007
+ #edges(content, version, section) {
4001
4008
  const parsed = parseJSON(content);
4002
4009
  if (!isRecord(parsed)) return [];
4003
4010
  const versions = parsed.versions;
4004
4011
  if (!isRecord(versions)) return [];
4005
4012
  const manifest = versions[version];
4006
4013
  if (!isRecord(manifest)) return [];
4007
- const declared = manifest.dependencies;
4014
+ const declared = manifest[section];
4008
4015
  if (!isRecord(declared)) return [];
4009
4016
  const edges = [];
4010
4017
  for (const [name, range] of Object.entries(declared)) {