视觉画布设计
canvas-design
基于设计原则创作静态视觉作品,用于海报与品牌图形。
annotate-source-files【文档与办公】Add PUT workflow annotations to source files using the correct language-specific comment prefix. Covers annotation syntax, skeleton generation via put_generate(), multiline annotations, .internal variables, and validation. Supports 30+ languages with automatic comment prefix detection. Use after analyzing a codebase and having an annotation plan, whe…
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
Add PUT workflow annotations → putior extracts structured workflow data + generates Mermaid diagrams.
analyze-codebase-workflow + annotation planput_generate() skeletons? (default: yes)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.
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.
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.internal ext: 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/terminalExample 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.
Place at top of file or immediately above relevant code block.
Placement conventions:
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.
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:
id:'name → id:'name'id:"name" → id:'name'id must be unique across entire scanned dir\ must be last char before newlineput("./src/") returns df w/ expected node countid values across scanned dirput_diagram() produces connected flowchart (not all isolated).internal vars appear only outputs, never cross-file insexclude no appear in workflow (e.g., put("./src/", exclude = "test_") skips test helpers)id:'name'. Double quotes → parsing issues when annotation in string ctx.id must be globally unique within scanned scope. Naming: <script>_<step> (e.g., extract_read, transform_clean)..internal exists only during script exec. Pass data between scripts → persisted file format (.rds, .csv, .parquet) as out of one + in of next.# in SQL or // in Python → annotation treated as code not comment. Always verify get_comment_prefix().\ + next line must start w/ comment prefix.''' ''', """ """). Always # for Python PUT.put() + put_diagram()) → script's own annotations appear in generated diagram. Exclude file from scanning (see generate-workflow-diagram Traps) 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