katalyst-forge 3.0.0__tar.gz → 4.0.0__tar.gz

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 (64) hide show
  1. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/.gitignore +7 -0
  2. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/PKG-INFO +2 -2
  3. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/pyproject.toml +2 -2
  4. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/bundle.py +7 -10
  5. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/relationships.py +30 -0
  6. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/wings/agentic.py +0 -2
  7. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/wings/delivery.py +0 -2
  8. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/wings/design.py +110 -8
  9. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/wings/org.py +0 -6
  10. katalyst_forge-4.0.0/src/katalyst_forge/wings/pipeline.py +51 -0
  11. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/wings/practices.py +0 -4
  12. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/wings/system.py +0 -6
  13. katalyst_forge-3.0.0/src/katalyst_forge/wings/dx.py +0 -157
  14. katalyst_forge-3.0.0/src/katalyst_forge/wings/pipeline.py +0 -134
  15. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/__init__.py +0 -0
  16. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/py.typed +0 -0
  17. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/creation/_base.yaml.j2 +0 -0
  18. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/creation/layer.yaml.j2 +0 -0
  19. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/creation/project.yaml.j2 +0 -0
  20. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/creation/stack.yaml.j2 +0 -0
  21. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/creation/system.yaml.j2 +0 -0
  22. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/creation/team.yaml.j2 +0 -0
  23. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/creation/team_member.yaml.j2 +0 -0
  24. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/app-docker/.dockerignore +0 -0
  25. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/app-docker/.env.example +0 -0
  26. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/app-docker/README.md +0 -0
  27. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/app-docker/base/Dockerfile +0 -0
  28. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/app-docker/docker-compose.yaml +0 -0
  29. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/app-docker/env-template/Dockerfile +0 -0
  30. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/app-docker/env-template/docker-compose.override.yaml +0 -0
  31. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/app-docker/env-template/environment.yaml +0 -0
  32. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/app-docker/layer.yaml +0 -0
  33. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/iac-terragrunt/README.md +0 -0
  34. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/iac-terragrunt/composite/terraform/main.tf +0 -0
  35. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/iac-terragrunt/composite/terraform/outputs.tf +0 -0
  36. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/iac-terragrunt/composite/terraform/variables.tf +0 -0
  37. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/iac-terragrunt/env-template/environment.yaml +0 -0
  38. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/iac-terragrunt/env-template/terragrunt.hcl +0 -0
  39. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/iac-terragrunt/global/iac/context.hcl +0 -0
  40. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/iac-terragrunt/global/iac/dev.yaml +0 -0
  41. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/iac-terragrunt/global/iac/prod.yaml +0 -0
  42. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/iac-terragrunt/global/iac/staging.yaml +0 -0
  43. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/iac-terragrunt/layer.yaml +0 -0
  44. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/iac-terragrunt/version.yaml +0 -0
  45. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/k8s-argocd/README.md +0 -0
  46. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/k8s-argocd/base/app/argocd-application.yaml +0 -0
  47. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/k8s-argocd/base/kustomization.yaml +0 -0
  48. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/k8s-argocd/base/namespace.yaml +0 -0
  49. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/k8s-argocd/environment-template/argocd-application.yaml +0 -0
  50. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/k8s-argocd/environment-template/kustomization.yaml +0 -0
  51. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/k8s-argocd/environment-template/patch-argocd-application.yaml +0 -0
  52. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/k8s-argocd/layer.yaml +0 -0
  53. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/k8s-kustomize/README.md +0 -0
  54. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/k8s-kustomize/base/deployment.yaml +0 -0
  55. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/k8s-kustomize/base/kustomization.yaml +0 -0
  56. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/k8s-kustomize/base/namespace.yaml +0 -0
  57. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/k8s-kustomize/base/service.yaml +0 -0
  58. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/k8s-kustomize/environment-template/kustomization.yaml +0 -0
  59. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/k8s-kustomize/environment-template/patch-deployment.yaml +0 -0
  60. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/k8s-kustomize/global/k8s/base/kustomization.yaml +0 -0
  61. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/k8s-kustomize/global/k8s/base/namespace.yaml +0 -0
  62. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/k8s-kustomize/global/k8s/kustomization.yaml +0 -0
  63. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/templates/scaffolds/k8s-kustomize/layer.yaml +0 -0
  64. {katalyst_forge-3.0.0 → katalyst_forge-4.0.0}/src/katalyst_forge/wings/__init__.py +0 -0
@@ -103,3 +103,10 @@ stack-tests/test-results/
103
103
  # Generated artifacts (rebuild with `just generate-schemas`)
104
104
  taxonomy/src/katalyst_taxonomy/engine/generated/
105
105
  .worktrees/
106
+ .plan-74-75-76-77.md
107
+ .HANDOFF-scaffolding-wiring.md
108
+ .HANDOFF-2-cicd-migration.md
109
+ .HANDOFF-action-execution-fixes.md
110
+ .HANDOFF-bdd-coverage.md
111
+ .HANDOFF-*.md
112
+ docs/superpowers/
@@ -1,8 +1,8 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: katalyst-forge
3
- Version: 3.0.0
3
+ Version: 4.0.0
4
4
  Summary: The Forge bundle — 31 node-type definitions for software delivery taxonomy
5
5
  Author: eSimplicity
6
6
  License: Proprietary
7
7
  Requires-Python: >=3.12
8
- Requires-Dist: katalyst-engine
8
+ Requires-Dist: katalyst-engine<5,>=4.0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "katalyst-forge"
3
- version = "3.0.0"
3
+ version = "4.0.0"
4
4
  description = "The Forge bundle — 31 node-type definitions for software delivery taxonomy"
5
5
  license = { text = "Proprietary" }
6
6
  requires-python = ">=3.12"
@@ -8,7 +8,7 @@ authors = [
8
8
  { name = "eSimplicity" }
9
9
  ]
10
10
  dependencies = [
11
- "katalyst-engine",
11
+ "katalyst-engine>=4.0,<5",
12
12
  ]
13
13
 
14
14
  [project.entry-points."katalyst_engine.bundles"]
@@ -1,6 +1,6 @@
1
1
  """Forge bundle — the pre-installed taxonomy for software delivery.
2
2
 
3
- Assembles 33 node types across 8 wings from the wing modules into
3
+ Assembles 34 node types across 8 wings from the wing modules into
4
4
  a single ``ForgeBundle`` that implements the engine's ``Bundle``
5
5
  protocol. Discovered via the ``katalyst_engine.bundles`` entry point.
6
6
 
@@ -10,9 +10,9 @@ Wing modules:
10
10
  - ``wings/system.py`` — system, environment, stack, layer, library, capability
11
11
  - ``wings/org.py`` — organization, program, project, team, team_member, role
12
12
  - ``wings/practices.py`` — practice_area, competency, skill, tool
13
- - ``wings/design.py`` — business_domain_model, user_type, user_need, adr, nfr, specification, assertion
13
+ - ``wings/design.py`` — business_domain_model, user_type, user_need, design_spec, adr, nfr, specification, assertion
14
14
  - ``wings/delivery.py`` — work_item, change_entry
15
- - ``wings/dx.py`` — template, action, template_overlay
15
+ - ``wings/pipeline.py`` — cicd_stage
16
16
  - ``wings/pipeline.py`` — cicd_stage, cicd_job_template, cicd_workflow_template
17
17
  - ``wings/agentic.py`` — agent, agent_skill
18
18
  """
@@ -36,7 +36,6 @@ from katalyst_forge.relationships import ALL_RELATIONSHIP_DEFINITIONS
36
36
  from katalyst_forge.wings.agentic import AGENTIC_WING, AGENTIC_WING_NODES
37
37
  from katalyst_forge.wings.delivery import DELIVERY_WING, DELIVERY_WING_NODES
38
38
  from katalyst_forge.wings.design import DESIGN_WING, DESIGN_WING_NODES
39
- from katalyst_forge.wings.dx import DX_WING, DX_WING_NODES
40
39
  from katalyst_forge.wings.org import ORG_WING, ORG_WING_NODES
41
40
  from katalyst_forge.wings.pipeline import PIPELINE_WING, PIPELINE_WING_NODES
42
41
  from katalyst_forge.wings.practices import PRACTICES_WING, PRACTICES_WING_NODES
@@ -52,7 +51,6 @@ ALL_NODE_DEFINITIONS: list[NodeDefinition] = [
52
51
  *PRACTICES_WING_NODES,
53
52
  *DESIGN_WING_NODES,
54
53
  *DELIVERY_WING_NODES,
55
- *DX_WING_NODES,
56
54
  *PIPELINE_WING_NODES,
57
55
  *AGENTIC_WING_NODES,
58
56
  ]
@@ -65,7 +63,6 @@ ALL_WING_DEFINITIONS: list[WingDefinition] = [
65
63
  DESIGN_WING,
66
64
  DELIVERY_WING,
67
65
  PRACTICES_WING,
68
- DX_WING,
69
66
  PIPELINE_WING,
70
67
  AGENTIC_WING,
71
68
  ]
@@ -79,7 +76,7 @@ ALL_WING_NAMES: frozenset[str] = frozenset(wd.identity.name for wd in ALL_WING_D
79
76
 
80
77
 
81
78
  class ForgeBundle:
82
- """The Forge bundle — 33 node types across 8 wings.
79
+ """The Forge bundle — 34 node types across 8 wings.
83
80
 
84
81
  This is the pre-installed taxonomy bundle that ships with
85
82
  Katalyst Taxonomy. It models software delivery organizations
@@ -92,10 +89,10 @@ class ForgeBundle:
92
89
  def manifest(self) -> BundleManifest:
93
90
  return BundleManifest(
94
91
  identity=Identity(kind="bundle", name="forge"),
95
- version=Version(major=2, minor=0),
92
+ version=Version(major=4, minor=0),
96
93
  provided_kinds=ALL_KINDS,
97
94
  wing_names=ALL_WING_NAMES,
98
- description="Forge taxonomy — 33 node types for modeling software delivery organizations",
95
+ description="Forge taxonomy — 29 node types for modeling software delivery organizations",
99
96
  )
100
97
 
101
98
  def node_definitions(self) -> list[NodeDefinition]:
@@ -112,7 +109,7 @@ class ForgeBundle:
112
109
  identity=Identity(kind="schema", name="forge"),
113
110
  describes_kind="taxonomy",
114
111
  api_version="v2alpha",
115
- schema_version=Version(major=2),
112
+ schema_version=Version(major=4),
116
113
  node_definitions=tuple(nd.identity for nd in ALL_NODE_DEFINITIONS),
117
114
  wing_definitions=tuple(wd.identity for wd in ALL_WING_DEFINITIONS),
118
115
  )
@@ -104,6 +104,15 @@ TESTS_CAPABILITY_REL = RelationshipDefinition(
104
104
  cardinality=Cardinality.MANY_TO_MANY,
105
105
  )
106
106
 
107
+ DESIGNS_CAPABILITY_REL = RelationshipDefinition(
108
+ identity=_rel_id("designs_capability"),
109
+ describes_kind="designs_capability",
110
+ description="Design spec shapes how a capability manifests in the UI",
111
+ wing="capability",
112
+ display_order=145,
113
+ cardinality=Cardinality.MANY_TO_MANY,
114
+ )
115
+
107
116
  # ── Organizational wing ──────────────────────────────────────────────
108
117
 
109
118
  FILLED_BY_REL = RelationshipDefinition(
@@ -171,6 +180,24 @@ CAPTURES_STORY_REL = RelationshipDefinition(
171
180
  cardinality=Cardinality.MANY_TO_MANY,
172
181
  )
173
182
 
183
+ DESIGNS_FOR_NEED_REL = RelationshipDefinition(
184
+ identity=_rel_id("designs_for_need"),
185
+ describes_kind="designs_for_need",
186
+ description="Design spec addresses user needs visually and interactionally",
187
+ wing="verification",
188
+ display_order=325,
189
+ cardinality=Cardinality.MANY_TO_MANY,
190
+ )
191
+
192
+ IMPLEMENTS_DESIGN_REL = RelationshipDefinition(
193
+ identity=_rel_id("implements_design"),
194
+ describes_kind="implements_design",
195
+ description="Specification formalizes a design spec into executable BDD tests",
196
+ wing="verification",
197
+ display_order=330,
198
+ cardinality=Cardinality.MANY_TO_MANY,
199
+ )
200
+
174
201
  # ── Workflow wing ─────────────────────────────────────────────────────
175
202
 
176
203
  BLOCKS_REL = RelationshipDefinition(
@@ -243,6 +270,7 @@ ALL_RELATIONSHIP_DEFINITIONS: list[RelationshipDefinition] = [
243
270
  DEPENDS_ON_CAPABILITY_REL,
244
271
  SPECIFIES_CAPABILITY_REL,
245
272
  TESTS_CAPABILITY_REL,
273
+ DESIGNS_CAPABILITY_REL,
246
274
  # organizational
247
275
  FILLED_BY_REL,
248
276
  DEVELOPS_COMPETENCY_REL,
@@ -252,6 +280,8 @@ ALL_RELATIONSHIP_DEFINITIONS: list[RelationshipDefinition] = [
252
280
  VERIFIED_BY_REL,
253
281
  TESTS_SPECIFICATION_REL,
254
282
  CAPTURES_STORY_REL,
283
+ DESIGNS_FOR_NEED_REL,
284
+ IMPLEMENTS_DESIGN_REL,
255
285
  # workflow
256
286
  BLOCKS_REL,
257
287
  BLOCKED_BY_REL,
@@ -18,7 +18,6 @@ AGENT: NodeDefinition = NodeDefinition(
18
18
  is_root=True,
19
19
  is_leaf=True,
20
20
  is_extension=False,
21
- scaffoldable=False,
22
21
  clonable=False,
23
22
  display_label="Agent",
24
23
  display_label_plural="Agents",
@@ -92,7 +91,6 @@ SKILL: NodeDefinition = NodeDefinition(
92
91
  is_root=True,
93
92
  is_leaf=True,
94
93
  is_extension=False,
95
- scaffoldable=False,
96
94
  clonable=False,
97
95
  display_label="Agent Skill",
98
96
  display_label_plural="Agent Skills",
@@ -20,7 +20,6 @@ WORK_ITEM: NodeDefinition = NodeDefinition(
20
20
  is_root=True,
21
21
  is_leaf=False,
22
22
  is_extension=False,
23
- scaffoldable=False,
24
23
  clonable=False,
25
24
  display_label="Work Item",
26
25
  display_label_plural="Work Items",
@@ -99,7 +98,6 @@ CHANGE_ENTRY: NodeDefinition = NodeDefinition(
99
98
  is_root=False,
100
99
  is_leaf=True,
101
100
  is_extension=False,
102
- scaffoldable=False,
103
101
  clonable=False,
104
102
  display_label="Change Entry",
105
103
  display_label_plural="Change Entries",
@@ -1,4 +1,4 @@
1
- """Design wing — business_domain_model, user_type, user_need, adr, nfr, specification, assertion."""
1
+ """Design wing — business_domain_model, user_type, user_need, design_spec, adr, nfr, specification, assertion."""
2
2
 
3
3
  from __future__ import annotations
4
4
 
@@ -20,7 +20,6 @@ BUSINESS_DOMAIN_MODEL: NodeDefinition = NodeDefinition(
20
20
  is_root=True,
21
21
  is_leaf=True,
22
22
  is_extension=False,
23
- scaffoldable=False,
24
23
  clonable=False,
25
24
  display_label="Business Domain Model",
26
25
  display_label_plural="Business Domain Models",
@@ -70,7 +69,6 @@ USER_TYPE: NodeDefinition = NodeDefinition(
70
69
  is_root=True,
71
70
  is_leaf=False,
72
71
  is_extension=False,
73
- scaffoldable=False,
74
72
  clonable=False,
75
73
  display_label="User Type",
76
74
  display_label_plural="User Types",
@@ -132,7 +130,6 @@ USER_NEED: NodeDefinition = NodeDefinition(
132
130
  is_root=False,
133
131
  is_leaf=True,
134
132
  is_extension=False,
135
- scaffoldable=False,
136
133
  clonable=False,
137
134
  display_label="User Need",
138
135
  display_label_plural="User Needs",
@@ -203,6 +200,102 @@ USER_NEED: NodeDefinition = NodeDefinition(
203
200
  ),
204
201
  )
205
202
 
203
+ DESIGN_SPEC: NodeDefinition = NodeDefinition(
204
+ identity=Identity(kind="node_definition", name="design_spec"),
205
+ describes_kind="design_spec",
206
+ wing="design",
207
+ display_order=365,
208
+ directory_name="design_specs",
209
+ is_root=True,
210
+ is_leaf=False,
211
+ is_extension=False,
212
+ clonable=False,
213
+ display_label="Design Spec",
214
+ display_label_plural="Design Specs",
215
+ extends_kinds=(),
216
+ parent_rules=(),
217
+ fields=(
218
+ FieldSpec(
219
+ name="title",
220
+ field_type="string",
221
+ required=False,
222
+ description="Human-readable name",
223
+ ),
224
+ FieldSpec(
225
+ name="layout_type",
226
+ field_type="string",
227
+ required=False,
228
+ description="High-level layout pattern (dashboard, wizard, form, list, detail, modal)",
229
+ ),
230
+ FieldSpec(
231
+ name="components",
232
+ field_type="list",
233
+ required=False,
234
+ description="Key UI components involved",
235
+ ),
236
+ FieldSpec(
237
+ name="states",
238
+ field_type="list",
239
+ required=False,
240
+ description="View/interaction states (loading, empty, error, populated)",
241
+ ),
242
+ FieldSpec(
243
+ name="flows",
244
+ field_type="list",
245
+ required=False,
246
+ description="Interaction sequences and state transitions",
247
+ ),
248
+ FieldSpec(
249
+ name="constraints",
250
+ field_type="list",
251
+ required=False,
252
+ description="Testable design constraints (responsive, a11y, max items, keyboard nav)",
253
+ ),
254
+ FieldSpec(
255
+ name="stories",
256
+ field_type="list",
257
+ required=False,
258
+ description="Referenced user stories this design addresses",
259
+ ),
260
+ FieldSpec(
261
+ name="capabilities",
262
+ field_type="list",
263
+ required=False,
264
+ description="Referenced capabilities this design shapes",
265
+ ),
266
+ FieldSpec(
267
+ name="design_file",
268
+ field_type="string",
269
+ required=False,
270
+ description="Path to external design document",
271
+ ),
272
+ FieldSpec(
273
+ name="notes",
274
+ field_type="string",
275
+ required=False,
276
+ description="Freeform context or rationale summary",
277
+ ),
278
+ FieldSpec(
279
+ name="status",
280
+ field_type="string",
281
+ required=False,
282
+ description="Lifecycle status",
283
+ ),
284
+ ),
285
+ cross_references=(
286
+ FieldRef(
287
+ field_name="user_needs",
288
+ target_kind="user_need",
289
+ rel_type="DESIGNS_FOR_NEED",
290
+ ),
291
+ FieldRef(
292
+ field_name="capabilities",
293
+ target_kind="capability",
294
+ rel_type="DESIGNS_CAPABILITY",
295
+ ),
296
+ ),
297
+ )
298
+
206
299
  ADR: NodeDefinition = NodeDefinition(
207
300
  identity=Identity(kind="node_definition", name="adr"),
208
301
  describes_kind="adr",
@@ -212,7 +305,6 @@ ADR: NodeDefinition = NodeDefinition(
212
305
  is_root=True,
213
306
  is_leaf=True,
214
307
  is_extension=False,
215
- scaffoldable=False,
216
308
  clonable=False,
217
309
  display_label="ADR",
218
310
  display_label_plural="ADRs",
@@ -268,7 +360,6 @@ NFR: NodeDefinition = NodeDefinition(
268
360
  is_root=True,
269
361
  is_leaf=True,
270
362
  is_extension=False,
271
- scaffoldable=False,
272
363
  clonable=False,
273
364
  display_label="NFR",
274
365
  display_label_plural="NFRs",
@@ -324,7 +415,6 @@ SPECIFICATION: NodeDefinition = NodeDefinition(
324
415
  is_root=True,
325
416
  is_leaf=False,
326
417
  is_extension=False,
327
- scaffoldable=False,
328
418
  clonable=False,
329
419
  display_label="Specification",
330
420
  display_label_plural="Specifications",
@@ -355,6 +445,12 @@ SPECIFICATION: NodeDefinition = NodeDefinition(
355
445
  required=False,
356
446
  description="",
357
447
  ),
448
+ FieldSpec(
449
+ name="design_specs",
450
+ field_type="list",
451
+ required=False,
452
+ description="Referenced design specs this specification formalizes",
453
+ ),
358
454
  FieldSpec(
359
455
  name="status",
360
456
  field_type="string",
@@ -378,6 +474,11 @@ SPECIFICATION: NodeDefinition = NodeDefinition(
378
474
  target_kind="user_need",
379
475
  rel_type="CAPTURES_STORY",
380
476
  ),
477
+ FieldRef(
478
+ field_name="design_specs",
479
+ target_kind="design_spec",
480
+ rel_type="IMPLEMENTS_DESIGN",
481
+ ),
381
482
  ),
382
483
  )
383
484
 
@@ -390,7 +491,6 @@ ASSERTION: NodeDefinition = NodeDefinition(
390
491
  is_root=False,
391
492
  is_leaf=True,
392
493
  is_extension=False,
393
- scaffoldable=False,
394
494
  clonable=False,
395
495
  display_label="Assertion",
396
496
  display_label_plural="Assertions",
@@ -444,6 +544,7 @@ DESIGN_WING: WingDefinition = WingDefinition(
444
544
  "business_domain_model",
445
545
  "user_type",
446
546
  "user_need",
547
+ "design_spec",
447
548
  "adr",
448
549
  "nfr",
449
550
  "specification",
@@ -455,6 +556,7 @@ DESIGN_WING_NODES = [
455
556
  BUSINESS_DOMAIN_MODEL,
456
557
  USER_TYPE,
457
558
  USER_NEED,
559
+ DESIGN_SPEC,
458
560
  ADR,
459
561
  NFR,
460
562
  SPECIFICATION,
@@ -20,7 +20,6 @@ ORGANIZATION: NodeDefinition = NodeDefinition(
20
20
  is_root=True,
21
21
  is_leaf=False,
22
22
  is_extension=False,
23
- scaffoldable=False,
24
23
  clonable=False,
25
24
  display_label="Organization",
26
25
  display_label_plural="Organizations",
@@ -39,7 +38,6 @@ PROGRAM: NodeDefinition = NodeDefinition(
39
38
  is_root=False,
40
39
  is_leaf=False,
41
40
  is_extension=False,
42
- scaffoldable=False,
43
41
  clonable=True,
44
42
  display_label="Program",
45
43
  display_label_plural="Programs",
@@ -64,7 +62,6 @@ PROJECT: NodeDefinition = NodeDefinition(
64
62
  is_root=False,
65
63
  is_leaf=True,
66
64
  is_extension=False,
67
- scaffoldable=False,
68
65
  clonable=True,
69
66
  display_label="Project",
70
67
  display_label_plural="Projects",
@@ -89,7 +86,6 @@ TEAM: NodeDefinition = NodeDefinition(
89
86
  is_root=False,
90
87
  is_leaf=False,
91
88
  is_extension=False,
92
- scaffoldable=False,
93
89
  clonable=True,
94
90
  display_label="Team",
95
91
  display_label_plural="Teams",
@@ -121,7 +117,6 @@ TEAM_MEMBER: NodeDefinition = NodeDefinition(
121
117
  is_root=False,
122
118
  is_leaf=True,
123
119
  is_extension=False,
124
- scaffoldable=False,
125
120
  clonable=False,
126
121
  display_label="Team Member",
127
122
  display_label_plural="Team Members",
@@ -159,7 +154,6 @@ ROLE: NodeDefinition = NodeDefinition(
159
154
  is_root=True,
160
155
  is_leaf=True,
161
156
  is_extension=False,
162
- scaffoldable=False,
163
157
  clonable=False,
164
158
  display_label="Role",
165
159
  display_label_plural="Roles",
@@ -0,0 +1,51 @@
1
+ """Pipeline wing — cicd_stage (CI/CD job/workflow templates relocated to the cicd plugin, #79)."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from katalyst_engine.core.identity import Identity
6
+ from katalyst_engine.schema.definition import (
7
+ FieldRef,
8
+ FieldSpec,
9
+ NodeDefinition,
10
+ WingDefinition,
11
+ )
12
+
13
+ CICD_STAGE: NodeDefinition = NodeDefinition(
14
+ identity=Identity(kind="node_definition", name="cicd_stage"),
15
+ describes_kind="cicd_stage",
16
+ wing="pipeline",
17
+ display_order=600,
18
+ directory_name="cicd_stages",
19
+ is_root=True,
20
+ is_leaf=False,
21
+ is_extension=False,
22
+ clonable=False,
23
+ display_label="CI/CD Stage",
24
+ display_label_plural="CI/CD Stages",
25
+ extends_kinds=(),
26
+ parent_rules=(),
27
+ fields=(
28
+ FieldSpec(
29
+ name="stage_depends_on",
30
+ field_type="list",
31
+ required=False,
32
+ description="Names of stages that must complete before this one",
33
+ ),
34
+ ),
35
+ cross_references=(
36
+ FieldRef(
37
+ field_name="stage_depends_on",
38
+ target_kind="cicd_stage",
39
+ rel_type="STAGE_DEPENDS_ON",
40
+ ),
41
+ ),
42
+ )
43
+
44
+ PIPELINE_WING: WingDefinition = WingDefinition(
45
+ identity=Identity(kind="wing_definition", name="pipeline"),
46
+ describes_kind="pipeline",
47
+ display_name="Pipeline",
48
+ member_kinds=("cicd_stage",),
49
+ )
50
+
51
+ PIPELINE_WING_NODES = [CICD_STAGE]
@@ -20,7 +20,6 @@ PRACTICE_AREA: NodeDefinition = NodeDefinition(
20
20
  is_root=True,
21
21
  is_leaf=False,
22
22
  is_extension=False,
23
- scaffoldable=False,
24
23
  clonable=True,
25
24
  display_label="Practice Area",
26
25
  display_label_plural="Practice Areas",
@@ -81,7 +80,6 @@ COMPETENCY: NodeDefinition = NodeDefinition(
81
80
  is_root=False,
82
81
  is_leaf=False,
83
82
  is_extension=False,
84
- scaffoldable=False,
85
83
  clonable=False,
86
84
  display_label="Competency",
87
85
  display_label_plural="Competencies",
@@ -137,7 +135,6 @@ SKILL: NodeDefinition = NodeDefinition(
137
135
  is_root=False,
138
136
  is_leaf=True,
139
137
  is_extension=False,
140
- scaffoldable=False,
141
138
  clonable=False,
142
139
  display_label="Skill",
143
140
  display_label_plural="Skills",
@@ -175,7 +172,6 @@ TOOL: NodeDefinition = NodeDefinition(
175
172
  is_root=True,
176
173
  is_leaf=True,
177
174
  is_extension=False,
178
- scaffoldable=False,
179
175
  clonable=False,
180
176
  display_label="Tool",
181
177
  display_label_plural="Tools",
@@ -20,7 +20,6 @@ SYSTEM: NodeDefinition = NodeDefinition(
20
20
  is_root=True,
21
21
  is_leaf=False,
22
22
  is_extension=False,
23
- scaffoldable=False,
24
23
  clonable=False,
25
24
  display_label="System",
26
25
  display_label_plural="Systems",
@@ -58,7 +57,6 @@ ENVIRONMENT: NodeDefinition = NodeDefinition(
58
57
  is_root=True,
59
58
  is_leaf=True,
60
59
  is_extension=False,
61
- scaffoldable=False,
62
60
  clonable=False,
63
61
  display_label="Environment",
64
62
  display_label_plural="Environments",
@@ -90,7 +88,6 @@ STACK: NodeDefinition = NodeDefinition(
90
88
  is_root=False,
91
89
  is_leaf=False,
92
90
  is_extension=False,
93
- scaffoldable=False,
94
91
  clonable=True,
95
92
  display_label="Stack",
96
93
  display_label_plural="Stacks",
@@ -128,7 +125,6 @@ LAYER: NodeDefinition = NodeDefinition(
128
125
  is_root=False,
129
126
  is_leaf=True,
130
127
  is_extension=False,
131
- scaffoldable=True,
132
128
  clonable=True,
133
129
  display_label="Layer",
134
130
  display_label_plural="Layers",
@@ -172,7 +168,6 @@ LIBRARY: NodeDefinition = NodeDefinition(
172
168
  is_root=False,
173
169
  is_leaf=False,
174
170
  is_extension=False,
175
- scaffoldable=False,
176
171
  clonable=True,
177
172
  display_label="Library",
178
173
  display_label_plural="Libraries",
@@ -209,7 +204,6 @@ CAPABILITY: NodeDefinition = NodeDefinition(
209
204
  is_root=True,
210
205
  is_leaf=False,
211
206
  is_extension=False,
212
- scaffoldable=False,
213
207
  clonable=False,
214
208
  display_label="Capability",
215
209
  display_label_plural="Capabilities",
@@ -1,157 +0,0 @@
1
- """DX wing — template, action, template_overlay."""
2
-
3
- from __future__ import annotations
4
-
5
- from katalyst_engine.core.identity import Identity
6
- from katalyst_engine.schema.definition import (
7
- FieldSpec,
8
- NodeDefinition,
9
- WingDefinition,
10
- )
11
-
12
- TEMPLATE: NodeDefinition = NodeDefinition(
13
- identity=Identity(kind="node_definition", name="template"),
14
- describes_kind="template",
15
- wing="dx",
16
- display_order=500,
17
- directory_name="templates",
18
- is_root=False,
19
- is_leaf=False,
20
- is_extension=True,
21
- scaffoldable=False,
22
- clonable=False,
23
- display_label="Template",
24
- display_label_plural="Templates",
25
- extends_kinds=("layer", "stack", "system"),
26
- parent_rules=(),
27
- fields=(
28
- FieldSpec(
29
- name="scope",
30
- field_type="string",
31
- required=False,
32
- description="",
33
- ),
34
- FieldSpec(
35
- name="template_path",
36
- field_type="string",
37
- required=False,
38
- description="",
39
- ),
40
- FieldSpec(
41
- name="default_layer_dir",
42
- field_type="string",
43
- required=False,
44
- description="Default directory name for layers of this type",
45
- ),
46
- FieldSpec(
47
- name="optional_paths",
48
- field_type="list",
49
- required=False,
50
- description="Optional files/dirs in the template",
51
- ),
52
- FieldSpec(
53
- name="global_template_path",
54
- field_type="string",
55
- required=False,
56
- description="Path to global template directory",
57
- ),
58
- ),
59
- cross_references=(),
60
- )
61
-
62
- ACTION: NodeDefinition = NodeDefinition(
63
- identity=Identity(kind="node_definition", name="action"),
64
- describes_kind="action",
65
- wing="dx",
66
- display_order=510,
67
- directory_name="actions",
68
- is_root=False,
69
- is_leaf=False,
70
- is_extension=True,
71
- scaffoldable=False,
72
- clonable=False,
73
- display_label="Action",
74
- display_label_plural="Actions",
75
- extends_kinds=("template",),
76
- parent_rules=(),
77
- fields=(
78
- FieldSpec(
79
- name="action_type",
80
- field_type="string",
81
- required=False,
82
- description="How the action is executed",
83
- ),
84
- FieldSpec(
85
- name="when",
86
- field_type="string",
87
- required=False,
88
- description="Condition for when to run",
89
- ),
90
- FieldSpec(
91
- name="run",
92
- field_type="string",
93
- required=False,
94
- description="Command or URL to execute",
95
- ),
96
- FieldSpec(
97
- name="timeout_seconds",
98
- field_type="integer",
99
- required=False,
100
- description="Execution timeout",
101
- ),
102
- FieldSpec(
103
- name="action_environment",
104
- field_type="list",
105
- required=False,
106
- description="Environment variables",
107
- ),
108
- FieldSpec(
109
- name="action_tags",
110
- field_type="list",
111
- required=False,
112
- description="",
113
- ),
114
- ),
115
- cross_references=(),
116
- )
117
-
118
- TEMPLATE_OVERLAY: NodeDefinition = NodeDefinition(
119
- identity=Identity(kind="node_definition", name="template_overlay"),
120
- describes_kind="template_overlay",
121
- wing="dx",
122
- display_order=550,
123
- directory_name="template_overlays",
124
- is_root=False,
125
- is_leaf=False,
126
- is_extension=True,
127
- scaffoldable=False,
128
- clonable=False,
129
- display_label="Template Overlay",
130
- display_label_plural="Template Overlays",
131
- extends_kinds=("template", "action"),
132
- parent_rules=(),
133
- fields=(
134
- FieldSpec(
135
- name="provides_template",
136
- field_type="string",
137
- required=False,
138
- description="Path to template directory to overlay",
139
- ),
140
- FieldSpec(
141
- name="provides_files",
142
- field_type="list",
143
- required=False,
144
- description="Explicit file mappings (source:destination)",
145
- ),
146
- ),
147
- cross_references=(),
148
- )
149
-
150
- DX_WING: WingDefinition = WingDefinition(
151
- identity=Identity(kind="wing_definition", name="dx"),
152
- describes_kind="dx",
153
- display_name="DX",
154
- member_kinds=("template", "action", "template_overlay"),
155
- )
156
-
157
- DX_WING_NODES = [TEMPLATE, ACTION, TEMPLATE_OVERLAY]
@@ -1,134 +0,0 @@
1
- """Pipeline wing — cicd_stage, cicd_job_template, cicd_workflow_template."""
2
-
3
- from __future__ import annotations
4
-
5
- from katalyst_engine.core.identity import Identity
6
- from katalyst_engine.schema.definition import (
7
- FieldRef,
8
- FieldSpec,
9
- NodeDefinition,
10
- WingDefinition,
11
- )
12
-
13
- CICD_STAGE: NodeDefinition = NodeDefinition(
14
- identity=Identity(kind="node_definition", name="cicd_stage"),
15
- describes_kind="cicd_stage",
16
- wing="pipeline",
17
- display_order=600,
18
- directory_name="cicd_stages",
19
- is_root=True,
20
- is_leaf=False,
21
- is_extension=False,
22
- scaffoldable=False,
23
- clonable=False,
24
- display_label="CI/CD Stage",
25
- display_label_plural="CI/CD Stages",
26
- extends_kinds=(),
27
- parent_rules=(),
28
- fields=(
29
- FieldSpec(
30
- name="stage_depends_on",
31
- field_type="list",
32
- required=False,
33
- description="Names of stages that must complete before this one",
34
- ),
35
- ),
36
- cross_references=(
37
- FieldRef(
38
- field_name="stage_depends_on",
39
- target_kind="cicd_stage",
40
- rel_type="STAGE_DEPENDS_ON",
41
- ),
42
- ),
43
- )
44
-
45
- CICD_JOB_TEMPLATE: NodeDefinition = NodeDefinition(
46
- identity=Identity(kind="node_definition", name="cicd_job_template"),
47
- describes_kind="cicd_job_template",
48
- wing="pipeline",
49
- display_order=525,
50
- directory_name="cicd_jobs",
51
- is_root=False,
52
- is_leaf=False,
53
- is_extension=True,
54
- scaffoldable=False,
55
- clonable=False,
56
- display_label="CI/CD Job Template",
57
- display_label_plural="CI/CD Job Templates",
58
- extends_kinds=("template",),
59
- parent_rules=(),
60
- fields=(
61
- FieldSpec(
62
- name="stage",
63
- field_type="string",
64
- required=True,
65
- description="Pipeline stage (ci, cd, post)",
66
- ),
67
- FieldSpec(
68
- name="template_path",
69
- field_type="string",
70
- required=False,
71
- description="",
72
- ),
73
- FieldSpec(
74
- name="renderer_type",
75
- field_type="string",
76
- required=False,
77
- description="",
78
- ),
79
- FieldSpec(
80
- name="inputs_required",
81
- field_type="list",
82
- required=False,
83
- description="Required input parameters",
84
- ),
85
- ),
86
- cross_references=(
87
- FieldRef(
88
- field_name="stage",
89
- target_kind="cicd_stage",
90
- rel_type="BELONGS_TO_STAGE",
91
- ),
92
- ),
93
- )
94
-
95
- CICD_WORKFLOW_TEMPLATE: NodeDefinition = NodeDefinition(
96
- identity=Identity(kind="node_definition", name="cicd_workflow_template"),
97
- describes_kind="cicd_workflow_template",
98
- wing="pipeline",
99
- display_order=530,
100
- directory_name="cicd_workflows",
101
- is_root=False,
102
- is_leaf=False,
103
- is_extension=True,
104
- scaffoldable=False,
105
- clonable=False,
106
- display_label="CI/CD Workflow Template",
107
- display_label_plural="CI/CD Workflow Templates",
108
- extends_kinds=("cicd_stage",),
109
- parent_rules=(),
110
- fields=(
111
- FieldSpec(
112
- name="template_path",
113
- field_type="string",
114
- required=False,
115
- description="Path to the workflow template file",
116
- ),
117
- FieldSpec(
118
- name="renderer_type",
119
- field_type="string",
120
- required=False,
121
- description="",
122
- ),
123
- ),
124
- cross_references=(),
125
- )
126
-
127
- PIPELINE_WING: WingDefinition = WingDefinition(
128
- identity=Identity(kind="wing_definition", name="pipeline"),
129
- describes_kind="pipeline",
130
- display_name="Pipeline",
131
- member_kinds=("cicd_stage", "cicd_job_template", "cicd_workflow_template"),
132
- )
133
-
134
- PIPELINE_WING_NODES = [CICD_STAGE, CICD_JOB_TEMPLATE, CICD_WORKFLOW_TEMPLATE]