@kody-ade/kody-engine 0.2.62 → 0.3.0
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 +24 -24
- package/dist/bin/{kody2.js → kody.js} +171 -169
- package/dist/executables/bug/profile.json +6 -6
- package/dist/executables/chore/profile.json +6 -6
- package/dist/executables/classify/profile.json +1 -1
- package/dist/executables/feature/profile.json +6 -6
- package/dist/executables/fix/profile.json +1 -1
- package/dist/executables/fix/prompt.md +1 -1
- package/dist/executables/fix-ci/profile.json +1 -1
- package/dist/executables/init/profile.json +1 -1
- package/dist/executables/plan/profile.json +1 -1
- package/dist/executables/plan-verify/profile.json +2 -2
- package/dist/executables/plan-verify/prompt.md +1 -1
- package/dist/executables/research/profile.json +1 -1
- package/dist/executables/resolve/profile.json +1 -1
- package/dist/executables/review/profile.json +1 -1
- package/dist/executables/run/profile.json +1 -1
- package/dist/executables/run/prompt.md +2 -2
- package/dist/executables/spec/profile.json +4 -4
- package/dist/executables/sync/profile.json +1 -1
- package/dist/executables/types.ts +3 -3
- package/dist/executables/ui-review/profile.json +3 -3
- package/dist/executables/ui-review/prompt.md +8 -8
- package/dist/plugins/commands/kody-live-probe.md +2 -2
- package/dist/plugins/skills/kody-live-marker/SKILL.md +3 -3
- package/dist/plugins/test-plugin/.claude-plugin/plugin.json +2 -2
- package/dist/plugins/test-plugin/skills/kody-plugin-marker/SKILL.md +2 -2
- package/kody.config.schema.json +3 -3
- package/package.json +4 -4
- package/templates/{kody2.yml → kody.yml} +16 -16
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"with": {
|
|
34
34
|
"label": "kody-flow:bug",
|
|
35
35
|
"color": "d73a4a",
|
|
36
|
-
"description": "
|
|
36
|
+
"description": "kody flow: bug / enhancement"
|
|
37
37
|
}
|
|
38
38
|
},
|
|
39
39
|
{
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"with": {
|
|
42
42
|
"label": "kody:orchestrating",
|
|
43
43
|
"color": "1d76db",
|
|
44
|
-
"description": "
|
|
44
|
+
"description": "kody: orchestrating a multi-stage flow"
|
|
45
45
|
}
|
|
46
46
|
},
|
|
47
47
|
{ "script": "loadIssueContext" },
|
|
@@ -58,22 +58,22 @@
|
|
|
58
58
|
"runWhen": { "data.taskState.core.lastOutcome.type": "RUN_COMPLETED" } },
|
|
59
59
|
|
|
60
60
|
{ "script": "finishFlow",
|
|
61
|
-
"with": { "reason": "review-passed", "label": "kody:done", "color": "0e8a16", "description": "
|
|
61
|
+
"with": { "reason": "review-passed", "label": "kody:done", "color": "0e8a16", "description": "kody: PR ready for human review/merge" },
|
|
62
62
|
"runWhen": { "data.taskState.core.lastOutcome.type": "REVIEW_PASS" } },
|
|
63
63
|
|
|
64
64
|
{ "script": "dispatch", "with": { "next": "fix", "target": "pr" },
|
|
65
65
|
"runWhen": { "data.taskState.core.lastOutcome.type": ["REVIEW_CONCERNS", "REVIEW_FAIL"] } },
|
|
66
66
|
|
|
67
67
|
{ "script": "finishFlow",
|
|
68
|
-
"with": { "reason": "review-failed", "label": "kody:failed", "color": "e11d21", "description": "
|
|
68
|
+
"with": { "reason": "review-failed", "label": "kody:failed", "color": "e11d21", "description": "kody: flow failed" },
|
|
69
69
|
"runWhen": { "data.taskState.core.lastOutcome.type": "REVIEW_FAILED" } },
|
|
70
70
|
|
|
71
71
|
{ "script": "finishFlow",
|
|
72
|
-
"with": { "reason": "fix-applied", "label": "kody:done", "color": "0e8a16", "description": "
|
|
72
|
+
"with": { "reason": "fix-applied", "label": "kody:done", "color": "0e8a16", "description": "kody: PR ready for human review/merge" },
|
|
73
73
|
"runWhen": { "data.taskState.core.lastOutcome.type": "FIX_COMPLETED" } },
|
|
74
74
|
|
|
75
75
|
{ "script": "finishFlow",
|
|
76
|
-
"with": { "reason": "aborted", "label": "kody:failed", "color": "e11d21", "description": "
|
|
76
|
+
"with": { "reason": "aborted", "label": "kody:failed", "color": "e11d21", "description": "kody: flow failed" },
|
|
77
77
|
"runWhen": { "data.taskState.core.lastOutcome.type": ["PLAN_FAILED", "RUN_FAILED", "FIX_FAILED", "AGENT_NOT_RUN"] } },
|
|
78
78
|
|
|
79
79
|
{ "script": "persistFlowState" }
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"with": {
|
|
34
34
|
"label": "kody-flow:chore",
|
|
35
35
|
"color": "c5def5",
|
|
36
|
-
"description": "
|
|
36
|
+
"description": "kody flow: chore / docs / dep-bump"
|
|
37
37
|
}
|
|
38
38
|
},
|
|
39
39
|
{
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"with": {
|
|
42
42
|
"label": "kody:orchestrating",
|
|
43
43
|
"color": "1d76db",
|
|
44
|
-
"description": "
|
|
44
|
+
"description": "kody: orchestrating a multi-stage flow"
|
|
45
45
|
}
|
|
46
46
|
},
|
|
47
47
|
{ "script": "loadIssueContext" },
|
|
@@ -55,22 +55,22 @@
|
|
|
55
55
|
"runWhen": { "data.taskState.core.lastOutcome.type": "RUN_COMPLETED" } },
|
|
56
56
|
|
|
57
57
|
{ "script": "finishFlow",
|
|
58
|
-
"with": { "reason": "review-passed", "label": "kody:done", "color": "0e8a16", "description": "
|
|
58
|
+
"with": { "reason": "review-passed", "label": "kody:done", "color": "0e8a16", "description": "kody: PR ready for human review/merge" },
|
|
59
59
|
"runWhen": { "data.taskState.core.lastOutcome.type": "REVIEW_PASS" } },
|
|
60
60
|
|
|
61
61
|
{ "script": "dispatch", "with": { "next": "fix", "target": "pr" },
|
|
62
62
|
"runWhen": { "data.taskState.core.lastOutcome.type": ["REVIEW_CONCERNS", "REVIEW_FAIL"] } },
|
|
63
63
|
|
|
64
64
|
{ "script": "finishFlow",
|
|
65
|
-
"with": { "reason": "review-failed", "label": "kody:failed", "color": "e11d21", "description": "
|
|
65
|
+
"with": { "reason": "review-failed", "label": "kody:failed", "color": "e11d21", "description": "kody: flow failed" },
|
|
66
66
|
"runWhen": { "data.taskState.core.lastOutcome.type": "REVIEW_FAILED" } },
|
|
67
67
|
|
|
68
68
|
{ "script": "finishFlow",
|
|
69
|
-
"with": { "reason": "fix-applied", "label": "kody:done", "color": "0e8a16", "description": "
|
|
69
|
+
"with": { "reason": "fix-applied", "label": "kody:done", "color": "0e8a16", "description": "kody: PR ready for human review/merge" },
|
|
70
70
|
"runWhen": { "data.taskState.core.lastOutcome.type": "FIX_COMPLETED" } },
|
|
71
71
|
|
|
72
72
|
{ "script": "finishFlow",
|
|
73
|
-
"with": { "reason": "aborted", "label": "kody:failed", "color": "e11d21", "description": "
|
|
73
|
+
"with": { "reason": "aborted", "label": "kody:failed", "color": "e11d21", "description": "kody: flow failed" },
|
|
74
74
|
"runWhen": { "data.taskState.core.lastOutcome.type": ["RUN_FAILED", "FIX_FAILED", "AGENT_NOT_RUN"] } },
|
|
75
75
|
|
|
76
76
|
{ "script": "persistFlowState" }
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"with": {
|
|
34
34
|
"label": "kody-flow:feature",
|
|
35
35
|
"color": "a2eeef",
|
|
36
|
-
"description": "
|
|
36
|
+
"description": "kody flow: feature / refactor"
|
|
37
37
|
}
|
|
38
38
|
},
|
|
39
39
|
{
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"with": {
|
|
42
42
|
"label": "kody:orchestrating",
|
|
43
43
|
"color": "1d76db",
|
|
44
|
-
"description": "
|
|
44
|
+
"description": "kody: orchestrating a multi-stage flow"
|
|
45
45
|
}
|
|
46
46
|
},
|
|
47
47
|
{ "script": "loadIssueContext" },
|
|
@@ -61,22 +61,22 @@
|
|
|
61
61
|
"runWhen": { "data.taskState.core.lastOutcome.type": "RUN_COMPLETED" } },
|
|
62
62
|
|
|
63
63
|
{ "script": "finishFlow",
|
|
64
|
-
"with": { "reason": "review-passed", "label": "kody:done", "color": "0e8a16", "description": "
|
|
64
|
+
"with": { "reason": "review-passed", "label": "kody:done", "color": "0e8a16", "description": "kody: PR ready for human review/merge" },
|
|
65
65
|
"runWhen": { "data.taskState.core.lastOutcome.type": "REVIEW_PASS" } },
|
|
66
66
|
|
|
67
67
|
{ "script": "dispatch", "with": { "next": "fix", "target": "pr" },
|
|
68
68
|
"runWhen": { "data.taskState.core.lastOutcome.type": ["REVIEW_CONCERNS", "REVIEW_FAIL"] } },
|
|
69
69
|
|
|
70
70
|
{ "script": "finishFlow",
|
|
71
|
-
"with": { "reason": "review-failed", "label": "kody:failed", "color": "e11d21", "description": "
|
|
71
|
+
"with": { "reason": "review-failed", "label": "kody:failed", "color": "e11d21", "description": "kody: flow failed" },
|
|
72
72
|
"runWhen": { "data.taskState.core.lastOutcome.type": "REVIEW_FAILED" } },
|
|
73
73
|
|
|
74
74
|
{ "script": "finishFlow",
|
|
75
|
-
"with": { "reason": "fix-applied", "label": "kody:done", "color": "0e8a16", "description": "
|
|
75
|
+
"with": { "reason": "fix-applied", "label": "kody:done", "color": "0e8a16", "description": "kody: PR ready for human review/merge" },
|
|
76
76
|
"runWhen": { "data.taskState.core.lastOutcome.type": "FIX_COMPLETED" } },
|
|
77
77
|
|
|
78
78
|
{ "script": "finishFlow",
|
|
79
|
-
"with": { "reason": "aborted", "label": "kody:failed", "color": "e11d21", "description": "
|
|
79
|
+
"with": { "reason": "aborted", "label": "kody:failed", "color": "e11d21", "description": "kody: flow failed" },
|
|
80
80
|
"runWhen": { "data.taskState.core.lastOutcome.type": ["RESEARCH_FAILED", "PLAN_FAILED", "RUN_FAILED", "FIX_FAILED", "AGENT_NOT_RUN"] } },
|
|
81
81
|
|
|
82
82
|
{ "script": "persistFlowState" }
|
|
@@ -42,6 +42,6 @@ You are Kody, an autonomous engineer. Apply the feedback below to the existing P
|
|
|
42
42
|
- **"Already satisfied" (i.e. skipping the edit because the code already does what's asked) is only allowed when you can cite the exact file:line that already implements it.** If in doubt, make the edit — under `fixed`.
|
|
43
43
|
- Do NOT run git/gh commands. The wrapper handles it.
|
|
44
44
|
- Stay on `{{branch}}`.
|
|
45
|
-
- Do not modify files under `.kody/`, `.kody-engine/`, `.
|
|
45
|
+
- Do not modify files under `.kody/`, `.kody-engine/`, `.kody/`, `node_modules/`, `dist/`, `build/`, `.env`, `*.log`.
|
|
46
46
|
- If the feedback is ambiguous or conflicts with the issue, err toward what the feedback says.
|
|
47
47
|
{{systemPromptAppend}}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "init",
|
|
3
3
|
"role": "utility",
|
|
4
|
-
"describe": "Scaffold a consumer repo with kody.config.json and the @
|
|
4
|
+
"describe": "Scaffold a consumer repo with kody.config.json and the @kody workflow. No agent.",
|
|
5
5
|
"inputs": [
|
|
6
6
|
{
|
|
7
7
|
"name": "force",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "plan-verify",
|
|
3
3
|
"role": "utility",
|
|
4
|
-
"describe": "Live-test executable. Loads kody-live-marker skill, /kody-live-probe command, kody-live-trace hook, and the bundled test-plugin. Asks the agent to emit confirmation tokens for each feature so
|
|
4
|
+
"describe": "Live-test executable. Loads kody-live-marker skill, /kody-live-probe command, kody-live-trace hook, and the bundled test-plugin. Asks the agent to emit confirmation tokens for each feature so Kody can validate plugin wiring end-to-end.",
|
|
5
5
|
"inputs": [
|
|
6
6
|
{ "name": "issue", "flag": "--issue", "type": "int", "required": true, "describe": "GitHub issue number to verify against." }
|
|
7
7
|
],
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"model": "inherit",
|
|
10
10
|
"permissionMode": "default",
|
|
11
11
|
"maxTurns": 15,
|
|
12
|
-
"systemPromptAppend": "You are running
|
|
12
|
+
"systemPromptAppend": "You are running Kody's plugin-wiring live verification. Emit confirmation tokens exactly as the prompt instructs.",
|
|
13
13
|
"tools": ["Read", "Grep", "Glob", "Bash"],
|
|
14
14
|
"hooks": ["kody-live-trace"],
|
|
15
15
|
"skills": ["kody-live-marker"],
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
You are
|
|
1
|
+
You are Kody's plugin-wiring live verification agent. Your ONLY job is to prove that each of the four extension mechanisms (plugins, skills, commands, hooks) is successfully loaded into your session. Do NOT address the issue's actual work.
|
|
2
2
|
|
|
3
3
|
Issue #{{issue.number}}: {{issue.title}}
|
|
4
4
|
|
|
@@ -7,7 +7,7 @@ You are Kody, an autonomous engineer. Take a GitHub issue from spec to a tested
|
|
|
7
7
|
{{conventionsBlock}}{{coverageBlock}}{{toolsUsage}}# Issue #{{issue.number}}: {{issue.title}}
|
|
8
8
|
{{issue.body}}
|
|
9
9
|
|
|
10
|
-
# Existing plan (produced by `@
|
|
10
|
+
# Existing plan (produced by `@kody plan`, if present)
|
|
11
11
|
{{artifacts.plan}}
|
|
12
12
|
|
|
13
13
|
If the plan above is non-empty, TREAT IT AS AUTHORITATIVE — follow its file list and approach rather than inventing your own. Deviate only if the plan is wrong; if you do, you MUST declare each deviation in the `PLAN_DEVIATIONS:` block of your final message (format below). Silent deviations are a hard failure, even if the code works. If the plan is empty, proceed from first principles and emit `PLAN_DEVIATIONS: none` in the final message.
|
|
@@ -32,7 +32,7 @@ If the plan above is non-empty, TREAT IT AS AUTHORITATIVE — follow its file li
|
|
|
32
32
|
# Rules
|
|
33
33
|
- Do NOT run **any** `git` or `gh` commands. The wrapper handles all git/gh operations. If a quality gate fails, that's the failure — do not investigate it via git.
|
|
34
34
|
- Stay on the current branch (`{{branch}}`). It is already checked out for you.
|
|
35
|
-
- Do NOT modify files under: `.kody/`, `.kody-engine/`, `.kody-lean/`, `.
|
|
35
|
+
- Do NOT modify files under: `.kody/`, `.kody-engine/`, `.kody-lean/`, `.kody/`, `node_modules/`, `dist/`, `build/`, `.env`, or any `*.log`.
|
|
36
36
|
- Do NOT post issue comments — the wrapper handles that.
|
|
37
37
|
- Pre-existing quality-gate failures: assume they are NOT your responsibility unless your edits touched related code.
|
|
38
38
|
- Keep the plan and reasoning concise. Long monologues waste turns.
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"with": {
|
|
34
34
|
"label": "kody-flow:spec",
|
|
35
35
|
"color": "7057ff",
|
|
36
|
-
"description": "
|
|
36
|
+
"description": "kody flow: spec / RFC / design-doc"
|
|
37
37
|
}
|
|
38
38
|
},
|
|
39
39
|
{
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"with": {
|
|
42
42
|
"label": "kody:orchestrating",
|
|
43
43
|
"color": "1d76db",
|
|
44
|
-
"description": "
|
|
44
|
+
"description": "kody: orchestrating a multi-stage flow"
|
|
45
45
|
}
|
|
46
46
|
},
|
|
47
47
|
{ "script": "loadIssueContext" },
|
|
@@ -55,11 +55,11 @@
|
|
|
55
55
|
"runWhen": { "data.taskState.core.lastOutcome.type": "RESEARCH_COMPLETED" } },
|
|
56
56
|
|
|
57
57
|
{ "script": "finishFlow",
|
|
58
|
-
"with": { "reason": "spec-ready", "label": "kody:done", "color": "0e8a16", "description": "
|
|
58
|
+
"with": { "reason": "spec-ready", "label": "kody:done", "color": "0e8a16", "description": "kody: spec/plan artifact ready" },
|
|
59
59
|
"runWhen": { "data.taskState.core.lastOutcome.type": "PLAN_COMPLETED" } },
|
|
60
60
|
|
|
61
61
|
{ "script": "finishFlow",
|
|
62
|
-
"with": { "reason": "aborted", "label": "kody:failed", "color": "e11d21", "description": "
|
|
62
|
+
"with": { "reason": "aborted", "label": "kody:failed", "color": "e11d21", "description": "kody: flow failed" },
|
|
63
63
|
"runWhen": { "data.taskState.core.lastOutcome.type": ["RESEARCH_FAILED", "PLAN_FAILED", "AGENT_NOT_RUN"] } },
|
|
64
64
|
|
|
65
65
|
{ "script": "persistFlowState" }
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import type { AgentResult } from "../agent.js"
|
|
11
|
-
import type {
|
|
11
|
+
import type { KodyConfig } from "../config.js"
|
|
12
12
|
import type { Phase } from "../state.js"
|
|
13
13
|
|
|
14
14
|
// ────────────────────────────────────────────────────────────────────────────
|
|
@@ -101,7 +101,7 @@ export interface InputSpec {
|
|
|
101
101
|
}
|
|
102
102
|
|
|
103
103
|
export interface ClaudeCodeSpec {
|
|
104
|
-
/** "inherit" → use
|
|
104
|
+
/** "inherit" → use KodyConfig.agent.model. Or a concrete "provider/model". */
|
|
105
105
|
model: string
|
|
106
106
|
permissionMode: "default" | "acceptEdits" | "plan" | "bypassPermissions"
|
|
107
107
|
/** null = unbounded. */
|
|
@@ -184,7 +184,7 @@ export interface Context {
|
|
|
184
184
|
/** Project root. */
|
|
185
185
|
cwd: string
|
|
186
186
|
/** Loaded kody.config.json. */
|
|
187
|
-
config:
|
|
187
|
+
config: KodyConfig
|
|
188
188
|
/** Stream-output verbosity. */
|
|
189
189
|
verbose?: boolean
|
|
190
190
|
quiet?: boolean
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ui-review",
|
|
3
3
|
"role": "primitive",
|
|
4
|
-
"describe": "UI/UX review of an open PR: browses the running preview with Playwright, compares behavior to diff intent, posts one structured review comment. Read-only on the repo (no commits); writes a throwaway Playwright spec under .
|
|
4
|
+
"describe": "UI/UX review of an open PR: browses the running preview with Playwright, compares behavior to diff intent, posts one structured review comment. Read-only on the repo (no commits); writes a throwaway Playwright spec under .kody/.",
|
|
5
5
|
"kind": "oneshot",
|
|
6
6
|
"inputs": [
|
|
7
7
|
{
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"installCommand": "npx --yes playwright install --with-deps chromium"
|
|
50
50
|
},
|
|
51
51
|
"verify": "npx --no-install playwright --version",
|
|
52
|
-
"usage": "Use `npx playwright test <file>` to run a Playwright spec. Write ad-hoc specs under `.
|
|
52
|
+
"usage": "Use `npx playwright test <file>` to run a Playwright spec. Write ad-hoc specs under `.kody/ui-review/*.spec.ts`. If `npx playwright test` errors with `Cannot find package '@playwright/test'`, install it once with `npm install -D @playwright/test` (or the repo's package-manager equivalent) before retrying — the `playwright` browser binaries are already set up by preflight, but the per-repo test framework may not be. Prefer `page.goto(process.env.UI_REVIEW_BASE_URL)` — the base URL is injected as `UI_REVIEW_BASE_URL` at run time. Capture screenshots with `await page.screenshot({ path: '.kody/ui-review/<name>.png' })` and reference those paths in your final review.",
|
|
53
53
|
"allowedUses": [
|
|
54
54
|
"test",
|
|
55
55
|
"--version"
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
"outputArtifacts": [],
|
|
61
61
|
"scripts": {
|
|
62
62
|
"preflight": [
|
|
63
|
-
{ "script": "setLifecycleLabel", "with": { "label": "kody:reviewing", "color": "d93f0b", "description": "
|
|
63
|
+
{ "script": "setLifecycleLabel", "with": { "label": "kody:reviewing", "color": "d93f0b", "description": "kody: reviewing a PR" } },
|
|
64
64
|
{ "script": "reviewFlow" },
|
|
65
65
|
{ "script": "loadTaskState" },
|
|
66
66
|
{ "script": "loadConventions" },
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
You are Kody, a senior UI/UX reviewer. Review PR #{{pr.number}} by reading the diff AND browsing the running app with Playwright. Post ONE structured review comment. Do NOT edit any tracked source files. Do NOT run any `git` or `gh` commands.
|
|
2
2
|
|
|
3
|
-
You MAY write throwaway Playwright specs and screenshots under `.
|
|
3
|
+
You MAY write throwaway Playwright specs and screenshots under `.kody/ui-review/` — that directory is ignored by the repo.
|
|
4
4
|
|
|
5
5
|
# PR #{{pr.number}}: {{pr.title}}
|
|
6
6
|
|
|
@@ -46,23 +46,23 @@ If the response is not 2xx or 3xx, the preview is unreachable. In that case, SKI
|
|
|
46
46
|
|
|
47
47
|
2. **Plan the browse session.** For each UI-affecting change, pick 1–3 routes from the QA context that exercise it. If the change requires an authenticated role, grab credentials from the QA guide above. If no credentials are available for a role the change depends on, note that as a gap and browse only public pages.
|
|
48
48
|
|
|
49
|
-
3. **Write a Playwright spec.** Create exactly one file at `.
|
|
49
|
+
3. **Write a Playwright spec.** Create exactly one file at `.kody/ui-review/browse.spec.ts`. Use `process.env.UI_REVIEW_BASE_URL` as the base URL. For each route you plan to check, write a test that:
|
|
50
50
|
- navigates there,
|
|
51
51
|
- performs the minimum interaction to exercise the change (click, submit, fill),
|
|
52
|
-
- takes a screenshot at `.
|
|
52
|
+
- takes a screenshot at `.kody/ui-review/<slug>.png`,
|
|
53
53
|
- asserts at least one piece of visible content so the test fails loudly on a blank / error page.
|
|
54
54
|
|
|
55
|
-
Include a `playwright.config.ts` at `.
|
|
55
|
+
Include a `playwright.config.ts` at `.kody/ui-review/playwright.config.ts` only if you need custom config; otherwise rely on defaults (headless chromium).
|
|
56
56
|
|
|
57
57
|
4. **Run it.** Invoke:
|
|
58
58
|
|
|
59
59
|
```bash
|
|
60
|
-
UI_REVIEW_BASE_URL={{previewUrl}} npx playwright test .
|
|
60
|
+
UI_REVIEW_BASE_URL={{previewUrl}} npx playwright test .kody/ui-review/browse.spec.ts --reporter=line
|
|
61
61
|
```
|
|
62
62
|
|
|
63
63
|
Capture both stdout and exit code. If Playwright is not installed, the executor will have tried to install it in preflight — if it still fails, report the install error and fall back to a diff-only review.
|
|
64
64
|
|
|
65
|
-
5. **Inspect screenshots.** Use the Read tool on each `.png` under `.
|
|
65
|
+
5. **Inspect screenshots.** Use the Read tool on each `.png` under `.kody/ui-review/` so the visual state is in your context. Note anything that looks broken, empty, misaligned, or inconsistent with the diff's intent.
|
|
66
66
|
|
|
67
67
|
6. **Write the review.** Your FINAL MESSAGE must be the markdown review comment — no preamble, no DONE / COMMIT_MSG markers. The entire final message is posted verbatim to the PR.
|
|
68
68
|
|
|
@@ -71,7 +71,7 @@ If the response is not 2xx or 3xx, the preview is unreachable. In that case, SKI
|
|
|
71
71
|
```
|
|
72
72
|
## Verdict: PASS | CONCERNS | FAIL
|
|
73
73
|
|
|
74
|
-
_UI review by
|
|
74
|
+
_UI review by kody — browsed {{previewUrl}}_
|
|
75
75
|
|
|
76
76
|
### Summary
|
|
77
77
|
<2-3 sentences: what this PR changes in the UI, and whether the running app matches that intent>
|
|
@@ -95,7 +95,7 @@ _UI review by kody2 — browsed {{previewUrl}}_
|
|
|
95
95
|
|
|
96
96
|
# Rules
|
|
97
97
|
|
|
98
|
-
- No commits. No `git` / `gh` invocations. No edits to files outside `.
|
|
98
|
+
- No commits. No `git` / `gh` invocations. No edits to files outside `.kody/ui-review/`.
|
|
99
99
|
- Verdict **FAIL** only for clear visual regressions, broken flows, or correctness/accessibility issues that block merge.
|
|
100
100
|
- Verdict **CONCERNS** for clarity/polish/edge-case gaps that shouldn't block.
|
|
101
101
|
- Verdict **PASS** when the PR's UI changes work as intended and nothing obvious is broken.
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Internal
|
|
2
|
+
description: Internal Kody live-test slash command. Prints a confirmation token proving commands are loaded.
|
|
3
3
|
---
|
|
4
4
|
|
|
5
5
|
# /kody-live-probe
|
|
6
6
|
|
|
7
7
|
Print the literal token `COMMAND_LOADED_OK` in your next message, followed by the current ISO timestamp on a new line.
|
|
8
8
|
|
|
9
|
-
Do not perform any other action — this command is a no-op confirmation signal for
|
|
9
|
+
Do not perform any other action — this command is a no-op confirmation signal for Kody infrastructure validation.
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: kody-live-marker
|
|
3
|
-
description: Internal
|
|
3
|
+
description: Internal Kody live-test skill. Activates when a prompt mentions "kody-live-marker" and provides a confirmation token.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# kody-live-marker
|
|
7
7
|
|
|
8
|
-
This skill exists only to verify that
|
|
8
|
+
This skill exists only to verify that Kody's synthetic plugin wiring actually loads skills into the agent's session.
|
|
9
9
|
|
|
10
10
|
## When to activate
|
|
11
11
|
|
|
@@ -13,6 +13,6 @@ When the user's prompt contains the phrase "kody-live-marker" or explicitly asks
|
|
|
13
13
|
|
|
14
14
|
## What to do
|
|
15
15
|
|
|
16
|
-
Include the literal token `SKILL_LOADED_OK` somewhere in your final message. Include the skill's description verbatim: "Internal
|
|
16
|
+
Include the literal token `SKILL_LOADED_OK` somewhere in your final message. Include the skill's description verbatim: "Internal Kody live-test skill."
|
|
17
17
|
|
|
18
18
|
Do not use this skill for anything else. It is a no-op confirmation signal for infrastructure validation.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"name": "
|
|
2
|
+
"name": "kody-test-plugin",
|
|
3
3
|
"version": "1.0.0",
|
|
4
|
-
"description": "
|
|
4
|
+
"description": "Kody internal live-test plugin. Ships a single skill that proves external-plugin loading works.",
|
|
5
5
|
"skills": ["./skills/"]
|
|
6
6
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: kody-plugin-marker
|
|
3
|
-
description:
|
|
3
|
+
description: Kody external-plugin live-test skill. Activates when prompt mentions "kody-plugin-marker" and outputs a confirmation token.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# kody-plugin-marker
|
|
7
7
|
|
|
8
|
-
This skill is bundled inside a standalone plugin directory (not copied into a synthetic plugin). Its purpose is to verify that
|
|
8
|
+
This skill is bundled inside a standalone plugin directory (not copied into a synthetic plugin). Its purpose is to verify that Kody's `plugins: string[]` profile field successfully loads an external plugin as-is.
|
|
9
9
|
|
|
10
10
|
## When to activate
|
|
11
11
|
|
package/kody.config.schema.json
CHANGED
|
@@ -84,7 +84,7 @@
|
|
|
84
84
|
},
|
|
85
85
|
"issueContext": {
|
|
86
86
|
"type": "object",
|
|
87
|
-
"description": "
|
|
87
|
+
"description": "kody: 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
88
|
"properties": {
|
|
89
89
|
"commentLimit": {
|
|
90
90
|
"type": "integer",
|
|
@@ -103,7 +103,7 @@
|
|
|
103
103
|
},
|
|
104
104
|
"testRequirements": {
|
|
105
105
|
"type": "array",
|
|
106
|
-
"description": "
|
|
106
|
+
"description": "kody 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
107
|
"items": {
|
|
108
108
|
"type": "object",
|
|
109
109
|
"required": ["pattern", "requireSibling"],
|
|
@@ -127,7 +127,7 @@
|
|
|
127
127
|
"model": {
|
|
128
128
|
"type": "string",
|
|
129
129
|
"pattern": "^[^/]+/.+$",
|
|
130
|
-
"description": "Single 'provider/model' string used by
|
|
130
|
+
"description": "Single 'provider/model' string used by kody (single-session pipeline). Use 'claude/...' or 'anthropic/...' for direct Anthropic API; anything else routes through LiteLLM proxy.",
|
|
131
131
|
"examples": ["claude/claude-sonnet-4-6", "minimax/MiniMax-M2.7-highspeed"]
|
|
132
132
|
},
|
|
133
133
|
"modelMap": {
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kody-ade/kody-engine",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "kody — 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
|
-
"
|
|
8
|
+
"kody": "dist/bin/kody.js"
|
|
9
9
|
},
|
|
10
10
|
"files": [
|
|
11
11
|
"dist",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"homepage": "https://github.com/aharonyaircohen/kody-engine",
|
|
34
34
|
"bugs": "https://github.com/aharonyaircohen/kody-engine/issues",
|
|
35
35
|
"scripts": {
|
|
36
|
-
"
|
|
36
|
+
"kody": "tsx bin/kody.ts",
|
|
37
37
|
"build": "tsup && node scripts/copy-assets.cjs",
|
|
38
38
|
"test": "vitest run tests/unit tests/int --no-coverage",
|
|
39
39
|
"test:e2e": "vitest run tests/e2e --no-coverage",
|