annotate-source-files
О программе
Этот навык автоматически добавляет аннотации рабочих процессов PUT в исходные файлы, используя синтаксис комментариев для более чем 30 языков программирования. Он обеспечивает генерацию аннотаций, многострочное форматирование, работу с переменными .internal и валидацию через автоматическое определение префиксов комментариев. Используйте его для документирования рабочих процессов в существующих кодовых базах, конвейерах данных или многошаговых вычислениях после создания плана аннотаций.
Быстрая установка
Claude Code
Рекомендуетсяnpx skills add pjt222/agent-almanac -a claude-code/plugin add https://github.com/pjt222/agent-almanacgit clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/annotate-source-filesСкопируйте и вставьте эту команду в Claude Code для установки этого навыка
Документация
Annotate Source Files
Add PUT workflow annotations → putior extracts structured workflow data + generates Mermaid diagrams.
Use When
- After
analyze-codebase-workflow+ annotation plan - Add workflow docs new/existing src
- Enrich auto-detected w/ manual labels + connections
- Doc data pipelines, ETL, multi-step computations
In
- Required: Src files to annotate
- Required: Annotation plan or workflow steps knowledge
- Optional: Style — single-line or multiline (default: single-line)
- Optional: Use
put_generate()skeletons? (default: yes)
Do
Step 1: Determine Comment Prefix
Each lang has specific prefix. get_comment_prefix() → correct one.
library(putior)
# Common prefixes
get_comment_prefix("R") # "#"
get_comment_prefix("py") # "#"
get_comment_prefix("sql") # "--"
get_comment_prefix("js") # "//"
get_comment_prefix("ts") # "//"
get_comment_prefix("go") # "//"
get_comment_prefix("rs") # "//"
get_comment_prefix("m") # "%"
get_comment_prefix("lua") # "--"
→ String like "#", "--", "//", or "%".
Line + block comments: putior detects annotations in both line comments (
//,#,--) + C-style block comments (/* */,/** */). JS/TS both//+/* */scanned. Python triple-quote strings (''' ''') not detected — use#for Python.
If err: Ext not recognized → lang may not be supported. Check get_supported_extensions(). Unsupported langs → use # conventional default.
Step 2: Generate Skeletons
put_generate() → annotation templates based on auto-detected I/O.
# Print suggestions to console
put_generate("./src/etl/")
# Single-line style (default)
put_generate("./src/etl/", style = "single")
# Multiline style for complex annotations
put_generate("./src/etl/", style = "multiline")
# Copy to clipboard for pasting
put_generate("./src/etl/", output = "clipboard")
Example out for R file:
# put id:'extract_data', label:'Extract Customer Data', input:'customers.csv', output:'raw_data.internal'
Example out for SQL:
-- put id:'load_data', label:'Load Customer Table', output:'customers'
→ 1+ annotation comment lines per file, pre-filled w/ detected fn names + I/O.
If err: No suggestions → file may not have recognizable I/O patterns. Write annotations manually.
Step 3: Refine Annotations
Edit generated skeletons → accurate labels, connections, metadata.
Annotation syntax:
<prefix> put id:'unique_id', label:'Human Readable Label', input:'file1.csv, file2.rds', output:'result.parquet, summary.internal'
Fields:
id(required): Unique ID, for node connectionslabel(required): Human-readable desc shown diagraminput: Comma-separated insoutput: Comma-separated outs.internalext: Marks in-memory vars (not persisted between scripts)node_type: Mermaid shape + class styling. Values:"input"— stadium shape([...])data srcs + config"output"— subroutine shape[[...]]generated artifacts"process"— rectangle[...]processing steps (default)"decision"— diamond{...}conditional logic"start"/"end"— stadium shape([...])entry/terminal
Example w/ node_type:
# put id:'config', label:'Load Config', node_type:'input', output:'config.internal'
# put id:'transform', label:'Apply Rules', node_type:'process', input:'config.internal', output:'result.rds'
# put id:'report', label:'Generate Report', node_type:'output', input:'result.rds'
Multiline syntax (complex):
# put id:'complex_step', \
# label:'Multi-line Label', \
# input:'data.csv, config.yaml', \
# output:'result.parquet'
Block comment syntax (//-prefix langs only: JS, TS, Go, Rust, C, C++, Java, etc.):
Langs w/ // line comments also support PUT in /* */ + /** */ blocks. Use * put as line prefix inside block body:
/* put id:'init', label:'Initialize Config', output:'config.internal' */
/**
* put id:'process', \
* label:'Process Records', \
* input:'config.internal, records.json', \
* output:'results.json'
*/
function processRecords(config, records) {
// ...
}
JSDoc annotations useful documenting workflow + API docs:
/**
* Transform raw sensor data into normalized readings.
* put id:'normalize', label:'Normalize Sensor Data', input:'raw_readings.json', output:'normalized.parquet'
*/
export function normalizeSensorData(readings: SensorReading[]): NormalizedData {
// ...
}
Note: Block comment annotations not supported for
#-prefix (R, Python, Shell) or---prefix (SQL, Lua). Line comments only those. Block-originated no backslash continuation across lines.
Cross-file data flow (connect scripts via file-based I/O):
# Script 1: extract.R
# put id:'extract', label:'Extract Data', output:'raw_data.internal, raw_data.rds'
data <- read.csv("source.csv")
saveRDS(data, "raw_data.rds")
# Script 2: transform.R
# put id:'transform', label:'Transform Data', input:'raw_data.rds', output:'clean_data.parquet'
data <- readRDS("raw_data.rds")
arrow::write_parquet(clean, "clean_data.parquet")
→ Annotations refined w/ accurate IDs, labels, I/O reflecting actual data flow.
If err: Unsure I/O → .internal ext for in-memory intermediates + explicit file names for persisted.
Step 4: Insert Annotations
Place at top of file or immediately above relevant code block.
Placement conventions:
- File-level: Top after shebang or header comment
- Block-level: Immediately above code block it describes
- Multi per file: Distinct workflow phases
Example in R:
#!/usr/bin/env Rscript
# ETL Extract Script
#
# put id:'read_source', label:'Read Source Data', input:'raw_data.csv', output:'df.internal'
df <- read.csv("raw_data.csv")
# put id:'clean_data', label:'Clean and Validate', input:'df.internal', output:'clean.rds'
df_clean <- df[complete.cases(df), ]
saveRDS(df_clean, "clean.rds")
Edit tool → insert into existing files no disturb surrounding.
→ Annotations inserted at appropriate locations per file.
If err: Break syntax highlighting → verify prefix correct for lang. PUT = std comments + should not affect exec.
Step 5: Validate
Run putior validation → syntax + connectivity.
# Scan annotated files
workflow <- put("./src/", validate = TRUE)
# Check for validation issues
print(workflow)
cat(sprintf("Total nodes: %d\n", nrow(workflow)))
# Verify connections by checking input/output overlap
inputs <- unlist(strsplit(workflow$input, ",\\s*"))
outputs <- unlist(strsplit(workflow$output, ",\\s*"))
connected <- intersect(inputs, outputs)
cat(sprintf("Connected data flows: %d\n", length(connected)))
# Generate diagram to visually inspect
cat(put_diagram(workflow, theme = "github", show_source_info = TRUE))
# Merge with auto-detected for maximum coverage
merged <- put_merge("./src/", merge_strategy = "supplement")
cat(put_diagram(merged, theme = "github"))
→ All annotations parse no err. Diagram shows connected workflow. put_merge() fills gaps from auto-detection.
If err: Common issues:
- Missing close quote:
id:'name→id:'name' - Double quotes inside:
id:"name"→id:'name' - Duplicate IDs across files: each
idmust be unique across entire scanned dir - Backslash continuation wrong line:
\must be last char before newline
Check
- Every annotated file has syntactically valid PUT annotations
-
put("./src/")returns df w/ expected node count - No duplicate
idvalues across scanned dir -
put_diagram()produces connected flowchart (not all isolated) - Multiline annotations (if used) parse correct w/ backslash continuation
-
.internalvars appear only outputs, never cross-file ins - Files excluded via
excludeno appear in workflow (e.g.,put("./src/", exclude = "test_")skips test helpers)
Traps
- Quote nesting: PUT uses single quotes:
id:'name'. Double quotes → parsing issues when annotation in string ctx. - Duplicate IDs: Every
idmust be globally unique within scanned scope. Naming:<script>_<step>(e.g.,extract_read,transform_clean). - .internal as cross-file in:
.internalexists only during script exec. Pass data between scripts → persisted file format (.rds,.csv,.parquet) as out of one + in of next. - Missing connections: Disconnected nodes → check out filenames in 1 annotation exactly match in filenames in another (including exts).
- Wrong prefix:
#in SQL or//in Python → annotation treated as code not comment. Always verifyget_comment_prefix(). - Forget multiline continuation: Every continued line must end
\+ next line must start w/ comment prefix. - Python triple-quote strings: putior no scan (
''' ''',""" """). Always#for Python PUT. - Meta-pipeline annotations: Annotate build script that also scans for annotations (e.g., script calling
put()+put_diagram()) → script's own annotations appear in generated diagram. Exclude file from scanning (seegenerate-workflow-diagramTraps) or no PUT in build script itself.
→
analyze-codebase-workflow— prereq: produces annotation plan this followsgenerate-workflow-diagram— next: generate final from annotationsinstall-putior— putior installed before annotatingconfigure-putior-mcp— MCP tools interactive annotation assistance
GitHub репозиторий
Похожие навыки
content-collections
МетаЭтот навык предоставляет проверенную в продакшене настройку для Content Collections — TypeScript-ориентированного инструмента, который преобразует файлы Markdown/MDX в типобезопасные коллекции данных с валидацией Zod. Используйте его при создании блогов, сайтов документации или контентных приложений на Vite + React для обеспечения типобезопасности и автоматической проверки содержимого. Он охватывает всё: от настройки плагина Vite и компиляции MDX до оптимизации развертывания и валидации схем.
polymarket
МетаЭтот навык позволяет разработчикам создавать приложения на платформе прогнозных рынков Polymarket, включая интеграцию с API для торговли и получения рыночных данных. Он также обеспечивает потоковую передачу данных в реальном времени через WebSocket для отслеживания текущих сделок и рыночной активности. Используйте его для реализации торговых стратегий или создания инструментов, обрабатывающих обновления рынка в реальном времени.
creating-opencode-plugins
МетаЭтот навык помогает разработчикам создавать плагины OpenCode, которые подключаются к более чем 25 типам событий, таким как команды, файлы и операции LSP. Он предоставляет структуру плагина, спецификации API событий и шаблоны реализации для модулей на JavaScript/TypeScript. Используйте его, когда вам нужно перехватывать, отслеживать или расширять жизненный цикл ассистента OpenCode AI с помощью пользовательской событийно-ориентированной логики.
sglang
МетаSGLang — это высокопроизводительный фреймворк для обслуживания больших языковых моделей (LLM), специализирующийся на быстрой структурированной генерации JSON, regex и рабочих процессов агентов с использованием кэширования префиксов RadixAttention. Он обеспечивает значительно более высокую скорость вывода, особенно для задач с повторяющимися префиксами, что делает его идеальным для сложных структурированных результатов и многократных диалогов. Выбирайте SGLang вместо альтернатив, таких как vLLM, когда вам требуется ограниченное декодирование или вы создаете приложения с интенсивным совместным использованием префиксов.
