aicodeman 0.9.9 → 0.9.11
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 +2 -2
- package/README.zh-CN.md +2 -2
- package/dist/prompts/index.d.ts +1 -0
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +1 -0
- package/dist/prompts/index.js.map +1 -1
- package/dist/prompts/ralph.d.ts +31 -0
- package/dist/prompts/ralph.d.ts.map +1 -0
- package/dist/prompts/ralph.js +75 -0
- package/dist/prompts/ralph.js.map +1 -0
- package/dist/templates/case-template.md +42 -445
- package/dist/templates/claude-md.d.ts.map +1 -1
- package/dist/templates/claude-md.js +8 -9
- package/dist/templates/claude-md.js.map +1 -1
- package/dist/types/update.d.ts +6 -2
- package/dist/types/update.d.ts.map +1 -1
- package/dist/web/middleware/auth.d.ts.map +1 -1
- package/dist/web/middleware/auth.js +6 -1
- package/dist/web/middleware/auth.js.map +1 -1
- package/dist/web/public/api-client.c9b1cddc.js.gz +0 -0
- package/dist/web/public/app.a8663e79.js.gz +0 -0
- package/dist/web/public/constants.74211deb.js.gz +0 -0
- package/dist/web/public/image-input.0ea86695.js.gz +0 -0
- package/dist/web/public/index.html +2 -2
- package/dist/web/public/index.html.br +0 -0
- package/dist/web/public/index.html.gz +0 -0
- package/dist/web/public/input-cjk.b8686b5e.js.gz +0 -0
- package/dist/web/public/keyboard-accessory.bc753cc7.js.gz +0 -0
- package/dist/web/public/mobile-handlers.d54d97d6.js.gz +0 -0
- package/dist/web/public/mobile.959f6fe2.css.gz +0 -0
- package/dist/web/public/notification-manager.9c984ac2.js.gz +0 -0
- package/dist/web/public/orchestrator-panel.js.gz +0 -0
- package/dist/web/public/panels-ui.6bb3169f.js.gz +0 -0
- package/dist/web/public/ralph-panel.6de2d0f8.js.gz +0 -0
- package/dist/web/public/{ralph-wizard.a6b2d36b.js → ralph-wizard.13a1831e.js} +4 -1
- package/dist/web/public/ralph-wizard.13a1831e.js.br +0 -0
- package/dist/web/public/ralph-wizard.13a1831e.js.gz +0 -0
- package/dist/web/public/respawn-ui.2d249da9.js.gz +0 -0
- package/dist/web/public/session-ui.512816d8.js.gz +0 -0
- package/dist/web/public/settings-ui.21b009ca.js.gz +0 -0
- package/dist/web/public/styles.f3a0faa3.css.gz +0 -0
- package/dist/web/public/subagent-windows.a366a4ad.js.gz +0 -0
- package/dist/web/public/sw.js.gz +0 -0
- package/dist/web/public/terminal-ui.0e930cb3.js +3 -0
- package/dist/web/public/terminal-ui.0e930cb3.js.br +0 -0
- package/dist/web/public/terminal-ui.0e930cb3.js.gz +0 -0
- package/dist/web/public/upload.html.gz +0 -0
- package/dist/web/public/vendor/marked.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-zerolag-input.137ad9f0.js.gz +0 -0
- package/dist/web/public/vendor/xterm.css.gz +0 -0
- package/dist/web/public/vendor/xterm.min.js.gz +0 -0
- package/dist/web/public/voice-input.085e9e73.js.gz +0 -0
- package/dist/web/routes/ralph-routes.d.ts.map +1 -1
- package/dist/web/routes/ralph-routes.js +7 -31
- package/dist/web/routes/ralph-routes.js.map +1 -1
- package/dist/web/self-update.d.ts +3 -1
- package/dist/web/self-update.d.ts.map +1 -1
- package/dist/web/self-update.js +27 -1
- package/dist/web/self-update.js.map +1 -1
- package/package.json +2 -2
- package/dist/web/public/ralph-wizard.a6b2d36b.js.br +0 -0
- package/dist/web/public/ralph-wizard.a6b2d36b.js.gz +0 -0
- package/dist/web/public/terminal-ui.6ce91b0b.js +0 -3
- package/dist/web/public/terminal-ui.6ce91b0b.js.br +0 -0
- package/dist/web/public/terminal-ui.6ce91b0b.js.gz +0 -0
package/README.md
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
<img src="docs/images/codeman-title.svg" alt="Codeman" height="60">
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
|
-
<h2 align="center">
|
|
5
|
+
<h2 align="center">Mission control for AI coding agents</h2>
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
|
-
<em>
|
|
8
|
+
<em>Claude Code • OpenCode • Codex — One Dashboard • Zero-Lag Mobile Input • Any Device</em>
|
|
9
9
|
</p>
|
|
10
10
|
|
|
11
11
|
<p align="center">
|
package/README.zh-CN.md
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
<img src="docs/images/codeman-title.svg" alt="Codeman" height="60">
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
|
-
<h2 align="center"
|
|
5
|
+
<h2 align="center">AI 编程智能体的任务控制中心</h2>
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
|
-
<em
|
|
8
|
+
<em>Claude Code • OpenCode • Codex —— 统一仪表盘 • 零延迟移动输入 • 任意设备</em>
|
|
9
9
|
</p>
|
|
10
10
|
|
|
11
11
|
<p align="center">
|
package/dist/prompts/index.d.ts
CHANGED
|
@@ -7,4 +7,5 @@
|
|
|
7
7
|
export { RESEARCH_AGENT_PROMPT } from './research-agent.js';
|
|
8
8
|
export { PLANNER_PROMPT } from './planner.js';
|
|
9
9
|
export { PHASE_EXECUTION_PROMPT, TEAM_LEAD_PROMPT, REPLAN_PROMPT, SINGLE_TASK_PROMPT } from './orchestrator.js';
|
|
10
|
+
export { RALPH_STATUS_CONTRACT, buildRalphLoopPrompt, type RalphLoopPromptOptions } from './ralph.js';
|
|
10
11
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAChH,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,KAAK,sBAAsB,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/prompts/index.js
CHANGED
|
@@ -7,4 +7,5 @@
|
|
|
7
7
|
export { RESEARCH_AGENT_PROMPT } from './research-agent.js';
|
|
8
8
|
export { PLANNER_PROMPT } from './planner.js';
|
|
9
9
|
export { PHASE_EXECUTION_PROMPT, TEAM_LEAD_PROMPT, REPLAN_PROMPT, SINGLE_TASK_PROMPT } from './orchestrator.js';
|
|
10
|
+
export { RALPH_STATUS_CONTRACT, buildRalphLoopPrompt } from './ralph.js';
|
|
10
11
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAChH,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAA+B,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Ralph Loop prompt construction
|
|
3
|
+
*
|
|
4
|
+
* Builds the full `@ralph_prompt.md` content written for a new Ralph loop
|
|
5
|
+
* session, including the RALPH_STATUS block contract. The contract travels
|
|
6
|
+
* with the loop prompt (not the generated CLAUDE.md) so every Ralph session
|
|
7
|
+
* emits parseable status blocks regardless of the project's CLAUDE.md.
|
|
8
|
+
*
|
|
9
|
+
* @module prompts/ralph
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Structured status-reporting contract appended to every Ralph loop prompt.
|
|
13
|
+
*
|
|
14
|
+
* `RalphStatusParser` (src/ralph-status-parser.ts) parses this block from
|
|
15
|
+
* session output — keep the field names and enum values in sync with its
|
|
16
|
+
* patterns.
|
|
17
|
+
*/
|
|
18
|
+
export declare const RALPH_STATUS_CONTRACT = "## Status Reporting\n\nEnd EVERY response with exactly this block \u2014 Codeman parses it to track the loop:\n\n```\n---RALPH_STATUS---\nSTATUS: IN_PROGRESS | COMPLETE | BLOCKED\nTASKS_COMPLETED_THIS_LOOP: <number>\nFILES_MODIFIED: <number>\nTESTS_STATUS: PASSING | FAILING | NOT_RUN\nWORK_TYPE: IMPLEMENTATION | TESTING | DOCUMENTATION | REFACTORING\nEXIT_SIGNAL: false | true\nRECOMMENDATION: <one line: what to do next>\n---END_RALPH_STATUS---\n```\n\nRules:\n- `EXIT_SIGNAL: true` only when ALL tasks are verifiably done \u2014 then also output the completion phrase\n- `STATUS: BLOCKED` when you need human input; describe the blocker in RECOMMENDATION\n- Never set `EXIT_SIGNAL: true` while tests are failing\n";
|
|
19
|
+
export interface RalphLoopPromptOptions {
|
|
20
|
+
/** The user's task description (becomes the prompt header) */
|
|
21
|
+
taskDescription: string;
|
|
22
|
+
/** Completion phrase the session must emit inside <promise></promise> */
|
|
23
|
+
completionPhrase: string;
|
|
24
|
+
/** Whether a @fix_plan.md task plan was generated for this loop */
|
|
25
|
+
hasPlan: boolean;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Builds the full Ralph loop prompt written to `@ralph_prompt.md`.
|
|
29
|
+
*/
|
|
30
|
+
export declare function buildRalphLoopPrompt({ taskDescription, completionPhrase, hasPlan }: RalphLoopPromptOptions): string;
|
|
31
|
+
//# sourceMappingURL=ralph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ralph.d.ts","sourceRoot":"","sources":["../../src/prompts/ralph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,ktBAoBjC,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,8DAA8D;IAC9D,eAAe,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,gBAAgB,EAAE,MAAM,CAAC;IACzB,mEAAmE;IACnE,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,eAAe,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE,sBAAsB,GAAG,MAAM,CAgCnH"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Ralph Loop prompt construction
|
|
3
|
+
*
|
|
4
|
+
* Builds the full `@ralph_prompt.md` content written for a new Ralph loop
|
|
5
|
+
* session, including the RALPH_STATUS block contract. The contract travels
|
|
6
|
+
* with the loop prompt (not the generated CLAUDE.md) so every Ralph session
|
|
7
|
+
* emits parseable status blocks regardless of the project's CLAUDE.md.
|
|
8
|
+
*
|
|
9
|
+
* @module prompts/ralph
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Structured status-reporting contract appended to every Ralph loop prompt.
|
|
13
|
+
*
|
|
14
|
+
* `RalphStatusParser` (src/ralph-status-parser.ts) parses this block from
|
|
15
|
+
* session output — keep the field names and enum values in sync with its
|
|
16
|
+
* patterns.
|
|
17
|
+
*/
|
|
18
|
+
export const RALPH_STATUS_CONTRACT = `## Status Reporting
|
|
19
|
+
|
|
20
|
+
End EVERY response with exactly this block — Codeman parses it to track the loop:
|
|
21
|
+
|
|
22
|
+
\`\`\`
|
|
23
|
+
---RALPH_STATUS---
|
|
24
|
+
STATUS: IN_PROGRESS | COMPLETE | BLOCKED
|
|
25
|
+
TASKS_COMPLETED_THIS_LOOP: <number>
|
|
26
|
+
FILES_MODIFIED: <number>
|
|
27
|
+
TESTS_STATUS: PASSING | FAILING | NOT_RUN
|
|
28
|
+
WORK_TYPE: IMPLEMENTATION | TESTING | DOCUMENTATION | REFACTORING
|
|
29
|
+
EXIT_SIGNAL: false | true
|
|
30
|
+
RECOMMENDATION: <one line: what to do next>
|
|
31
|
+
---END_RALPH_STATUS---
|
|
32
|
+
\`\`\`
|
|
33
|
+
|
|
34
|
+
Rules:
|
|
35
|
+
- \`EXIT_SIGNAL: true\` only when ALL tasks are verifiably done — then also output the completion phrase
|
|
36
|
+
- \`STATUS: BLOCKED\` when you need human input; describe the blocker in RECOMMENDATION
|
|
37
|
+
- Never set \`EXIT_SIGNAL: true\` while tests are failing
|
|
38
|
+
`;
|
|
39
|
+
/**
|
|
40
|
+
* Builds the full Ralph loop prompt written to `@ralph_prompt.md`.
|
|
41
|
+
*/
|
|
42
|
+
export function buildRalphLoopPrompt({ taskDescription, completionPhrase, hasPlan }) {
|
|
43
|
+
let fullPrompt = taskDescription + '\n\n---\n\n';
|
|
44
|
+
if (hasPlan) {
|
|
45
|
+
fullPrompt += '## Task Plan\n\n';
|
|
46
|
+
fullPrompt += 'A task plan has been written to `@fix_plan.md`. Use this to track progress:\n';
|
|
47
|
+
fullPrompt += '- Reference the plan at the start of each iteration\n';
|
|
48
|
+
fullPrompt += '- Update task checkboxes as you complete items\n';
|
|
49
|
+
fullPrompt += '- Work through items in priority order (P0 > P1 > P2)\n\n';
|
|
50
|
+
}
|
|
51
|
+
fullPrompt += '## Iteration Protocol\n\n';
|
|
52
|
+
fullPrompt += 'This is an autonomous loop. Files from previous iterations persist. On each iteration:\n';
|
|
53
|
+
fullPrompt += '1. Check what work has already been done\n';
|
|
54
|
+
fullPrompt += '2. Make incremental progress toward completion\n';
|
|
55
|
+
fullPrompt += '3. Commit meaningful changes with descriptive messages\n\n';
|
|
56
|
+
fullPrompt += '## Verification\n\n';
|
|
57
|
+
fullPrompt += 'After each significant change:\n';
|
|
58
|
+
fullPrompt += '- Run tests to verify (npm test, pytest, etc.)\n';
|
|
59
|
+
fullPrompt += '- Check for type/lint errors if applicable\n';
|
|
60
|
+
fullPrompt += '- If tests fail, read the error, fix it, and retry\n\n';
|
|
61
|
+
fullPrompt += '## Completion Criteria\n\n';
|
|
62
|
+
fullPrompt += `Output \`<promise>${completionPhrase}</promise>\` when ALL of the following are true:\n`;
|
|
63
|
+
fullPrompt += '- All requirements from the task description are implemented\n';
|
|
64
|
+
fullPrompt += '- All tests pass\n';
|
|
65
|
+
fullPrompt += '- Changes are committed\n\n';
|
|
66
|
+
fullPrompt += '## If Stuck\n\n';
|
|
67
|
+
fullPrompt += 'If you encounter the same error for 3+ iterations:\n';
|
|
68
|
+
fullPrompt += "1. Document what you've tried\n";
|
|
69
|
+
fullPrompt += '2. Identify the specific blocker\n';
|
|
70
|
+
fullPrompt += '3. Try an alternative approach\n';
|
|
71
|
+
fullPrompt += '4. If truly blocked, output `<promise>BLOCKED</promise>` with an explanation\n\n';
|
|
72
|
+
fullPrompt += RALPH_STATUS_CONTRACT;
|
|
73
|
+
return fullPrompt;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=ralph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ralph.js","sourceRoot":"","sources":["../../src/prompts/ralph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;CAoBpC,CAAC;AAWF;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,EAAE,eAAe,EAAE,gBAAgB,EAAE,OAAO,EAA0B;IACzG,IAAI,UAAU,GAAG,eAAe,GAAG,aAAa,CAAC;IACjD,IAAI,OAAO,EAAE,CAAC;QACZ,UAAU,IAAI,kBAAkB,CAAC;QACjC,UAAU,IAAI,+EAA+E,CAAC;QAC9F,UAAU,IAAI,uDAAuD,CAAC;QACtE,UAAU,IAAI,kDAAkD,CAAC;QACjE,UAAU,IAAI,2DAA2D,CAAC;IAC5E,CAAC;IACD,UAAU,IAAI,2BAA2B,CAAC;IAC1C,UAAU,IAAI,0FAA0F,CAAC;IACzG,UAAU,IAAI,4CAA4C,CAAC;IAC3D,UAAU,IAAI,kDAAkD,CAAC;IACjE,UAAU,IAAI,4DAA4D,CAAC;IAC3E,UAAU,IAAI,qBAAqB,CAAC;IACpC,UAAU,IAAI,kCAAkC,CAAC;IACjD,UAAU,IAAI,kDAAkD,CAAC;IACjE,UAAU,IAAI,8CAA8C,CAAC;IAC7D,UAAU,IAAI,wDAAwD,CAAC;IACvE,UAAU,IAAI,4BAA4B,CAAC;IAC3C,UAAU,IAAI,qBAAqB,gBAAgB,oDAAoD,CAAC;IACxG,UAAU,IAAI,gEAAgE,CAAC;IAC/E,UAAU,IAAI,oBAAoB,CAAC;IACnC,UAAU,IAAI,6BAA6B,CAAC;IAC5C,UAAU,IAAI,iBAAiB,CAAC;IAChC,UAAU,IAAI,sDAAsD,CAAC;IACrE,UAAU,IAAI,iCAAiC,CAAC;IAChD,UAAU,IAAI,oCAAoC,CAAC;IACnD,UAAU,IAAI,kCAAkC,CAAC;IACjD,UAAU,IAAI,kFAAkF,CAAC;IACjG,UAAU,IAAI,qBAAqB,CAAC;IACpC,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -1,461 +1,58 @@
|
|
|
1
|
-
# CLAUDE.md
|
|
1
|
+
# CLAUDE.md
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
- `.claude/settings.json` → `.claude/settings.json`
|
|
3
|
+
<!--
|
|
4
|
+
Generated by Codeman on [DATE]. This file is loaded into context at the
|
|
5
|
+
start of every Claude Code session in this project.
|
|
7
6
|
|
|
8
|
-
|
|
7
|
+
Keep it short (target: under 200 lines). For each line ask: "would removing
|
|
8
|
+
this cause Claude to make mistakes?" If not, cut it. Don't document what
|
|
9
|
+
Claude can infer from the code itself (file layout, standard conventions,
|
|
10
|
+
APIs) — bloat causes Claude to ignore the rules that matter.
|
|
9
11
|
|
|
10
|
-
|
|
12
|
+
HTML comments like this one are stripped before loading, so fill-in notes
|
|
13
|
+
cost no context. If this file grows too big, split into path-scoped rules
|
|
14
|
+
in .claude/rules/*.md or import other files with @path/to/file syntax.
|
|
15
|
+
-->
|
|
11
16
|
|
|
12
|
-
|
|
13
|
-
<!-- Update this section with project-specific details -->
|
|
14
|
-
- **Project Name**: [PROJECT_NAME]
|
|
15
|
-
- **Description**: [PROJECT_DESCRIPTION]
|
|
16
|
-
- **Tech Stack**: [TECHNOLOGIES_USED]
|
|
17
|
-
- **Last Updated**: [DATE]
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
## Codeman Environment
|
|
22
|
-
|
|
23
|
-
This session is managed by **Codeman** and runs within a tmux session.
|
|
24
|
-
|
|
25
|
-
**Important**: Check for `CODEMAN_MUX=1` environment variable to confirm.
|
|
26
|
-
- Do NOT attempt to kill your own tmux session
|
|
27
|
-
- The session persists across disconnects - your work is safe
|
|
28
|
-
- Token usage, costs, and background tasks are tracked externally
|
|
29
|
-
|
|
30
|
-
---
|
|
31
|
-
|
|
32
|
-
## Work Principles
|
|
33
|
-
|
|
34
|
-
### Autonomy
|
|
35
|
-
Full permissions granted. Act decisively without asking - read, write, edit, execute freely.
|
|
36
|
-
|
|
37
|
-
### Git Discipline
|
|
38
|
-
- **Commit after every meaningful change** - never batch unrelated work
|
|
39
|
-
- Use conventional commits: `feat:`, `fix:`, `docs:`, `refactor:`, `test:`, `chore:`
|
|
40
|
-
- Commit message = what changed + why (not how)
|
|
41
|
-
|
|
42
|
-
### Documentation
|
|
43
|
-
- Update README.md when adding features or changing setup
|
|
44
|
-
- Update this file's session log after work sessions
|
|
45
|
-
- Keep docs in sync with code changes
|
|
46
|
-
|
|
47
|
-
### Thinking
|
|
48
|
-
Extended thinking is enabled. Use deep reasoning for complex architectural decisions, difficult bugs, and multi-file changes.
|
|
49
|
-
|
|
50
|
-
### Task Tracking (TodoWrite)
|
|
51
|
-
**ALWAYS use TodoWrite** to track tasks. This is non-negotiable for anything beyond trivial single-step work.
|
|
52
|
-
|
|
53
|
-
**When to use TodoWrite:**
|
|
54
|
-
- Multi-step tasks (3+ steps)
|
|
55
|
-
- Bug fixes requiring investigation
|
|
56
|
-
- Feature implementations
|
|
57
|
-
- Any work where progress tracking helps
|
|
58
|
-
- When the user provides multiple requests
|
|
59
|
-
|
|
60
|
-
**How to use it:**
|
|
61
|
-
1. **Before starting**: Break down the work into discrete todos
|
|
62
|
-
2. **During work**: Mark each todo `in_progress` before starting, `completed` when done
|
|
63
|
-
3. **One at a time**: Only ONE todo should be `in_progress` at any moment
|
|
64
|
-
4. **Immediately**: Mark todos complete the moment they're done - don't batch
|
|
65
|
-
|
|
66
|
-
**Why this matters:**
|
|
67
|
-
- Gives the user visibility into your progress
|
|
68
|
-
- Prevents forgetting tasks mid-work
|
|
69
|
-
- Creates accountability checkpoints
|
|
70
|
-
- Makes complex work manageable
|
|
71
|
-
|
|
72
|
-
**Example workflow:**
|
|
73
|
-
```
|
|
74
|
-
User: "Add user authentication with JWT"
|
|
75
|
-
|
|
76
|
-
→ TodoWrite:
|
|
77
|
-
- [ ] Research existing auth patterns in codebase
|
|
78
|
-
- [ ] Implement JWT token generation
|
|
79
|
-
- [ ] Add login endpoint
|
|
80
|
-
- [ ] Add token validation middleware
|
|
81
|
-
- [ ] Add protected route example
|
|
82
|
-
- [ ] Write tests
|
|
83
|
-
|
|
84
|
-
→ Mark "Research existing auth patterns" as in_progress
|
|
85
|
-
→ Do the research
|
|
86
|
-
→ Mark as completed, mark next as in_progress
|
|
87
|
-
→ Continue until all done
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
**Anti-patterns to avoid:**
|
|
91
|
-
- Starting work without creating todos first
|
|
92
|
-
- Having multiple todos `in_progress` simultaneously
|
|
93
|
-
- Batching completions at the end
|
|
94
|
-
- Skipping TodoWrite for "simple" multi-step tasks
|
|
95
|
-
|
|
96
|
-
---
|
|
97
|
-
|
|
98
|
-
## When to Use Agents
|
|
99
|
-
|
|
100
|
-
**Explore agent**: Codebase investigation, finding files, understanding architecture
|
|
101
|
-
```
|
|
102
|
-
"Use explore agent to find all authentication-related code"
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
**Parallel agents**: Independent tasks that don't conflict
|
|
106
|
-
```
|
|
107
|
-
"Research auth, database, and API modules in parallel using separate agents"
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
**Background execution**: Long-running operations (tests, builds)
|
|
111
|
-
```
|
|
112
|
-
"Run the test suite in the background while I continue"
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
**Sequential chaining**: When second task depends on first
|
|
116
|
-
```
|
|
117
|
-
"Use code-reviewer to find issues, then use fixer to resolve them"
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
---
|
|
121
|
-
|
|
122
|
-
## Planning Mode (Automatic)
|
|
123
|
-
|
|
124
|
-
**Automatically enter planning mode** when ANY of these conditions apply:
|
|
125
|
-
- Multi-file changes (3+ files affected)
|
|
126
|
-
- Architectural decisions
|
|
127
|
-
- Unclear or evolving requirements
|
|
128
|
-
- Risk mitigation on core systems
|
|
129
|
-
- New feature implementation
|
|
130
|
-
- Refactoring existing functionality
|
|
131
|
-
|
|
132
|
-
**Do NOT ask** whether to enter planning mode - just enter it when conditions are met.
|
|
133
|
-
|
|
134
|
-
Planning mode flow: read-only exploration → create plan → get approval → execute.
|
|
135
|
-
|
|
136
|
-
**Skip planning mode** only for:
|
|
137
|
-
- Single-file bug fixes
|
|
138
|
-
- Typo corrections
|
|
139
|
-
- Simple config changes
|
|
140
|
-
- Tasks with explicit step-by-step instructions from user
|
|
141
|
-
|
|
142
|
-
---
|
|
143
|
-
|
|
144
|
-
## Ralph Wiggum Loop (Autonomous Work Mode)
|
|
145
|
-
|
|
146
|
-
Ralph loops enable persistent, autonomous work on large tasks. When active, you continue iterating until completion criteria are met or the loop is cancelled.
|
|
147
|
-
|
|
148
|
-
### Starting a Ralph Loop
|
|
149
|
-
- Start: `/ralph-loop:ralph-loop`
|
|
150
|
-
- Cancel: `/ralph-loop:cancel-ralph`
|
|
151
|
-
- Help: `/ralph-loop:help`
|
|
152
|
-
|
|
153
|
-
### Time-Aware Loops
|
|
154
|
-
|
|
155
|
-
When the user specifies a **minimum duration** (e.g., "optimize for 8 hours", "work on this for 2 hours"), the loop becomes time-aware:
|
|
156
|
-
|
|
157
|
-
**At loop start:**
|
|
158
|
-
```bash
|
|
159
|
-
# Record start time
|
|
160
|
-
date +%s > /tmp/ralph_start_time
|
|
161
|
-
echo "Loop started at $(date)"
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
**Check elapsed time periodically:**
|
|
165
|
-
```bash
|
|
166
|
-
START=$(cat /tmp/ralph_start_time)
|
|
167
|
-
NOW=$(date +%s)
|
|
168
|
-
ELAPSED_HOURS=$(echo "scale=2; ($NOW - $START) / 3600" | bc)
|
|
169
|
-
echo "Elapsed: $ELAPSED_HOURS hours"
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
**Time-aware behavior:**
|
|
173
|
-
1. Complete all primary tasks from the user's prompt
|
|
174
|
-
2. After primary tasks done, check elapsed time
|
|
175
|
-
3. If minimum duration NOT reached:
|
|
176
|
-
- **Do NOT output completion phrase**
|
|
177
|
-
- Self-generate additional related tasks
|
|
178
|
-
- Continue working until minimum time elapsed
|
|
179
|
-
4. Only output completion phrase when:
|
|
180
|
-
- ALL primary tasks complete AND
|
|
181
|
-
- Minimum duration reached (or exceeded)
|
|
182
|
-
|
|
183
|
-
**Self-generating additional tasks when time remains:**
|
|
184
|
-
- Code optimization (performance, readability, DRY)
|
|
185
|
-
- Test coverage improvements
|
|
186
|
-
- Edge case handling
|
|
187
|
-
- Error message improvements
|
|
188
|
-
- Documentation gaps
|
|
189
|
-
- Security hardening
|
|
190
|
-
- Accessibility improvements
|
|
191
|
-
- Code cleanup and dead code removal
|
|
192
|
-
- Dependency updates
|
|
193
|
-
- Type safety improvements
|
|
194
|
-
|
|
195
|
-
**Example time-aware prompt:**
|
|
196
|
-
```
|
|
197
|
-
"Optimize the API endpoints for the next 4 hours. Focus on performance first,
|
|
198
|
-
then code quality. Minimum runtime: 4 hours."
|
|
199
|
-
Completion phrase: <promise>TIME_COMPLETE</promise>
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
**Time-aware loop behavior:**
|
|
203
|
-
```
|
|
204
|
-
[Start loop, record timestamp]
|
|
205
|
-
[Complete primary optimization tasks - 2 hours elapsed]
|
|
206
|
-
[Check time: 2/4 hours - NOT done yet]
|
|
207
|
-
[Self-generate: "Add caching to database queries"]
|
|
208
|
-
[Self-generate: "Optimize N+1 queries"]
|
|
209
|
-
[Self-generate: "Add request batching"]
|
|
210
|
-
[Continue working... 4.5 hours elapsed]
|
|
211
|
-
[Check time: 4.5/4 hours - minimum reached]
|
|
212
|
-
[All tasks complete, tests pass]
|
|
213
|
-
<promise>TIME_COMPLETE</promise>
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
### How You Know You're in a Ralph Loop
|
|
217
|
-
|
|
218
|
-
The user started the loop with a prompt containing:
|
|
219
|
-
- Clear task requirements
|
|
220
|
-
- A **completion phrase** (e.g., `<promise>COMPLETE</promise>`)
|
|
221
|
-
- **Optional: minimum duration** (e.g., "for the next 4 hours")
|
|
222
|
-
- Iteration limits (handled by the system)
|
|
17
|
+
This file guides Claude Code when working in this repository.
|
|
223
18
|
|
|
224
|
-
|
|
19
|
+
## Project
|
|
225
20
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
**1. Work Incrementally**
|
|
229
|
-
- Complete one sub-task at a time
|
|
230
|
-
- Verify it works before moving to the next
|
|
231
|
-
- Don't try to do everything in one pass
|
|
232
|
-
|
|
233
|
-
**2. Commit Frequently**
|
|
234
|
-
- Commit after each meaningful completion
|
|
235
|
-
- Creates recovery points if something breaks
|
|
236
|
-
- Shows progress in git history
|
|
237
|
-
```
|
|
238
|
-
git add . && git commit -m "feat(auth): add token refresh endpoint"
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
**3. Self-Correct Relentlessly**
|
|
242
|
-
```
|
|
243
|
-
Loop:
|
|
244
|
-
1. Implement/fix
|
|
245
|
-
2. Run tests
|
|
246
|
-
3. If tests fail → read error, fix, go to 1
|
|
247
|
-
4. Run linter
|
|
248
|
-
5. If lint errors → fix, go to 1
|
|
249
|
-
6. Commit
|
|
250
|
-
7. Continue to next task
|
|
251
|
-
```
|
|
252
|
-
|
|
253
|
-
**4. Track Progress**
|
|
254
|
-
Update the session log in this file as you complete tasks:
|
|
255
|
-
```markdown
|
|
256
|
-
| Date | Tasks Completed | Files Changed | Notes |
|
|
257
|
-
|------|-----------------|---------------|-------|
|
|
258
|
-
| YYYY-MM-DD | Add auth endpoint | auth.ts, routes.ts | Tests passing |
|
|
259
|
-
```
|
|
260
|
-
|
|
261
|
-
**5. Use Git History When Stuck**
|
|
262
|
-
If something isn't working:
|
|
263
|
-
```bash
|
|
264
|
-
git log --oneline -10
|
|
265
|
-
git diff HEAD~1
|
|
266
|
-
```
|
|
267
|
-
See what you already tried. Don't repeat failed approaches.
|
|
268
|
-
|
|
269
|
-
**6. Completion Phrase = Contract**
|
|
270
|
-
Only output the completion phrase (e.g., `<promise>COMPLETE</promise>`) when:
|
|
271
|
-
- ALL requirements from the original prompt are done
|
|
272
|
-
- ALL tests pass
|
|
273
|
-
- ALL linting passes
|
|
274
|
-
- Changes are committed
|
|
275
|
-
|
|
276
|
-
**Never output the completion phrase early.** The loop only ends when you say it's done.
|
|
277
|
-
|
|
278
|
-
### What Makes Good Completion Criteria
|
|
279
|
-
|
|
280
|
-
The user should provide criteria that are:
|
|
281
|
-
- **Verifiable**: Tests pass, lint clean, build succeeds
|
|
282
|
-
- **Measurable**: "5 endpoints", "all files in src/", "zero errors"
|
|
283
|
-
- **Binary**: Done or not done, no ambiguity
|
|
284
|
-
|
|
285
|
-
If the original prompt has vague criteria, ask clarifying questions before starting heavy work.
|
|
286
|
-
|
|
287
|
-
### Self-Correction Pattern (Include in Your Work)
|
|
288
|
-
|
|
289
|
-
```
|
|
290
|
-
FOR EACH TASK:
|
|
291
|
-
1. Implement the change
|
|
292
|
-
2. Run tests (npm test, pytest, go test, cargo test, etc.)
|
|
293
|
-
- If fail → read error, fix, retry
|
|
294
|
-
3. Run linter (npm run lint, ruff, golangci-lint, etc.)
|
|
295
|
-
- If fail → fix, go to step 2
|
|
296
|
-
4. Verify manually if needed
|
|
297
|
-
5. Commit with descriptive message
|
|
298
|
-
6. Update session log
|
|
299
|
-
7. Move to next task
|
|
300
|
-
|
|
301
|
-
WHEN ALL TASKS DONE:
|
|
302
|
-
1. Run full test suite
|
|
303
|
-
2. Run full lint
|
|
304
|
-
3. Verify build succeeds
|
|
305
|
-
4. Review all changes: git diff main
|
|
306
|
-
5. Only then output completion phrase
|
|
307
|
-
```
|
|
308
|
-
|
|
309
|
-
### Example: How to Think During Ralph Loop
|
|
310
|
-
|
|
311
|
-
**Original prompt**: "Add CRUD endpoints for todos with validation"
|
|
312
|
-
|
|
313
|
-
**Your approach**:
|
|
314
|
-
```
|
|
315
|
-
Task breakdown:
|
|
316
|
-
- [ ] GET /todos (list)
|
|
317
|
-
- [ ] POST /todos (create with validation)
|
|
318
|
-
- [ ] GET /todos/:id (single)
|
|
319
|
-
- [ ] PUT /todos/:id (update with validation)
|
|
320
|
-
- [ ] DELETE /todos/:id
|
|
321
|
-
- [ ] Tests for all endpoints
|
|
322
|
-
|
|
323
|
-
Starting with GET /todos...
|
|
324
|
-
[implement]
|
|
325
|
-
[test - passes]
|
|
326
|
-
[commit: "feat(todos): add GET /todos endpoint"]
|
|
327
|
-
[update session log]
|
|
328
|
-
|
|
329
|
-
Moving to POST /todos...
|
|
330
|
-
[implement]
|
|
331
|
-
[test - fails: validation not working]
|
|
332
|
-
[fix validation]
|
|
333
|
-
[test - passes]
|
|
334
|
-
[commit: "feat(todos): add POST /todos with validation"]
|
|
335
|
-
[update session log]
|
|
336
|
-
|
|
337
|
-
...continue until all done...
|
|
338
|
-
|
|
339
|
-
Final verification:
|
|
340
|
-
[npm test - all pass]
|
|
341
|
-
[npm run lint - clean]
|
|
342
|
-
[npm run build - succeeds]
|
|
343
|
-
|
|
344
|
-
<promise>COMPLETE</promise>
|
|
345
|
-
```
|
|
346
|
-
|
|
347
|
-
### When to NOT Output Completion Phrase
|
|
348
|
-
|
|
349
|
-
- Tests are failing (even one)
|
|
350
|
-
- Lint errors exist
|
|
351
|
-
- Build is broken
|
|
352
|
-
- You skipped a requirement
|
|
353
|
-
- You're unsure if something works
|
|
354
|
-
- **Minimum duration not reached** (for time-aware loops)
|
|
355
|
-
|
|
356
|
-
Instead: Fix the issue, verify, then complete. For time-aware loops: generate more tasks and keep improving until minimum time elapsed.
|
|
357
|
-
|
|
358
|
-
### RALPH_STATUS Block (Required During Ralph Loop)
|
|
359
|
-
|
|
360
|
-
At the **END of every response** during a Ralph Loop, output this structured status block:
|
|
361
|
-
|
|
362
|
-
```
|
|
363
|
-
---RALPH_STATUS---
|
|
364
|
-
STATUS: IN_PROGRESS | COMPLETE | BLOCKED
|
|
365
|
-
TASKS_COMPLETED_THIS_LOOP: <number>
|
|
366
|
-
FILES_MODIFIED: <number>
|
|
367
|
-
TESTS_STATUS: PASSING | FAILING | NOT_RUN
|
|
368
|
-
WORK_TYPE: IMPLEMENTATION | TESTING | DOCUMENTATION | REFACTORING
|
|
369
|
-
EXIT_SIGNAL: false | true
|
|
370
|
-
RECOMMENDATION: <one line summary of what to do next>
|
|
371
|
-
---END_RALPH_STATUS---
|
|
372
|
-
```
|
|
373
|
-
|
|
374
|
-
**Rules:**
|
|
375
|
-
- Output this block at the end of **every** response, no exceptions
|
|
376
|
-
- Set `EXIT_SIGNAL` to `true` ONLY when ALL tasks are verifiably done
|
|
377
|
-
- Set `STATUS` to `BLOCKED` when you need human intervention
|
|
378
|
-
- Do NOT continue with busy work when `EXIT_SIGNAL` should be `true`
|
|
379
|
-
- Do NOT forget the status block — it is required for loop tracking
|
|
380
|
-
|
|
381
|
-
### Testing Limits
|
|
382
|
-
|
|
383
|
-
- **LIMIT testing to ~20% of total effort** per loop
|
|
384
|
-
- PRIORITIZE: Implementation > Documentation > Tests
|
|
385
|
-
- Only write tests for NEW functionality
|
|
386
|
-
- Do NOT refactor existing tests unless broken
|
|
387
|
-
- Do NOT run tests repeatedly without implementing new features
|
|
388
|
-
|
|
389
|
-
### Exit Scenarios (When to Set EXIT_SIGNAL)
|
|
390
|
-
|
|
391
|
-
| Scenario | STATUS | EXIT_SIGNAL | Action |
|
|
392
|
-
|----------|--------|-------------|--------|
|
|
393
|
-
| All tasks completed, tests pass | COMPLETE | true | Output completion phrase |
|
|
394
|
-
| No work remaining, specs done | COMPLETE | true | Output completion phrase |
|
|
395
|
-
| Making normal progress | IN_PROGRESS | false | Continue to next task |
|
|
396
|
-
| Test-only loop (no implementation) | IN_PROGRESS | false | Warn and shift to implementation |
|
|
397
|
-
| Stuck on same error repeatedly | BLOCKED | false | Describe blocker, request help |
|
|
398
|
-
| Needs human decision/intervention | BLOCKED | false | Describe what's needed |
|
|
399
|
-
|
|
400
|
-
**Anti-patterns to avoid:**
|
|
401
|
-
- Setting `EXIT_SIGNAL: true` when tests are failing
|
|
402
|
-
- Continuing to work when all tasks are genuinely done (busy work)
|
|
403
|
-
- Running the same failing test repeatedly without changing approach
|
|
404
|
-
- Adding features not in the original specifications
|
|
405
|
-
- Refactoring working code instead of completing assigned tasks
|
|
406
|
-
|
|
407
|
-
---
|
|
408
|
-
|
|
409
|
-
## Code Standards
|
|
410
|
-
|
|
411
|
-
### Before Writing
|
|
412
|
-
- Read existing code in the area you're modifying
|
|
413
|
-
- Follow existing patterns and conventions
|
|
414
|
-
- Check for similar implementations to reference
|
|
415
|
-
|
|
416
|
-
### During Implementation
|
|
417
|
-
- Keep changes focused and minimal
|
|
418
|
-
- Don't over-engineer
|
|
419
|
-
- Write tests for new functionality
|
|
420
|
-
|
|
421
|
-
### After Implementation
|
|
422
|
-
- Run tests
|
|
423
|
-
- Update docs if needed
|
|
424
|
-
- Commit with descriptive message
|
|
425
|
-
|
|
426
|
-
---
|
|
427
|
-
|
|
428
|
-
## Hooks Awareness
|
|
429
|
-
|
|
430
|
-
This project may have hooks that auto-format code after writes or validate operations. If a tool call behaves unexpectedly, hooks are likely the cause. Continue working - they're intentional.
|
|
431
|
-
|
|
432
|
-
---
|
|
433
|
-
|
|
434
|
-
## Session Log
|
|
435
|
-
|
|
436
|
-
| Date | Tasks Completed | Files Changed | Notes |
|
|
437
|
-
|------|-----------------|---------------|-------|
|
|
438
|
-
| [DATE] | Project created | CLAUDE.md | Initial setup |
|
|
21
|
+
- **Project Name**: [PROJECT_NAME]
|
|
22
|
+
- **Description**: [PROJECT_DESCRIPTION]
|
|
439
23
|
|
|
440
|
-
|
|
24
|
+
## Commands
|
|
441
25
|
|
|
442
|
-
|
|
26
|
+
<!-- List the exact commands Claude can't guess — fill in as the project
|
|
27
|
+
takes shape, then delete this comment:
|
|
443
28
|
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
29
|
+
| Task | Command |
|
|
30
|
+
|------|---------|
|
|
31
|
+
| Dev server | `npm run dev` |
|
|
32
|
+
| Test (single file) | `npm test -- test/<file>.test.ts` |
|
|
33
|
+
| Lint | `npm run lint` |
|
|
34
|
+
| Build | `npm run build` |
|
|
35
|
+
-->
|
|
447
36
|
|
|
448
|
-
|
|
449
|
-
- [ ] <!-- Add tasks here -->
|
|
37
|
+
## Code Style
|
|
450
38
|
|
|
451
|
-
|
|
39
|
+
<!-- Only rules that differ from language/framework defaults, one line each:
|
|
40
|
+
- Use 2-space indentation
|
|
41
|
+
- ES modules only — never require()
|
|
42
|
+
-->
|
|
452
43
|
|
|
453
|
-
##
|
|
44
|
+
## Workflow
|
|
454
45
|
|
|
455
|
-
|
|
46
|
+
- Full permissions are granted: read, write, edit, and execute without asking.
|
|
47
|
+
- Commit after every meaningful change; never batch unrelated work.
|
|
48
|
+
- Use conventional commits (`feat:` `fix:` `docs:` `refactor:` `test:` `chore:`); the message says what changed and why.
|
|
49
|
+
- Run the tests and linter before declaring any task done.
|
|
50
|
+
- Keep README and docs in sync with code changes.
|
|
456
51
|
|
|
457
|
-
|
|
52
|
+
## Codeman Environment
|
|
458
53
|
|
|
459
|
-
|
|
54
|
+
This session is managed by Codeman and runs inside tmux (`CODEMAN_MUX=1` confirms it).
|
|
460
55
|
|
|
461
|
-
|
|
56
|
+
- NEVER kill your own session: no `tmux kill-session`, `pkill tmux`, or `pkill claude`.
|
|
57
|
+
- The session persists across disconnects — your work is safe.
|
|
58
|
+
- Hooks may auto-format or validate after writes; unexpected tool behavior usually means a hook ran. Keep working.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-md.d.ts","sourceRoot":"","sources":["../../src/templates/claude-md.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"claude-md.d.ts","sourceRoot":"","sources":["../../src/templates/claude-md.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAsBH;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,GAAE,MAAW,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAyB1G"}
|