@eventmodelers/cli 0.0.1

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 (220) hide show
  1. package/README.md +175 -0
  2. package/cli.js +676 -0
  3. package/package.json +35 -0
  4. package/shared/build-kit/code-export.mjs +560 -0
  5. package/shared/build-kit/lib/ollama-agent.js +147 -0
  6. package/shared/build-kit/package.json +11 -0
  7. package/shared/build-kit/ralph-ollama.js +39 -0
  8. package/shared/build-kit/realtime-agent.js +18 -0
  9. package/stacks/axon/templates/.claude/skills/build-automation/SKILL.md +407 -0
  10. package/stacks/axon/templates/.claude/skills/build-automation/references/feature-flag-patterns.md +114 -0
  11. package/stacks/axon/templates/.claude/skills/build-automation-workflow/SKILL.md +496 -0
  12. package/stacks/axon/templates/.claude/skills/build-automation-workflow/references/axon-workflow-api.md +279 -0
  13. package/stacks/axon/templates/.claude/skills/build-automation-workflow/references/feature-flag-patterns.md +114 -0
  14. package/stacks/axon/templates/.claude/skills/build-state-change/SKILL.md +396 -0
  15. package/stacks/axon/templates/.claude/skills/build-state-change/references/axon-test-fixture-patterns.md +162 -0
  16. package/stacks/axon/templates/.claude/skills/build-state-change/references/feature-flag-patterns.md +56 -0
  17. package/stacks/axon/templates/.claude/skills/build-state-change/references/rest-api-patterns.md +115 -0
  18. package/stacks/axon/templates/.claude/skills/build-state-view/SKILL.md +282 -0
  19. package/stacks/axon/templates/.claude/skills/connect/SKILL.md +178 -0
  20. package/stacks/axon/templates/.claude/skills/learn-eventmodelers-api/SKILL.md +611 -0
  21. package/stacks/axon/templates/.claude/skills/load-slice/SKILL.md +141 -0
  22. package/stacks/axon/templates/.claude/skills/update-slice-status/SKILL.md +105 -0
  23. package/stacks/axon/templates/build-kit/lib/AGENT.md +47 -0
  24. package/stacks/axon/templates/build-kit/lib/agent.sh +20 -0
  25. package/stacks/axon/templates/build-kit/lib/backend-prompt.md +158 -0
  26. package/stacks/axon/templates/build-kit/lib/prompt.md +126 -0
  27. package/stacks/axon/templates/build-kit/lib/ralph.js +369 -0
  28. package/stacks/axon/templates/build-kit/ralph-claude.js +44 -0
  29. package/stacks/axon/templates/build-kit/ralph.sh +98 -0
  30. package/stacks/axon/templates/root/.env.example +5 -0
  31. package/stacks/axon/templates/root/CLAUDE.md +60 -0
  32. package/stacks/axon/templates/root/README.md +44 -0
  33. package/stacks/axon/templates/root/docker-compose.yml +64 -0
  34. package/stacks/axon/templates/root/mvnw +259 -0
  35. package/stacks/axon/templates/root/mvnw.cmd +149 -0
  36. package/stacks/axon/templates/root/pom.xml +125 -0
  37. package/stacks/axon/templates/root/src/main/java/io/axoniq/quickstart/QuickstartApplication.java +128 -0
  38. package/stacks/axon/templates/root/src/main/java/io/axoniq/quickstart/config/WebConfig.java +155 -0
  39. package/stacks/axon/templates/root/src/main/resources/application.properties +2 -0
  40. package/stacks/axon/templates/root/src/main/resources/static/bg-body.png +0 -0
  41. package/stacks/axon/templates/root/src/main/resources/static/bg-header.png +0 -0
  42. package/stacks/axon/templates/root/src/main/resources/static/index.html +596 -0
  43. package/stacks/cratis-csharp/templates/.claude/skills/_shared/cratis-conventions.md +251 -0
  44. package/stacks/cratis-csharp/templates/.claude/skills/build-automation/SKILL.md +99 -0
  45. package/stacks/cratis-csharp/templates/.claude/skills/build-automation/references/patterns.md +115 -0
  46. package/stacks/cratis-csharp/templates/.claude/skills/build-state-change/SKILL.md +163 -0
  47. package/stacks/cratis-csharp/templates/.claude/skills/build-state-change/references/patterns.md +234 -0
  48. package/stacks/cratis-csharp/templates/.claude/skills/build-state-view/SKILL.md +120 -0
  49. package/stacks/cratis-csharp/templates/.claude/skills/build-state-view/references/patterns.md +166 -0
  50. package/stacks/cratis-csharp/templates/.claude/skills/connect/SKILL.md +169 -0
  51. package/stacks/cratis-csharp/templates/.claude/skills/learn-eventmodelers-api/SKILL.md +609 -0
  52. package/stacks/cratis-csharp/templates/.claude/skills/load-slice/SKILL.md +141 -0
  53. package/stacks/cratis-csharp/templates/.claude/skills/update-slice-status/SKILL.md +105 -0
  54. package/stacks/cratis-csharp/templates/build-kit/lib/AGENT.md +58 -0
  55. package/stacks/cratis-csharp/templates/build-kit/lib/agent.sh +20 -0
  56. package/stacks/cratis-csharp/templates/build-kit/lib/backend-prompt.md +129 -0
  57. package/stacks/cratis-csharp/templates/build-kit/lib/prompt.md +124 -0
  58. package/stacks/cratis-csharp/templates/build-kit/lib/ralph.js +302 -0
  59. package/stacks/cratis-csharp/templates/build-kit/ralph-claude.js +37 -0
  60. package/stacks/cratis-csharp/templates/build-kit/ralph.sh +98 -0
  61. package/stacks/cratis-csharp/templates/root/.frontend/index.css +29 -0
  62. package/stacks/cratis-csharp/templates/root/.frontend/index.html +17 -0
  63. package/stacks/cratis-csharp/templates/root/.frontend/main.tsx +18 -0
  64. package/stacks/cratis-csharp/templates/root/.frontend/tsconfig.json +42 -0
  65. package/stacks/cratis-csharp/templates/root/.frontend/tsconfig.node.json +11 -0
  66. package/stacks/cratis-csharp/templates/root/.frontend/vite.config.ts +56 -0
  67. package/stacks/cratis-csharp/templates/root/App.tsx +23 -0
  68. package/stacks/cratis-csharp/templates/root/CLAUDE.md +62 -0
  69. package/stacks/cratis-csharp/templates/root/CratisApp.csproj +25 -0
  70. package/stacks/cratis-csharp/templates/root/CratisApp.sln +18 -0
  71. package/stacks/cratis-csharp/templates/root/GlobalUsings.cs +3 -0
  72. package/stacks/cratis-csharp/templates/root/Home.tsx +102 -0
  73. package/stacks/cratis-csharp/templates/root/Program.cs +26 -0
  74. package/stacks/cratis-csharp/templates/root/README.md +192 -0
  75. package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Listing/AllListings.ts +47 -0
  76. package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Listing/Listing.cs +11 -0
  77. package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Listing/Listing.ts +12 -0
  78. package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Listing/ListingDataTable.tsx +17 -0
  79. package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Listing/index.ts +1 -0
  80. package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Registration/Register.ts +51 -0
  81. package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Registration/RegisterDialog.tsx +18 -0
  82. package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Registration/Registration.cs +27 -0
  83. package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Registration/index.ts +1 -0
  84. package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/SomeFeature.tsx +22 -0
  85. package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/SomeName.cs +3 -0
  86. package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/index.ts +1 -0
  87. package/stacks/cratis-csharp/templates/root/appsettings.Development.json +9 -0
  88. package/stacks/cratis-csharp/templates/root/appsettings.json +26 -0
  89. package/stacks/cratis-csharp/templates/root/docker-compose.yml +23 -0
  90. package/stacks/cratis-csharp/templates/root/package.json +33 -0
  91. package/stacks/cratis-csharp/templates/root/tsconfig.json +3 -0
  92. package/stacks/modeling-kit/templates/.claude/settings.local.json +13 -0
  93. package/stacks/modeling-kit/templates/.claude/skills/analyze-existing-model/SKILL.md +215 -0
  94. package/stacks/modeling-kit/templates/.claude/skills/attributes/SKILL.md +176 -0
  95. package/stacks/modeling-kit/templates/.claude/skills/connect/SKILL.md +182 -0
  96. package/stacks/modeling-kit/templates/.claude/skills/discover-storyboard/SKILL.md +383 -0
  97. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-applying-conways-law/SKILL.md +465 -0
  98. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-brainstorming-events/SKILL.md +587 -0
  99. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-brainstorming-events/references/facilitating-event-modeling-workshops.md +626 -0
  100. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-checking-completeness/SKILL.md +542 -0
  101. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-designing-event-models/SKILL.md +497 -0
  102. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-elaborating-scenarios/SKILL.md +783 -0
  103. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-inputs/SKILL.md +604 -0
  104. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-outputs/SKILL.md +699 -0
  105. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-integrating-legacy-systems/SKILL.md +674 -0
  106. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/SKILL.md +231 -0
  107. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/domain-patterns.md +150 -0
  108. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/patterns.md +329 -0
  109. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/snapshotting.md +204 -0
  110. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-orchestrating-event-modeling/SKILL.md +352 -0
  111. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-orchestrating-event-modeling/references/project-planning-with-event-modeling.md +341 -0
  112. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-plotting-events/SKILL.md +153 -0
  113. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/SKILL.md +136 -0
  114. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/references/examples.md +78 -0
  115. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/references/patterns.md +85 -0
  116. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-storyboarding-events/SKILL.md +655 -0
  117. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-translating-external-events/SKILL.md +479 -0
  118. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models/SKILL.md +234 -0
  119. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models-checklist/SKILL.md +353 -0
  120. package/stacks/modeling-kit/templates/.claude/skills/examples/SKILL.md +200 -0
  121. package/stacks/modeling-kit/templates/.claude/skills/handle-comment/SKILL.md +94 -0
  122. package/stacks/modeling-kit/templates/.claude/skills/learn-eventmodelers-api/SKILL.md +441 -0
  123. package/stacks/modeling-kit/templates/.claude/skills/place-element/SKILL.md +290 -0
  124. package/stacks/modeling-kit/templates/.claude/skills/storyboard/SKILL.md +212 -0
  125. package/stacks/modeling-kit/templates/.claude/skills/storyboard-screen/SKILL.md +123 -0
  126. package/stacks/modeling-kit/templates/.claude/skills/timeline/SKILL.md +353 -0
  127. package/stacks/modeling-kit/templates/.claude/skills/update-slice-status/SKILL.md +110 -0
  128. package/stacks/modeling-kit/templates/.claude/skills/wdyt/SKILL.md +134 -0
  129. package/stacks/modeling-kit/templates/kit/lib/agent.sh +20 -0
  130. package/stacks/modeling-kit/templates/kit/lib/ollama-agent.js +147 -0
  131. package/stacks/modeling-kit/templates/kit/lib/ralph.js +286 -0
  132. package/stacks/modeling-kit/templates/kit/package.json +12 -0
  133. package/stacks/modeling-kit/templates/kit/ralph-claude.js +50 -0
  134. package/stacks/modeling-kit/templates/kit/ralph-ollama.js +38 -0
  135. package/stacks/modeling-kit/templates/kit/ralph.sh +61 -0
  136. package/stacks/modeling-kit/templates/kit/realtime-agent.js +18 -0
  137. package/stacks/modeling-kit/templates/root/CLAUDE.md +56 -0
  138. package/stacks/node/templates/.claude/skills/build-automation/SKILL.md +266 -0
  139. package/stacks/node/templates/.claude/skills/build-state-change/SKILL.md +344 -0
  140. package/stacks/node/templates/.claude/skills/build-state-view/SKILL.md +412 -0
  141. package/stacks/node/templates/.claude/skills/connect/SKILL.md +178 -0
  142. package/stacks/node/templates/.claude/skills/learn-eventmodelers-api/SKILL.md +628 -0
  143. package/stacks/node/templates/.claude/skills/load-slice/SKILL.md +143 -0
  144. package/stacks/node/templates/.claude/skills/update-slice-status/SKILL.md +110 -0
  145. package/stacks/node/templates/build-kit/README.md +86 -0
  146. package/stacks/node/templates/build-kit/lib/AGENT.md +47 -0
  147. package/stacks/node/templates/build-kit/lib/agent.sh +20 -0
  148. package/stacks/node/templates/build-kit/lib/backend-prompt.md +152 -0
  149. package/stacks/node/templates/build-kit/lib/prompt.md +122 -0
  150. package/stacks/node/templates/build-kit/lib/ralph.js +369 -0
  151. package/stacks/node/templates/build-kit/ralph-claude.js +44 -0
  152. package/stacks/node/templates/build-kit/ralph.sh +98 -0
  153. package/stacks/node/templates/root/.env.example +15 -0
  154. package/stacks/node/templates/root/CLAUDE.md +60 -0
  155. package/stacks/node/templates/root/docker-compose.yml +15 -0
  156. package/stacks/node/templates/root/flyway.conf +17 -0
  157. package/stacks/node/templates/root/migrations/V1__schema.sql.example +12 -0
  158. package/stacks/node/templates/root/package.json +50 -0
  159. package/stacks/node/templates/root/server.ts +130 -0
  160. package/stacks/node/templates/root/setup-env.sh +53 -0
  161. package/stacks/node/templates/root/src/common/assertions.ts +6 -0
  162. package/stacks/node/templates/root/src/common/db.ts +32 -0
  163. package/stacks/node/templates/root/src/common/loadPostgresEventstore.ts +23 -0
  164. package/stacks/node/templates/root/src/common/parseEndpoint.ts +51 -0
  165. package/stacks/node/templates/root/src/common/processorDlq.ts +28 -0
  166. package/stacks/node/templates/root/src/common/realtimeBroadcast.ts +12 -0
  167. package/stacks/node/templates/root/src/common/replay.ts +16 -0
  168. package/stacks/node/templates/root/src/common/routes.ts +19 -0
  169. package/stacks/node/templates/root/src/common/testHelpers.ts +44 -0
  170. package/stacks/node/templates/root/src/swagger.ts +34 -0
  171. package/stacks/node/templates/root/src/util/assertions.ts +6 -0
  172. package/stacks/node/templates/root/src/util/hash.ts +9 -0
  173. package/stacks/node/templates/root/src/util/sanitize.ts +23 -0
  174. package/stacks/node/templates/root/tsconfig.json +32 -0
  175. package/stacks/node/templates/root/vercel.json +8 -0
  176. package/stacks/supabase/templates/.claude/skills/build-automation/SKILL.md +266 -0
  177. package/stacks/supabase/templates/.claude/skills/build-state-change/SKILL.md +344 -0
  178. package/stacks/supabase/templates/.claude/skills/build-state-view/SKILL.md +390 -0
  179. package/stacks/supabase/templates/.claude/skills/build-webhook/SKILL.md +303 -0
  180. package/stacks/supabase/templates/.claude/skills/connect/SKILL.md +178 -0
  181. package/stacks/supabase/templates/.claude/skills/learn-eventmodelers-api/SKILL.md +628 -0
  182. package/stacks/supabase/templates/.claude/skills/load-slice/SKILL.md +143 -0
  183. package/stacks/supabase/templates/.claude/skills/update-slice-status/SKILL.md +110 -0
  184. package/stacks/supabase/templates/build-kit/README.md +86 -0
  185. package/stacks/supabase/templates/build-kit/lib/AGENT.md +47 -0
  186. package/stacks/supabase/templates/build-kit/lib/agent.sh +20 -0
  187. package/stacks/supabase/templates/build-kit/lib/backend-prompt.md +152 -0
  188. package/stacks/supabase/templates/build-kit/lib/prompt.md +123 -0
  189. package/stacks/supabase/templates/build-kit/lib/ralph.js +369 -0
  190. package/stacks/supabase/templates/build-kit/ralph-claude.js +44 -0
  191. package/stacks/supabase/templates/build-kit/ralph.sh +98 -0
  192. package/stacks/supabase/templates/root/.env.example +22 -0
  193. package/stacks/supabase/templates/root/CLAUDE.md +61 -0
  194. package/stacks/supabase/templates/root/flyway.conf +17 -0
  195. package/stacks/supabase/templates/root/package.json +52 -0
  196. package/stacks/supabase/templates/root/server.ts +177 -0
  197. package/stacks/supabase/templates/root/setup-env.sh +53 -0
  198. package/stacks/supabase/templates/root/src/common/assertions.ts +6 -0
  199. package/stacks/supabase/templates/root/src/common/db.ts +32 -0
  200. package/stacks/supabase/templates/root/src/common/loadPostgresEventstore.ts +23 -0
  201. package/stacks/supabase/templates/root/src/common/parseEndpoint.ts +51 -0
  202. package/stacks/supabase/templates/root/src/common/processorDlq.ts +28 -0
  203. package/stacks/supabase/templates/root/src/common/realtimeBroadcast.ts +19 -0
  204. package/stacks/supabase/templates/root/src/common/replay.ts +16 -0
  205. package/stacks/supabase/templates/root/src/common/routes.ts +23 -0
  206. package/stacks/supabase/templates/root/src/common/testHelpers.ts +54 -0
  207. package/stacks/supabase/templates/root/src/supabase/README.md +141 -0
  208. package/stacks/supabase/templates/root/src/supabase/api.ts +56 -0
  209. package/stacks/supabase/templates/root/src/supabase/requireOrgaAdmin.ts +32 -0
  210. package/stacks/supabase/templates/root/src/supabase/requireSysUser.ts +40 -0
  211. package/stacks/supabase/templates/root/src/supabase/requireUser.ts +72 -0
  212. package/stacks/supabase/templates/root/src/swagger.ts +34 -0
  213. package/stacks/supabase/templates/root/src/util/assertions.ts +6 -0
  214. package/stacks/supabase/templates/root/src/util/hash.ts +9 -0
  215. package/stacks/supabase/templates/root/src/util/sanitize.ts +23 -0
  216. package/stacks/supabase/templates/root/supabase/config.toml +295 -0
  217. package/stacks/supabase/templates/root/supabase/migrations/V1__schema.sql.example +12 -0
  218. package/stacks/supabase/templates/root/supabase/seed.sql +1 -0
  219. package/stacks/supabase/templates/root/tsconfig.json +32 -0
  220. package/stacks/supabase/templates/root/vercel.json +8 -0
@@ -0,0 +1,9 @@
1
+ {
2
+ "Logging": {
3
+ "LogLevel": {
4
+ "Default": "Debug",
5
+ "System": "Information",
6
+ "Microsoft": "Information"
7
+ }
8
+ }
9
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "Logging": {
3
+ "LogLevel": {
4
+ "Default": "Information",
5
+ "Microsoft.AspNetCore": "Warning"
6
+ }
7
+ },
8
+ "AllowedHosts": "*",
9
+ "Cratis": {
10
+ "Arc": {
11
+ "GeneratedApis": {
12
+ "RoutePrefix": "api",
13
+ "IncludeCommandNameInRoute": false,
14
+ "SegmentsToSkipForRoute": 1
15
+ }
16
+ },
17
+ "Chronicle": {
18
+ "EventStore": "CratisApp",
19
+ "ConnectionString": "chronicle://chronicle-dev-client:chronicle-dev-secret@localhost:35000"
20
+ },
21
+ "MongoDB": {
22
+ "Server": "mongodb://localhost:27017",
23
+ "Database": "CratisApp"
24
+ }
25
+ }
26
+ }
@@ -0,0 +1,23 @@
1
+ services:
2
+ chronicle:
3
+ image: cratis/chronicle:latest-development
4
+ pull_policy: always
5
+ environment:
6
+ - OTEL_EXPORTER_OTLP_ENDPOINT=http://aspire-dashboard:18889
7
+ ports:
8
+ - 27017:27017
9
+ - 8080:8080
10
+ - 11111:11111
11
+ - 30000:30000
12
+ - 35000:35000
13
+
14
+ aspire-dashboard:
15
+ image: mcr.microsoft.com/dotnet/aspire-dashboard:latest
16
+ environment:
17
+ - DOTNET_DASHBOARD_UNSECURED_ALLOW_ANONYMOUS=true
18
+ - DOTNET_DASHBOARD_OTLP_ENDPOINT_URL=http://chronicle:18889
19
+ - ALLOW_UNSECURED_TRANSPORT=true
20
+ - DOTNET_ENVIRONMENT=Development
21
+ ports:
22
+ - 18888:18888
23
+ - 4317:18889
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "cratisapp",
3
+ "private": true,
4
+ "version": "0.0.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite --config .frontend/vite.config.ts",
8
+ "build": "tsc -b .frontend/tsconfig.json && vite build --config .frontend/vite.config.ts",
9
+ "preview": "vite preview --config .frontend/vite.config.ts"
10
+ },
11
+ "dependencies": {
12
+ "@cratis/arc.react": "^20.3.1",
13
+ "@cratis/arc.vite": "^20.3.1",
14
+ "@cratis/components": "^2.5.0",
15
+ "primeicons": "^7.0.0",
16
+ "primereact": "^10.9.7",
17
+ "react": "^19.0.0",
18
+ "react-dom": "^19.0.0",
19
+ "react-icons": "^5.5.0",
20
+ "react-router-dom": "^7.0.0",
21
+ "ts-deepmerge": "^7.0.0",
22
+ "usehooks-ts": "^3.1.0"
23
+ },
24
+ "devDependencies": {
25
+ "@tailwindcss/vite": "^4.0.0",
26
+ "@types/react": "^19.0.0",
27
+ "@types/react-dom": "^19.0.0",
28
+ "@vitejs/plugin-react": "^4.0.0",
29
+ "tailwindcss": "^4.0.0",
30
+ "typescript": "^5.5.0",
31
+ "vite": "^6.0.0"
32
+ }
33
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": "./.frontend/tsconfig.json"
3
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Skill(connect)",
5
+ "Bash(curl *)",
6
+ "Bash(python3 -c \"import uuid; print\\(uuid.uuid4\\(\\)\\)\")",
7
+ "Bash(python3 -c ' *)",
8
+ "Read(//tmp/**)",
9
+ "Bash(python3 -m json.tool)",
10
+ "Bash(npm run *)"
11
+ ]
12
+ }
13
+ }
@@ -0,0 +1,215 @@
1
+ ---
2
+ name: analyze-existing-model
3
+ description: Analyze the existing event model on a board — summarizes contexts, slices, element counts, status breakdown, spec coverage, and structural gaps. Read-only, no board modifications.
4
+ ---
5
+
6
+ # Analyze Existing Model
7
+
8
+ > **Before doing anything else**, invoke the `connect` skill to resolve `TOKEN`, `BOARD_ID`, `ORG_ID`, and `BASE_URL`. Do not proceed until the connect skill has completed.
9
+
10
+ Read the full event model from a board and produce a structured analysis: what contexts exist, how many slices are in each state, which slices have GWT specs, and where the visible gaps are. This skill is read-only — it never posts comments or modifies the board.
11
+
12
+ ---
13
+
14
+ ## Step 1 — Parse arguments
15
+
16
+ From `$ARGUMENTS`, extract:
17
+
18
+ | Field | How to find it | Default |
19
+ |-------|---------------|---------|
20
+ | `contextName` | bounded context to focus on, e.g. `Ordering` | all contexts |
21
+ | `boardId` | a board UUID | from `connect` skill (`BOARD_ID`) |
22
+
23
+ If `boardId` is explicitly passed it overrides `BOARD_ID` from `connect`.
24
+
25
+ ---
26
+
27
+ ## Step 2 — List all slices
28
+
29
+ ```bash
30
+ curl -s \
31
+ -H "x-token: $TOKEN" \
32
+ -H "x-board-id: $BOARD_ID" \
33
+ -H "x-user-id: analyze-existing-model" \
34
+ "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/slicedata/slices"
35
+ ```
36
+
37
+ Response: `{ "slices": [{ "id": "<uuid>", "title": "<name>", "status": "<status>" }] }`
38
+
39
+ Save the full slice list. Count total slices and group by status:
40
+
41
+ | Status values |
42
+ |---------------|
43
+ | `Created`, `Planned`, `InProgress`, `Review`, `Done`, `Blocked`, `Assigned`, `Informational` |
44
+
45
+ ---
46
+
47
+ ## Step 3 — Discover contexts
48
+
49
+ Fetch all `MODEL_CONTEXT` nodes to identify bounded contexts on the board:
50
+
51
+ ```bash
52
+ curl -s \
53
+ -H "x-token: $TOKEN" \
54
+ -H "x-board-id: $BOARD_ID" \
55
+ -H "x-user-id: analyze-existing-model" \
56
+ "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=MODEL_CONTEXT"
57
+ ```
58
+
59
+ - If a `contextName` argument was given, filter to that single context and skip others.
60
+ - If no `MODEL_CONTEXT` nodes exist, continue with a single unnamed context scope.
61
+ - Record each context's `id` and `title`.
62
+
63
+ ---
64
+
65
+ ## Step 4 — Fetch slice data per context
66
+
67
+ For each resolved context, fetch the full element graph:
68
+
69
+ ```bash
70
+ curl -s \
71
+ -H "x-token: $TOKEN" \
72
+ -H "x-board-id: $BOARD_ID" \
73
+ -H "x-user-id: analyze-existing-model" \
74
+ "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/slicedata?contextName=<CONTEXT_NAME>"
75
+ ```
76
+
77
+ Each response contains a `slices` array. Each slice entry includes:
78
+ - `id`, `title`, `status`
79
+ - `elements`: array of `{ type, id, title, fields[] }` — element types: `EVENT`, `COMMAND`, `READMODEL`, `SCREEN`, `AUTOMATION`
80
+ - `specs`: array of GWT scenarios (may be empty)
81
+ - `edges`: relationships between elements
82
+
83
+ Fetch all contexts in parallel if there are multiple. Merge results, keyed by context name.
84
+
85
+ ---
86
+
87
+ ## Step 5 — Analyse the model
88
+
89
+ Work through the collected data and compute the following for each context:
90
+
91
+ ### 5a — Element inventory
92
+
93
+ Count elements by type across all slices in the context:
94
+
95
+ | Element type | Count |
96
+ |-------------|-------|
97
+ | EVENT | |
98
+ | COMMAND | |
99
+ | READMODEL | |
100
+ | SCREEN | |
101
+ | AUTOMATION | |
102
+
103
+ ### 5b — Slice status breakdown
104
+
105
+ Group slices by status. Report counts per status. Flag any status that suggests blocked or stalled work (`Blocked`, `Created` with no changes).
106
+
107
+ ### 5c — Spec coverage
108
+
109
+ For each slice, check whether `specs` is non-empty. Calculate:
110
+ - Slices **with** at least one GWT scenario
111
+ - Slices **without** any scenarios (grouped by slice type if detectable)
112
+
113
+ ### 5d — Structural gaps per slice
114
+
115
+ For every slice, determine its type from the elements present and check for common structural issues:
116
+
117
+ | Slice type | Expect | Flag if missing |
118
+ |-----------|--------|-----------------|
119
+ | Command slice | SCREEN + COMMAND + EVENT | Any of the three absent |
120
+ | State-view slice | SCREEN + READMODEL | Either absent |
121
+ | Automation slice | AUTOMATION + EVENT | Either absent |
122
+
123
+ Do not flag gaps that are clearly intentional (e.g. a slice named "Internal" with no SCREEN). Use judgement — only surface gaps that look unintentional given the slice title.
124
+
125
+ ### 5e — Orphaned elements
126
+
127
+ Check whether any EVENT, COMMAND, or READMODEL appears in zero slices (present on the board but not wired into any slice boundary). If the slicedata API does not expose this directly, skip this check and note it.
128
+
129
+ ---
130
+
131
+ ## Step 6 — Report to the user
132
+
133
+ Output a structured report. Never post anything to the board.
134
+
135
+ ### Report format
136
+
137
+ ```
138
+ ## Model Analysis — <BOARD_ID>
139
+ Analysed: <ISO timestamp>
140
+
141
+ ### Contexts (<n> found)
142
+ - <ContextName>: <n> slices
143
+
144
+ ---
145
+
146
+ ### Slice Status
147
+ | Status | Count |
148
+ |------------|-------|
149
+ | Done | x |
150
+ | InProgress | x |
151
+ | Planned | x |
152
+ | Created | x |
153
+ | Blocked | x |
154
+ | ... | ... |
155
+ Total: <n> slices
156
+
157
+ ---
158
+
159
+ ### Element Inventory [per context]
160
+ | Type | Count |
161
+ |-------------|-------|
162
+ | EVENT | x |
163
+ | COMMAND | x |
164
+ | READMODEL | x |
165
+ | SCREEN | x |
166
+ | AUTOMATION | x |
167
+
168
+ ---
169
+
170
+ ### Spec Coverage
171
+ - <n> of <total> slices have at least one GWT scenario (<pct>%)
172
+ - Slices without specs: <list titles, max 10, then "and N more">
173
+
174
+ ---
175
+
176
+ ### Structural Gaps
177
+ <list only genuine gaps — slice title + what's missing>
178
+ (none) if everything looks complete
179
+
180
+ ---
181
+
182
+ ### Summary
183
+ <2–4 sentences: overall model maturity, the most important gap or risk, one concrete suggestion>
184
+ ```
185
+
186
+ If a context was specified but not found, tell the user clearly and list the contexts that do exist.
187
+
188
+ ---
189
+
190
+ ## Example — full board analysis
191
+
192
+ ```bash
193
+ # 1. List slices
194
+ curl -s \
195
+ -H "x-token: $TOKEN" \
196
+ -H "x-board-id: $BOARD_ID" \
197
+ -H "x-user-id: analyze-existing-model" \
198
+ "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/slicedata/slices"
199
+
200
+ # 2. Fetch MODEL_CONTEXT nodes
201
+ curl -s \
202
+ -H "x-token: $TOKEN" \
203
+ -H "x-board-id: $BOARD_ID" \
204
+ -H "x-user-id: analyze-existing-model" \
205
+ "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=MODEL_CONTEXT"
206
+
207
+ # 3. Fetch full slice data for a context
208
+ curl -s \
209
+ -H "x-token: $TOKEN" \
210
+ -H "x-board-id: $BOARD_ID" \
211
+ -H "x-user-id: analyze-existing-model" \
212
+ "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/slicedata?contextName=Ordering"
213
+ ```
214
+
215
+ Replace `$TOKEN`, `$ORG_ID`, `$BOARD_ID`, and the context name with real values resolved from the `connect` skill.
@@ -0,0 +1,176 @@
1
+ ---
2
+ name: attributes
3
+ description: Add a new attribute or rename an existing attribute across a chain of elements from a source cell to a target cell, following inbound dependencies
4
+ ---
5
+
6
+ # Attributes
7
+
8
+ > **Before doing anything else**, invoke the `connect` skill to resolve `TOKEN`, `BOARD_ID`, and `BASE_URL`. Do not proceed until the connect skill has completed.
9
+
10
+ You are propagating an attribute change (add or rename) across a chain of elements on an eventmodelers board. You start at the target cell, apply the change, then walk backwards through inbound dependencies until you reach the source cell, applying the change to every element along the way.
11
+
12
+ ---
13
+
14
+ ## Step 1 — Gather inputs
15
+
16
+ Ask the user for all required information **in a single message** (do not ask one at a time):
17
+
18
+ 1. **Target cell** — the end of the chain (e.g. `B2`)
19
+ 2. **Source cell** — the start of the chain (e.g. `A2`)
20
+ 3. **Operation** — `add` a new attribute, or `rename` an existing one
21
+ 4. If **rename**: which attribute name to rename FROM, and what to rename it TO
22
+ 5. If **add**: the name of the new attribute to add
23
+
24
+ If any of these were already provided in `$ARGUMENTS`, skip asking for them.
25
+
26
+ ---
27
+
28
+ ## Step 2 — Resolve both cells to nodes
29
+
30
+ For each cell (target and source), resolve it to a node using the same cell-resolution strategy as the `examples` skill. Always fetch fresh:
31
+
32
+ 1. Fetch chapters:
33
+ ```bash
34
+ curl -s "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=CHAPTER" \
35
+ -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" -H "x-user-id: attributes-skill"
36
+ ```
37
+
38
+ If multiple chapters exist, ask the user which one to use.
39
+
40
+ 2. Fetch the chapter fresh to decode the grid:
41
+ ```bash
42
+ curl -s "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/$CHAPTER_ID" \
43
+ -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" -H "x-user-id: attributes-skill"
44
+ ```
45
+
46
+ Decode the cell name:
47
+ - Column letter(s) → 0-based index (A=0, B=1, … Z=25, AA=26, …)
48
+ - Row number → 0-based index (1→0, 2→1, …)
49
+ s- Find the matching column in `columns` and row in `rows`.
50
+ - Compute: **`CELL_ID = row.id + "-" + column.id`** (cell IDs are always `<rowId>-<columnId>`).
51
+
52
+ 3. Always fetch the cell live:
53
+ ```bash
54
+ curl -s "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?cellId=$CELL_ID" \
55
+ -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" -H "x-user-id: attributes-skill"
56
+ ```
57
+
58
+ Take the first non-CHAPTER result as the node for that cell.
59
+
60
+ Save as `TARGET_NODE` and `SOURCE_NODE`.
61
+
62
+ ---
63
+
64
+ ## Step 3 — Build the dependency chain
65
+
66
+ Walk backwards from `TARGET_NODE` to `SOURCE_NODE` by following inbound edges. Build an ordered list: `[TARGET_NODE, …intermediate nodes…, SOURCE_NODE]`.
67
+
68
+ ### 3a — Use node edges
69
+ Each node may have an `edges` array:
70
+ ```json
71
+ edges: [{ id, source, target, sourceHandle, targetHandle }]
72
+ ```
73
+ An **inbound** edge is one where `edge.target === currentNode.id`. For each inbound edge, fetch the source node:
74
+ ```bash
75
+ curl -s "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/$EDGE_SOURCE_ID" \
76
+ -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" -H "x-user-id: attributes-skill"
77
+ ```
78
+
79
+ ### 3b — Column-based fallback (if no edges)
80
+ If a node has no edges, use the chapter cell layout (already in memory) to find plausible inbound neighbours:
81
+
82
+ In a standard event modeling layout:
83
+ - **READMODEL** in the interaction row → its inbound EVENT is in the swimlane row of the **same column**
84
+ - **EVENT** in the swimlane row → its inbound COMMAND is in the interaction row of the **same column**
85
+ - **COMMAND** in the interaction row → its inbound READMODEL is in the swimlane row of the **previous column**
86
+
87
+ Fetch candidate nodes by their cellId (live), skip any that don't exist or are already in the chain.
88
+
89
+ ### 3c — Stop condition
90
+ Stop traversal when:
91
+ - You reach `SOURCE_NODE` (id match), OR
92
+ - There are no more inbound nodes to follow, OR
93
+ - You have visited 20 nodes (safety limit — warn the user if hit)
94
+
95
+ ---
96
+
97
+ ## Step 4 — Apply the change to each node in the chain
98
+
99
+ Process nodes in order: TARGET_NODE first, then backwards to SOURCE_NODE.
100
+
101
+ For each node:
102
+
103
+ ### If operation is `add`:
104
+ - Check if a field with that name already exists in `meta.fields` — if so, skip this node (log it).
105
+ - Otherwise append a new field:
106
+ ```json
107
+ {
108
+ "name": "<attributeName>",
109
+ "type": "String",
110
+ "query": false,
111
+ "edited": false,
112
+ "optional": false,
113
+ "generated": false,
114
+ "subfields": [],
115
+ "cardinality": "Single",
116
+ "idAttribute": false,
117
+ "showAttributes": false,
118
+ "technicalAttribute": false
119
+ }
120
+ ```
121
+
122
+ ### If operation is `rename`:
123
+ - Find the field where `name === oldName` (case-insensitive). If not found in this node, skip it (log it).
124
+ - Update only the `name` property to `newName`. Leave all other field properties unchanged.
125
+
126
+ Build the updated `fields` array and send a `node:changed` event using Python to avoid JSON escaping issues:
127
+
128
+ ```bash
129
+ python3 - <<EOF > /tmp/attributes_payload.json
130
+ import json, time, uuid
131
+ payload = [{
132
+ "id": str(uuid.uuid4()),
133
+ "eventType": "node:changed",
134
+ "nodeId": "<NODE_ID>",
135
+ "boardId": "<BOARD_ID>",
136
+ "timestamp": int(time.time() * 1000),
137
+ "changedAttributes": ["meta.fields"],
138
+ "meta": {
139
+ "fields": <updated_fields_as_python_list>
140
+ }
141
+ }]
142
+ print(json.dumps(payload))
143
+ EOF
144
+
145
+ curl -s -w "\n%{http_code}" -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
146
+ -H "Content-Type: application/json" \
147
+ -H "x-token: $TOKEN" \
148
+ -H "x-board-id: $BOARD_ID" \
149
+ -H "x-user-id: attributes-skill" \
150
+ --data-binary @/tmp/attributes_payload.json
151
+ ```
152
+
153
+ Verify HTTP 200 before proceeding to the next node. If a node fails, report the error and stop.
154
+
155
+ ---
156
+
157
+ ## Step 5 — Report back
158
+
159
+ Tell the user:
160
+
161
+ - **Operation**: add `"<name>"` / rename `"<old>"` → `"<new>"`
162
+ - **Chain**: list each element in order (type + title + cell)
163
+ - **Updated**: which nodes were changed
164
+ - **Skipped**: which nodes were skipped and why (field already exists / field not found)
165
+
166
+ Example output:
167
+ ```
168
+ Operation: rename "customerId" → "clientId"
169
+
170
+ Chain traversed (target → source):
171
+ READMODEL "Customer Overview" (B2) ✓ renamed
172
+ EVENT "Customer Registered" (A3) ✓ renamed
173
+ COMMAND "Register Customer" (A2) — skipped (field not found)
174
+
175
+ Done.
176
+ ```
@@ -0,0 +1,182 @@
1
+ ---
2
+ name: connect
3
+ description: Resolve eventmodelers connection config (token, boardId, baseUrl) from inline params or .agent-modeling-kit/.eventmodelers/config.json — ask the user for missing values, persist them, and add the file to .gitignore. All other skills invoke this first.
4
+ ---
5
+
6
+ # Connect — Resolve Eventmodelers Config
7
+
8
+ **Every other skill invokes this skill first** before making any API calls. Do not proceed past this skill until all four values (`TOKEN`, `BOARD_ID`, `ORG_ID`, `BASE_URL`) are resolved.
9
+
10
+ ---
11
+
12
+ ## What this skill produces
13
+
14
+ After running, the following variables are available for the rest of the session:
15
+
16
+ | Variable | Header sent to API | Description |
17
+ |----------|--------------------|-------------|
18
+ | `TOKEN` | `x-token` | API token UUID |
19
+ | `BOARD_ID` | `x-board-id` | Target board UUID |
20
+ | `ORG_ID` | — | Organization UUID (used in all board-scoped URLs) |
21
+ | `BASE_URL` | — | Base URL, e.g. `http://localhost:3000` |
22
+
23
+ Every API call in every skill must include these headers:
24
+ ```
25
+ x-token: <TOKEN>
26
+ x-board-id: <BOARD_ID>
27
+ x-user-id: <skill-name> ← set by each skill individually
28
+ ```
29
+
30
+ All board-scoped URLs follow the pattern: `<BASE_URL>/api/org/<ORG_ID>/boards/<BOARD_ID>/...`
31
+
32
+ ---
33
+
34
+ ## Step 0 — Check for inline parameters
35
+
36
+ Before reading the config file, scan the prompt/arguments that invoked this skill for inline overrides. Supported formats:
37
+
38
+ | Pattern | Example |
39
+ |---------|---------|
40
+ | `board=<uuid>` | `board=05cda19d-d5b8-4b51-ae88-c72f2611548a` |
41
+ | `token=<uuid>` | `token=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` |
42
+ | `org=<uuid>` | `org=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` |
43
+ | `baseUrl=<url>` | `baseUrl=http://localhost:3000` |
44
+
45
+ If an inline `board=<uuid>` is found, use it as `BOARD_ID` — **it takes priority over the config file**. Same for `token`, `org`, and `baseUrl`. Record which values came from inline params so they are not overwritten in Step 3.
46
+
47
+ ---
48
+
49
+ ## Step 1 — Read config file
50
+
51
+ Search for `.eventmodelers/config.json` starting from the current working directory and walking up through all parent directories. Also check `.agent-modeling-kit/.eventmodelers/config.json` from the project root:
52
+
53
+ ```bash
54
+ # Walk parent directories for .eventmodelers/config.json
55
+ dir="$PWD"
56
+ config_file=""
57
+ while [ "$dir" != "/" ]; do
58
+ if [ -f "$dir/.eventmodelers/config.json" ]; then
59
+ config_file="$dir/.eventmodelers/config.json"
60
+ break
61
+ fi
62
+ dir="$(dirname "$dir")"
63
+ done
64
+ [ -n "$config_file" ] && cat "$config_file"
65
+ # Also check the kit subdirectory
66
+ [ -z "$config_file" ] && cat .agent-modeling-kit/.eventmodelers/config.json 2>/dev/null
67
+ ```
68
+
69
+ If a file is found (at any level), note its path and extract any values **not already set by Step 0**:
70
+ - `token` → `TOKEN`
71
+ - `boardId` → `BOARD_ID`
72
+ - `organizationId` or `orgId` → `ORG_ID` (accept either field name)
73
+ - `baseUrl` → `BASE_URL` (default: `https://api.eventmodelers.ai` if missing)
74
+
75
+ Resolution priority: **inline param > config file > ask user**
76
+
77
+ If all four are present (from any source), skip to **Step 4 — Verify**.
78
+
79
+ ---
80
+
81
+ ## Step 2 — Ask for missing values
82
+
83
+ If after Steps 0 and 1 any required field is still missing, **ask the user one question first**:
84
+
85
+ > "Do you have a config from the eventmodelers accounts page? (yes / no)"
86
+
87
+ **If the user answers yes:**
88
+ Stop asking questions. Show this hint and wait for them to paste:
89
+
90
+ > "Great — please paste your config from https://app.eventmodelers.ai/account here."
91
+
92
+ When they paste a JSON object, parse it immediately — accept both `orgId` and `organizationId` as the organization field — apply all values, and proceed directly to Step 3.
93
+
94
+ **If the user answers no** (or pastes only a partial config), ask for each still-missing field one at a time, in this order: `token`, then `boardId`, then `orgId`. Wait for the answer before asking the next.
95
+
96
+ | Field | What to ask |
97
+ |-------|--------------------------------------------------------------------------------------|
98
+ | `token` | "Please provide your eventmodelers API token (a UUID from your workspace settings)." |
99
+ | `boardId` | "Please provide the board ID you want to work with (the UUID from the board URL)." |
100
+ | `orgId` | "Please provide your organization ID (the UUID from your organization settings)." |
101
+ | `baseUrl` | Do **not** ask — default to `https://api.eventmodelers.ai` silently. |
102
+
103
+ Where to find the token: users generate API tokens in their workspace settings at the eventmodelers platform. The token is shown only once at creation time. It is a UUID and must belong to the same organization as the board.
104
+
105
+ ---
106
+
107
+ ## Step 3 — Persist config
108
+
109
+ Once all values are collected, write the config file. Determine the write path: use `.agent-modeling-kit/.eventmodelers/config.json` if the `.agent-modeling-kit/` directory exists in cwd, otherwise use `.eventmodelers/config.json`. When writing, merge with any existing config — do **not** overwrite fields that were provided as inline params with values from a previous config (the inline param is the user's explicit intent for this session, but the persisted value should reflect the most recently user-supplied value):
110
+
111
+ ```bash
112
+ # From project root (most common):
113
+ mkdir -p .agent-modeling-kit/.eventmodelers
114
+ cat > .agent-modeling-kit/.eventmodelers/config.json << 'EOF'
115
+ {
116
+ "token": "<TOKEN>",
117
+ "boardId": "<BOARD_ID>",
118
+ "organizationId": "<ORG_ID>",
119
+ "baseUrl": "<BASE_URL>"
120
+ }
121
+ EOF
122
+ ```
123
+
124
+ Then ensure `.agent-modeling-kit/.eventmodelers/` is in `.gitignore`. Check whether it is already present:
125
+
126
+ ```bash
127
+ grep -q ".agent-modeling-kit/.eventmodelers/" .gitignore 2>/dev/null || echo "MISSING"
128
+ ```
129
+
130
+ If `MISSING`, append it:
131
+
132
+ ```bash
133
+ echo ".agent-modeling-kit/.eventmodelers/" >> .gitignore
134
+ ```
135
+
136
+ Tell the user: `"Config saved to .agent-modeling-kit/.eventmodelers/config.json and added to .gitignore."`
137
+
138
+ ---
139
+
140
+ ## Step 4 — Verify
141
+
142
+ Confirm the token and board are valid with a lightweight call:
143
+
144
+ ```bash
145
+ curl -s -o /dev/null -w "%{http_code}" \
146
+ -H "x-token: <TOKEN>" \
147
+ -H "x-board-id: <BOARD_ID>" \
148
+ -H "x-user-id: connect-skill" \
149
+ "<BASE_URL>/api/org/<ORG_ID>/boards/<BOARD_ID>/nodes?type=CHAPTER"
150
+ ```
151
+
152
+ | Response | Action |
153
+ |----------|--------|
154
+ | `200` | Config is valid. Print one line: `"Connected — board <BOARD_ID>"` and return. |
155
+ | `401` | Token is invalid or missing. Tell the user and re-run from Step 2, clearing `token`. |
156
+ | `403` | Token organization does not match board. Tell the user to check that the token was issued for the correct workspace. Re-run from Step 2 for both fields. |
157
+ | `404` | Board not found. Tell the user and re-run from Step 2, clearing `boardId`. |
158
+ | Any other | Print the status code and raw response. Ask the user how to proceed. |
159
+
160
+ ---
161
+
162
+ ## Config file format
163
+
164
+ `.agent-modeling-kit/.eventmodelers/config.json`:
165
+ ```json
166
+ {
167
+ "token": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
168
+ "boardId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
169
+ "organizationId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
170
+ "baseUrl": "http://localhost:3000"
171
+ }
172
+ ```
173
+
174
+ The `token` field is a secret. It is never logged or shown after initial confirmation.
175
+
176
+ ---
177
+
178
+ ## Security notes
179
+
180
+ - The config file is workspace-local and gitignored — never commit it.
181
+ - The token grants write access to all boards in its organization — treat it like a password.
182
+ - If a skill receives a `401` or `403` mid-session, re-invoke this skill to refresh the config before retrying.