@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.
- package/README.md +175 -0
- package/cli.js +676 -0
- package/package.json +35 -0
- package/shared/build-kit/code-export.mjs +560 -0
- package/shared/build-kit/lib/ollama-agent.js +147 -0
- package/shared/build-kit/package.json +11 -0
- package/shared/build-kit/ralph-ollama.js +39 -0
- package/shared/build-kit/realtime-agent.js +18 -0
- package/stacks/axon/templates/.claude/skills/build-automation/SKILL.md +407 -0
- package/stacks/axon/templates/.claude/skills/build-automation/references/feature-flag-patterns.md +114 -0
- package/stacks/axon/templates/.claude/skills/build-automation-workflow/SKILL.md +496 -0
- package/stacks/axon/templates/.claude/skills/build-automation-workflow/references/axon-workflow-api.md +279 -0
- package/stacks/axon/templates/.claude/skills/build-automation-workflow/references/feature-flag-patterns.md +114 -0
- package/stacks/axon/templates/.claude/skills/build-state-change/SKILL.md +396 -0
- package/stacks/axon/templates/.claude/skills/build-state-change/references/axon-test-fixture-patterns.md +162 -0
- package/stacks/axon/templates/.claude/skills/build-state-change/references/feature-flag-patterns.md +56 -0
- package/stacks/axon/templates/.claude/skills/build-state-change/references/rest-api-patterns.md +115 -0
- package/stacks/axon/templates/.claude/skills/build-state-view/SKILL.md +282 -0
- package/stacks/axon/templates/.claude/skills/connect/SKILL.md +178 -0
- package/stacks/axon/templates/.claude/skills/learn-eventmodelers-api/SKILL.md +611 -0
- package/stacks/axon/templates/.claude/skills/load-slice/SKILL.md +141 -0
- package/stacks/axon/templates/.claude/skills/update-slice-status/SKILL.md +105 -0
- package/stacks/axon/templates/build-kit/lib/AGENT.md +47 -0
- package/stacks/axon/templates/build-kit/lib/agent.sh +20 -0
- package/stacks/axon/templates/build-kit/lib/backend-prompt.md +158 -0
- package/stacks/axon/templates/build-kit/lib/prompt.md +126 -0
- package/stacks/axon/templates/build-kit/lib/ralph.js +369 -0
- package/stacks/axon/templates/build-kit/ralph-claude.js +44 -0
- package/stacks/axon/templates/build-kit/ralph.sh +98 -0
- package/stacks/axon/templates/root/.env.example +5 -0
- package/stacks/axon/templates/root/CLAUDE.md +60 -0
- package/stacks/axon/templates/root/README.md +44 -0
- package/stacks/axon/templates/root/docker-compose.yml +64 -0
- package/stacks/axon/templates/root/mvnw +259 -0
- package/stacks/axon/templates/root/mvnw.cmd +149 -0
- package/stacks/axon/templates/root/pom.xml +125 -0
- package/stacks/axon/templates/root/src/main/java/io/axoniq/quickstart/QuickstartApplication.java +128 -0
- package/stacks/axon/templates/root/src/main/java/io/axoniq/quickstart/config/WebConfig.java +155 -0
- package/stacks/axon/templates/root/src/main/resources/application.properties +2 -0
- package/stacks/axon/templates/root/src/main/resources/static/bg-body.png +0 -0
- package/stacks/axon/templates/root/src/main/resources/static/bg-header.png +0 -0
- package/stacks/axon/templates/root/src/main/resources/static/index.html +596 -0
- package/stacks/cratis-csharp/templates/.claude/skills/_shared/cratis-conventions.md +251 -0
- package/stacks/cratis-csharp/templates/.claude/skills/build-automation/SKILL.md +99 -0
- package/stacks/cratis-csharp/templates/.claude/skills/build-automation/references/patterns.md +115 -0
- package/stacks/cratis-csharp/templates/.claude/skills/build-state-change/SKILL.md +163 -0
- package/stacks/cratis-csharp/templates/.claude/skills/build-state-change/references/patterns.md +234 -0
- package/stacks/cratis-csharp/templates/.claude/skills/build-state-view/SKILL.md +120 -0
- package/stacks/cratis-csharp/templates/.claude/skills/build-state-view/references/patterns.md +166 -0
- package/stacks/cratis-csharp/templates/.claude/skills/connect/SKILL.md +169 -0
- package/stacks/cratis-csharp/templates/.claude/skills/learn-eventmodelers-api/SKILL.md +609 -0
- package/stacks/cratis-csharp/templates/.claude/skills/load-slice/SKILL.md +141 -0
- package/stacks/cratis-csharp/templates/.claude/skills/update-slice-status/SKILL.md +105 -0
- package/stacks/cratis-csharp/templates/build-kit/lib/AGENT.md +58 -0
- package/stacks/cratis-csharp/templates/build-kit/lib/agent.sh +20 -0
- package/stacks/cratis-csharp/templates/build-kit/lib/backend-prompt.md +129 -0
- package/stacks/cratis-csharp/templates/build-kit/lib/prompt.md +124 -0
- package/stacks/cratis-csharp/templates/build-kit/lib/ralph.js +302 -0
- package/stacks/cratis-csharp/templates/build-kit/ralph-claude.js +37 -0
- package/stacks/cratis-csharp/templates/build-kit/ralph.sh +98 -0
- package/stacks/cratis-csharp/templates/root/.frontend/index.css +29 -0
- package/stacks/cratis-csharp/templates/root/.frontend/index.html +17 -0
- package/stacks/cratis-csharp/templates/root/.frontend/main.tsx +18 -0
- package/stacks/cratis-csharp/templates/root/.frontend/tsconfig.json +42 -0
- package/stacks/cratis-csharp/templates/root/.frontend/tsconfig.node.json +11 -0
- package/stacks/cratis-csharp/templates/root/.frontend/vite.config.ts +56 -0
- package/stacks/cratis-csharp/templates/root/App.tsx +23 -0
- package/stacks/cratis-csharp/templates/root/CLAUDE.md +62 -0
- package/stacks/cratis-csharp/templates/root/CratisApp.csproj +25 -0
- package/stacks/cratis-csharp/templates/root/CratisApp.sln +18 -0
- package/stacks/cratis-csharp/templates/root/GlobalUsings.cs +3 -0
- package/stacks/cratis-csharp/templates/root/Home.tsx +102 -0
- package/stacks/cratis-csharp/templates/root/Program.cs +26 -0
- package/stacks/cratis-csharp/templates/root/README.md +192 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Listing/AllListings.ts +47 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Listing/Listing.cs +11 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Listing/Listing.ts +12 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Listing/ListingDataTable.tsx +17 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Listing/index.ts +1 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Registration/Register.ts +51 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Registration/RegisterDialog.tsx +18 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Registration/Registration.cs +27 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/Registration/index.ts +1 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/SomeFeature.tsx +22 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/SomeName.cs +3 -0
- package/stacks/cratis-csharp/templates/root/SomeModule/SomeFeature/index.ts +1 -0
- package/stacks/cratis-csharp/templates/root/appsettings.Development.json +9 -0
- package/stacks/cratis-csharp/templates/root/appsettings.json +26 -0
- package/stacks/cratis-csharp/templates/root/docker-compose.yml +23 -0
- package/stacks/cratis-csharp/templates/root/package.json +33 -0
- package/stacks/cratis-csharp/templates/root/tsconfig.json +3 -0
- package/stacks/modeling-kit/templates/.claude/settings.local.json +13 -0
- package/stacks/modeling-kit/templates/.claude/skills/analyze-existing-model/SKILL.md +215 -0
- package/stacks/modeling-kit/templates/.claude/skills/attributes/SKILL.md +176 -0
- package/stacks/modeling-kit/templates/.claude/skills/connect/SKILL.md +182 -0
- package/stacks/modeling-kit/templates/.claude/skills/discover-storyboard/SKILL.md +383 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-applying-conways-law/SKILL.md +465 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-brainstorming-events/SKILL.md +587 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-brainstorming-events/references/facilitating-event-modeling-workshops.md +626 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-checking-completeness/SKILL.md +542 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-designing-event-models/SKILL.md +497 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-elaborating-scenarios/SKILL.md +783 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-inputs/SKILL.md +604 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-outputs/SKILL.md +699 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-integrating-legacy-systems/SKILL.md +674 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/SKILL.md +231 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/domain-patterns.md +150 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/patterns.md +329 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/snapshotting.md +204 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-orchestrating-event-modeling/SKILL.md +352 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-orchestrating-event-modeling/references/project-planning-with-event-modeling.md +341 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-plotting-events/SKILL.md +153 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/SKILL.md +136 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/references/examples.md +78 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/references/patterns.md +85 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-storyboarding-events/SKILL.md +655 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-translating-external-events/SKILL.md +479 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models/SKILL.md +234 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models-checklist/SKILL.md +353 -0
- package/stacks/modeling-kit/templates/.claude/skills/examples/SKILL.md +200 -0
- package/stacks/modeling-kit/templates/.claude/skills/handle-comment/SKILL.md +94 -0
- package/stacks/modeling-kit/templates/.claude/skills/learn-eventmodelers-api/SKILL.md +441 -0
- package/stacks/modeling-kit/templates/.claude/skills/place-element/SKILL.md +290 -0
- package/stacks/modeling-kit/templates/.claude/skills/storyboard/SKILL.md +212 -0
- package/stacks/modeling-kit/templates/.claude/skills/storyboard-screen/SKILL.md +123 -0
- package/stacks/modeling-kit/templates/.claude/skills/timeline/SKILL.md +353 -0
- package/stacks/modeling-kit/templates/.claude/skills/update-slice-status/SKILL.md +110 -0
- package/stacks/modeling-kit/templates/.claude/skills/wdyt/SKILL.md +134 -0
- package/stacks/modeling-kit/templates/kit/lib/agent.sh +20 -0
- package/stacks/modeling-kit/templates/kit/lib/ollama-agent.js +147 -0
- package/stacks/modeling-kit/templates/kit/lib/ralph.js +286 -0
- package/stacks/modeling-kit/templates/kit/package.json +12 -0
- package/stacks/modeling-kit/templates/kit/ralph-claude.js +50 -0
- package/stacks/modeling-kit/templates/kit/ralph-ollama.js +38 -0
- package/stacks/modeling-kit/templates/kit/ralph.sh +61 -0
- package/stacks/modeling-kit/templates/kit/realtime-agent.js +18 -0
- package/stacks/modeling-kit/templates/root/CLAUDE.md +56 -0
- package/stacks/node/templates/.claude/skills/build-automation/SKILL.md +266 -0
- package/stacks/node/templates/.claude/skills/build-state-change/SKILL.md +344 -0
- package/stacks/node/templates/.claude/skills/build-state-view/SKILL.md +412 -0
- package/stacks/node/templates/.claude/skills/connect/SKILL.md +178 -0
- package/stacks/node/templates/.claude/skills/learn-eventmodelers-api/SKILL.md +628 -0
- package/stacks/node/templates/.claude/skills/load-slice/SKILL.md +143 -0
- package/stacks/node/templates/.claude/skills/update-slice-status/SKILL.md +110 -0
- package/stacks/node/templates/build-kit/README.md +86 -0
- package/stacks/node/templates/build-kit/lib/AGENT.md +47 -0
- package/stacks/node/templates/build-kit/lib/agent.sh +20 -0
- package/stacks/node/templates/build-kit/lib/backend-prompt.md +152 -0
- package/stacks/node/templates/build-kit/lib/prompt.md +122 -0
- package/stacks/node/templates/build-kit/lib/ralph.js +369 -0
- package/stacks/node/templates/build-kit/ralph-claude.js +44 -0
- package/stacks/node/templates/build-kit/ralph.sh +98 -0
- package/stacks/node/templates/root/.env.example +15 -0
- package/stacks/node/templates/root/CLAUDE.md +60 -0
- package/stacks/node/templates/root/docker-compose.yml +15 -0
- package/stacks/node/templates/root/flyway.conf +17 -0
- package/stacks/node/templates/root/migrations/V1__schema.sql.example +12 -0
- package/stacks/node/templates/root/package.json +50 -0
- package/stacks/node/templates/root/server.ts +130 -0
- package/stacks/node/templates/root/setup-env.sh +53 -0
- package/stacks/node/templates/root/src/common/assertions.ts +6 -0
- package/stacks/node/templates/root/src/common/db.ts +32 -0
- package/stacks/node/templates/root/src/common/loadPostgresEventstore.ts +23 -0
- package/stacks/node/templates/root/src/common/parseEndpoint.ts +51 -0
- package/stacks/node/templates/root/src/common/processorDlq.ts +28 -0
- package/stacks/node/templates/root/src/common/realtimeBroadcast.ts +12 -0
- package/stacks/node/templates/root/src/common/replay.ts +16 -0
- package/stacks/node/templates/root/src/common/routes.ts +19 -0
- package/stacks/node/templates/root/src/common/testHelpers.ts +44 -0
- package/stacks/node/templates/root/src/swagger.ts +34 -0
- package/stacks/node/templates/root/src/util/assertions.ts +6 -0
- package/stacks/node/templates/root/src/util/hash.ts +9 -0
- package/stacks/node/templates/root/src/util/sanitize.ts +23 -0
- package/stacks/node/templates/root/tsconfig.json +32 -0
- package/stacks/node/templates/root/vercel.json +8 -0
- package/stacks/supabase/templates/.claude/skills/build-automation/SKILL.md +266 -0
- package/stacks/supabase/templates/.claude/skills/build-state-change/SKILL.md +344 -0
- package/stacks/supabase/templates/.claude/skills/build-state-view/SKILL.md +390 -0
- package/stacks/supabase/templates/.claude/skills/build-webhook/SKILL.md +303 -0
- package/stacks/supabase/templates/.claude/skills/connect/SKILL.md +178 -0
- package/stacks/supabase/templates/.claude/skills/learn-eventmodelers-api/SKILL.md +628 -0
- package/stacks/supabase/templates/.claude/skills/load-slice/SKILL.md +143 -0
- package/stacks/supabase/templates/.claude/skills/update-slice-status/SKILL.md +110 -0
- package/stacks/supabase/templates/build-kit/README.md +86 -0
- package/stacks/supabase/templates/build-kit/lib/AGENT.md +47 -0
- package/stacks/supabase/templates/build-kit/lib/agent.sh +20 -0
- package/stacks/supabase/templates/build-kit/lib/backend-prompt.md +152 -0
- package/stacks/supabase/templates/build-kit/lib/prompt.md +123 -0
- package/stacks/supabase/templates/build-kit/lib/ralph.js +369 -0
- package/stacks/supabase/templates/build-kit/ralph-claude.js +44 -0
- package/stacks/supabase/templates/build-kit/ralph.sh +98 -0
- package/stacks/supabase/templates/root/.env.example +22 -0
- package/stacks/supabase/templates/root/CLAUDE.md +61 -0
- package/stacks/supabase/templates/root/flyway.conf +17 -0
- package/stacks/supabase/templates/root/package.json +52 -0
- package/stacks/supabase/templates/root/server.ts +177 -0
- package/stacks/supabase/templates/root/setup-env.sh +53 -0
- package/stacks/supabase/templates/root/src/common/assertions.ts +6 -0
- package/stacks/supabase/templates/root/src/common/db.ts +32 -0
- package/stacks/supabase/templates/root/src/common/loadPostgresEventstore.ts +23 -0
- package/stacks/supabase/templates/root/src/common/parseEndpoint.ts +51 -0
- package/stacks/supabase/templates/root/src/common/processorDlq.ts +28 -0
- package/stacks/supabase/templates/root/src/common/realtimeBroadcast.ts +19 -0
- package/stacks/supabase/templates/root/src/common/replay.ts +16 -0
- package/stacks/supabase/templates/root/src/common/routes.ts +23 -0
- package/stacks/supabase/templates/root/src/common/testHelpers.ts +54 -0
- package/stacks/supabase/templates/root/src/supabase/README.md +141 -0
- package/stacks/supabase/templates/root/src/supabase/api.ts +56 -0
- package/stacks/supabase/templates/root/src/supabase/requireOrgaAdmin.ts +32 -0
- package/stacks/supabase/templates/root/src/supabase/requireSysUser.ts +40 -0
- package/stacks/supabase/templates/root/src/supabase/requireUser.ts +72 -0
- package/stacks/supabase/templates/root/src/swagger.ts +34 -0
- package/stacks/supabase/templates/root/src/util/assertions.ts +6 -0
- package/stacks/supabase/templates/root/src/util/hash.ts +9 -0
- package/stacks/supabase/templates/root/src/util/sanitize.ts +23 -0
- package/stacks/supabase/templates/root/supabase/config.toml +295 -0
- package/stacks/supabase/templates/root/supabase/migrations/V1__schema.sql.example +12 -0
- package/stacks/supabase/templates/root/supabase/seed.sql +1 -0
- package/stacks/supabase/templates/root/tsconfig.json +32 -0
- package/stacks/supabase/templates/root/vercel.json +8 -0
|
@@ -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,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.
|