@a5c-ai/kradle 5.0.1-staging.3abdf9534c25

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 (295) hide show
  1. package/Dockerfile +31 -0
  2. package/README.md +187 -0
  3. package/bin/kradle-demo.mjs +23 -0
  4. package/bin/kradle-server.mjs +14 -0
  5. package/dist/kradle-controller-ui.json +3482 -0
  6. package/dist/kradle-lifecycle.json +201 -0
  7. package/dist/kradle-runtime-snapshot.json +3125 -0
  8. package/dist/kradle-summary.json +724 -0
  9. package/docs/README.md +61 -0
  10. package/docs/agents/README.md +83 -0
  11. package/docs/agents/acceptance-test-matrix.md +193 -0
  12. package/docs/agents/agent-mux-adapter-contract.md +167 -0
  13. package/docs/agents/agent-mux-source-map.md +310 -0
  14. package/docs/agents/agent-run-memory-import-spec.md +256 -0
  15. package/docs/agents/agent-stack-management-spec.md +421 -0
  16. package/docs/agents/api-contract-spec.md +309 -0
  17. package/docs/agents/artifacts-writeback-spec.md +145 -0
  18. package/docs/agents/chart-packaging-spec.md +128 -0
  19. package/docs/agents/ci-orchestration-spec.md +140 -0
  20. package/docs/agents/context-assembly-spec.md +219 -0
  21. package/docs/agents/controller-reconciliation-spec.md +255 -0
  22. package/docs/agents/crd-schema-spec.md +315 -0
  23. package/docs/agents/decision-log-open-questions.md +169 -0
  24. package/docs/agents/developer-implementation-checklist.md +329 -0
  25. package/docs/agents/dispatching-design.md +262 -0
  26. package/docs/agents/gaps-agent-mux-to-kradle-crds.md +298 -0
  27. package/docs/agents/glossary.md +66 -0
  28. package/docs/agents/implementation-blueprint.md +324 -0
  29. package/docs/agents/implementation-rollout-slices.md +251 -0
  30. package/docs/agents/memory-context-integration-spec.md +194 -0
  31. package/docs/agents/memory-ontology-schema-spec.md +253 -0
  32. package/docs/agents/memory-operations-runbook.md +121 -0
  33. package/docs/agents/mvp-vertical-slice-spec.md +146 -0
  34. package/docs/agents/observability-audit-spec.md +265 -0
  35. package/docs/agents/operator-runbook.md +174 -0
  36. package/docs/agents/org-memory-api-payload-examples.md +333 -0
  37. package/docs/agents/org-memory-controller-sequence-spec.md +181 -0
  38. package/docs/agents/org-memory-e2e-fixture-plan.md +161 -0
  39. package/docs/agents/org-memory-ui-implementation-map.md +114 -0
  40. package/docs/agents/org-memory-vertical-slice-spec.md +168 -0
  41. package/docs/agents/org-resource-model-delta-spec.md +111 -0
  42. package/docs/agents/org-route-resource-model-spec.md +183 -0
  43. package/docs/agents/org-scoping-namespace-spec.md +114 -0
  44. package/docs/agents/rbac-secrets-management-spec.md +406 -0
  45. package/docs/agents/repository-page-integration-spec.md +255 -0
  46. package/docs/agents/resource-contract-examples.md +808 -0
  47. package/docs/agents/resource-relationship-map.md +190 -0
  48. package/docs/agents/security-threat-model.md +188 -0
  49. package/docs/agents/shared-memory-company-brain-spec.md +358 -0
  50. package/docs/agents/storage-migration-spec.md +168 -0
  51. package/docs/agents/subagent-orchestration-spec.md +152 -0
  52. package/docs/agents/system-overview.md +88 -0
  53. package/docs/agents/tools-mcp-skills-spec.md +189 -0
  54. package/docs/agents/traceability-matrix.md +79 -0
  55. package/docs/agents/ui-flow-spec.md +211 -0
  56. package/docs/agents/ui-ux-system-spec.md +426 -0
  57. package/docs/agents/workspace-lifecycle-spec.md +166 -0
  58. package/docs/architecture-spec.md +78 -0
  59. package/docs/architecture-v2.md +2759 -0
  60. package/docs/components/control-plane.md +78 -0
  61. package/docs/components/data-plane.md +69 -0
  62. package/docs/components/hooks-events.md +67 -0
  63. package/docs/components/identity-rbac-policy.md +73 -0
  64. package/docs/components/kubevela-oam.md +70 -0
  65. package/docs/components/operations-publishing.md +81 -0
  66. package/docs/components/runners-ci.md +66 -0
  67. package/docs/components/web-ui.md +94 -0
  68. package/docs/crd-behaviors-and-relationships.md +3926 -0
  69. package/docs/external/README.md +47 -0
  70. package/docs/external/bidirectional-sync-design.md +134 -0
  71. package/docs/external/cicd-interface.md +64 -0
  72. package/docs/external/external-backend-controllers.md +170 -0
  73. package/docs/external/external-backend-crds.md +234 -0
  74. package/docs/external/external-backend-ui-spec.md +151 -0
  75. package/docs/external/external-backend-ux-flows.md +115 -0
  76. package/docs/external/external-object-mapping.md +125 -0
  77. package/docs/external/git-forge-interface.md +68 -0
  78. package/docs/external/github-integration-design.md +151 -0
  79. package/docs/external/issue-tracking-interface.md +66 -0
  80. package/docs/external/provider-capability-manifests.md +204 -0
  81. package/docs/external/provider-catalog.md +139 -0
  82. package/docs/external/provider-rollout-testing.md +78 -0
  83. package/docs/external/research-results.md +48 -0
  84. package/docs/external/security-auth-permissions.md +81 -0
  85. package/docs/external/sync-state-machines.md +108 -0
  86. package/docs/external/unified-external-backend-model.md +107 -0
  87. package/docs/external/user-facing-changes.md +67 -0
  88. package/docs/gaps.md +161 -0
  89. package/docs/install.md +94 -0
  90. package/docs/integration-and-design-decisions.md +1530 -0
  91. package/docs/kradle-design.md +334 -0
  92. package/docs/local-minikube.md +55 -0
  93. package/docs/ontology/README.md +32 -0
  94. package/docs/ontology/bounded-contexts.md +29 -0
  95. package/docs/ontology/events-and-hooks.md +32 -0
  96. package/docs/ontology/oam-kubevela.md +32 -0
  97. package/docs/ontology/operations-and-release.md +25 -0
  98. package/docs/ontology/personas-and-actors.md +32 -0
  99. package/docs/ontology/policies-and-invariants.md +33 -0
  100. package/docs/ontology/problem-space.md +30 -0
  101. package/docs/ontology/resource-contracts.md +40 -0
  102. package/docs/ontology/resource-taxonomy.md +42 -0
  103. package/docs/ontology/runners-and-ci.md +29 -0
  104. package/docs/ontology/solution-space.md +24 -0
  105. package/docs/ontology/storage-and-data-boundaries.md +29 -0
  106. package/docs/ontology/validation-matrix.md +24 -0
  107. package/docs/ontology/web-ui-excellent-flows.md +32 -0
  108. package/docs/ontology/workflows.md +39 -0
  109. package/docs/ontology/world.md +35 -0
  110. package/docs/openapi.yaml +1291 -0
  111. package/docs/product-requirements.md +62 -0
  112. package/docs/requirements-v2.md +235 -0
  113. package/docs/roadmap-mvp.md +87 -0
  114. package/docs/sdk-api-reference.md +1108 -0
  115. package/docs/system-requirements.md +90 -0
  116. package/docs/system-spec-v2.md +1230 -0
  117. package/docs/tests/README.md +53 -0
  118. package/docs/tests/agent-qa-plan.md +63 -0
  119. package/docs/tests/browser-ui-tests.md +62 -0
  120. package/docs/tests/ci-quality-gates.md +48 -0
  121. package/docs/tests/coverage-model.md +64 -0
  122. package/docs/tests/e2e-scenario-tests.md +53 -0
  123. package/docs/tests/fixtures-test-data.md +63 -0
  124. package/docs/tests/observability-reliability-tests.md +54 -0
  125. package/docs/tests/product-test-matrix.md +145 -0
  126. package/docs/tests/qa-adoption-roadmap.md +130 -0
  127. package/docs/tests/qa-automation-plan.md +101 -0
  128. package/docs/tests/security-compliance-tests.md +57 -0
  129. package/docs/tests/test-framework-tools.md +88 -0
  130. package/docs/tests/test-suite-layout.md +121 -0
  131. package/docs/tests/unit-integration-tests.md +48 -0
  132. package/docs/todo-kyverno +714 -0
  133. package/docs/todos.md +4 -0
  134. package/docs/user-stories.md +78 -0
  135. package/docs/web-console-spec.md +533 -0
  136. package/examples/minikube-demo.yaml +190 -0
  137. package/examples/oam-application.yaml +23 -0
  138. package/examples/policy-kyverno-pr-title.yaml +18 -0
  139. package/package.json +66 -0
  140. package/scripts/build.mjs +29 -0
  141. package/scripts/setup-minikube.mjs +65 -0
  142. package/scripts/smoke.mjs +37 -0
  143. package/scripts/validate-doc-coverage.mjs +152 -0
  144. package/scripts/validate-package.mjs +95 -0
  145. package/scripts/validate-ui.mjs +305 -0
  146. package/src/agent-adapter-controller.js +169 -0
  147. package/src/agent-approval-controller.js +170 -0
  148. package/src/agent-context-bundles.js +242 -0
  149. package/src/agent-dispatch-controller.js +549 -0
  150. package/src/agent-gateway-config-controller.js +147 -0
  151. package/src/agent-identity-migration.js +115 -0
  152. package/src/agent-memory-controller.js +357 -0
  153. package/src/agent-memory-import.js +327 -0
  154. package/src/agent-memory-query.js +292 -0
  155. package/src/agent-memory-repository-source-controller.js +255 -0
  156. package/src/agent-mux-client.js +589 -0
  157. package/src/agent-permission-review.js +250 -0
  158. package/src/agent-persona-controller.js +135 -0
  159. package/src/agent-project-controller.js +117 -0
  160. package/src/agent-prompt-composition.js +55 -0
  161. package/src/agent-provider-config-controller.js +151 -0
  162. package/src/agent-secret-config-grant-controller.js +282 -0
  163. package/src/agent-session-transcript-controller.js +189 -0
  164. package/src/agent-stack-controller.js +421 -0
  165. package/src/agent-subagent-controller.js +160 -0
  166. package/src/agent-transport-binding-controller.js +121 -0
  167. package/src/agent-trigger-controller.js +387 -0
  168. package/src/agent-workspace-controller.js +702 -0
  169. package/src/agent-writeback-controller.js +302 -0
  170. package/src/api-controller.js +621 -0
  171. package/src/argocd-gitops.js +43 -0
  172. package/src/artifact-registry-controller.js +542 -0
  173. package/src/assistant-runtime.js +284 -0
  174. package/src/async-controller.js +207 -0
  175. package/src/audit-controller.js +191 -0
  176. package/src/auth.js +310 -0
  177. package/src/component-catalog.js +41 -0
  178. package/src/control-plane.js +136 -0
  179. package/src/controller-client.js +112 -0
  180. package/src/controller-ui.js +620 -0
  181. package/src/data-plane.js +179 -0
  182. package/src/event-bus.js +397 -0
  183. package/src/external/conflict-controller.js +225 -0
  184. package/src/external/github/auth.js +96 -0
  185. package/src/external/github/cicd.js +180 -0
  186. package/src/external/github/git-forge.js +240 -0
  187. package/src/external/github/index.js +144 -0
  188. package/src/external/github/issue-tracking.js +163 -0
  189. package/src/external/provider-adapter.js +161 -0
  190. package/src/external/provider-resource-factory.js +221 -0
  191. package/src/external/sync-controller.js +235 -0
  192. package/src/external/webhook-controller.js +144 -0
  193. package/src/external/write-controller.js +283 -0
  194. package/src/gitea-backend.js +131 -0
  195. package/src/gitea-service.js +173 -0
  196. package/src/handoff.js +98 -0
  197. package/src/health-probes.js +134 -0
  198. package/src/hooks-events.js +63 -0
  199. package/src/hooks-lifecycle.js +117 -0
  200. package/src/http-server.js +409 -0
  201. package/src/identity-policy.js +86 -0
  202. package/src/index.js +71 -0
  203. package/src/jitsi-agent-bridge.js +141 -0
  204. package/src/jitsi-meeting-controller.js +291 -0
  205. package/src/jitsi-sync-controller.js +198 -0
  206. package/src/kradle-inference-service-controller.js +246 -0
  207. package/src/kubernetes-controller-async.js +531 -0
  208. package/src/kubernetes-controller.js +904 -0
  209. package/src/kubernetes-resource-gateway.js +48 -0
  210. package/src/model-route-controller.js +364 -0
  211. package/src/notification-controller.js +178 -0
  212. package/src/operations.js +112 -0
  213. package/src/org-scoping.js +5 -0
  214. package/src/resource-model.js +282 -0
  215. package/src/runner-controller.js +272 -0
  216. package/src/runners-ci.js +48 -0
  217. package/src/runtime.js +196 -0
  218. package/src/snapshot-cache.js +157 -0
  219. package/src/virtual-model-controller.js +538 -0
  220. package/src/virtual-model-hook-bridge.js +200 -0
  221. package/src/web-ui.js +40 -0
  222. package/tests/agent-adapter-controller.test.js +361 -0
  223. package/tests/agent-approval-controller.test.js +173 -0
  224. package/tests/agent-context-bundles.test.js +278 -0
  225. package/tests/agent-dispatch-controller.test.js +679 -0
  226. package/tests/agent-gateway-config-controller.test.js +386 -0
  227. package/tests/agent-identity-migration.test.js +87 -0
  228. package/tests/agent-memory-controller.test.js +461 -0
  229. package/tests/agent-memory-import-snapshot.test.js +477 -0
  230. package/tests/agent-memory-query.test.js +404 -0
  231. package/tests/agent-memory-repository-source.test.js +514 -0
  232. package/tests/agent-mux-client.test.js +389 -0
  233. package/tests/agent-mux-integration.test.js +971 -0
  234. package/tests/agent-permission-review-v2.test.js +317 -0
  235. package/tests/agent-permission-review.test.js +209 -0
  236. package/tests/agent-persona-controller.test.js +127 -0
  237. package/tests/agent-project-controller.test.js +302 -0
  238. package/tests/agent-prompt-composition.test.js +76 -0
  239. package/tests/agent-provider-config-controller.test.js +376 -0
  240. package/tests/agent-resources.test.js +303 -0
  241. package/tests/agent-secret-config-grant.test.js +231 -0
  242. package/tests/agent-session-transcript-controller.test.js +499 -0
  243. package/tests/agent-stack-controller.test.js +283 -0
  244. package/tests/agent-subagent-controller.test.js +201 -0
  245. package/tests/agent-transport-binding-controller.test.js +294 -0
  246. package/tests/agent-trigger-controller.test.js +271 -0
  247. package/tests/agent-trigger-routes.test.js +190 -0
  248. package/tests/agent-trigger-sources.test.js +245 -0
  249. package/tests/agent-workspace-controller.test.js +181 -0
  250. package/tests/agent-writeback.test.js +292 -0
  251. package/tests/approval-persistence.test.js +171 -0
  252. package/tests/artifact-registry.test.js +511 -0
  253. package/tests/assistant-runtime.test.js +506 -0
  254. package/tests/async-controller.test.js +252 -0
  255. package/tests/audit-controller.test.js +227 -0
  256. package/tests/codespace-controller.test.js +318 -0
  257. package/tests/controller-client.test.js +133 -0
  258. package/tests/deployment.test.js +527 -0
  259. package/tests/e2e/lifecycle.test.js +120 -0
  260. package/tests/event-bus-integration.test.js +355 -0
  261. package/tests/external-github-forge.test.js +560 -0
  262. package/tests/external-github-issues-cicd.test.js +520 -0
  263. package/tests/external-integration.test.js +470 -0
  264. package/tests/external-persistence.test.js +415 -0
  265. package/tests/external-provider-adapter.test.js +365 -0
  266. package/tests/external-resource-model.test.js +223 -0
  267. package/tests/external-webhook-sync.test.js +287 -0
  268. package/tests/external-write-conflict.test.js +353 -0
  269. package/tests/gitea-service.test.js +253 -0
  270. package/tests/health-check-real.test.js +165 -0
  271. package/tests/health-probes.test.js +90 -0
  272. package/tests/hooks-lifecycle.test.js +364 -0
  273. package/tests/integration/full-flow.test.js +266 -0
  274. package/tests/jitsi-agent-bridge.test.js +119 -0
  275. package/tests/jitsi-helm-integration.test.js +77 -0
  276. package/tests/jitsi-meeting-controller.test.js +170 -0
  277. package/tests/jitsi-resource-model.test.js +73 -0
  278. package/tests/jitsi-sync-controller.test.js +112 -0
  279. package/tests/kradle-inference-service.test.js +689 -0
  280. package/tests/kradle.test.js +779 -0
  281. package/tests/memory-search-wiring.test.js +270 -0
  282. package/tests/model-route-controller.test.js +733 -0
  283. package/tests/notification-controller.test.js +196 -0
  284. package/tests/notification-integration.test.js +179 -0
  285. package/tests/org-scoping.test.js +687 -0
  286. package/tests/runner-controller.test.js +327 -0
  287. package/tests/runner-integration.test.js +231 -0
  288. package/tests/session-cookie-hmac.test.js +151 -0
  289. package/tests/snapshot-performance.test.js +315 -0
  290. package/tests/sse-events.test.js +107 -0
  291. package/tests/virtual-model-controller.test.js +877 -0
  292. package/tests/virtual-model-hook-bridge.test.js +384 -0
  293. package/tests/webhook-trigger.test.js +198 -0
  294. package/tests/workspace-volumes.test.js +312 -0
  295. package/tests/writeback-persistence.test.js +207 -0
@@ -0,0 +1,190 @@
1
+ apiVersion: kradle.a5c.ai/v1alpha1
2
+ kind: Organization
3
+ metadata:
4
+ name: kradle
5
+ namespace: kradle-system
6
+ spec:
7
+ displayName: Kradle
8
+ description: Kradle-managed default organization
9
+ owners:
10
+ - platform
11
+ slug: kradle
12
+ namespaceName: kradle-org-kradle
13
+ ---
14
+ apiVersion: kradle.a5c.ai/v1alpha1
15
+ kind: SSHKey
16
+ metadata:
17
+ name: platform-deploy
18
+ namespace: kradle-org-kradle
19
+ labels:
20
+ kradle.a5c.ai/org: kradle
21
+ kradle.a5c.ai/namespace: kradle-org-kradle
22
+ spec:
23
+ scope: deploy
24
+ owner: kradle
25
+ repository: kradle-demo
26
+ title: platform deploy key
27
+ key: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKradleDemoKey platform@example.test
28
+ readOnly: true
29
+ organizationRef: kradle
30
+ ---
31
+ apiVersion: kradle.a5c.ai/v1alpha1
32
+ kind: RepositoryPermission
33
+ metadata:
34
+ name: kradle-demo-maintainers
35
+ namespace: kradle-org-kradle
36
+ labels:
37
+ kradle.a5c.ai/org: kradle
38
+ kradle.a5c.ai/namespace: kradle-org-kradle
39
+ spec:
40
+ repository: kradle-demo
41
+ subjectKind: team
42
+ subject: maintainers
43
+ permission: admin
44
+ organizationRef: kradle
45
+ ---
46
+ apiVersion: kradle.a5c.ai/v1alpha1
47
+ kind: Repository
48
+ metadata:
49
+ name: kradle-demo
50
+ namespace: kradle-org-kradle
51
+ labels:
52
+ kradle.a5c.ai/org: kradle
53
+ kradle.a5c.ai/namespace: kradle-org-kradle
54
+ spec:
55
+ visibility: internal
56
+ defaultBranch: main
57
+ organizationRef: kradle
58
+ ---
59
+ apiVersion: kradle.a5c.ai/v1alpha1
60
+ kind: BranchProtection
61
+ metadata:
62
+ name: main-protection
63
+ namespace: kradle-org-kradle
64
+ labels:
65
+ kradle.a5c.ai/org: kradle
66
+ kradle.a5c.ai/namespace: kradle-org-kradle
67
+ spec:
68
+ refs:
69
+ - refs/heads/main
70
+ requirePullRequest: true
71
+ organizationRef: kradle
72
+ ---
73
+ apiVersion: kradle.a5c.ai/v1alpha1
74
+ kind: RefPolicy
75
+ metadata:
76
+ name: deny-internal-refs
77
+ namespace: kradle-org-kradle
78
+ labels:
79
+ kradle.a5c.ai/org: kradle
80
+ kradle.a5c.ai/namespace: kradle-org-kradle
81
+ spec:
82
+ deny:
83
+ - refs/internal/
84
+ organizationRef: kradle
85
+ ---
86
+ apiVersion: kradle.a5c.ai/v1alpha1
87
+ kind: RunnerPool
88
+ metadata:
89
+ name: trusted-linux
90
+ namespace: kradle-org-kradle
91
+ labels:
92
+ kradle.a5c.ai/org: kradle
93
+ kradle.a5c.ai/namespace: kradle-org-kradle
94
+ spec:
95
+ warmReplicas: 1
96
+ maxReplicas: 4
97
+ organizationRef: kradle
98
+ ---
99
+ apiVersion: kradle.a5c.ai/v1alpha1
100
+ kind: WebhookSubscription
101
+ metadata:
102
+ name: chatops
103
+ namespace: kradle-org-kradle
104
+ labels:
105
+ kradle.a5c.ai/org: kradle
106
+ kradle.a5c.ai/namespace: kradle-org-kradle
107
+ spec:
108
+ url: https://hooks.example.test/kradle
109
+ events:
110
+ - pullrequest.created
111
+ organizationRef: kradle
112
+ ---
113
+ apiVersion: kradle.a5c.ai/v1alpha1
114
+ kind: Pipeline
115
+ metadata:
116
+ name: demo-pr-checks
117
+ labels:
118
+ repository: kradle-demo
119
+ workflow: pull-request
120
+ kradle.a5c.ai/org: kradle
121
+ kradle.a5c.ai/namespace: kradle-org-kradle
122
+ namespace: kradle-org-kradle
123
+ spec:
124
+ repository: kradle-demo
125
+ ref: refs/pull/1/head
126
+ runnerPool: trusted-linux
127
+ trustTier: trusted
128
+ steps:
129
+ - checkout
130
+ - test
131
+ - publish
132
+ organizationRef: kradle
133
+ ---
134
+ apiVersion: argoproj.io/v1alpha1
135
+ kind: Application
136
+ metadata:
137
+ name: kradle-demo
138
+ namespace: argocd
139
+ spec:
140
+ project: default
141
+ source:
142
+ repoURL: https://gitea-http.kradle-system.svc.cluster.local/kradle/platform-config.git
143
+ targetRevision: main
144
+ path: charts/kradle
145
+ destination:
146
+ server: https://kubernetes.default.svc
147
+ namespace: kradle-system
148
+ syncPolicy:
149
+ automated:
150
+ prune: true
151
+ selfHeal: true
152
+ syncOptions:
153
+ - CreateNamespace=true
154
+ ---
155
+ apiVersion: kradle.a5c.ai/v1alpha1
156
+ kind: Issue
157
+ metadata:
158
+ name: issue-1
159
+ namespace: kradle-org-kradle
160
+ labels:
161
+ kradle.a5c.ai/org: kradle
162
+ kradle.a5c.ai/namespace: kradle-org-kradle
163
+ spec:
164
+ repository: kradle-demo
165
+ title: Wire Kradle-managed permissions
166
+ labels:
167
+ - forge
168
+ - access
169
+ organizationRef: kradle
170
+ status:
171
+ phase: triage
172
+ ---
173
+ apiVersion: kradle.a5c.ai/v1alpha1
174
+ kind: PullRequest
175
+ metadata:
176
+ name: pr-1
177
+ namespace: kradle-org-kradle
178
+ labels:
179
+ kradle.a5c.ai/org: kradle
180
+ kradle.a5c.ai/namespace: kradle-org-kradle
181
+ spec:
182
+ repository: kradle-demo
183
+ title: Improve forge UI
184
+ head: feature/forge-ui
185
+ base: main
186
+ organizationRef: kradle
187
+ status:
188
+ phase: Open
189
+ changedFiles:
190
+ - apps/web/app/ui-shell.jsx
@@ -0,0 +1,23 @@
1
+ apiVersion: core.oam.dev/v1beta1
2
+ kind: Application
3
+ metadata:
4
+ name: kradle-demo-app
5
+ namespace: kradle-system
6
+ labels:
7
+ kradle.a5c.ai/repository: kradle-demo
8
+ spec:
9
+ components:
10
+ - name: kradle-demo
11
+ type: webservice
12
+ properties:
13
+ image: kradle/mvp-model:0.1.0
14
+ traits:
15
+ - type: scaler
16
+ properties:
17
+ replicas: 1
18
+ scopes:
19
+ healthscopes.core.oam.dev: kradle-demo-health
20
+ workflow:
21
+ steps:
22
+ - name: deploy
23
+ type: deploy
@@ -0,0 +1,18 @@
1
+ apiVersion: kyverno.io/v1
2
+ kind: ClusterPolicy
3
+ metadata:
4
+ name: kradle-pullrequest-title-required
5
+ spec:
6
+ validationFailureAction: Enforce
7
+ rules:
8
+ - name: require-descriptive-pr-title
9
+ match:
10
+ any:
11
+ - resources:
12
+ kinds:
13
+ - PullRequest.kradle.a5c.ai/v1alpha1
14
+ validate:
15
+ message: PullRequest spec.title must be descriptive.
16
+ pattern:
17
+ spec:
18
+ title: "?*"
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "@a5c-ai/kradle",
3
+ "version": "5.0.1-staging.3abdf9534c25",
4
+ "description": "a5c.ai Kradle: Kubernetes-native forge runtime with Argo CD GitOps and Gitea-backed Git hosting.",
5
+ "type": "module",
6
+ "main": "./src/index.js",
7
+ "exports": {
8
+ ".": "./src/index.js"
9
+ },
10
+ "bin": {
11
+ "kradle-demo": "./bin/kradle-demo.mjs",
12
+ "kradle-server": "./bin/kradle-server.mjs"
13
+ },
14
+ "scripts": {
15
+ "build": "node scripts/build.mjs",
16
+ "test": "node --test tests/*.test.js",
17
+ "validate:docs": "node scripts/validate-doc-coverage.mjs",
18
+ "smoke": "node scripts/smoke.mjs",
19
+ "check": "npm run build && npm run validate:docs && npm test && npm run e2e && npm run package:check && npm run smoke",
20
+ "demo": "node bin/kradle-demo.mjs",
21
+ "e2e": "node --test tests/e2e/*.test.js",
22
+ "package:check": "node scripts/validate-package.mjs",
23
+ "setup:minikube": "node scripts/setup-minikube.mjs",
24
+ "serve": "node bin/kradle-server.mjs"
25
+ },
26
+ "keywords": [
27
+ "kubernetes",
28
+ "forge",
29
+ "git",
30
+ "ci",
31
+ "rbac",
32
+ "webhooks"
33
+ ],
34
+ "license": "MIT",
35
+ "engines": {
36
+ "node": ">=20"
37
+ },
38
+ "author": "a5c.ai",
39
+ "homepage": "https://github.com/a5c-ai/babysitter/tree/main/packages/kradle/core#readme",
40
+ "repository": {
41
+ "type": "git",
42
+ "url": "git+https://github.com/a5c-ai/babysitter.git",
43
+ "directory": "packages/kradle/core"
44
+ },
45
+ "bugs": {
46
+ "url": "https://github.com/a5c-ai/babysitter/issues"
47
+ },
48
+ "publishConfig": {
49
+ "access": "public"
50
+ },
51
+ "files": [
52
+ "bin",
53
+ "src",
54
+ "dist",
55
+ "scripts",
56
+ "docs",
57
+ "examples",
58
+ "tests",
59
+ "Dockerfile",
60
+ "README.md"
61
+ ],
62
+ "dependencies": {
63
+ "@nats-io/jetstream": "3.3.0",
64
+ "@nats-io/transport-node": "3.3.0"
65
+ }
66
+ }
@@ -0,0 +1,29 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { mkdir, writeFile } from 'node:fs/promises';
3
+ import { createControllerUiModel, createKradleHandoffSummary, createKradleMvpDemo, createKradleRuntime } from '../src/index.js';
4
+
5
+ const packageInfo = JSON.parse(await readFile('package.json', 'utf8'));
6
+ const runtime = createKradleRuntime();
7
+ const controller = createControllerUiModel(runtime);
8
+ const snapshot = runtime.snapshot();
9
+ const demo = createKradleMvpDemo();
10
+ const lifecycle = demo.lifecycle;
11
+ const summary = createKradleHandoffSummary(demo, { packageInfo });
12
+ summary.controller = {
13
+ status: controller.status,
14
+ namespace: controller.namespace,
15
+ endpoints: controller.controller.endpoints,
16
+ metrics: controller.metrics,
17
+ operations: controller.operations
18
+ };
19
+ summary.runtime = {
20
+ resources: Object.fromEntries(Object.entries(snapshot.resources).map(([kind, resources]) => [kind, resources.length])),
21
+ events: snapshot.events.length,
22
+ auditEntries: snapshot.auditLog.length
23
+ };
24
+ await mkdir('dist', { recursive: true });
25
+ await writeFile('dist/kradle-summary.json', JSON.stringify(summary, null, 2));
26
+ await writeFile('dist/kradle-controller-ui.json', JSON.stringify(controller, null, 2));
27
+ await writeFile('dist/kradle-runtime-snapshot.json', JSON.stringify(snapshot, null, 2));
28
+ await writeFile('dist/kradle-lifecycle.json', JSON.stringify(lifecycle, null, 2));
29
+ console.log('build ok: dist/kradle-summary.json dist/kradle-controller-ui.json dist/kradle-runtime-snapshot.json dist/kradle-lifecycle.json');
@@ -0,0 +1,65 @@
1
+ #!/usr/bin/env node
2
+ import { spawnSync } from 'node:child_process';
3
+
4
+ export function parseArgs(argv = process.argv.slice(2)) {
5
+ const options = { apply: false, json: false, profile: 'kradle', namespace: 'kradle-system', release: 'kradle', driver: 'docker', chart: '../charts' };
6
+ for (const arg of argv) {
7
+ if (arg === '--apply') options.apply = true;
8
+ else if (arg === '--dry-run') options.apply = false;
9
+ else if (arg === '--json') options.json = true;
10
+ else if (arg.startsWith('--profile=')) options.profile = arg.slice('--profile='.length);
11
+ else if (arg.startsWith('--namespace=')) options.namespace = arg.slice('--namespace='.length);
12
+ else if (arg.startsWith('--release=')) options.release = arg.slice('--release='.length);
13
+ else if (arg.startsWith('--driver=')) options.driver = arg.slice('--driver='.length);
14
+ else if (arg.startsWith('--chart=')) options.chart = arg.slice('--chart='.length);
15
+ else throw new Error(`Unknown option: ${arg}`);
16
+ }
17
+ return options;
18
+ }
19
+
20
+ export function buildMinikubePlan(options = parseArgs([])) {
21
+ const { profile, namespace, release, driver, chart } = options;
22
+ return {
23
+ mode: options.apply ? 'apply' : 'dry-run',
24
+ requiredTools: ['minikube', 'kubectl', 'helm', 'node', 'npm'],
25
+ commands: [
26
+ ['minikube', ['start', '-p', profile, '--driver', driver]],
27
+ ['minikube', ['addons', 'enable', 'ingress', '-p', profile]],
28
+ ['minikube', ['addons', 'enable', 'metrics-server', '-p', profile]],
29
+ ['kubectl', ['config', 'use-context', profile]],
30
+ ['kubectl', ['create', 'namespace', namespace, '--dry-run=client', '-o', 'yaml']],
31
+ ['helm', ['lint', chart]],
32
+ ['helm', ['upgrade', '--install', release, chart, '--namespace', namespace, '--create-namespace', '--set', 'demo.enabled=true']],
33
+ ['kubectl', ['apply', '-n', namespace, '-f', 'examples/minikube-demo.yaml']],
34
+ ['kubectl', ['wait', '--for=condition=Available', `deployment/${release}-kradle-api`, '-n', namespace, '--timeout=120s']],
35
+ ['node', ['scripts/smoke.mjs']]
36
+ ]
37
+ };
38
+ }
39
+
40
+ function commandToString([command, args]) {
41
+ return [command, ...args].join(' ');
42
+ }
43
+
44
+ function runCommand(command) {
45
+ const [bin, args] = command;
46
+ const result = spawnSync(bin, args, { stdio: 'inherit', shell: process.platform === 'win32' });
47
+ if (result.status !== 0) throw new Error(`Command failed: ${commandToString(command)}`);
48
+ }
49
+
50
+ const isMain = process.argv[1]?.replace(/\\/g, '/').endsWith('/scripts/setup-minikube.mjs');
51
+ if (isMain) {
52
+ try {
53
+ const options = parseArgs();
54
+ const plan = buildMinikubePlan(options);
55
+ if (options.json) console.log(JSON.stringify({ ...plan, commands: plan.commands.map(commandToString) }, null, 2));
56
+ else {
57
+ console.log(`Kradle minikube setup (${plan.mode})`);
58
+ for (const command of plan.commands) console.log(`- ${commandToString(command)}`);
59
+ }
60
+ if (options.apply) for (const command of plan.commands) runCommand(command);
61
+ } catch (error) {
62
+ console.error(error.message);
63
+ process.exit(1);
64
+ }
65
+ }
@@ -0,0 +1,37 @@
1
+ import { createKradleHttpServer, createKradleRuntime, runSmokeAssertions } from '../src/index.js';
2
+
3
+ const runtime = createKradleRuntime();
4
+ const server = createKradleHttpServer({ runtime });
5
+ const checks = [];
6
+
7
+ function record(name, passed, evidence = '') {
8
+ checks.push({ name, passed: Boolean(passed), evidence });
9
+ console.log(`${passed ? 'ok' : 'not ok'} - ${name}${evidence ? ` (${evidence})` : ''}`);
10
+ }
11
+
12
+ await new Promise((resolve) => server.listen(0, resolve));
13
+ const base = `http://127.0.0.1:${server.address().port}`;
14
+ let model;
15
+ try {
16
+ const health = await fetch(`${base}/healthz`);
17
+ record('HTTP health endpoint is live', health.ok, '/healthz');
18
+ const modelResponse = await fetch(`${base}/api/controller`);
19
+ model = await modelResponse.json();
20
+ record('Controller API exposes Kradle workspace model', modelResponse.ok && model.controller.mode === 'kradle-workspace', '/api/controller');
21
+ record('Controller model reports truthful ready or degraded state', ['ready', 'degraded'].includes(model.status) && Number.isFinite(model.metrics.resources), `${model.status}; ${model.metrics.resources} resources`);
22
+ record('Controller model includes Kradle management endpoints', model.controller.endpoints.some((endpoint) => endpoint.path === '/api/orgs/:org/resources') && model.controller.endpoints.some((endpoint) => endpoint.path === '/api/orgs/:org/repositories'), model.controller.endpoints.map((endpoint) => endpoint.path).join(', '));
23
+ record('Controller model includes publishing gates', model.operations.releaseGates.includes('npm pack --json') && model.operations.releaseGates.includes('docker build'), model.operations.releaseGates.join(', '));
24
+ const snapshotResponse = await fetch(`${base}/api/orgs/default/snapshot`);
25
+ const snapshot = await snapshotResponse.json();
26
+ record('Org snapshot endpoint exports durable runtime state', snapshotResponse.ok && snapshot.export?.controlPlane && snapshot.resources?.Repository?.length > 0, '/api/orgs/default/snapshot');
27
+ } finally {
28
+ await new Promise((resolve) => server.close(resolve));
29
+ }
30
+
31
+ const contractSmoke = runSmokeAssertions();
32
+ for (const [name, passed] of contractSmoke.assertions) record(name, passed, 'runtime contract compatibility');
33
+ if (!checks.every((check) => check.passed)) {
34
+ console.error(JSON.stringify({ status: 'failed', checks }, null, 2));
35
+ process.exit(1);
36
+ }
37
+ console.log(JSON.stringify({ status: 'success', checks: checks.length, controllerStatus: model.status, resources: model.metrics.resources }, null, 2));
@@ -0,0 +1,152 @@
1
+ import { readFile } from 'node:fs/promises';
2
+
3
+ const requiredDocs = [
4
+ 'README.md',
5
+ 'docs/README.md',
6
+ 'docs/product-requirements.md',
7
+ 'docs/system-requirements.md',
8
+ 'docs/architecture-spec.md',
9
+ 'docs/user-stories.md',
10
+ 'docs/roadmap-mvp.md',
11
+ 'docs/install.md',
12
+ 'docs/local-minikube.md',
13
+ 'docs/components/control-plane.md',
14
+ 'docs/components/data-plane.md',
15
+ 'docs/components/identity-rbac-policy.md',
16
+ 'docs/components/runners-ci.md',
17
+ 'docs/components/hooks-events.md',
18
+ 'docs/components/web-ui.md',
19
+ 'docs/components/operations-publishing.md',
20
+ 'docs/components/kubevela-oam.md'
21
+ ];
22
+
23
+ const requiredOntology = [
24
+ 'docs/ontology/README.md',
25
+ 'docs/ontology/world.md',
26
+ 'docs/ontology/problem-space.md',
27
+ 'docs/ontology/solution-space.md',
28
+ 'docs/ontology/bounded-contexts.md',
29
+ 'docs/ontology/resource-taxonomy.md',
30
+ 'docs/ontology/resource-contracts.md',
31
+ 'docs/ontology/personas-and-actors.md',
32
+ 'docs/ontology/workflows.md',
33
+ 'docs/ontology/policies-and-invariants.md',
34
+ 'docs/ontology/storage-and-data-boundaries.md',
35
+ 'docs/ontology/events-and-hooks.md',
36
+ 'docs/ontology/runners-and-ci.md',
37
+ 'docs/ontology/web-ui-excellent-flows.md',
38
+ 'docs/ontology/operations-and-release.md',
39
+ 'docs/ontology/validation-matrix.md',
40
+ 'docs/ontology/oam-kubevela.md'
41
+ ];
42
+
43
+ const implementationFiles = [
44
+ 'src/resource-model.js',
45
+ 'src/control-plane.js',
46
+ 'src/data-plane.js',
47
+ 'src/identity-policy.js',
48
+ 'src/runners-ci.js',
49
+ 'src/hooks-events.js',
50
+ 'src/web-ui.js',
51
+ 'src/operations.js',
52
+ 'tests/kradle.test.js'
53
+ ];
54
+
55
+ async function readRequired(file) {
56
+ try {
57
+ return await readFile(file, 'utf8');
58
+ } catch (error) {
59
+ throw new Error(`${file} missing or unreadable: ${error.message}`);
60
+ }
61
+ }
62
+
63
+ const docsText = (await Promise.all(requiredDocs.map(readRequired))).join('\n');
64
+ const ontologyByFile = Object.fromEntries(await Promise.all(requiredOntology.map(async (file) => [file, await readRequired(file)])));
65
+ const ontologyText = Object.values(ontologyByFile).join('\n');
66
+ const sourceByFile = Object.fromEntries(await Promise.all(implementationFiles.map(async (file) => [file, await readRequired(file)])));
67
+ const allRequirementsText = `${docsText}\n${ontologyText}`;
68
+
69
+ const requiredTerms = [
70
+ 'Repository', 'PullRequest', 'Issue', 'Review', 'Pipeline', 'Job', 'RunnerPool',
71
+ 'WebhookSubscription', 'WebhookDelivery', 'RefPolicy', 'BranchProtection', 'View', 'Selector',
72
+ 'RBAC', 'OIDC', 'Postgres', 'etcd', 'receive-pack', 'GitOps', 'backup', 'restore',
73
+ 'APIService', 'fork', 'admission', 'webhook', 'object storage', 'search', 'release gates', 'KubeVela', 'OAM', 'Application', 'Component', 'Trait', 'Workflow Step'
74
+ ];
75
+
76
+ const sourceTerms = [
77
+ ['RESOURCE_DEFINITIONS', 'src/resource-model.js'],
78
+ ['resourceSchemaForKind', 'src/resource-model.js'],
79
+ ['watch', 'src/control-plane.js'],
80
+ ['auditLog', 'src/control-plane.js'],
81
+ ['recordObject', 'src/data-plane.js'],
82
+ ['enqueueSearchIndex', 'src/data-plane.js'],
83
+ ['serviceAccountForJob', 'src/identity-policy.js'],
84
+ ['rerunFromStep', 'src/runners-ci.js'],
85
+ ['inspect', 'src/hooks-events.js'],
86
+ ['createWebhookInspector', 'src/web-ui.js'],
87
+ ['observabilityModel', 'src/operations.js'],
88
+ ['releaseGates', 'src/operations.js']
89
+ ];
90
+
91
+ const workflowText = await readRequired('.github/workflows/publish.yml');
92
+ const releaseSurfaceTerms = [
93
+ ['Dockerfile', docsText],
94
+ ['controller image', docsText],
95
+ ['GitHub publishing', docsText],
96
+ ['GHCR', docsText],
97
+ ['Helm chart', docsText],
98
+ ['Live-cluster conformance', docsText],
99
+ ['docker/build-push-action', workflowText],
100
+ ['helm push', workflowText],
101
+ ['npm pack', workflowText]
102
+ ];
103
+
104
+ const staleReleaseBoundaryPhrases = [
105
+ 'does not claim to ship production controller images yet',
106
+ 'does not yet ship production controller images',
107
+ 'Real controller images, registry publication, and live-cluster conformance remain follow-up release work',
108
+ 'Production controller images, registry publication, and live-cluster conformance still remain tracked follow-ups'
109
+ ];
110
+
111
+ const ontologyExpectations = [
112
+ ['docs/ontology/resource-taxonomy.md', ['CRD-backed', 'Aggregated', 'Repository', 'WebhookDelivery']],
113
+ ['docs/ontology/resource-contracts.md', ['metadata.name', 'resourceVersion', 'RunnerPool', 'WebhookDelivery']],
114
+ ['docs/ontology/policies-and-invariants.md', ['RBAC', 'Admission', 'Fork PR', 'BranchProtection']],
115
+ ['docs/ontology/storage-and-data-boundaries.md', ['etcd', 'Postgres', 'Gitea', 'Object storage', 'Search']],
116
+ ['docs/ontology/validation-matrix.md',
117
+ 'docs/ontology/oam-kubevela.md', ['npm run check', 'docs and ontology coverage']]
118
+ ];
119
+
120
+ const missing = [];
121
+ for (const term of requiredTerms) {
122
+ if (!allRequirementsText.includes(term)) missing.push(`requirements/ontology missing term: ${term}`);
123
+ }
124
+ for (const [term, file] of sourceTerms) {
125
+ if (!sourceByFile[file]?.includes(term)) missing.push(`${file} missing implementation term: ${term}`);
126
+ }
127
+ for (const [term, text] of releaseSurfaceTerms) {
128
+ if (!text.includes(term)) missing.push(`release surface missing term: ${term}`);
129
+ }
130
+ for (const phrase of staleReleaseBoundaryPhrases) {
131
+ if (allRequirementsText.includes(phrase)) missing.push(`stale release boundary phrase still present: ${phrase}`);
132
+ }
133
+ for (const [file, terms] of ontologyExpectations) {
134
+ for (const term of terms) {
135
+ if (!ontologyByFile[file]?.includes(term)) missing.push(`${file} missing ontology term: ${term}`);
136
+ }
137
+ }
138
+
139
+ if (missing.length) {
140
+ console.error(JSON.stringify({ status: 'failed', missing }, null, 2));
141
+ process.exit(1);
142
+ }
143
+
144
+ console.log(JSON.stringify({
145
+ status: 'success',
146
+ checkedDocs: requiredDocs.length,
147
+ checkedOntologyFiles: requiredOntology.length,
148
+ checkedImplementationFiles: implementationFiles.length,
149
+ requiredTerms: requiredTerms.length,
150
+ sourceTerms: sourceTerms.length,
151
+ releaseSurfaceTerms: releaseSurfaceTerms.length
152
+ }, null, 2));