Imported from Negai-ai/AgentClaw (
agentclaw/skills/builtin_skills/coding_skill/SKILL.md). Install upstream withnpx skills add Negai-ai/AgentClaw --skill coding_skill. Copyright stays with the author.
Coding Skill (Primary Playbook)
This SKILL.md is the default guide for common coding tasks.
Focus on reliable tool usage and verifiable code changes.
Load references/* only when needed.
1) Scope and Boundary
- This skill covers generic coding work: discover, read, edit, refactor, and validate code.
- This skill is tool-centric. Keep guidance about product/domain-specific implementation out of the main flow.
- All coding-tool paths are resolved under
project_dir. Paths outsideproject_dirare invalid. - Use minimal edits first; escalate to broad rewrites only when partial edits are unstable.
- Do not introduce hardcoded secrets, machine-specific absolute paths, or environment-specific install commands in generated code.
2) Zero-Context Execution Flow (Default)
When repository context is limited, use this fixed sequence:
search_codeto locate files/snippets.- Run quick environment preflight for path/tool consistency:
- confirm
project_dir-relative target paths - avoid bare
pip; prefer interpreter-scoped install commands when needed
- confirm
read_codeto load exact edit context.- Apply smallest safe edit (
replace_in_fileorupdate_code). - For Python edits:
- If you used
write_code: syntax is already validated (pre-write check). Do NOT callsyntax_checkin the same tool call — the file won't exist yet when parallel tools run. Only usesyntax_checkseparately forreplace_in_file/update_codeedits. python -m py_compile <changed_file>.py(optional, for import-level validation; on Windows you may also usepy -3 -m py_compile)
- If you used
- If syntax fails, patch the failing region with local edits first (
replace_in_file/update_code), then re-run checks. - Re-read changed region (
read_code) when ambiguity/count errors occurred. - Report changed files, validations, and unresolved risks.
Prefer not to skip to later steps when an earlier step fails.
3) Tool Contract (Default)
3.1 search_code
Purpose: text/regex discovery in project files. Returns file:line:col: matched_text for each match.
Important: This tool only returns the matching line text, NOT full function/class definitions or surrounding code. To read the full implementation of a matched symbol, use read_code with the file path and line range from search results.
Required:
query(string)
Common optional:
path(default".")file_glob(default"**/*")use_regex(defaultfalse)max_results(default200, range1-1000)
Example:
{
"query": "class Workflow",
"path": "agentclaw",
"file_glob": "**/*.py"
}
3.2 read_code
Purpose: read file content by line range or Python symbol.
Required:
path
Optional:
start_line,end_linesymbol(Python only)symbol_type(auto|function|class)
Examples:
{
"path": "agentclaw/graph/workflow.py",
"start_line": 60,
"end_line": 180
}
{
"path": "agentclaw/node/llm.py",
"symbol": "_build_messages",
"symbol_type": "function"
}
3.3 syntax_check
Purpose: language-aware syntax diagnostics.
Required:
path
Optional:
languageoverride (py|js|ts|json|yaml|toml)context_lines(default3, range0-8)include_source_context(defaulttrue)
Example:
{"path":"agentclaw/node/llm.py"}
When to use:
- immediately after editing Python/JS/TS/JSON/YAML/TOML files
- before
py_compile/register/runtime checks
When NOT to use:
- for semantic/runtime logic debugging (it is syntax-focused)
- as a replacement for import/runtime validation
Common failure shapes -> next action:
path_not_found/Not a file- align path with
project_dir, then retry same check
- align path with
PY_SYNTAX_ERROR/ syntax diagnostics with line+col- patch failing region via
replace_in_fileorupdate_code, then re-runsyntax_check
- patch failing region via
- checker unavailable (
node,tsc,PyYAML,tomli)- report dependency gap and continue with partial validation
Output format:
- Human-readable block first (error message, source context with
>marker, smart HINT), followed by structured JSON. - HINT line detects common root causes:
HTML entities (" > ')→ usewrite_codeinstead ofwrite_fileto auto-sanitize.double-escaped sequences (\\\\n)→ use literal multi-line content or single\\n.
ok=true+status=success: syntax pass with no flagged risk pattern.ok=true+status=warning: syntax pass butrisk_diagnosticsis non-empty.- treat as unresolved risk and patch before claiming completion.
ok=false+diagnostics: syntax failure; repair same region first.
3.4 update_code
Purpose: regex-based code update with automatic syntax validation.
Required:
pathpattern(Python regex)replacement
Optional:
dry_run(defaultfalse)
Features:
- Uses Python regex with re.MULTILINE flag
- Automatically validates syntax after update (Python/JSON files)
- Returns syntax warnings without blocking write (allows incremental fixes)
Example:
{
"path": "agentclaw/node/llm.py",
"pattern": "def\\s+old_name\\(",
"replacement": "def new_name(",
"dry_run": true
}
When to use:
- Pattern-based refactoring across code
- Renaming functions/variables with regex
- Updating repeated code patterns
When NOT to use:
- Exact text replacement (use
replace_in_file) - Large block rewrites (use
write_code)
Result includes:
syntax_warning: line number and error if syntax check fails (does not block write)preview: affected code linesreplacements: number of matches replaced
3.5 replace_in_file
Purpose: deterministic single-file snippet replacement.
Required:
path,old_text,new_text
Optional:
replace_all(defaultfalse)expected_replacementsoccurrence_index(1-based)
Notes:
- old_text and new_text are matched/written LITERALLY — no escape sequence processing (
\\nmeans literal backslash-n). Use real multi-line strings for actual newlines.
Rules:
- Use this for small exact replacements, not broad transformations.
- If multiple matches and
replace_all=false, setoccurrence_indexto disambiguate. expected_replacementsshould only be set when match count is deterministic.- If
expected_replacementsmismatches, re-read file and recalculate before retrying.
Example:
{
"path": "workflows/nl2sql.py",
"old_text": "Workflow(\"nl2sql\")",
"new_text": "Workflow(id=\"nl2sql\", name=\"NL2SQL\")"
}
3.6 write_file
Purpose: create/overwrite a full file when partial edit is inefficient.
Note: For source code files (.py, .js, .ts, .json, etc.), prefer write_code (section 3.8) — it auto-sanitizes HTML entities and runs pre-write syntax checks.
Required:
path(relative project path)content(raw source text)
Rules:
- Content is written LITERALLY as-is — no escape sequence processing (
\\nbecomes literal backslash-n, not a newline). Use real multi-line content for actual newlines. - Use
write_filefor new files or full rewrites only. - For existing files, prefer
replace_in_file/update_code; only usewrite_fileoverwrite when intentional. - If an existing file was already written once in this task, do not keep rewriting it with
write_file; switch to local patch tools for follow-up fixes. - Do not pass source text into
path. - Keep
contentas raw code; do not pre-escape triple quotes into the final file. - Always re-read the file after
write_filebefore registration/runtime checks. - If writing Python code, run
syntax_check+python -m py_compileimmediately afterwrite_file. - If syntax fails after
write_file, do not rewrite whole file first; repair failing region with targeted edits.
Example:
{
"path": "workflows/new_agent.py",
"content": "from agentclaw import Workflow\n..."
}
When to use:
- creating a new file
- full overwrite only when partial edits are clearly unstable
When NOT to use:
- one-line or small region fixes (prefer
replace_in_file/update_code) - first attempt for syntax error repair on an existing file
Common failure shapes -> next action:
content_too_large- split into smaller deterministic edits
- post-write syntax error
- run local patch loop on failing lines; do not jump to another full rewrite
- path confusion after write
- re-list and re-read file with
project_dir-relative path, then validate again
- re-list and re-read file with
3.7 Safe Coding Patterns (Avoid Syntax Errors)
When generating code with complex strings or nested structures, use segmented writing to prevent syntax errors.
Rule 1: Segmented Writing Strategy
For new files with complex content:
- Write basic structure (imports, class/function signatures)
- Run
syntax_checkto validate - Add simple logic and core functionality
- Run
syntax_checkto validate - Add complex content (long strings, nested structures)
- Run
syntax_check+py_compileto validate
Rule 2: Complex String Handling
For code containing long prompts or multi-line strings:
- Use separate constant definitions for complex strings
- Keep string nesting simple (avoid mixing f-strings with triple quotes)
- Use
textwrap.dedentfor indentation handling when needed - Validate after each addition
Rule 3: Incremental Validation
After each write_file or significant edit:
- If
write_codewas used: syntax is already validated — skipsyntax_check(do NOT call it in the same tool batch aswrite_code; the file won't exist yet). - If
replace_in_file/update_codewas used: runsyntax_checkin a separate tool call. - If syntax passes, run
py_compilefor Python files. - Fix any issues with local edits before adding more content.
- Only proceed to next content addition after validation passes.
This approach reduces syntax error rates and makes fixes more targeted.
3.8 write_code (Preferred for source code)
Purpose: write source code files with automatic sanitization and pre-write validation.
Use this instead of write_file for any source code (.py, .js, .ts, .json, etc.).
Required:
path(relative project path)content(source code)
Optional:
overwrite_existing(defaultfalse)
Auto-sanitization:
- HTML entities (
"→",'→',>→>,&→&) are auto-decoded - Double-escaped newlines (
\\nliteral) trigger a warning in the response
Pre-write checks:
- Python files:
compile()check before writing; rejects invalid syntax without touching file - JSON files:
json.loads()check before writing
Result contract:
[OK]with file stats on success; includesnote=html_entities_auto_fixedif sanitization was applied[SYNTAX_ERROR]with line context and smart HINT if pre-write check fails — file NOT written[Error]on parameter/path validation failure
Example:
{
"path": "workflows/nl2sql.py",
"content": "from agentclaw import Workflow\n\nworkflow = Workflow(id=\"nl2sql\")\n",
"overwrite_existing": true
}
When to use:
- any new code file creation
- full overwrite of source code when partial edits are unstable
- when model output may contain HTML entity encoding
When NOT to use:
- non-code files (configs, logs, binary) — use
write_file - small edits to existing files — use
replace_in_file/update_code
3.9 lookup_api
Purpose: introspect installed Python packages to discover correct import paths, constructor signatures, and methods. Use this when you are unsure of the correct import or API for any installed library.
Required:
module(e.g."agentclaw","agentclaw.node")
Optional:
symbol(e.g."LLMNode","Workflow") — omit to list all exported namesinclude_methods(defaultfalse) — list public methods of a class
Examples:
{"module": "agentclaw"}
→ Lists all classes, functions, and other exports of the module.
{"module": "agentclaw", "symbol": "LLMNode", "include_methods": true}
→ Returns: import paths (shortest + source), constructor signature, description, and public methods.
When to use:
- before writing
importstatements for unfamiliar packages - when
search_codecannot find the symbol (because it is in an installed package, not project code) - to verify constructor arguments before generating code
When NOT to use:
- for project-local code (use
search_code+read_codeinstead) - for non-Python packages
4) Tool Selection Strategy
replace_in_file: first choice for small deterministic edits.update_code(anchor): bounded block insertion/replacement with explicit anchors.update_code(regex): repetitive pattern refactors.replace_in_files: broad mechanical rename/namespace updates.write_code: preferred for creating new code files or full rewrites (auto-sanitizes, pre-validates).write_file: non-code files or whenwrite_codeis not appropriate.lookup_api: verify imports and constructor signatures before generating code for installed packages.- For precise single-target edits, prefer:
replace_in_file+occurrence_index/expected_replacementsupdate_code(exact)+expected_count=1- avoid unbounded
replace_all=trueunless scope guards are set.
5) Failure Recovery Loop (Default)
- Classify failure first: path, parameter, count, ambiguity, or checker environment.
- Fix the same failing tool call before switching to unrelated tools.
- Re-read local context before retry when mismatch/ambiguity appears.
- Retry with corrected args.
- After two same-shape failures, switch strategy and explain the switch.
- For syntax failures after code edits, prefer local patch loops before full-file rewrite.
5.1 Error-Code Repair Playbook (Default)
Map structured failures to deterministic next actions:
error_class=path_not_found- Action: verify
project_dir-relative path withsearch_code/read_code, then retry same tool.
- Action: verify
error_class=parameter_validation- Action: correct required args for current mode/tool, retry immediately.
error_class=ambiguous_match- Action: set
occurrence_indexor narrow match anchors/text.
- Action: set
error_class=replacement_scope_too_large- Action: narrow scope first; only then set explicit replacement caps.
error_class=syntax_errororSYNTAX_ERRORdiagnostics- Action: patch failing region with local edit tools, then re-run
syntax_check+py_compile.
- Action: patch failing region with local edit tools, then re-run
- checker unavailable errors
- Action: report missing dependency and keep status
partialif this blocks required validation.
- Action: report missing dependency and keep status
Common patterns:
path_not_found/Not a file- Re-discover path with
search_code; confirm relative path underproject_dir.
- Re-discover path with
parameter_validation/ missing fields- Correct required mode fields and retry same tool immediately.
expected_count/expected_replacementsmismatch- File changed or match pattern drifted; re-read and recompute.
- ambiguous match
- provide
occurrence_indexor explicit ambiguity override.
- provide
- replacement scope too large
- narrow
old_text/anchors, or set explicitmax_replacements/max_total_replacementsafter verifying match count.
- narrow
- checker unavailable (
node,tsc,PyYAML,tomli)- report dependency gap and treat validation as partial.
- syntax/compile failure after write
- run targeted fix on failing lines with
replace_in_file/update_code; - only do full rewrite when local fixes failed repeatedly.
- run targeted fix on failing lines with
6) Structured Outcome Contract (Default)
When using MCP coding tools, consume structured fields first, not prose keywords:
- success hints:
ok=truechanged/replacementspresent as expected- for
syntax_check, requirestatus=success(notwarning) before claiming clean pass
- failure hints:
error_classmissing_fieldssuggested_fix- explicit
[ERROR] ...prefix
Required behavior:
- If
error_class=parameter_validation, fix arguments and retry the same tool. - If result is
dry_run=true, do not claim the edit is applied. - If replacement/count guard fails, re-read target region before retry.
- In final report, bind each claimed change to a concrete successful tool call.
- If
syntax_checkreturnsrisk_diagnostics, include them in risks or fix them before markingcompleted.
7) Validation Standard
For code-change tasks:
syntax_checkfor changed files when supported.py_compilefor changed Python files.- If changed files include
workflows/*.py, confirm bootstrap import wiring inserver.py(direct import or viaworkflows/__init__.py). - Re-run focused checks when previous step failed.
Do not report full completion without validation evidence.
7.1 Workflow Tooling Pattern (Recommended)
For workflow-local tools in generated workflow files:
- Prefer
@workflow.toolas the default registration path. - Use
workflow.register_toolkit(...)only when cross-workflow reuse/pluginization is explicitly required. - If migrating old examples (
ToolKit()+workflow.use(toolkit)), keep behavior equivalent and avoid unrelated rewrites.
8) Anti-Hardcoding Rules (Default)
- Never write credentials/tokens/passwords directly into source files.
- Avoid absolute host-specific paths (for example
/home/<user>/...) in code and scripts. - Prefer config/env-based values and explicit input parameters.
- If dependency installation is required, do not emit bare
pip install ...by default.- prefer
<python_executable> -m pip ...or project-selected package manager strategy.
- prefer
8.1 Import Validity Check (Recommended for generated code)
- Do not invent module paths or symbol names from memory.
- Before final
write_code/write_filefor framework code, verify:- imported module path exists in the local repository/runtime;
- imported symbols are actually exported.
- For installed packages: use
lookup_api(module="<pkg>", symbol="<name>")to get correct import paths and constructor signatures. - For project-local code: use
search_code/read_codeto confirm local definitions before writing. - If registration/preflight reports import blockers, fix imports first, then continue to syntax/runtime validation.
9) Completion Contract
Final result should include:
changed_filesoperations(tools actually used)validation(syntax_check,py_compile, or explicit limitations)status(completed/partial/blocked)next_step(if not completed)
10) Reference Policy
Read references only when needed.
Read only when task requires coordination between coding_skill and agent_creator:
references/agent_workflow_coding_notes.md