@kody-ade/kody-engine 0.1.7 → 0.2.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 (52) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +28 -61
  3. package/dist/bin/kody2.js +2579 -0
  4. package/dist/executables/build/profile.json +83 -0
  5. package/dist/executables/build/prompts/fix-ci.md +42 -0
  6. package/dist/executables/build/prompts/fix.md +40 -0
  7. package/dist/executables/build/prompts/resolve.md +34 -0
  8. package/dist/executables/build/prompts/run.md +31 -0
  9. package/dist/executables/types.ts +154 -0
  10. package/kody.config.schema.json +406 -0
  11. package/package.json +23 -28
  12. package/templates/kody2.yml +56 -0
  13. package/dist/bin/cli.mjs +0 -10781
  14. package/dist/bin/cli.mjs.map +0 -1
  15. package/opencode/agents/admin-expert.md +0 -73
  16. package/opencode/agents/advisor.md +0 -128
  17. package/opencode/agents/architect.md +0 -193
  18. package/opencode/agents/autofix.md +0 -103
  19. package/opencode/agents/build-delegation-test.md +0 -93
  20. package/opencode/agents/build-delegation.md +0 -98
  21. package/opencode/agents/build-manager.md +0 -212
  22. package/opencode/agents/build.md +0 -266
  23. package/opencode/agents/clarify.md +0 -84
  24. package/opencode/agents/code-reviewer.md +0 -42
  25. package/opencode/agents/commit.md +0 -27
  26. package/opencode/agents/docs.md +0 -123
  27. package/opencode/agents/domain/admin-expert.md +0 -43
  28. package/opencode/agents/domain/llm-expert.md +0 -55
  29. package/opencode/agents/domain/payload-expert.md +0 -67
  30. package/opencode/agents/domain/security-auditor.md +0 -62
  31. package/opencode/agents/domain/ui-expert.md +0 -43
  32. package/opencode/agents/domain/web-expert.md +0 -45
  33. package/opencode/agents/e2e-test-writer.md +0 -156
  34. package/opencode/agents/fix.md +0 -158
  35. package/opencode/agents/gap.md +0 -206
  36. package/opencode/agents/kody-expert.md +0 -173
  37. package/opencode/agents/llm-expert.md +0 -90
  38. package/opencode/agents/neuron.md +0 -12
  39. package/opencode/agents/payload-expert.md +0 -32
  40. package/opencode/agents/plan-gap.md +0 -132
  41. package/opencode/agents/pr.md +0 -25
  42. package/opencode/agents/review.md +0 -163
  43. package/opencode/agents/security-auditor.md +0 -33
  44. package/opencode/agents/taskify.md +0 -344
  45. package/opencode/agents/test-writer.md +0 -261
  46. package/opencode/agents/test.md +0 -142
  47. package/opencode/agents/verify.md +0 -30
  48. package/opencode/agents/web-expert.md +0 -63
  49. package/opencode/docs/BROWSER_AUTOMATION.md +0 -64
  50. package/opencode/docs/PIPELINE.md +0 -210
  51. package/opencode/opencode.json +0 -98
  52. package/templates/kody.yml +0 -312
@@ -0,0 +1,406 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "Kody Engine Lite Configuration",
4
+ "description": "Configuration for the Kody autonomous SDLC pipeline. See https://github.com/aharonyaircohen/Kody-Engine-Lite",
5
+ "type": "object",
6
+ "properties": {
7
+ "quality": {
8
+ "type": "object",
9
+ "description": "Quality gate commands run during the verify stage. Leave empty string to skip.",
10
+ "properties": {
11
+ "typecheck": {
12
+ "type": "string",
13
+ "description": "TypeScript type checking command (e.g., 'pnpm typecheck', 'pnpm tsc --noEmit')",
14
+ "default": "pnpm -s tsc --noEmit"
15
+ },
16
+ "lint": {
17
+ "type": "string",
18
+ "description": "Lint command (e.g., 'pnpm lint'). Empty to skip.",
19
+ "default": ""
20
+ },
21
+ "lintFix": {
22
+ "type": "string",
23
+ "description": "Auto-fix lint command, run when verify fails (e.g., 'pnpm lint:fix')",
24
+ "default": ""
25
+ },
26
+ "formatFix": {
27
+ "type": "string",
28
+ "description": "Auto-fix format command, run when verify fails (e.g., 'pnpm format')",
29
+ "default": ""
30
+ },
31
+ "testUnit": {
32
+ "type": "string",
33
+ "description": "Unit test command. Use test:unit to exclude integration/e2e tests (e.g., 'pnpm test:unit')",
34
+ "default": "pnpm -s test"
35
+ }
36
+ },
37
+ "additionalProperties": false
38
+ },
39
+ "git": {
40
+ "type": "object",
41
+ "description": "Git configuration",
42
+ "properties": {
43
+ "defaultBranch": {
44
+ "type": "string",
45
+ "description": "Default branch for PR base and branch syncing (e.g., 'main', 'dev')",
46
+ "default": "dev"
47
+ }
48
+ },
49
+ "additionalProperties": false
50
+ },
51
+ "github": {
52
+ "type": "object",
53
+ "description": "GitHub repository settings. Auto-detected from git remote by init.",
54
+ "properties": {
55
+ "owner": {
56
+ "type": "string",
57
+ "description": "GitHub organization or username (e.g., 'my-org')"
58
+ },
59
+ "repo": {
60
+ "type": "string",
61
+ "description": "GitHub repository name (e.g., 'my-repo')"
62
+ },
63
+ "postSummary": {
64
+ "type": "boolean",
65
+ "description": "Post a structured pipeline summary comment on the issue after completion. Default: true in CI, false locally.",
66
+ "default": true
67
+ }
68
+ },
69
+ "additionalProperties": false
70
+ },
71
+ "timeouts": {
72
+ "type": "object",
73
+ "description": "Per-stage timeout overrides in seconds. Defaults: taskify=600, plan=600, build=2400, verify=300, review=600, review-fix=1200, ship=240",
74
+ "properties": {
75
+ "taskify": { "type": "number", "description": "Taskify stage timeout in seconds", "default": 600 },
76
+ "plan": { "type": "number", "description": "Plan stage timeout in seconds", "default": 600 },
77
+ "build": { "type": "number", "description": "Build stage timeout in seconds", "default": 2400 },
78
+ "verify": { "type": "number", "description": "Verify stage timeout in seconds", "default": 300 },
79
+ "review": { "type": "number", "description": "Review stage timeout in seconds", "default": 600 },
80
+ "review-fix": { "type": "number", "description": "Review-fix stage timeout in seconds", "default": 1200 },
81
+ "ship": { "type": "number", "description": "Ship stage timeout in seconds", "default": 240 }
82
+ },
83
+ "additionalProperties": false
84
+ },
85
+ "issueContext": {
86
+ "type": "object",
87
+ "description": "kody2: how many and how much of the issue's comments the agent sees in its prompt. Higher = more context but larger prompts. Defaults: 50 comments, 10000 bytes each.",
88
+ "properties": {
89
+ "commentLimit": {
90
+ "type": "integer",
91
+ "minimum": 1,
92
+ "description": "Max number of comments (most recent first) to include in the agent prompt. Default: 50.",
93
+ "default": 50
94
+ },
95
+ "commentMaxBytes": {
96
+ "type": "integer",
97
+ "minimum": 1,
98
+ "description": "Max bytes per comment before truncation. Default: 10000.",
99
+ "default": 10000
100
+ }
101
+ },
102
+ "additionalProperties": false
103
+ },
104
+ "testRequirements": {
105
+ "type": "array",
106
+ "description": "kody2 enforces that newly added files matching `pattern` ship with a sibling test file matching `requireSibling`. Misses fail the run; the agent gets one retry with the gap as feedback. Empty array or absent = no enforcement.",
107
+ "items": {
108
+ "type": "object",
109
+ "required": ["pattern", "requireSibling"],
110
+ "additionalProperties": false,
111
+ "properties": {
112
+ "pattern": {
113
+ "type": "string",
114
+ "description": "Glob-style pattern (* within segment, ** across segments). Example: 'src/app/api/**/route.ts'"
115
+ },
116
+ "requireSibling": {
117
+ "type": "string",
118
+ "description": "Sibling test path template. Tokens: {name} (filename without ext), {ext} (e.g. .ts). Example: '{name}.test{ext}'"
119
+ }
120
+ }
121
+ }
122
+ },
123
+ "agent": {
124
+ "type": "object",
125
+ "description": "Agent execution configuration",
126
+ "properties": {
127
+ "model": {
128
+ "type": "string",
129
+ "pattern": "^[^/]+/.+$",
130
+ "description": "Single 'provider/model' string used by kody2 (single-session pipeline). Use 'claude/...' or 'anthropic/...' for direct Anthropic API; anything else routes through LiteLLM proxy.",
131
+ "examples": ["claude/claude-sonnet-4-6", "minimax/MiniMax-M2.7-highspeed"]
132
+ },
133
+ "modelMap": {
134
+ "type": "object",
135
+ "description": "Maps model tiers to 'provider/model' strings. Use 'claude/...' or 'anthropic/...' for direct Anthropic API; anything else routes through LiteLLM proxy.",
136
+ "properties": {
137
+ "cheap": {
138
+ "type": "string",
139
+ "pattern": "^[^/]+/.+$",
140
+ "description": "Fast/cheap 'provider/model' for taskify (e.g., 'claude/claude-haiku-4-5-20251001', 'minimax/MiniMax-M2.7-highspeed')",
141
+ "examples": ["claude/claude-haiku-4-5-20251001", "minimax/MiniMax-M2.7-highspeed"]
142
+ },
143
+ "mid": {
144
+ "type": "string",
145
+ "pattern": "^[^/]+/.+$",
146
+ "description": "Mid-tier 'provider/model' for build, review-fix, autofix (e.g., 'claude/claude-sonnet-4-6')",
147
+ "examples": ["claude/claude-sonnet-4-6", "minimax/MiniMax-M2.7-highspeed"]
148
+ },
149
+ "strong": {
150
+ "type": "string",
151
+ "pattern": "^[^/]+/.+$",
152
+ "description": "Strongest 'provider/model' for plan, review — deep reasoning (e.g., 'claude/claude-opus-4-6')",
153
+ "examples": ["claude/claude-opus-4-6", "minimax/MiniMax-M2.7-highspeed"]
154
+ }
155
+ },
156
+ "additionalProperties": false
157
+ },
158
+ "defaultRunner": {
159
+ "type": "string",
160
+ "description": "Name of the default runner when multiple runners are configured (advanced)",
161
+ "default": "claude"
162
+ },
163
+ "runners": {
164
+ "type": "object",
165
+ "description": "Named runner definitions (advanced)",
166
+ "additionalProperties": {
167
+ "type": "object",
168
+ "properties": {
169
+ "type": {
170
+ "type": "string",
171
+ "enum": ["claude-code"]
172
+ }
173
+ },
174
+ "required": ["type"]
175
+ }
176
+ },
177
+ "stageRunners": {
178
+ "type": "object",
179
+ "description": "Per-stage runner assignment (advanced). Maps stage name to runner name.",
180
+ "properties": {
181
+ "taskify": { "type": "string" },
182
+ "plan": { "type": "string" },
183
+ "build": { "type": "string" },
184
+ "autofix": { "type": "string" },
185
+ "review": { "type": "string" },
186
+ "review-fix": { "type": "string" }
187
+ },
188
+ "additionalProperties": false
189
+ },
190
+ "default": {
191
+ "type": "string",
192
+ "pattern": "^[^/]+/.+$",
193
+ "description": "Default 'provider/model' string applied to every stage. Use 'claude/<model>' for direct Anthropic API; anything else routes through LiteLLM proxy. Overridden by entries in 'stages'.",
194
+ "examples": ["claude/claude-sonnet-4-6", "minimax/MiniMax-M2.7-highspeed", "openai/gpt-4o"]
195
+ },
196
+ "stages": {
197
+ "type": "object",
198
+ "description": "Per-stage 'provider/model' overrides. Takes precedence over 'default' and 'modelMap'.",
199
+ "properties": {
200
+ "taskify": { "type": "string", "pattern": "^[^/]+/.+$" },
201
+ "plan": { "type": "string", "pattern": "^[^/]+/.+$" },
202
+ "build": { "type": "string", "pattern": "^[^/]+/.+$" },
203
+ "verify": { "type": "string", "pattern": "^[^/]+/.+$" },
204
+ "review": { "type": "string", "pattern": "^[^/]+/.+$" },
205
+ "review-fix": { "type": "string", "pattern": "^[^/]+/.+$" },
206
+ "ship": { "type": "string", "pattern": "^[^/]+/.+$" }
207
+ },
208
+ "additionalProperties": false
209
+ },
210
+ "escalateOnTimeout": {
211
+ "type": "boolean",
212
+ "description": "Escalate to a stronger model tier when a stage times out and retries. Default: true.",
213
+ "default": true
214
+ }
215
+ },
216
+ "additionalProperties": false
217
+ },
218
+ "watch": {
219
+ "type": "object",
220
+ "description": "Kody Watch — periodic health monitoring. Runs every 30 minutes via GitHub Actions to check pipeline health, security, and configuration.",
221
+ "properties": {
222
+ "enabled": {
223
+ "type": "boolean",
224
+ "description": "Enable Kody Watch periodic monitoring",
225
+ "default": false
226
+ },
227
+ "activityLog": {
228
+ "type": "number",
229
+ "description": "GitHub issue number for posting activity log reports. Auto-created by bootstrap."
230
+ },
231
+ "model": {
232
+ "type": "string",
233
+ "pattern": "^[^/]+/.+$",
234
+ "description": "'provider/model' string for watch agents. Falls back to agent.modelMap.cheap if not set.",
235
+ "examples": ["claude/claude-sonnet-4-6", "claude/claude-haiku-4-5-20251001", "minimax/MiniMax-M1"]
236
+ }
237
+ },
238
+ "additionalProperties": false
239
+ },
240
+ "decompose": {
241
+ "type": "object",
242
+ "description": "Decompose command configuration for splitting complex tasks into parallel sub-tasks.",
243
+ "properties": {
244
+ "enabled": {
245
+ "type": "boolean",
246
+ "description": "Enable the decompose command. Default: true.",
247
+ "default": true
248
+ },
249
+ "maxParallelSubTasks": {
250
+ "type": "number",
251
+ "description": "Maximum number of sub-tasks to build in parallel. Default: 3.",
252
+ "default": 3
253
+ },
254
+ "minComplexityScore": {
255
+ "type": "number",
256
+ "description": "Minimum complexity score (1-10) for a task to be decomposed. Set lower to decompose more tasks. Default: 4.",
257
+ "default": 4
258
+ }
259
+ },
260
+ "additionalProperties": false
261
+ },
262
+ "mcp": {
263
+ "type": "object",
264
+ "description": "MCP (Model Context Protocol) server configuration. Enables external tools like browser automation.",
265
+ "properties": {
266
+ "enabled": {
267
+ "type": "boolean",
268
+ "description": "Enable MCP server integration",
269
+ "default": false
270
+ },
271
+ "servers": {
272
+ "type": "object",
273
+ "description": "Named MCP server definitions. Each key is a server name.",
274
+ "additionalProperties": {
275
+ "type": "object",
276
+ "properties": {
277
+ "command": {
278
+ "type": "string",
279
+ "description": "Command to start the MCP server (e.g., 'npx')"
280
+ },
281
+ "args": {
282
+ "type": "array",
283
+ "items": { "type": "string" },
284
+ "description": "Command arguments"
285
+ },
286
+ "env": {
287
+ "type": "object",
288
+ "additionalProperties": { "type": "string" },
289
+ "description": "Environment variables for the server process"
290
+ }
291
+ },
292
+ "required": ["command"]
293
+ }
294
+ },
295
+ "stages": {
296
+ "type": "array",
297
+ "items": { "type": "string" },
298
+ "description": "Stages that can use MCP tools. Defaults to [\"build\", \"verify\", \"review\", \"review-fix\"]",
299
+ "default": ["build", "verify", "review", "review-fix"]
300
+ },
301
+ "devServer": {
302
+ "type": "object",
303
+ "description": "DEPRECATED: Use top-level devServer instead. Kept for backward compatibility.",
304
+ "properties": {
305
+ "command": {
306
+ "type": "string",
307
+ "description": "Command to start the dev server (e.g., 'pnpm dev')"
308
+ },
309
+ "url": {
310
+ "type": "string",
311
+ "description": "URL where the dev server will be accessible (e.g., 'http://localhost:3000')"
312
+ },
313
+ "readyPattern": {
314
+ "type": "string",
315
+ "description": "Regex pattern to match in stdout when server is ready. Default: 'Ready in|compiled|started server|Local:'"
316
+ },
317
+ "readyTimeout": {
318
+ "type": "number",
319
+ "description": "Seconds to wait for the server to be ready. Default: 180"
320
+ }
321
+ },
322
+ "required": ["command", "url"]
323
+ }
324
+ },
325
+ "required": ["enabled", "servers"],
326
+ "additionalProperties": false
327
+ },
328
+ "release": {
329
+ "type": "object",
330
+ "description": "Release automation configuration. Used by 'kody-engine release' command.",
331
+ "properties": {
332
+ "versionFiles": {
333
+ "type": "array",
334
+ "items": { "type": "string" },
335
+ "description": "Files containing version strings to update on release. Default: [\"package.json\"]",
336
+ "default": ["package.json"]
337
+ },
338
+ "publishCommand": {
339
+ "type": "string",
340
+ "description": "Shell command to run after tagging for publishing. Empty = skip. NOT hardcoded to any registry.",
341
+ "default": "",
342
+ "examples": ["npm publish --access public", "cargo publish", "make publish"]
343
+ },
344
+ "notifyCommand": {
345
+ "type": "string",
346
+ "description": "Shell command for post-release notifications. $VERSION is interpolated at runtime. Empty = skip.",
347
+ "default": "",
348
+ "examples": ["curl -X POST $SLACK_WEBHOOK -d '{\"text\": \"Released v$VERSION\"}'"]
349
+ },
350
+ "e2eCommand": {
351
+ "type": "string",
352
+ "description": "Shell command to run E2E tests as a release gate. Runs before publishCommand. $VERSION is interpolated at runtime. Empty = skip (no E2E gate).",
353
+ "default": "",
354
+ "examples": ["pnpm test:e2e", "npm run e2e", "playwright test"]
355
+ },
356
+ "timeoutMs": {
357
+ "type": "integer",
358
+ "description": "Timeout in milliseconds for e2eCommand, publishCommand, and notifyCommand. Default: 600000 (10 minutes).",
359
+ "default": 600000,
360
+ "examples": [600000, 1200000, 1800000]
361
+ },
362
+ "releaseBranch": {
363
+ "type": "string",
364
+ "description": "Production branch — E2E gates PRs into this branch. Release PR targets git.defaultBranch. Defaults to 'main'.",
365
+ "default": "main"
366
+ },
367
+ "labels": {
368
+ "type": "array",
369
+ "items": { "type": "string" },
370
+ "description": "Labels to add to the release PR. Default: [\"release\"]",
371
+ "default": ["kody:release"]
372
+ },
373
+ "draftRelease": {
374
+ "type": "boolean",
375
+ "description": "Create GitHub Releases as drafts. Default: false",
376
+ "default": false
377
+ }
378
+ },
379
+ "additionalProperties": false
380
+ },
381
+ "devServer": {
382
+ "type": "object",
383
+ "description": "Dev server configuration for browser tool verification. Works with any provider (MCP or CLI-based).",
384
+ "properties": {
385
+ "command": {
386
+ "type": "string",
387
+ "description": "Command to start the dev server (e.g., 'pnpm dev')"
388
+ },
389
+ "url": {
390
+ "type": "string",
391
+ "description": "URL where the dev server will be accessible (e.g., 'http://localhost:3000')"
392
+ },
393
+ "readyPattern": {
394
+ "type": "string",
395
+ "description": "Regex pattern to match in stdout when server is ready. Default: 'Ready in|compiled|started server|Local:'"
396
+ },
397
+ "readyTimeout": {
398
+ "type": "number",
399
+ "description": "Seconds to wait for the server to be ready. Default: 180"
400
+ }
401
+ },
402
+ "required": ["command", "url"]
403
+ }
404
+ },
405
+ "additionalProperties": false
406
+ }
package/package.json CHANGED
@@ -1,48 +1,43 @@
1
1
  {
2
2
  "name": "@kody-ade/kody-engine",
3
- "version": "0.1.7",
4
- "description": "Kody CI/CD pipeline engine multi-agent pipeline for GitHub repos",
3
+ "version": "0.2.1",
4
+ "description": "kody2 autonomous development engine. Single-session Claude Code agent behind a generic executor + declarative executable profiles.",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "bin": {
8
- "kody-engine": "./dist/bin/cli.mjs"
8
+ "kody2": "dist/bin/kody2.js"
9
9
  },
10
10
  "files": [
11
11
  "dist",
12
12
  "templates",
13
- "opencode"
13
+ "kody.config.schema.json"
14
14
  ],
15
15
  "scripts": {
16
- "copy:opencode": "rm -rf opencode && mkdir -p opencode && cp -r ../../.opencode/agents ../../.opencode/docs ../../opencode.json opencode/",
17
- "build": "tsup",
18
- "prepublishOnly": "pnpm build && pnpm copy:opencode"
16
+ "kody2": "tsx bin/kody2.ts",
17
+ "build": "tsup && node -e \"require('fs').cpSync('src/executables', 'dist/executables', { recursive: true })\"",
18
+ "test": "vitest run tests --no-coverage",
19
+ "test:e2e": "vitest run e2e --no-coverage",
20
+ "test:all": "vitest run tests e2e --no-coverage",
21
+ "typecheck": "tsc --noEmit",
22
+ "prepublishOnly": "pnpm build"
19
23
  },
20
24
  "dependencies": {
21
- "@ai-sdk/google": "^3.0.52",
22
- "@ai-sdk/mcp": "^1.0.30",
23
- "@anthropic-ai/sdk": "^0.80.0",
24
- "@modelcontextprotocol/sdk": "^1.27.1",
25
- "@octokit/core": "^7.0.6",
26
- "@octokit/plugin-throttling": "^11.0.3",
27
- "@octokit/rest": "^22.0.1",
28
- "ai": "^6.0.97",
29
- "commander": "^14.0.3",
30
- "date-fns": "^4.1.0",
31
- "dotenv": "17.2.3",
32
- "ms": "^2.1.3",
33
- "pino": "^10.1.0",
34
- "pino-pretty": "^13.1.3",
35
- "slugify": "^1.6.6",
36
- "znv": "^0.5.0",
37
- "zod": "^4.3.5"
25
+ "@anthropic-ai/claude-agent-sdk": "0.2.92"
38
26
  },
39
27
  "devDependencies": {
40
- "@types/ms": "^2.1.0",
41
28
  "@types/node": "^22.5.4",
42
- "tsup": "^8.5.0",
43
- "typescript": "5.9.3"
29
+ "tsup": "^8.5.1",
30
+ "tsx": "^4.21.0",
31
+ "typescript": "~5.7.0",
32
+ "vitest": "^4.1.1"
44
33
  },
45
34
  "engines": {
46
35
  "node": ">=22"
47
- }
36
+ },
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "git+https://github.com/aharonyaircohen/kody-engine.git"
40
+ },
41
+ "homepage": "https://github.com/aharonyaircohen/kody-engine",
42
+ "bugs": "https://github.com/aharonyaircohen/kody-engine/issues"
48
43
  }
@@ -0,0 +1,56 @@
1
+ # Drop this file at .github/workflows/kody2.yml in your repo.
2
+ #
3
+ # Triggers: @kody2 comment on an issue, or manual workflow_dispatch.
4
+ # Everything else (install deps, set up LiteLLM, run the agent, open the PR)
5
+ # is handled inside the @kody-ade/engine package. This template should
6
+ # rarely need editing — future kody2 capabilities ship via npm publish.
7
+ #
8
+ # Required repo secrets: at least one model provider key (e.g. MINIMAX_API_KEY,
9
+ # ANTHROPIC_API_KEY). kody2 reads any *_API_KEY secret automatically via
10
+ # toJSON(secrets) — no need to list them here.
11
+ #
12
+ # Optional: KODY_TOKEN secret — a PAT or GitHub App token. Needed only if
13
+ # you want kody2's pushes to trigger downstream workflows. Without it,
14
+ # github.token works fine for the PR/commit itself but won't fire other CI.
15
+
16
+ name: kody2
17
+
18
+ on:
19
+ workflow_dispatch:
20
+ inputs:
21
+ issue_number:
22
+ description: "GitHub issue number"
23
+ required: true
24
+ type: string
25
+ issue_comment:
26
+ types: [created]
27
+
28
+ jobs:
29
+ run:
30
+ if: >-
31
+ ${{ github.event_name == 'workflow_dispatch' ||
32
+ (github.event_name == 'issue_comment' &&
33
+ contains(github.event.comment.body, '@kody2')) }}
34
+ runs-on: ubuntu-latest
35
+ timeout-minutes: 60
36
+ permissions:
37
+ issues: write
38
+ pull-requests: write
39
+ contents: write
40
+ steps:
41
+ - uses: actions/checkout@v4
42
+ with:
43
+ fetch-depth: 0
44
+ token: ${{ secrets.KODY_TOKEN || github.token }}
45
+
46
+ - uses: actions/setup-node@v4
47
+ with:
48
+ node-version: 22
49
+
50
+ - uses: actions/setup-python@v5
51
+ with:
52
+ python-version: "3.12"
53
+
54
+ - env:
55
+ ALL_SECRETS: ${{ toJSON(secrets) }}
56
+ run: npx -y -p @kody-ade/kody-engine@latest kody2 ci