yarramate 1.2.0 → 1.4.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 (84) hide show
  1. package/catalogues/core-enrichment.yaml +237 -2
  2. package/dist/adapters/visual/session-server.js +16 -1
  3. package/dist/adapters/visual/view-identity.d.ts +1 -1
  4. package/dist/adapters/visual/view-identity.js +61 -3
  5. package/dist/adapters/visual/wire.d.ts +30 -0
  6. package/dist/adapters/visual/workspace-model.d.ts +35 -3
  7. package/dist/adapters/visual/workspace-model.js +62 -2
  8. package/dist/ask-command.js +37 -14
  9. package/dist/cli-support.d.ts +1 -1
  10. package/dist/cli-support.js +1 -1
  11. package/dist/cli.d.ts +1 -0
  12. package/dist/cli.js +26 -5
  13. package/dist/compiler.d.ts +13 -1
  14. package/dist/compiler.js +646 -0
  15. package/dist/concept-drafting.d.ts +13 -2
  16. package/dist/concept-drafting.js +15 -3
  17. package/dist/design-command.js +30 -4
  18. package/dist/evidence.js +25 -0
  19. package/dist/graph-projection.d.ts +10 -0
  20. package/dist/graph-projection.js +1 -0
  21. package/dist/index.d.ts +2 -2
  22. package/dist/index.js +1 -1
  23. package/dist/interrogate-command.d.ts +37 -1
  24. package/dist/interrogate-command.js +93 -42
  25. package/dist/interrogation-entry.d.ts +1 -1
  26. package/dist/layout-direction.d.ts +14 -0
  27. package/dist/layout-direction.js +5 -0
  28. package/dist/projection.d.ts +22 -6
  29. package/dist/projection.js +23 -2
  30. package/dist/relationship-drafting.d.ts +21 -2
  31. package/dist/relationship-drafting.js +49 -4
  32. package/dist/subject-references.js +5 -0
  33. package/dist/visual-app/assets/index-Rkq6smL2.css +1 -0
  34. package/dist/visual-app/assets/index-yCHtmQUH.js +394 -0
  35. package/dist/visual-app/index.html +2 -2
  36. package/dist/visual-app-lib/editor.js +29639 -27514
  37. package/dist/visual-app-lib/styles.css +1 -1
  38. package/dist/visual-app-lib/types/adapters/visual/view-identity.d.ts +1 -1
  39. package/dist/visual-app-lib/types/adapters/visual/wire.d.ts +30 -0
  40. package/dist/visual-app-lib/types/adapters/visual/workspace-model.d.ts +35 -3
  41. package/dist/visual-app-lib/types/compiler.d.ts +13 -1
  42. package/dist/visual-app-lib/types/concept-drafting.d.ts +13 -2
  43. package/dist/visual-app-lib/types/graph-projection.d.ts +10 -0
  44. package/dist/visual-app-lib/types/interrogate-command.d.ts +207 -0
  45. package/dist/visual-app-lib/types/layout-direction.d.ts +14 -0
  46. package/dist/visual-app-lib/types/projection.d.ts +22 -6
  47. package/dist/visual-app-lib/types/relationship-drafting.d.ts +21 -2
  48. package/dist/visual-app-lib/types/subject-identity.d.ts +34 -0
  49. package/dist/visual-app-lib/types/visual-app/App.d.ts +27 -2
  50. package/dist/visual-app-lib/types/visual-app/badges.d.ts +1 -0
  51. package/dist/visual-app-lib/types/visual-app/connection-panel.d.ts +9 -1
  52. package/dist/visual-app-lib/types/visual-app/context-menu-model.d.ts +15 -6
  53. package/dist/visual-app-lib/types/visual-app/graph-canvas.d.ts +77 -6
  54. package/dist/visual-app-lib/types/visual-app/kind-palette.d.ts +37 -0
  55. package/dist/visual-app-lib/types/visual-app/local-host.d.ts +42 -0
  56. package/dist/visual-app-lib/types/visual-app/mount.d.ts +73 -2
  57. package/dist/visual-app-lib/types/visual-app/open-questions.d.ts +15 -0
  58. package/dist/visual-app-lib/types/visual-app/query-fields.d.ts +3 -2
  59. package/dist/visual-app-lib/types/visual-app/query-panel.d.ts +8 -1
  60. package/dist/visual-app-lib/types/visual-app/save-view.d.ts +11 -5
  61. package/dist/visual-app-lib/types/visual-app/shipped-catalogue.d.ts +10 -0
  62. package/dist/visual-app-lib/types/visual-app/state.d.ts +15 -4
  63. package/dist/visual-app-lib/types/visual-app/subject-draft-panel.d.ts +13 -1
  64. package/dist/visual-app-lib/types/visual-app/subject-filter.d.ts +35 -0
  65. package/dist/visual-app-lib/types/visual-app/subject-form.d.ts +8 -0
  66. package/dist/visual-app-lib/types/visual-app/view-tree-model.d.ts +42 -9
  67. package/dist/visual-app-lib/types/visual-app/view-tree.d.ts +11 -2
  68. package/dist/visual-app-lib/types/visual-app/workspace-state.d.ts +81 -11
  69. package/dist/visual-app-lib/types/workspace.d.ts +2 -0
  70. package/dist/workspace.d.ts +2 -0
  71. package/dist/workspace.js +1 -0
  72. package/docs/CONSUMING-YARRAMATE.md +81 -0
  73. package/package.json +2 -1
  74. package/schema/yarramate-design-step.schema.json +26 -0
  75. package/schema/yarramate-document.schema.json +14 -0
  76. package/schema/yarramate-interrogation-report.schema.json +31 -0
  77. package/schema/yarramate-pattern.schema.json +133 -0
  78. package/schema/yarramate-projection.schema.json +9 -0
  79. package/schema/yarramate-question-catalogue.schema.json +34 -0
  80. package/schema/yarramate-visual-graph.schema.json +9 -0
  81. package/schema/yarramate-workspace.schema.json +4 -0
  82. package/skills/yarramate-architecture/SKILL.md +5 -0
  83. package/dist/visual-app/assets/index-CcmfL3oY.js +0 -394
  84. package/dist/visual-app/assets/index-DLutIWES.css +0 -1
@@ -470,7 +470,7 @@ export function runAskCommand(options, cwd) {
470
470
  });
471
471
  if (!loadedCatalogue.ok)
472
472
  return failed(loadedCatalogue.diagnostics);
473
- const report = evaluateCatalogue(loadedCatalogue.catalogue, compilation.graph, compilation.profileContext);
473
+ const report = evaluateCatalogue(loadedCatalogue.catalogue, compilation.graph, compilation.profileContext, evidenceDocuments.flatMap(({ observations }) => observations));
474
474
  const result = {
475
475
  format: 'yarramate/ask-result/v1',
476
476
  workspace: workspace.id,
@@ -500,8 +500,15 @@ export function runAskCommand(options, cwd) {
500
500
  if (reconciliation !== undefined) {
501
501
  lines.push(reconciliationLine(reconciliation));
502
502
  }
503
+ // Zero open has two causes and only one is complete (#334): a
504
+ // catalogue whose waves are all gated shut has asked nothing, and
505
+ // reporting that as a finished interview is the same empty-set
506
+ // flattery the wave rail carried.
507
+ const askedAnything = report.waves.some((wave) => wave.questions.length > 0);
503
508
  lines.push(report.summary.open === 0
504
- ? `Design interview complete (catalogue ${report.catalogue}): no open questions.`
509
+ ? askedAnything
510
+ ? `Design interview complete (catalogue ${report.catalogue}): no open questions.`
511
+ : `Design interview not started (catalogue ${report.catalogue}): no wave has opened yet.`
505
512
  : `Design interview: ${plural(report.summary.open, 'open question')} (catalogue ${report.catalogue}) — continue: yarramate design ${workspacePath}`, '', 'Backlog — planned, dependency order:', ...plannedLines(planned), '', `Current: ${plural(current.length, 'subject')} · Retired: ${retired.length} ` +
506
513
  `(roster: yarramate ask ${workspacePath} --subjects)`);
507
514
  return emit(result, `${lines.join('\n')}\n`);
@@ -689,8 +696,21 @@ export function runAskCommand(options, cwd) {
689
696
  });
690
697
  if (!loadedCatalogue.ok)
691
698
  return failed(loadedCatalogue.diagnostics);
699
+ // The evidence overlay rides along for the one condition that
700
+ // reads it (unchallenged-evidence); a workspace declaring no
701
+ // evidence passes an overlay known to be empty.
702
+ const evidenceObservations = [];
703
+ for (const path of workspace.evidence) {
704
+ const loaded = loadEvidence({
705
+ path,
706
+ source: readFileSync(resolve(cwd, path), 'utf8'),
707
+ });
708
+ if (!loaded.ok)
709
+ return failed(loaded.diagnostics);
710
+ evidenceObservations.push(...loaded.evidence.observations);
711
+ }
692
712
  const report = {
693
- ...evaluateCatalogue(loadedCatalogue.catalogue, graph, compilation.profileContext),
713
+ ...evaluateCatalogue(loadedCatalogue.catalogue, graph, compilation.profileContext, evidenceObservations),
694
714
  workspace: workspace.id,
695
715
  };
696
716
  const ordered = {
@@ -971,7 +991,20 @@ export function runAskCommand(options, cwd) {
971
991
  });
972
992
  if (!loadedCatalogue.ok)
973
993
  return failed(loadedCatalogue.diagnostics);
974
- const report = evaluateCatalogue(loadedCatalogue.catalogue, graph, compilation.profileContext);
994
+ // Loaded ahead of evaluation so the overlay feeds the one condition
995
+ // that reads it (unchallenged-evidence), then reused for the
996
+ // reconciliation summary below.
997
+ const evidenceDocuments = [];
998
+ for (const path of workspace.evidence) {
999
+ const loaded = loadEvidence({
1000
+ path,
1001
+ source: readFileSync(resolve(cwd, path), 'utf8'),
1002
+ });
1003
+ if (!loaded.ok)
1004
+ return failed(loaded.diagnostics);
1005
+ evidenceDocuments.push(loaded.evidence);
1006
+ }
1007
+ const report = evaluateCatalogue(loadedCatalogue.catalogue, graph, compilation.profileContext, evidenceDocuments.flatMap(({ observations }) => observations));
975
1008
  const openQuestions = [];
976
1009
  for (const wave of report.waves) {
977
1010
  for (const question of wave.questions) {
@@ -1003,16 +1036,6 @@ export function runAskCommand(options, cwd) {
1003
1036
  }
1004
1037
  let reconciliation;
1005
1038
  if (workspace.evidence.length > 0) {
1006
- const evidenceDocuments = [];
1007
- for (const path of workspace.evidence) {
1008
- const loaded = loadEvidence({
1009
- path,
1010
- source: readFileSync(resolve(cwd, path), 'utf8'),
1011
- });
1012
- if (!loaded.ok)
1013
- return failed(loaded.diagnostics);
1014
- evidenceDocuments.push(loaded.evidence);
1015
- }
1016
1039
  const evaluation = evaluateEvidenceWorkspace(graph, evidenceDocuments);
1017
1040
  if (!evaluation.ok)
1018
1041
  return failed(evaluation.diagnostics);
@@ -7,7 +7,7 @@ export interface CliResult {
7
7
  export declare const isMainModule: (moduleUrl: string, entrypoint: string | undefined) => boolean;
8
8
  export declare const packageVersion: string;
9
9
  export declare const versionResult: (binary: string) => CliResult;
10
- export declare const usage = "Usage:\n yarramate init <directory> [--no-pointer]\n yarramate design <workspace.yaml> [--subject <subject-id>] [--catalogue <catalogue.yaml>] [--facilitate] [--json]\n yarramate apply <operations.yaml> <workspace.yaml> [--json]\n yarramate ask <workspace.yaml> [--json]\n yarramate ask <workspace.yaml> \"<free text>\" | <subject-id> ... | <projection.yaml> [--budget <tokens>] [--neighbours <n>] [--json]\n yarramate ask <workspace.yaml> --subjects [--kind <term>] [--status <status>] [--json]\n yarramate ask <workspace.yaml> --kinds [--json]\n yarramate ask <workspace.yaml> --advise \"<topic>\" [--budget <tokens>] [--neighbours <n>] [--catalogue <catalogue.yaml>] [--json]\n yarramate ask <workspace.yaml> --where \"<free text>\" | <subject-id> ... [--json]\n yarramate ask <workspace.yaml> --next [--json]\n yarramate ask <workspace.yaml> --open [--catalogue <catalogue.yaml>] [--json]\n yarramate ask <workspace.yaml> --compare <from-state> <to-state> [--json]\n yarramate ask <workspace.yaml> --changed <git-range> [--budget <tokens>] [--neighbours <n>] [--json]\n yarramate check <source.yaml> [source.yaml ...] [--json] [--strict]\n yarramate reconcile <workspace.yaml>\n yarramate export graph <workspace.yaml> [--out <file>]\n yarramate export markdown <projection.yaml> <workspace.yaml> [--out <file>]\n yarramate export markdown --changed <git-range> <workspace.yaml> [--out <file>]\n yarramate export briefs <projection.yaml> <workspace.yaml> --out <directory> [--budget <tokens>]\n yarramate export briefs --changed <git-range> <workspace.yaml> --out <directory> [--budget <tokens>]\n yarramate export rtm <workspace.yaml> --out <directory>\n yarramate export likec4 <likec4-project.yaml> <output-dir> <workspace.yaml> [--changed <git-range>]\n";
10
+ export declare const usage = "Usage:\n yarramate init <directory> [--no-pointer]\n yarramate design <workspace.yaml> [--subject <subject-id>] [--catalogue <catalogue.yaml>] [--facilitate] [--json]\n yarramate apply <operations.yaml> <workspace.yaml> [--json]\n yarramate ask <workspace.yaml> [--json]\n yarramate ask <workspace.yaml> \"<free text>\" | <subject-id> ... | <projection.yaml> [--budget <tokens>] [--neighbours <n>] [--json]\n yarramate ask <workspace.yaml> --subjects [--kind <term>] [--status <status>] [--json]\n yarramate ask <workspace.yaml> --kinds [--json]\n yarramate ask <workspace.yaml> --advise \"<topic>\" [--budget <tokens>] [--neighbours <n>] [--catalogue <catalogue.yaml>] [--json]\n yarramate ask <workspace.yaml> --where \"<free text>\" | <subject-id> ... [--json]\n yarramate ask <workspace.yaml> --next [--json]\n yarramate ask <workspace.yaml> --open [--catalogue <catalogue.yaml>] [--json]\n yarramate ask <workspace.yaml> --compare <from-state> <to-state> [--json]\n yarramate ask <workspace.yaml> --changed <git-range> [--budget <tokens>] [--neighbours <n>] [--json]\n yarramate check <source.yaml> [source.yaml ...] [--json] [--strict]\n yarramate reconcile <workspace.yaml> [--json]\n yarramate export graph <workspace.yaml> [--out <file>]\n yarramate export markdown <projection.yaml> <workspace.yaml> [--out <file>]\n yarramate export markdown --changed <git-range> <workspace.yaml> [--out <file>]\n yarramate export briefs <projection.yaml> <workspace.yaml> --out <directory> [--budget <tokens>]\n yarramate export briefs --changed <git-range> <workspace.yaml> --out <directory> [--budget <tokens>]\n yarramate export rtm <workspace.yaml> --out <directory>\n yarramate export likec4 <likec4-project.yaml> <output-dir> <workspace.yaml> [--changed <git-range>]\n";
11
11
  export declare const diagnosticJson: (diagnostics: unknown) => string;
12
12
  export declare const checkResultJson: (ok: boolean, diagnostics: unknown, counted?: {
13
13
  readonly documents: number;
@@ -22,7 +22,7 @@ export const versionResult = (binary) => ({
22
22
  stdout: `${binary} ${packageVersion}\n`,
23
23
  stderr: '',
24
24
  });
25
- export const usage = 'Usage:\n yarramate init <directory> [--no-pointer]\n yarramate design <workspace.yaml> [--subject <subject-id>] [--catalogue <catalogue.yaml>] [--facilitate] [--json]\n yarramate apply <operations.yaml> <workspace.yaml> [--json]\n yarramate ask <workspace.yaml> [--json]\n yarramate ask <workspace.yaml> "<free text>" | <subject-id> ... | <projection.yaml> [--budget <tokens>] [--neighbours <n>] [--json]\n yarramate ask <workspace.yaml> --subjects [--kind <term>] [--status <status>] [--json]\n yarramate ask <workspace.yaml> --kinds [--json]\n yarramate ask <workspace.yaml> --advise "<topic>" [--budget <tokens>] [--neighbours <n>] [--catalogue <catalogue.yaml>] [--json]\n yarramate ask <workspace.yaml> --where "<free text>" | <subject-id> ... [--json]\n yarramate ask <workspace.yaml> --next [--json]\n yarramate ask <workspace.yaml> --open [--catalogue <catalogue.yaml>] [--json]\n yarramate ask <workspace.yaml> --compare <from-state> <to-state> [--json]\n yarramate ask <workspace.yaml> --changed <git-range> [--budget <tokens>] [--neighbours <n>] [--json]\n yarramate check <source.yaml> [source.yaml ...] [--json] [--strict]\n yarramate reconcile <workspace.yaml>\n yarramate export graph <workspace.yaml> [--out <file>]\n yarramate export markdown <projection.yaml> <workspace.yaml> [--out <file>]\n yarramate export markdown --changed <git-range> <workspace.yaml> [--out <file>]\n yarramate export briefs <projection.yaml> <workspace.yaml> --out <directory> [--budget <tokens>]\n yarramate export briefs --changed <git-range> <workspace.yaml> --out <directory> [--budget <tokens>]\n yarramate export rtm <workspace.yaml> --out <directory>\n yarramate export likec4 <likec4-project.yaml> <output-dir> <workspace.yaml> [--changed <git-range>]\n';
25
+ export const usage = 'Usage:\n yarramate init <directory> [--no-pointer]\n yarramate design <workspace.yaml> [--subject <subject-id>] [--catalogue <catalogue.yaml>] [--facilitate] [--json]\n yarramate apply <operations.yaml> <workspace.yaml> [--json]\n yarramate ask <workspace.yaml> [--json]\n yarramate ask <workspace.yaml> "<free text>" | <subject-id> ... | <projection.yaml> [--budget <tokens>] [--neighbours <n>] [--json]\n yarramate ask <workspace.yaml> --subjects [--kind <term>] [--status <status>] [--json]\n yarramate ask <workspace.yaml> --kinds [--json]\n yarramate ask <workspace.yaml> --advise "<topic>" [--budget <tokens>] [--neighbours <n>] [--catalogue <catalogue.yaml>] [--json]\n yarramate ask <workspace.yaml> --where "<free text>" | <subject-id> ... [--json]\n yarramate ask <workspace.yaml> --next [--json]\n yarramate ask <workspace.yaml> --open [--catalogue <catalogue.yaml>] [--json]\n yarramate ask <workspace.yaml> --compare <from-state> <to-state> [--json]\n yarramate ask <workspace.yaml> --changed <git-range> [--budget <tokens>] [--neighbours <n>] [--json]\n yarramate check <source.yaml> [source.yaml ...] [--json] [--strict]\n yarramate reconcile <workspace.yaml> [--json]\n yarramate export graph <workspace.yaml> [--out <file>]\n yarramate export markdown <projection.yaml> <workspace.yaml> [--out <file>]\n yarramate export markdown --changed <git-range> <workspace.yaml> [--out <file>]\n yarramate export briefs <projection.yaml> <workspace.yaml> --out <directory> [--budget <tokens>]\n yarramate export briefs --changed <git-range> <workspace.yaml> --out <directory> [--budget <tokens>]\n yarramate export rtm <workspace.yaml> --out <directory>\n yarramate export likec4 <likec4-project.yaml> <output-dir> <workspace.yaml> [--changed <git-range>]\n';
26
26
  export const diagnosticJson = (diagnostics) => `${JSON.stringify({
27
27
  format: 'yarramate/diagnostic-result/v1',
28
28
  diagnostics,
package/dist/cli.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env node
2
2
  import { type CliResult } from './cli-support.js';
3
3
  export type { CliResult } from './cli-support.js';
4
+ export declare const deriveInitId: (directory: string) => string;
4
5
  export declare function runCli(args: readonly string[], cwd?: string): CliResult;
package/dist/cli.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { existsSync, mkdirSync, readFileSync, writeFileSync, } from 'node:fs';
3
- import { dirname, relative, resolve } from 'node:path';
3
+ import { basename, dirname, relative, resolve } from 'node:path';
4
4
  import { compileWorkspace } from './compiler.js';
5
5
  import { diagnosticJson, isMainModule, usage, versionResult, } from './cli-support.js';
6
6
  import { runAskCommand } from './ask-command.js';
@@ -13,8 +13,12 @@ import { deriveAttestationStaleness } from './attestation-staleness.js';
13
13
  import { reconcileEvidenceReports } from './reconciliation.js';
14
14
  import { loadWorkspaceManifest } from './workspace.js';
15
15
  const runReconciliation = (options, cwd) => {
16
- const [workspacePath] = options;
17
- if (options.length !== 1 ||
16
+ // Bare reconcile already emits JSON, so --json changes nothing — but a
17
+ // harness scripting "add --json to every verb" must not hit exit 2 on
18
+ // the one verb that treats it as unknown (#275). Accepted as a no-op.
19
+ const positional = options.filter((option) => option !== '--json');
20
+ const [workspacePath] = positional;
21
+ if (positional.length !== 1 ||
18
22
  workspacePath === undefined ||
19
23
  workspacePath.startsWith('-')) {
20
24
  return { exitCode: 2, stdout: '', stderr: usage };
@@ -89,6 +93,22 @@ const runReconciliation = (options, cwd) => {
89
93
  return { exitCode: 2, stdout: '', stderr: `${message}\n` };
90
94
  }
91
95
  };
96
+ // The id grammar the document and workspace schemas share: a lowercase
97
+ // letter first, then lowercase alphanumerics in single-hyphen segments.
98
+ const initIdPattern = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;
99
+ // The first check output should say the project's own name, not `main`
100
+ // (#275, ADR 0112): the default id is the target directory's basename,
101
+ // slugified to the shared id grammar. `init .` resolves before deriving,
102
+ // so the cwd's basename is what gets named. `main` remains the fallback
103
+ // when the basename yields nothing the schemas accept ('.', '..',
104
+ // all-symbols, a leading digit).
105
+ export const deriveInitId = (directory) => {
106
+ const slug = basename(directory)
107
+ .toLowerCase()
108
+ .replace(/[^a-z0-9]+/g, '-')
109
+ .replace(/^-+|-+$/g, '');
110
+ return initIdPattern.test(slug) ? slug : 'main';
111
+ };
92
112
  const runInit = (options, cwd) => {
93
113
  const positional = options.filter((option) => option !== '--no-pointer');
94
114
  const writePointer = positional.length === options.length;
@@ -114,14 +134,15 @@ const runInit = (options, cwd) => {
114
134
  stderr: `${existing.join(' and ')} ${existing.length === 1 ? 'already exists' : 'already exist'}; nothing was changed\n`,
115
135
  };
116
136
  }
137
+ const workspaceId = deriveInitId(workspaceRoot);
117
138
  mkdirSync(dirname(documentPath), { recursive: true });
118
139
  writeFileSync(documentPath, 'format: yarramate/v1\n' +
119
- 'id: main\n' +
140
+ `id: ${workspaceId}\n` +
120
141
  'profile: yarramate/core@0.1\n' +
121
142
  'concepts: []\n' +
122
143
  'relationships: []\n', 'utf8');
123
144
  writeFileSync(manifestPath, 'format: yarramate/workspace/v1\n' +
124
- 'id: main\n' +
145
+ `id: ${workspaceId}\n` +
125
146
  'documents:\n' +
126
147
  ' - architecture/*.yaml\n' +
127
148
  'profiles: []\n' +
@@ -74,6 +74,18 @@ export interface ResolvedProfileContext {
74
74
  /** Kind identity -> the core kind it resolves to through lineage. */
75
75
  readonly conceptKindCoreAncestors: ReadonlyMap<string, CoreConceptKindId>;
76
76
  readonly relationshipKindCoreAncestors: ReadonlyMap<string, RelationshipKind>;
77
+ /**
78
+ * The core relationship kinds a pattern PORTS for a concept kind (#268
79
+ * phase 3, ADR 0124), keyed by kind identity. Only kinds that have a
80
+ * pattern with ports appear.
81
+ *
82
+ * A macro edge needs both ends to port its kind, so a consumer offering a
83
+ * palette between two instances intersects the two sets. Two raw groupings
84
+ * permit ten of the eleven kinds, which is no narrowing at all; the ports
85
+ * are what restore the guidance the relationship table gives everywhere
86
+ * else.
87
+ */
88
+ readonly patternPortKinds: ReadonlyMap<string, readonly RelationshipKind[]>;
77
89
  /**
78
90
  * The core relationship kinds the ArchiMate table permits between two
79
91
  * concept kind identities, resolved through lineage; undefined when either
@@ -104,7 +116,7 @@ export type ContextualCompilationResult = {
104
116
  */
105
117
  export interface ParsedWorkspaceSource {
106
118
  readonly source: string;
107
- readonly kind: 'profile' | 'document';
119
+ readonly kind: 'profile' | 'document' | 'pattern';
108
120
  readonly value: unknown;
109
121
  readonly schemaDiagnostics: readonly Diagnostic[];
110
122
  /**