Agent skill

Aspens Multi-Target Output

by aspenkit in aspenkit/aspens

Explains how the aspens generator routes output to Claude Code or Codex CLI targets and transforms generated skills and instruction files between their formats.

MITAuto-check passedAgent Workflows

Install Aspens Multi-Target Output

skills CLI
$ npx skills add aspenkit/aspens --skill codex-support -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install aspenkit/aspens codex-support --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/aspenkit/aspens.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/codex-support .claude/skills/codex-support && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
codex-support
GitHub stars
102
Token cost
~1.9k tokens
SKILL.md length
788 words
Files
1
Skills in repo
12
Repo updated
First seen
Licence
MIT

At a glance

Explains how the aspens generator routes output to Claude Code or Codex CLI targets and transforms generated skills and instruction files between their formats.

  • Changing how aspens generates output for the Codex CLI target
  • SKILL.md covers Key Concepts, Critical Rules and References
  • Calls claude and codex
  • Adding a new output target alongside Claude and Codex

What it does

This skill gives an agent the context needed to work on the multi-target output code in the aspens project, which generates documentation for Claude Code, Codex CLI or both. It separates a target, meaning where output goes (.claude/skills/ for Claude, .agents/skills/ plus directory-scoped AGENTS.md files for Codex), from a backend, meaning which LLM CLI generates the content (claude -p or codex exec).

Each target definition carries paths and capability flags such as supportsHooks, supportsSettings, supportsGraph, supportsSkills and supportsMCP, and Codex adds a 32 KiB limit on instructions and a user skills directory. Generation always produces Claude's format first, and transforms such as transformForTarget() run afterwards to remap paths and content for other targets. Sanitize functions strip Claude-specific references from Codex output, and the root instructions file always lists every skill found on disk.

When your agent uses it

  • Changing how aspens generates output for the Codex CLI target
  • Adding a new output target alongside Claude and Codex
  • Debugging path remapping or content transforms between target formats

Example prompts

  • “Add a new target to aspens with its own skills directory and capability flags.”
  • “Why does the Codex output leave the code map out of the root AGENTS.md?”
  • “Fix transformForTarget so domain skills also appear in the source directory's AGENTS.md.”

Requirements

  • A checkout of the aspens repository

What it can do on your machine

Read from SKILL.md and the folder at commit 8dde826. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • claude
    • codex

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Aspens Multi-Target Output loads about 1.9k tokens when it runs. Until then it costs about 33 tokens; SKILL.md has 788 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~33
When it runs · the whole SKILL.md, loaded when a task matches
~1.9k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from aspenkit/aspens at commit 8dde826, republished under its MIT licence (© aspenkit). 788 words, ~1,916 tokens.

Download SKILL.mdSave it as .claude/skills/codex-support/SKILL.md (or your agent's skills folder).
name
codex-support
description
Multi-target output system — target abstraction, backend routing, content transforms for Codex CLI and future targets
triggers.files
src/lib/target.js, src/lib/target-transform.js, src/lib/backend.js, AGENTS.md, .aspens.json
triggers.keywords
codex, target, backend, AGENTS.md, .aspens.json, sanitize, transform, multi-target, parity

You are working on multi-target output support — the system that lets aspens generate documentation for Claude Code, Codex CLI, or both simultaneously.

Key Concepts

  • Target vs Backend: Target = where output goes (claude → .claude/skills/, codex → .agents/skills/ + directory-scoped AGENTS.md). Backend = which LLM CLI generates the content (claude -p or codex exec).
  • Target definitions: TARGETS.claude (centralized) and TARGETS.codex (directory-scoped). Each defines paths and capability flags: supportsHooks, supportsSettings, supportsGraph, supportsSkills, needsActivationSection, needsCodeMapEmbed, supportsMCP. Codex also has maxInstructionsBytes (32 KiB) and userSkillsDir. Codex's needsCodeMapEmbed is false — condensed cluster/framework data goes into the synthetic .agents/skills/architecture/ skill instead of the root AGENTS.md.
  • Canonical generation: Generation always produces Claude-canonical format first. Prompts always receive CANONICAL_VARS (hardcoded Claude paths from doc-init.js). Transforms run after generation to produce other target formats.
  • Content transform: transformForTarget() remaps paths and content. For Codex: base skill → root AGENTS.md, domain skills → both .agents/skills/{domain}/SKILL.md and source directory AGENTS.md. generateCodexSkillReferences() creates .agents/skills/architecture/ with code-map data.
  • Skills section completeness: collectSkillsForList() (internal) reads every skill from disk under sourceTarget.skillsDir and overlays pending in-flight changes (files passed to the transform) so the root instructions file's ## Skills section always lists every on-disk skill — not just the subset that changed in this sync. Pending changes win for descriptions; on-disk content survives for unchanged skills.
  • Instructions file disk fallback: transformToDirectoryScoped loads instructionsFile from disk via repoPath context parameter when it's not in the canonical files array (e.g., during doc init --strategy skip-existing or incremental doc sync). Uses a single readFileSync from fs wrapped in try/catch (no separate existsSync check).
  • Content sanitization: sanitizeCodexInstructions() and sanitizeCodexSkill() strip Claude-specific references (hooks, skill-rules.json, Claude Code mentions) from Codex output.
  • sanitizePublishedContent(content, filePath) — Single-chokepoint sanitizer invoked by skill-writer.js on every disk write. Always strips ## Activation blocks and ## Key Files blocks. Outside code-map.md, also strips count-bearing blocks: **Hub files…**, **Domain clusters:**, **High-churn hotspots:**, **Framework entry points…**. Defense in depth — upstream leaks can't reach the user.
  • Skills-variant stripping: syncSkillsSection() removes LLM-emitted Skill-section variants (## Skills Reference, ## Skills Overview, etc.) before injecting the canonical ## Skills list. Doc-init and doc-sync prompts also forbid such headings.
  • ensureRootKeyFilesSection(content, graphSerialized) — Post-processes root instructions file to guarantee a ## Key Files section with top hub files from the graph.
  • mergeConfiguredTargets(existing, next) — Merges target arrays to avoid dropping previously configured targets during narrower runs. Validates against TARGETS keys, deduplicates.
  • getAllowedPaths(targets) — Returns { dirPrefixes, exactFiles } union across all active targets.
  • Backend detection: detectAvailableBackends() checks if claude and codex CLIs are installed. resolveBackend() picks best match: explicit flag > target match > fallback.
  • Config persistence: .aspens.json at repo root stores { targets, backend, version, saveTokens? }. readConfig() returns null if missing or if the config is structurally invalid. isValidConfig() validates targets, backend, version, and saveTokens (via isValidSaveTokensConfig()).
  • loadConfig(repoPath, { persist }) — Reads .aspens.json and, if missing, recovers via inferConfig() from on-disk artifacts. Returns { config, recovered }. Persists inferred config to disk by default unless persist: false is passed.
  • Feature config (saveTokens): Optional object in .aspens.json validated by isValidSaveTokensConfig() — checks enabled (boolean), warnAtTokens/compactAtTokens (positive integers, compact > warn unless either is MAX_SAFE_INTEGER), saveHandoff/sessionRotation (booleans), optional claude/codex sub-objects with enabled and mode.
  • writeConfig preserves feature config: writeConfig() reads existing config and merges — saveTokens preserved unless explicitly set to null (intentional removal) or undefined (keep existing). Targets and backend also merge with existing.
  • Multi-target publish: doc-sync uses publishFilesForTargets() to generate output for all configured targets from a single LLM run. repoPath is passed through to the transform context.
  • Codex inference tightened: inferConfig() only adds 'codex' to inferred targets when .codex/ config dir or .agents/skills/ dir exists.
  • Conditional architecture ref: Codex buildCodexSkillRefs() only includes the architecture skill reference when a graph was actually serialized.
  • Architecture skill is codex-only synthetic: The codex architecture skill is generated from graph data and has no Claude counterpart by design. logicalKeyForFile() returns null for codex architecture paths so assertTargetParity() won't raise a parity violation for the missing Claude side.
Show full SKILL.md (169 more words)Show less

Critical Rules

  • Generation always targets Claude canonical format first — transforms run after, never during. Prompts always receive CANONICAL_VARS.
  • Split write logic: writeSkillFiles() handles direct-write files. writeTransformedFiles() handles directory-scoped AGENTS.md with an explicit path allowlist and warn-and-skip policy. Both writers run their payloads through sanitizePublishedContent before touching disk.
  • Path safety: validateTransformedFiles() rejects absolute paths, traversal, and unexpected filenames. writeTransformedFiles() enforces the same checks.
  • Codex-only restrictions: add agent/command/hook and customize agents throw CliError for Codex-only repos. add skill works for both targets.
  • Graph/hooks are Claude-only — persistGraphArtifacts() returns data without writing files when target.supportsGraph === false. Hook installation skipped when supportsHooks === false.
  • Config validation is defensive — readConfig() treats malformed but parseable JSON (e.g., wrong types for targets/backend/version/saveTokens) as invalid and returns null, same as missing config.
  • repoPath context is required for disk fallback — callers of transformForTarget must pass repoPath in the context object for instructionsFile to load from disk when not in canonical files, and for collectSkillsForList to enumerate on-disk skills.

References

  • Patterns: See src/lib/target.js for all target property definitions

Last Updated: 2026-05-11

© aspenkit, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .agents/skills/codex-support of aspenkit/aspens.

Open the folder on GitHubat commit 8dde826

Compare with similar skills

Aspens Multi-Target Output next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Aspens Multi-Target Output compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Aspens Multi-Target Output this skillaspenkit/aspens102—~1.9kAutomated safety check: PassMIT
Context Routing Auditwithkynam/vibecode-pro-max-kit1.1k—~1.2kAutomated safety check: PassMIT
Using Agent Skillsaddyosmani/agent-skills102k4 repos~2.4kAutomated safety check: PassMIT
Task Observerrebelytics/one-skill-to-rule-them-all3.2k1 repos~12kAutomated safety check: PassCC-BY-4.0
Rules Distillationaffaan-m/ECC274k2 repos~2.3kAutomated safety check: PassMIT
Birdview Skills Compatibility AuditQiuner/birdview715—~794Automated safety check: PassMIT

Similar skills

  • Context Routing Audit

    withkynam/vibecode-pro-max-kit

    Audits a project's context routing, skill discoverability and skill wiring by running a chain of validator scripts and fixing whatever they report.

    1.1k GitHub stars~1.2k tokensUpdated 3 mo ago
    Agent WorkflowsAuto-check passed
  • Using Agent Skills

    addyosmani/agent-skills

    Meta-skill for choosing which workflow skill fits the task at hand, plus always-on habits: surface assumptions, stop on confusion, push back, keep it simple and stay in scope.

    102k GitHub starsUsed in 4 repos~2.4k tokens
    Agent WorkflowsAuto-check passed
  • Task Observer

    rebelytics/one-skill-to-rule-them-all

    Monitors task execution for skill improvement opportunities.

    3.2k GitHub starsUsed in 1 repo~12k tokens
    Agent WorkflowsAuto-check passed
  • Rules Distillation

    affaan-m/ECC

    Scans installed skills for principles that recur across them and proposes rule-file changes: append, revise, add a section, create a file or leave as covered.

    274k GitHub starsUsed in 2 repos~2.3k tokens
    Agent WorkflowsAuto-check passed
  • Audits the AI skills installed for a project for duplicate names, broad triggers and conflicting instructions, without changing any of them.

    715 GitHub stars~794 tokensUpdated 5 days ago
    Agent WorkflowsAuto-check passed
  • Mistral Vibe CLI Reference

    mistralai/mistral-vibe

    Official

    Reference for Mistral Vibe, the CLI agent it runs inside: config files, env vars, agents, skills, tools, hooks and MCP servers, so the agent can explain and troubleshoot its own setup.

    5.1k GitHub stars~14k tokensUpdated yesterday
    Agent WorkflowsAuto-check: notes

More from aspenkit/aspens

All 12 skills in this repo
  • Injects a project's own skills and AGENTS.md content into generic bundled agent template files, adding a tech-stack line and real conventions without touching an agent's core logic.

    102 GitHub stars~898 tokensUpdated 25 days ago
    Auto-check passed
  • Orientation to the aspens codebase for agents working on the CLI itself: its Node.js stack, commands, module layout and debug settings.

    102 GitHub stars~1.6k tokensUpdated 25 days ago
    Auto-check passed
  • Aspens CLI Shell

    aspenkit/aspens

    Project context for the aspens CLI entry point: Commander wiring, the welcome screen, missing-hook warnings, CliError exit handling and the public programmatic exports.

    102 GitHub stars~1.1k tokensUpdated 25 days ago
    Auto-check passed
  • Doc Impact

    aspenkit/aspens

    Context health analysis — freshness, domain coverage, hub surfacing, drift detection, LLM-powered interpretation, and auto-repair for generated agent context

    102 GitHub stars~1.3k tokensUpdated 25 days ago
    Auto-check passed
  • Doc Sync

    aspenkit/aspens

    Incremental skill updater that maps git diffs to affected skills and optionally auto-syncs via a post-commit hook

    102 GitHub stars~1.8k tokensUpdated 25 days ago
    Auto-check passed
  • Import Graph

    aspenkit/aspens

    Static import analysis that builds dependency graphs, domain clusters, hub files, git churn hotspots, and file priority rankings

    102 GitHub stars~1.1k tokensUpdated 25 days ago
    Auto-check passed

Questions about Aspens Multi-Target Output

What does Aspens Multi-Target Output do?

Explains how the aspens generator routes output to Claude Code or Codex CLI targets and transforms generated skills and instruction files between their formats. This skill gives an agent the context needed to work on the multi-target output code in the aspens project, which generates documentation for Claude Code, Codex CLI or both.md files for Codex), from a backend, meaning which LLM CLI generates the content (claude -p or codex exec).

When should I use Aspens Multi-Target Output?

Aspens Multi-Target Output fits situations like: changing how aspens generates output for the Codex CLI target; adding a new output target alongside Claude and Codex; debugging path remapping or content transforms between target formats.

How do I install Aspens Multi-Target Output in Claude Code?

Run `npx skills add aspenkit/aspens --skill codex-support -a claude-code`. Or copy the skill folder (.agents/skills/codex-support in aspenkit/aspens) into .claude/skills/codex-support in your project. Claude Code loads it when a task matches its description.

How do I install Aspens Multi-Target Output in Codex?

Run `npx skills add aspenkit/aspens --skill codex-support -a codex`. Or copy the skill folder (.agents/skills/codex-support in aspenkit/aspens) into .agents/skills/codex-support in your project. Codex loads it when a task matches its description.

Can I use Aspens Multi-Target Output in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add aspenkit/aspens --skill codex-support -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/codex-support, .gemini/skills/codex-support, .github/skills/codex-support and .opencode/skills/codex-support in your project.

What does Aspens Multi-Target Output need to run?

Going by SKILL.md and its folder, Aspens Multi-Target Output needs the command-line tools its instructions call (claude and codex). Our summary lists: A checkout of the aspens repository.

Does Aspens Multi-Target Output access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Aspens Multi-Target Output safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Aspens Multi-Target Output use?

Aspens Multi-Target Output is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Aspens Multi-Target Output use?

About 1.9k tokens (SKILL.md is roughly 7.7k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Aspens Multi-Target Output?

Skills that share tags, products or a category with Aspens Multi-Target Output: Context Routing Audit (withkynam/vibecode-pro-max-kit, 1.1k stars), Using Agent Skills (addyosmani/agent-skills, 102k stars), Task Observer (rebelytics/one-skill-to-rule-them-all, 3.2k stars) and Rules Distillation (affaan-m/ECC, 274k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Aspens Multi-Target Output?

aspenkit (a GitHub organization) maintains it in aspenkit/aspens, which has 102 GitHub stars. The repository holds 12 skills in this directory. The repository was last updated on September 12, 2026.

Source: aspenkit/aspens on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.