katalyst-forge 2.1.0__py3-none-any.whl
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.
- katalyst_forge/__init__.py +10 -0
- katalyst_forge/bundle.py +175 -0
- katalyst_forge/py.typed +0 -0
- katalyst_forge/relationships.py +263 -0
- katalyst_forge/templates/creation/_base.yaml.j2 +12 -0
- katalyst_forge/templates/creation/layer.yaml.j2 +21 -0
- katalyst_forge/templates/creation/project.yaml.j2 +16 -0
- katalyst_forge/templates/creation/stack.yaml.j2 +18 -0
- katalyst_forge/templates/creation/system.yaml.j2 +15 -0
- katalyst_forge/templates/creation/team.yaml.j2 +16 -0
- katalyst_forge/templates/creation/team_member.yaml.j2 +17 -0
- katalyst_forge/templates/scaffolds/app-docker/.dockerignore +51 -0
- katalyst_forge/templates/scaffolds/app-docker/.env.example +14 -0
- katalyst_forge/templates/scaffolds/app-docker/README.md +40 -0
- katalyst_forge/templates/scaffolds/app-docker/base/Dockerfile +54 -0
- katalyst_forge/templates/scaffolds/app-docker/docker-compose.yaml +34 -0
- katalyst_forge/templates/scaffolds/app-docker/env-template/Dockerfile +9 -0
- katalyst_forge/templates/scaffolds/app-docker/env-template/docker-compose.override.yaml +12 -0
- katalyst_forge/templates/scaffolds/app-docker/env-template/environment.yaml +9 -0
- katalyst_forge/templates/scaffolds/app-docker/layer.yaml +15 -0
- katalyst_forge/templates/scaffolds/iac-terragrunt/README.md +149 -0
- katalyst_forge/templates/scaffolds/iac-terragrunt/composite/terraform/main.tf +12 -0
- katalyst_forge/templates/scaffolds/iac-terragrunt/composite/terraform/outputs.tf +5 -0
- katalyst_forge/templates/scaffolds/iac-terragrunt/composite/terraform/variables.tf +5 -0
- katalyst_forge/templates/scaffolds/iac-terragrunt/env-template/environment.yaml +1 -0
- katalyst_forge/templates/scaffolds/iac-terragrunt/env-template/terragrunt.hcl +19 -0
- katalyst_forge/templates/scaffolds/iac-terragrunt/global/iac/context.hcl +121 -0
- katalyst_forge/templates/scaffolds/iac-terragrunt/global/iac/dev.yaml +4 -0
- katalyst_forge/templates/scaffolds/iac-terragrunt/global/iac/prod.yaml +4 -0
- katalyst_forge/templates/scaffolds/iac-terragrunt/global/iac/staging.yaml +4 -0
- katalyst_forge/templates/scaffolds/iac-terragrunt/layer.yaml +15 -0
- katalyst_forge/templates/scaffolds/iac-terragrunt/version.yaml +1 -0
- katalyst_forge/templates/scaffolds/k8s-argocd/README.md +136 -0
- katalyst_forge/templates/scaffolds/k8s-argocd/base/app/argocd-application.yaml +17 -0
- katalyst_forge/templates/scaffolds/k8s-argocd/base/kustomization.yaml +5 -0
- katalyst_forge/templates/scaffolds/k8s-argocd/base/namespace.yaml +4 -0
- katalyst_forge/templates/scaffolds/k8s-argocd/environment-template/argocd-application.yaml +20 -0
- katalyst_forge/templates/scaffolds/k8s-argocd/environment-template/kustomization.yaml +9 -0
- katalyst_forge/templates/scaffolds/k8s-argocd/environment-template/patch-argocd-application.yaml +15 -0
- katalyst_forge/templates/scaffolds/k8s-argocd/layer.yaml +18 -0
- katalyst_forge/templates/scaffolds/k8s-kustomize/README.md +95 -0
- katalyst_forge/templates/scaffolds/k8s-kustomize/base/deployment.yaml +22 -0
- katalyst_forge/templates/scaffolds/k8s-kustomize/base/kustomization.yaml +11 -0
- katalyst_forge/templates/scaffolds/k8s-kustomize/base/namespace.yaml +4 -0
- katalyst_forge/templates/scaffolds/k8s-kustomize/base/service.yaml +11 -0
- katalyst_forge/templates/scaffolds/k8s-kustomize/environment-template/kustomization.yaml +6 -0
- katalyst_forge/templates/scaffolds/k8s-kustomize/environment-template/patch-deployment.yaml +13 -0
- katalyst_forge/templates/scaffolds/k8s-kustomize/global/k8s/base/kustomization.yaml +4 -0
- katalyst_forge/templates/scaffolds/k8s-kustomize/global/k8s/base/namespace.yaml +4 -0
- katalyst_forge/templates/scaffolds/k8s-kustomize/global/k8s/kustomization.yaml +3 -0
- katalyst_forge/templates/scaffolds/k8s-kustomize/layer.yaml +15 -0
- katalyst_forge/wings/__init__.py +1 -0
- katalyst_forge/wings/agentic.py +137 -0
- katalyst_forge/wings/delivery.py +162 -0
- katalyst_forge/wings/design.py +462 -0
- katalyst_forge/wings/dx.py +157 -0
- katalyst_forge/wings/org.py +211 -0
- katalyst_forge/wings/pipeline.py +134 -0
- katalyst_forge/wings/practices.py +220 -0
- katalyst_forge/wings/system.py +266 -0
- katalyst_forge-2.1.0.dist-info/METADATA +8 -0
- katalyst_forge-2.1.0.dist-info/RECORD +64 -0
- katalyst_forge-2.1.0.dist-info/WHEEL +4 -0
- katalyst_forge-2.1.0.dist-info/entry_points.txt +2 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"""katalyst-forge — The Forge bundle for katalyst-engine.
|
|
2
|
+
|
|
3
|
+
Provides 33 node-type definitions across 8 wings for software delivery taxonomy.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
from katalyst_forge.bundle import ForgeBundle
|
|
9
|
+
|
|
10
|
+
__all__ = ["ForgeBundle"]
|
katalyst_forge/bundle.py
ADDED
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"""Forge bundle — the pre-installed taxonomy for software delivery.
|
|
2
|
+
|
|
3
|
+
Assembles 33 node types across 8 wings from the wing modules into
|
|
4
|
+
a single ``ForgeBundle`` that implements the engine's ``Bundle``
|
|
5
|
+
protocol. Discovered via the ``katalyst_engine.bundles`` entry point.
|
|
6
|
+
|
|
7
|
+
"Forge" — where delivery artifacts are forged.
|
|
8
|
+
|
|
9
|
+
Wing modules:
|
|
10
|
+
- ``wings/system.py`` — system, environment, stack, layer, library, capability
|
|
11
|
+
- ``wings/org.py`` — organization, program, project, team, team_member, role
|
|
12
|
+
- ``wings/practices.py`` — practice_area, competency, skill, tool
|
|
13
|
+
- ``wings/design.py`` — business_domain_model, user_type, user_story, adr, nfr, specification, assertion
|
|
14
|
+
- ``wings/delivery.py`` — work_item, change_entry
|
|
15
|
+
- ``wings/dx.py`` — template, action, template_overlay
|
|
16
|
+
- ``wings/pipeline.py`` — cicd_stage, cicd_job_template, cicd_workflow_template
|
|
17
|
+
- ``wings/agentic.py`` — agent, agent_skill
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
from pathlib import Path
|
|
23
|
+
|
|
24
|
+
from katalyst_engine.bundle.protocol import BundleManifest
|
|
25
|
+
from katalyst_engine.core.identity import Identity
|
|
26
|
+
from katalyst_engine.core.version import Version
|
|
27
|
+
from katalyst_engine.schema.definition import (
|
|
28
|
+
NodeDefinition,
|
|
29
|
+
RelationshipDefinition,
|
|
30
|
+
SchemaDefinition,
|
|
31
|
+
WingDefinition,
|
|
32
|
+
)
|
|
33
|
+
from katalyst_engine.schema.manager import SchemaManager
|
|
34
|
+
|
|
35
|
+
from katalyst_forge.relationships import ALL_RELATIONSHIP_DEFINITIONS
|
|
36
|
+
from katalyst_forge.wings.agentic import AGENTIC_WING, AGENTIC_WING_NODES
|
|
37
|
+
from katalyst_forge.wings.delivery import DELIVERY_WING, DELIVERY_WING_NODES
|
|
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
|
+
from katalyst_forge.wings.org import ORG_WING, ORG_WING_NODES
|
|
41
|
+
from katalyst_forge.wings.pipeline import PIPELINE_WING, PIPELINE_WING_NODES
|
|
42
|
+
from katalyst_forge.wings.practices import PRACTICES_WING, PRACTICES_WING_NODES
|
|
43
|
+
from katalyst_forge.wings.system import SYSTEM_WING, SYSTEM_WING_NODES
|
|
44
|
+
|
|
45
|
+
# ---------------------------------------------------------------------------
|
|
46
|
+
# Aggregate all definitions from wing modules
|
|
47
|
+
# ---------------------------------------------------------------------------
|
|
48
|
+
|
|
49
|
+
ALL_NODE_DEFINITIONS: list[NodeDefinition] = [
|
|
50
|
+
*SYSTEM_WING_NODES,
|
|
51
|
+
*ORG_WING_NODES,
|
|
52
|
+
*PRACTICES_WING_NODES,
|
|
53
|
+
*DESIGN_WING_NODES,
|
|
54
|
+
*DELIVERY_WING_NODES,
|
|
55
|
+
*DX_WING_NODES,
|
|
56
|
+
*PIPELINE_WING_NODES,
|
|
57
|
+
*AGENTIC_WING_NODES,
|
|
58
|
+
]
|
|
59
|
+
|
|
60
|
+
ALL_KINDS: frozenset[str] = frozenset(nd.describes_kind for nd in ALL_NODE_DEFINITIONS)
|
|
61
|
+
|
|
62
|
+
ALL_WING_DEFINITIONS: list[WingDefinition] = [
|
|
63
|
+
SYSTEM_WING,
|
|
64
|
+
ORG_WING,
|
|
65
|
+
DESIGN_WING,
|
|
66
|
+
DELIVERY_WING,
|
|
67
|
+
PRACTICES_WING,
|
|
68
|
+
DX_WING,
|
|
69
|
+
PIPELINE_WING,
|
|
70
|
+
AGENTIC_WING,
|
|
71
|
+
]
|
|
72
|
+
|
|
73
|
+
ALL_WING_NAMES: frozenset[str] = frozenset(wd.identity.name for wd in ALL_WING_DEFINITIONS)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
# ---------------------------------------------------------------------------
|
|
77
|
+
# Bundle class
|
|
78
|
+
# ---------------------------------------------------------------------------
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class ForgeBundle:
|
|
82
|
+
"""The Forge bundle — 33 node types across 8 wings.
|
|
83
|
+
|
|
84
|
+
This is the pre-installed taxonomy bundle that ships with
|
|
85
|
+
Katalyst Taxonomy. It models software delivery organizations
|
|
86
|
+
using systems, stacks, layers, teams, practices, and more.
|
|
87
|
+
|
|
88
|
+
"Forge" — where delivery artifacts are forged.
|
|
89
|
+
"""
|
|
90
|
+
|
|
91
|
+
@property
|
|
92
|
+
def manifest(self) -> BundleManifest:
|
|
93
|
+
return BundleManifest(
|
|
94
|
+
identity=Identity(kind="bundle", name="forge"),
|
|
95
|
+
version=Version(major=2, minor=0),
|
|
96
|
+
provided_kinds=ALL_KINDS,
|
|
97
|
+
wing_names=ALL_WING_NAMES,
|
|
98
|
+
description="Forge taxonomy — 33 node types for modeling software delivery organizations",
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
def node_definitions(self) -> list[NodeDefinition]:
|
|
102
|
+
return list(ALL_NODE_DEFINITIONS)
|
|
103
|
+
|
|
104
|
+
def wing_definitions(self) -> list[WingDefinition]:
|
|
105
|
+
return list(ALL_WING_DEFINITIONS)
|
|
106
|
+
|
|
107
|
+
def relationship_definitions(self) -> list[RelationshipDefinition]:
|
|
108
|
+
return list(ALL_RELATIONSHIP_DEFINITIONS)
|
|
109
|
+
|
|
110
|
+
def schema_definition(self) -> SchemaDefinition:
|
|
111
|
+
return SchemaDefinition(
|
|
112
|
+
identity=Identity(kind="schema", name="forge"),
|
|
113
|
+
describes_kind="taxonomy",
|
|
114
|
+
api_version="v2alpha",
|
|
115
|
+
schema_version=Version(major=2),
|
|
116
|
+
node_definitions=tuple(nd.identity for nd in ALL_NODE_DEFINITIONS),
|
|
117
|
+
wing_definitions=tuple(wd.identity for wd in ALL_WING_DEFINITIONS),
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
def register(self, manager: SchemaManager) -> None:
|
|
121
|
+
manager.register_schema(
|
|
122
|
+
self.schema_definition(),
|
|
123
|
+
node_definitions=self.node_definitions(),
|
|
124
|
+
wing_definitions=self.wing_definitions(),
|
|
125
|
+
relationship_definitions=self.relationship_definitions(),
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
# ------------------------------------------------------------------
|
|
129
|
+
# Optional template declarations
|
|
130
|
+
# ------------------------------------------------------------------
|
|
131
|
+
|
|
132
|
+
def creation_templates(self) -> dict[str, str]:
|
|
133
|
+
"""Return the 7 creation templates for Forge node types.
|
|
134
|
+
|
|
135
|
+
Templates are Jinja2-rendered ``.yaml.j2`` files that produce
|
|
136
|
+
the taxonomy YAML document when a node is created. The ``_base``
|
|
137
|
+
key provides a generic fallback for kinds without a dedicated
|
|
138
|
+
template.
|
|
139
|
+
|
|
140
|
+
Returns:
|
|
141
|
+
Mapping of kind name (or ``"_base"``) to template content.
|
|
142
|
+
"""
|
|
143
|
+
creation_dir = Path(__file__).parent / "templates" / "creation"
|
|
144
|
+
templates: dict[str, str] = {}
|
|
145
|
+
if not creation_dir.is_dir():
|
|
146
|
+
return templates
|
|
147
|
+
for template_file in sorted(creation_dir.glob("*.yaml.j2")):
|
|
148
|
+
if template_file.name.startswith("_"):
|
|
149
|
+
# _base.yaml.j2 → key "_base"
|
|
150
|
+
key = template_file.stem.split(".")[0] # "_base"
|
|
151
|
+
else:
|
|
152
|
+
# system.yaml.j2 → key "system"
|
|
153
|
+
key = template_file.stem.split(".")[0]
|
|
154
|
+
templates[key] = template_file.read_text(encoding="utf-8")
|
|
155
|
+
return templates
|
|
156
|
+
|
|
157
|
+
def scaffold_templates(self) -> dict[str, Path]:
|
|
158
|
+
"""Return scaffold template directories for layer variants.
|
|
159
|
+
|
|
160
|
+
Each subdirectory under ``templates/bundled/plugins/layer_types/``
|
|
161
|
+
is a scaffold variant (e.g. ``app-docker``, ``iac-terragrunt``).
|
|
162
|
+
Keys use the format ``layer:{variant}`` so the scaffolding plugin
|
|
163
|
+
can look up templates by ``(node_kind, scaffold_variant)``.
|
|
164
|
+
|
|
165
|
+
Returns:
|
|
166
|
+
Mapping of ``"layer:{variant}"`` to the scaffold directory path.
|
|
167
|
+
"""
|
|
168
|
+
scaffold_dir = Path(__file__).parent / "templates" / "scaffolds"
|
|
169
|
+
result: dict[str, Path] = {}
|
|
170
|
+
if not scaffold_dir.is_dir():
|
|
171
|
+
return result
|
|
172
|
+
for child in sorted(scaffold_dir.iterdir()):
|
|
173
|
+
if child.is_dir():
|
|
174
|
+
result[f"layer:{child.name}"] = child
|
|
175
|
+
return result
|
katalyst_forge/py.typed
ADDED
|
File without changes
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
"""Relationship definitions for the Forge bundle."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from katalyst_engine.core.identity import Identity
|
|
6
|
+
from katalyst_engine.core.relation import Cardinality
|
|
7
|
+
from katalyst_engine.schema.definition import RelationshipDefinition
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def _rel_id(name: str) -> Identity:
|
|
11
|
+
return Identity(kind="relationship_definition", name=name)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
# ── Structural wing ───────────────────────────────────────────────────
|
|
15
|
+
|
|
16
|
+
CHILD_OF_REL = RelationshipDefinition(
|
|
17
|
+
identity=_rel_id("child_of"),
|
|
18
|
+
describes_kind="child_of",
|
|
19
|
+
description="Hierarchical parent-child containment",
|
|
20
|
+
wing="structural",
|
|
21
|
+
display_order=10,
|
|
22
|
+
cardinality=Cardinality.MANY_TO_ONE,
|
|
23
|
+
directed=True,
|
|
24
|
+
structural=True,
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
EXTENDS_REL = RelationshipDefinition(
|
|
28
|
+
identity=_rel_id("extends"),
|
|
29
|
+
describes_kind="extends",
|
|
30
|
+
description="Node augments target with additional behavior or configuration",
|
|
31
|
+
wing="structural",
|
|
32
|
+
display_order=20,
|
|
33
|
+
cardinality=Cardinality.MANY_TO_MANY,
|
|
34
|
+
directed=True,
|
|
35
|
+
structural=True,
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
DEPENDS_ON_REL = RelationshipDefinition(
|
|
39
|
+
identity=_rel_id("depends_on"),
|
|
40
|
+
describes_kind="depends_on",
|
|
41
|
+
description="Runtime or build dependency between nodes",
|
|
42
|
+
wing="structural",
|
|
43
|
+
display_order=30,
|
|
44
|
+
cardinality=Cardinality.MANY_TO_MANY,
|
|
45
|
+
directed=True,
|
|
46
|
+
structural=True,
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
DEPLOYS_TO_REL = RelationshipDefinition(
|
|
50
|
+
identity=_rel_id("deploys_to"),
|
|
51
|
+
describes_kind="deploys_to",
|
|
52
|
+
description="Node is deployed to an environment",
|
|
53
|
+
wing="structural",
|
|
54
|
+
display_order=40,
|
|
55
|
+
cardinality=Cardinality.MANY_TO_MANY,
|
|
56
|
+
directed=True,
|
|
57
|
+
structural=True,
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
# ── Capability wing ──────────────────────────────────────────────────
|
|
61
|
+
|
|
62
|
+
PROVIDES_CAPABILITY_REL = RelationshipDefinition(
|
|
63
|
+
identity=_rel_id("provides_capability"),
|
|
64
|
+
describes_kind="provides_capability",
|
|
65
|
+
description="System, stack, or layer provides a capability",
|
|
66
|
+
wing="capability",
|
|
67
|
+
display_order=100,
|
|
68
|
+
cardinality=Cardinality.MANY_TO_MANY,
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
REQUIRES_CAPABILITY_REL = RelationshipDefinition(
|
|
72
|
+
identity=_rel_id("requires_capability"),
|
|
73
|
+
describes_kind="requires_capability",
|
|
74
|
+
description="User story requires a capability",
|
|
75
|
+
wing="capability",
|
|
76
|
+
display_order=110,
|
|
77
|
+
cardinality=Cardinality.MANY_TO_MANY,
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
DEPENDS_ON_CAPABILITY_REL = RelationshipDefinition(
|
|
81
|
+
identity=_rel_id("depends_on_capability"),
|
|
82
|
+
describes_kind="depends_on_capability",
|
|
83
|
+
description="Capability depends on another capability",
|
|
84
|
+
wing="capability",
|
|
85
|
+
display_order=120,
|
|
86
|
+
cardinality=Cardinality.MANY_TO_MANY,
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
SPECIFIES_CAPABILITY_REL = RelationshipDefinition(
|
|
90
|
+
identity=_rel_id("specifies_capability"),
|
|
91
|
+
describes_kind="specifies_capability",
|
|
92
|
+
description="Specification defines requirements for a capability",
|
|
93
|
+
wing="capability",
|
|
94
|
+
display_order=130,
|
|
95
|
+
cardinality=Cardinality.MANY_TO_MANY,
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
TESTS_CAPABILITY_REL = RelationshipDefinition(
|
|
99
|
+
identity=_rel_id("tests_capability"),
|
|
100
|
+
describes_kind="tests_capability",
|
|
101
|
+
description="Assertion verifies a capability",
|
|
102
|
+
wing="capability",
|
|
103
|
+
display_order=140,
|
|
104
|
+
cardinality=Cardinality.MANY_TO_MANY,
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
# ── Organizational wing ──────────────────────────────────────────────
|
|
108
|
+
|
|
109
|
+
FILLED_BY_REL = RelationshipDefinition(
|
|
110
|
+
identity=_rel_id("filled_by"),
|
|
111
|
+
describes_kind="filled_by",
|
|
112
|
+
description="Role is filled by team members",
|
|
113
|
+
wing="organizational",
|
|
114
|
+
display_order=200,
|
|
115
|
+
cardinality=Cardinality.MANY_TO_MANY,
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
DEVELOPS_COMPETENCY_REL = RelationshipDefinition(
|
|
119
|
+
identity=_rel_id("develops_competency"),
|
|
120
|
+
describes_kind="develops_competency",
|
|
121
|
+
description="Practice area develops a competency",
|
|
122
|
+
wing="organizational",
|
|
123
|
+
display_order=210,
|
|
124
|
+
cardinality=Cardinality.MANY_TO_MANY,
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
USES_TOOL_REL = RelationshipDefinition(
|
|
128
|
+
identity=_rel_id("uses_tool"),
|
|
129
|
+
describes_kind="uses_tool",
|
|
130
|
+
description="Practice area uses a tool",
|
|
131
|
+
wing="organizational",
|
|
132
|
+
display_order=220,
|
|
133
|
+
cardinality=Cardinality.MANY_TO_MANY,
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
REQUIRES_SKILL_REL = RelationshipDefinition(
|
|
137
|
+
identity=_rel_id("requires_skill"),
|
|
138
|
+
describes_kind="requires_skill",
|
|
139
|
+
description="Competency requires a skill",
|
|
140
|
+
wing="organizational",
|
|
141
|
+
display_order=230,
|
|
142
|
+
cardinality=Cardinality.MANY_TO_MANY,
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
# ── Verification wing ────────────────────────────────────────────────
|
|
146
|
+
|
|
147
|
+
VERIFIED_BY_REL = RelationshipDefinition(
|
|
148
|
+
identity=_rel_id("verified_by"),
|
|
149
|
+
describes_kind="verified_by",
|
|
150
|
+
description="Specification is verified by assertions",
|
|
151
|
+
wing="verification",
|
|
152
|
+
display_order=300,
|
|
153
|
+
cardinality=Cardinality.MANY_TO_MANY,
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
TESTS_SPECIFICATION_REL = RelationshipDefinition(
|
|
157
|
+
identity=_rel_id("tests_specification"),
|
|
158
|
+
describes_kind="tests_specification",
|
|
159
|
+
description="Assertion tests a specification",
|
|
160
|
+
wing="verification",
|
|
161
|
+
display_order=310,
|
|
162
|
+
cardinality=Cardinality.MANY_TO_MANY,
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
CAPTURES_STORY_REL = RelationshipDefinition(
|
|
166
|
+
identity=_rel_id("captures_story"),
|
|
167
|
+
describes_kind="captures_story",
|
|
168
|
+
description="Specification captures a user story",
|
|
169
|
+
wing="verification",
|
|
170
|
+
display_order=320,
|
|
171
|
+
cardinality=Cardinality.MANY_TO_MANY,
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
# ── Workflow wing ─────────────────────────────────────────────────────
|
|
175
|
+
|
|
176
|
+
BLOCKS_REL = RelationshipDefinition(
|
|
177
|
+
identity=_rel_id("blocks"),
|
|
178
|
+
describes_kind="blocks",
|
|
179
|
+
description="Work item blocks another work item",
|
|
180
|
+
wing="workflow",
|
|
181
|
+
display_order=400,
|
|
182
|
+
cardinality=Cardinality.MANY_TO_MANY,
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
BLOCKED_BY_REL = RelationshipDefinition(
|
|
186
|
+
identity=_rel_id("blocked_by"),
|
|
187
|
+
describes_kind="blocked_by",
|
|
188
|
+
description="Work item is blocked by another work item",
|
|
189
|
+
wing="workflow",
|
|
190
|
+
display_order=410,
|
|
191
|
+
cardinality=Cardinality.MANY_TO_MANY,
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
SUPERSEDED_BY_REL = RelationshipDefinition(
|
|
195
|
+
identity=_rel_id("superseded_by"),
|
|
196
|
+
describes_kind="superseded_by",
|
|
197
|
+
description="ADR is superseded by another ADR",
|
|
198
|
+
wing="workflow",
|
|
199
|
+
display_order=420,
|
|
200
|
+
cardinality=Cardinality.MANY_TO_ONE,
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
REFERENCES_ROAD_ITEM_REL = RelationshipDefinition(
|
|
204
|
+
identity=_rel_id("references_road_item"),
|
|
205
|
+
describes_kind="references_road_item",
|
|
206
|
+
description="Change entry references a road item",
|
|
207
|
+
wing="workflow",
|
|
208
|
+
display_order=430,
|
|
209
|
+
cardinality=Cardinality.MANY_TO_ONE,
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
# ── Pipeline wing ────────────────────────────────────────────────────
|
|
213
|
+
|
|
214
|
+
STAGE_DEPENDS_ON_REL = RelationshipDefinition(
|
|
215
|
+
identity=_rel_id("stage_depends_on"),
|
|
216
|
+
describes_kind="stage_depends_on",
|
|
217
|
+
description="CI/CD stage depends on another stage",
|
|
218
|
+
wing="pipeline",
|
|
219
|
+
display_order=500,
|
|
220
|
+
cardinality=Cardinality.MANY_TO_MANY,
|
|
221
|
+
)
|
|
222
|
+
|
|
223
|
+
BELONGS_TO_STAGE_REL = RelationshipDefinition(
|
|
224
|
+
identity=_rel_id("belongs_to_stage"),
|
|
225
|
+
describes_kind="belongs_to_stage",
|
|
226
|
+
description="CI/CD job template belongs to a stage",
|
|
227
|
+
wing="pipeline",
|
|
228
|
+
display_order=510,
|
|
229
|
+
cardinality=Cardinality.MANY_TO_ONE,
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
# ── Aggregate list ────────────────────────────────────────────────────
|
|
233
|
+
|
|
234
|
+
ALL_RELATIONSHIP_DEFINITIONS: list[RelationshipDefinition] = [
|
|
235
|
+
# structural
|
|
236
|
+
CHILD_OF_REL,
|
|
237
|
+
EXTENDS_REL,
|
|
238
|
+
DEPENDS_ON_REL,
|
|
239
|
+
DEPLOYS_TO_REL,
|
|
240
|
+
# capability
|
|
241
|
+
PROVIDES_CAPABILITY_REL,
|
|
242
|
+
REQUIRES_CAPABILITY_REL,
|
|
243
|
+
DEPENDS_ON_CAPABILITY_REL,
|
|
244
|
+
SPECIFIES_CAPABILITY_REL,
|
|
245
|
+
TESTS_CAPABILITY_REL,
|
|
246
|
+
# organizational
|
|
247
|
+
FILLED_BY_REL,
|
|
248
|
+
DEVELOPS_COMPETENCY_REL,
|
|
249
|
+
USES_TOOL_REL,
|
|
250
|
+
REQUIRES_SKILL_REL,
|
|
251
|
+
# verification
|
|
252
|
+
VERIFIED_BY_REL,
|
|
253
|
+
TESTS_SPECIFICATION_REL,
|
|
254
|
+
CAPTURES_STORY_REL,
|
|
255
|
+
# workflow
|
|
256
|
+
BLOCKS_REL,
|
|
257
|
+
BLOCKED_BY_REL,
|
|
258
|
+
SUPERSEDED_BY_REL,
|
|
259
|
+
REFERENCES_ROAD_ITEM_REL,
|
|
260
|
+
# pipeline
|
|
261
|
+
STAGE_DEPENDS_ON_REL,
|
|
262
|
+
BELONGS_TO_STAGE_REL,
|
|
263
|
+
]
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
apiVersion: katalyst.taxonomy/v2alpha
|
|
2
|
+
kind: {{ node_type }}
|
|
3
|
+
metadata:
|
|
4
|
+
name: "{{ name }}"
|
|
5
|
+
spec:
|
|
6
|
+
description: "{{ description }}"
|
|
7
|
+
owners:
|
|
8
|
+
- "{{ primary_owner }}"
|
|
9
|
+
annotations:
|
|
10
|
+
templateVersion: "{{ template_version }}"
|
|
11
|
+
{{ parents_block }} environments:
|
|
12
|
+
{{ environments_block }}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
apiVersion: katalyst.taxonomy/v2alpha
|
|
2
|
+
kind: layer
|
|
3
|
+
metadata:
|
|
4
|
+
name: "{{ name }}"
|
|
5
|
+
spec:
|
|
6
|
+
description: "{{ description }}"
|
|
7
|
+
owners:
|
|
8
|
+
- "{{ primary_owner }}"
|
|
9
|
+
annotations:
|
|
10
|
+
layout: root
|
|
11
|
+
layerType: "{{ layer_type }}"
|
|
12
|
+
templateVersion: "{{ template_version }}"
|
|
13
|
+
layerTypeVersion: "{{ layer_type_version }}"
|
|
14
|
+
parents:
|
|
15
|
+
node: "{{ parent_stack }}"
|
|
16
|
+
environments:
|
|
17
|
+
{{ environments_block }}
|
|
18
|
+
dependsOn:
|
|
19
|
+
nodes:
|
|
20
|
+
- "{{ parent_stack }}"
|
|
21
|
+
extensions: {}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
apiVersion: katalyst.taxonomy/v2alpha
|
|
2
|
+
kind: project
|
|
3
|
+
metadata:
|
|
4
|
+
name: "{{ name }}"
|
|
5
|
+
spec:
|
|
6
|
+
description: "{{ description }}"
|
|
7
|
+
owners:
|
|
8
|
+
- "{{ primary_owner }}"
|
|
9
|
+
annotations:
|
|
10
|
+
templateVersion: "{{ template_version }}"
|
|
11
|
+
parents:
|
|
12
|
+
node: "{{ parent }}"
|
|
13
|
+
environments:
|
|
14
|
+
{{ environments_block }}
|
|
15
|
+
project:
|
|
16
|
+
status: active
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
apiVersion: katalyst.taxonomy/v2alpha
|
|
2
|
+
kind: stack
|
|
3
|
+
metadata:
|
|
4
|
+
name: "{{ name }}"
|
|
5
|
+
spec:
|
|
6
|
+
description: "{{ description }}"
|
|
7
|
+
owners:
|
|
8
|
+
- "{{ primary_owner }}"
|
|
9
|
+
annotations:
|
|
10
|
+
layout: root
|
|
11
|
+
templateVersion: "{{ template_version }}"
|
|
12
|
+
parents:
|
|
13
|
+
node: "{{ parent_system }}"
|
|
14
|
+
environments:
|
|
15
|
+
{{ environments_block }}
|
|
16
|
+
dependsOn:
|
|
17
|
+
nodes:
|
|
18
|
+
- "{{ parent_system }}"
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
apiVersion: katalyst.taxonomy/v2alpha
|
|
2
|
+
kind: system
|
|
3
|
+
metadata:
|
|
4
|
+
name: "{{ name }}"
|
|
5
|
+
spec:
|
|
6
|
+
description: "{{ description }}"
|
|
7
|
+
owners:
|
|
8
|
+
- "{{ primary_owner }}"
|
|
9
|
+
annotations:
|
|
10
|
+
layout: root
|
|
11
|
+
templateVersion: "{{ template_version }}"
|
|
12
|
+
{{ parents_block }} environments:
|
|
13
|
+
{{ environments_block }}
|
|
14
|
+
dependsOn:
|
|
15
|
+
nodes: []
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
apiVersion: katalyst.taxonomy/v2alpha
|
|
2
|
+
kind: team
|
|
3
|
+
metadata:
|
|
4
|
+
name: "{{ name }}"
|
|
5
|
+
spec:
|
|
6
|
+
description: "{{ description }}"
|
|
7
|
+
owners:
|
|
8
|
+
- "{{ primary_owner }}"
|
|
9
|
+
annotations:
|
|
10
|
+
templateVersion: "{{ template_version }}"
|
|
11
|
+
parents:
|
|
12
|
+
node: "{{ parent }}"
|
|
13
|
+
environments:
|
|
14
|
+
{{ environments_block }}
|
|
15
|
+
team:
|
|
16
|
+
unitType: squad
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
apiVersion: katalyst.taxonomy/v2alpha
|
|
2
|
+
kind: team_member
|
|
3
|
+
metadata:
|
|
4
|
+
name: "{{ name }}"
|
|
5
|
+
spec:
|
|
6
|
+
description: "{{ description }}"
|
|
7
|
+
owners:
|
|
8
|
+
- "{{ primary_owner }}"
|
|
9
|
+
annotations:
|
|
10
|
+
templateVersion: "{{ template_version }}"
|
|
11
|
+
parents:
|
|
12
|
+
node: "{{ parent }}"
|
|
13
|
+
environments:
|
|
14
|
+
{{ environments_block }}
|
|
15
|
+
teamMember:
|
|
16
|
+
role: engineer
|
|
17
|
+
email: "{{ primary_owner }}"
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Git
|
|
2
|
+
.git
|
|
3
|
+
.gitignore
|
|
4
|
+
|
|
5
|
+
# Documentation
|
|
6
|
+
*.md
|
|
7
|
+
docs/
|
|
8
|
+
|
|
9
|
+
# Tests
|
|
10
|
+
tests/
|
|
11
|
+
test/
|
|
12
|
+
__tests__/
|
|
13
|
+
*.test.js
|
|
14
|
+
*.spec.js
|
|
15
|
+
coverage/
|
|
16
|
+
|
|
17
|
+
# Development files
|
|
18
|
+
.env.local
|
|
19
|
+
.env.development
|
|
20
|
+
.env*.local
|
|
21
|
+
*.log
|
|
22
|
+
|
|
23
|
+
# IDE and editor
|
|
24
|
+
.idea/
|
|
25
|
+
.vscode/
|
|
26
|
+
*.swp
|
|
27
|
+
*.swo
|
|
28
|
+
*~
|
|
29
|
+
|
|
30
|
+
# OS files
|
|
31
|
+
.DS_Store
|
|
32
|
+
Thumbs.db
|
|
33
|
+
|
|
34
|
+
# Node.js
|
|
35
|
+
node_modules/
|
|
36
|
+
npm-debug.log*
|
|
37
|
+
|
|
38
|
+
# Build artifacts (if building outside Docker)
|
|
39
|
+
dist/
|
|
40
|
+
build/
|
|
41
|
+
*.tsbuildinfo
|
|
42
|
+
|
|
43
|
+
# Taxonomy files (not needed in container)
|
|
44
|
+
layer.yaml
|
|
45
|
+
*.yaml
|
|
46
|
+
!docker-compose.yaml
|
|
47
|
+
|
|
48
|
+
# Docker files (avoid recursion)
|
|
49
|
+
Dockerfile*
|
|
50
|
+
docker-compose*.yaml
|
|
51
|
+
.dockerignore
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Environment configuration for {{ layer_name }}
|
|
2
|
+
# Copy this file to .env and adjust values for your environment
|
|
3
|
+
|
|
4
|
+
# Application
|
|
5
|
+
NODE_ENV=development
|
|
6
|
+
LOG_LEVEL=debug
|
|
7
|
+
|
|
8
|
+
# Server
|
|
9
|
+
HOST_PORT=8080
|
|
10
|
+
|
|
11
|
+
# Add your environment-specific variables below
|
|
12
|
+
# DATABASE_URL=postgres://user:pass@localhost:5432/db
|
|
13
|
+
# REDIS_URL=redis://localhost:6379
|
|
14
|
+
# API_KEY=your-api-key
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# {{ system_name }}/{{ stack_name }}/{{ layer_name }} layer
|
|
2
|
+
|
|
3
|
+
Layer type: app-docker
|
|
4
|
+
|
|
5
|
+
This scaffold creates a Docker-based application structure:
|
|
6
|
+
|
|
7
|
+
- `layer.yaml` - taxonomy node descriptor.
|
|
8
|
+
- `Dockerfile` - multi-stage Docker build.
|
|
9
|
+
- `docker-compose.yaml` - local development orchestration.
|
|
10
|
+
- `.dockerignore` - files excluded from Docker context.
|
|
11
|
+
- `<environment>/` - environment-specific configuration.
|
|
12
|
+
|
|
13
|
+
Copy `env-template/` for each environment and adjust the configuration files.
|
|
14
|
+
|
|
15
|
+
## Local Development
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
# Build the image
|
|
19
|
+
docker compose build
|
|
20
|
+
|
|
21
|
+
# Run locally
|
|
22
|
+
docker compose up
|
|
23
|
+
|
|
24
|
+
# Run with environment overrides
|
|
25
|
+
docker compose --env-file ./dev/.env up
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Building for Production
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
# Build with specific tag
|
|
32
|
+
docker build -t {{ layer_name }}:latest .
|
|
33
|
+
|
|
34
|
+
# Build for specific environment
|
|
35
|
+
docker build --build-arg ENVIRONMENT=prod -t {{ layer_name }}:prod .
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
<!-- BEGIN AUTO-LAYER -->
|
|
39
|
+
<!-- This section is managed by scripts. Manual edits inside may be overwritten. -->
|
|
40
|
+
<!-- END AUTO-LAYER -->
|