Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
git clone --depth 1 https://github.com/mariorojasmz/apolo-cadWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/commands/mariorojasmz/apolo-cad/claude)<a href="https://agentmods.dev/commands/mariorojasmz/apolo-cad/claude"><img src="https://agentmods.dev/badge/commands/mariorojasmz/apolo-cad/claude/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/commands/mariorojasmz/apolo-cad/claude"><img src="https://agentmods.dev/badge/commands/mariorojasmz/apolo-cad/claude.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00000 | $0.06191 |
| Opus 5.5 | $0.00000 | $0.02476 |
| Sonnet 5.5 | $0.00000 | $0.01238 |
| Haiku 4.5 | $0.00000 | $0.00619 |
Grade A, and why
CLAUDE scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured today.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 238 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Comandos (core/apolo/commands/)
El registro schema-driven: models.py (fachada de los params pydantic = schema de UI, diálogos
y tools del agente; viven en models_*.py por familia), escena.py (Feature, DEFINITIONS,
_require/_instanced…: la capa de abajo), exec_*.py (executors por familia), registry.py
(el shim, el REGISTRY, el despacho y los schemas), spec.py (CommandSpec + run_executor, el
despacho), state.py (RegenState, el estado con nombre que execute_command muta y el
regenerate guarda como checkpoint; ExecContext, lo que recibe un executor), strict.py (la
entrada estricta de params), errors.py (CommandError) y expressions.py (motor de =expr). Lo transversal (locks, log, regenerate, cirugía de modelos) está en el
CLAUDE.md raíz; lo común del backend, en core/apolo.
Al agregar o cambiar un comando
- Todo executor es
_exec_x(ctx: ExecContext, cmd_id, p):ctx.scene,ctx.joints,ctx.fasteners… son los dicts VIVOS (se mutan en sitio),ctx.attachmentslos adjuntos yctx.resolved_variables()las variables evaluadas. Ningún flag elige la firma (lo exigetests/test_despacho_unico.py): si un comando necesita más contexto, es una propiedad deExecContext, no un flag ni una rama en el despacho. plan - Params estrictos (
strict.py): la ENTRADA de un cliente (las cuatro puertas deDocument; también elpreviewcon que el chat ensaya sus propuestas) rechaza la clave que el modelo no declara, con su ruta, las válidas y «¿quisiste decir…?»; el REPLAY la ignora (extra="ignore"explícito) y un edit sólo rechaza las que el cliente INTRODUCE (la UI reenvía los params guardados). Los modelos NO fijanextra: cambiaría el JSON Schema publicado. Quitar o renombrar un campo exige upcaster; un campo nuevo entra con un default que reproduce lo anterior (trinquete D12:tests/test_contrato_comandos.py); si lo NUEVO debe nacer con otro valor, el sello de entrada (CommandSpec.al_crear) se lo pone sólo al comando que nace (join_bolted.criterio,create_belt_conveyor.cierres). models.pyes FACHADA (partir-nucleo-congelado F2): los params viven por familia —models_base(Vec3,Rot3,_floor_to_int, listas de catálogo),models_basicos(primitivas, patrones, colocación,set_variable),models_maquinas(conveyor, weldment, frame, script, brazo),models_chapa,models_modificar(caras, taladro, circular, espejo, ebanistería),models_croquis(croquis, barrido, loft, superficies) ymodels_ensamblaje(juntas, mates, restricciones, grupos,insert_project, ground)— y la fachada sólo re-exporta por IDENTIDAD, para siempre (tests/test_rutas_viejas.py, lista cerrada). Un modelo nuevo va a su familia (o a unmodels_<tema>.pynuevo, comomodels_rodillos.py) y se re-exporta en la fachada; una familia importaVec3/Rot3de.models_base, nunca de.models(ciclo).registry.pyse partió igual (mismo plan, F3 y F4): capasescena←exec_*←registry.escena(Feature,DEFINITIONS,_require,_instanced,_orient_axis,_resolve_sel),exec_basicos(primitivas, booleana, patrones, espejo, borrar, duplicar,set_variable),exec_colocacion(_world_move/_world_place, transform, center_in, distribute, attach, snap_to,_planar_face_frame),exec_modificar(caras, fillet/chamfer/shell,_drill_tool, drill_hole, add_joinery),exec_croquis(sketch_*, barrido, loft, superficies, thicken, revolve, extrude_poly, import_step),exec_ensamblaje(_register_joint,_joint_drag, juntas, mates, restricciones, ground, grupos,_transform_point/_transform_dir, transform_group),exec_insertar(insert_projecty su precheck) yexec_biblioteca(run_script, brazo, conveyor +_publish_axis_anchor, weldment/frame +_emit_weldment_parts, chapa). Unexec_*puede importar de otroexec_*(sin ciclos) pero nunca deregistry(params de la fachada.models).registry.pysólo DEFINEREGISTRY,_validate_model,validate_params,execute_command,_schema_entryycommand_schemas(lo exigetests/test_rutas_viejas.py): un executor nuevo va a suexec_*y aquí sólo se importa.registryre-exporta cada nombre movido por IDENTIDAD, para siempre (lista cerrada entests/test_rutas_viejas.py; los blobs viejos de la caché nombranapolo.commands.registry.Feature).execute_command/validate_paramsse quedan enregistryyexecute_commandleerun_executor(despec) por el móduloregistry: los tests parcheanregistry_mod.run_executor. Mover un executor byte a byte deja su huella igual: nunca se actualizaVERSIONESpor un corte.- Los imports perezosos
from .registry import …DENTRO de executors ajenos (cilindro.py,exec_faja.py,tablero.py…) no se tocan: son parte de su huella D11. - La
descriptiondel modelo es para el AGENTE (larga a propósito, con nombres de params); la persona lee la PISTA depistas.py(vista?vista=persona,vista_persona.py): un comando nuevo sin pista rompetests/test_pistas.py(ui). Un super-comando reutilizable documenta ahí su MONTAJE (orientación, tensado, soldadura), no sólo qué es. - Versión del executor (
CommandSpec.version): si cambia la geometría que produce con los MISMOS params, sube SUversion(entra a la firma del regenerate sólo si es ≠ 1 → invalida la caché sólo de los proyectos que lo usan); si cambiaste un helper compartido, la de cada comando que lo usa; lo que no puedes acotar (kernel, builders, catálogo,Feature) es bump deGEOM_CACHE_EPOCH(regla completa en la raíz). Un comando que reproduce OTROS executors va concomposite=True(hoyinsert_project). El trinquete D11 (tests/test_contrato_comandos.py) guarda versión + huella del código de cada executor: si el código cambia y la versión no, falla y obliga a decidir (subirla, o sólo la huella si fue un refactor). La lógica de los dos trinquetes vive enapolo/contrato_comandos.py(viaja en la wheel; el test sólo guardaCAMPOS/VERSIONES). Un comando de EXTENSIÓN («x.algo», kindscene/vars) sigue la misma regla, con esas funciones; una ref de su catálogo suma elepoch_catalogosólo a la firma de quien la nombra en sus params (spec.REFS_DE_EXTENSION; un compuesto, todas). plan (A4) - Errores de OCCT accionables: fillet/chamfer nombran la arista más corta seleccionada;
shellpre-valida2·espesor ≥ dimensión menorantes de OCCT (condición necesaria, sin falsos positivos). No blindar geometría fina (radio vs caras vecinas): eltry/exceptde OCCT es la red. V6.1
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- today Changed · +20 lines a190ce13e587
- yesterday Changed · +4 lines 5b3b126476bb
- 2d ago Changed · +56 lines ac75e407c133
- 4d ago Changed · +3 lines 9dbf5715ff82
- 5d ago Changed · +27 lines ce2b54fe417d
- 7d ago Changed · +15 lines b96a8b24b4d0
- 8d ago Changed · +7 lines 447c89d3792f
- 16d ago Changed · +5 lines 93b0689f8980
- 18d ago Changed · +5 lines 7b1fe34e5c2e
- 22d ago First seen · 96 lines · 0 tokens per session scan A 7e53bae85706
CLAUDE is a command published in the GitHub repository mariorojasmz/apolo-cad (3 stars, last pushed today), licensed MIT. It costs nothing until one of its globs matches a file; then it loads 6,191 tokens. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-10-06.
Other commands, from other repositories
checklist
Generate a custom checklist for the current feature based on user requirements.
clarify
Identify underspecified areas in the current feature spec by asking up to 5 highly targeted clarification questions and encoding answers back into the spec.
specify
Create or update the feature specification from a natural language feature description.
converge
Assess the current codebase against the feature's spec, plan, and tasks, then append any remaining unbuilt work as new tasks to tasks.md so implement can complete it.
speckit.bug.fix
Apply the remediation from a bug assessment and record what was changed.
speckit.bug.test
Validate that a previously fixed bug is resolved and record the verification report.