v3.1.0
Added
- Retention classes and per-repo profiles — the always-on skill index is no longer all-or-nothing. An installed module's description is re-sent on every turn while its body is free until invoked, so installing a module carries a standing token cost. Modules now derive a retention class (
must/profile/resolver, overridable per module via frontmatter) and a profile list, letting an install keep the 12 must-have workflows resident and route the specialist catalog behind a generated100x-resolverartifact that lists each module with an exact path to read. Measured on this repo: the Claude Code index drops 4,900 → 1,732 tokens per turn (profile) or 554 (must); a slimmed Cursor project drops 7,249 → 2,189.
Both switches default to off. With no project config and no environment override,emit-cursor,emit-codex, andemit-claude-codeproduce byte-identical output to the previous release — verified by diffing the pre-change and post-change emitters over the same module tree. 100xprism slim— writes the two reversible switches (~/.100xprism/config.jsonskills,<project>/.100xprism.jsonprofiles), re-emits, and reports oversized instruction files. Supports--dry-run,--all-projects, and--skills=all|profile|must. The firstupdateafter this version appliesprofilemode once, announces it, and records the choice so no later update overrides a preference you set;update --no-slimskips it.detect-profilessubcommand onadapters/lib/modules.py, classifying a repo from its build/infra/content markers.
Changed
- Project config moves to
.claude/100xprism.yml.CLAUDE.mdis re-sent on every turn, so machine-readable db/cloud/production/security-exception config no longer belongs there./db,/query,/gate,/cloud-security, and/launchread the new file first and fall back to the instruction file, so repos that keep config inCLAUDE.mdare unaffected. Keys must stay flush-left — those modules match them with an anchoredgrep. - The scaffolded
CLAUDE.mdis now a router. Project Overview / Key Conventions / a "Reference docs (read on demand)" table, replacing ~350 tokens of commented-out placeholders that in practice were never filled in. Existing files are never rewritten. commit,push, andbranchre-tieredcore→on-demand. Cursor loads the full body of analwaysApply: truerule, and all three are explicitly invoked; thegate-on-commitPreToolUse hook already blocksgit commit/git pushdeterministically, so prompt residency was redundant with machine enforcement.gatestays resident. This lands ~3,700 tokens per turn for every Cursor user with no opt-in.
Fixed
- The Windows emitter wrote a slash-command alias for every command, diverging from the Python path, which skips aliases whose name matches the slug. Claude Code already exposes every skill as
/<slug>, so a same-name alias double-listed the module and paid its description twice. The two paths now agree, and a parity test compares them across every real module. meta-checkconflated "modules declaring a slash command" (27) with "alias files actually emitted" (5), so the documented count inAGENTS.mdcould never be correct. It now computes and validates both, and rejects an unknownretention:value.- Corrected a stale GitHub URL in
.env.exampleandtemplates/.env.example, an out-of-date auto-trigger skill count and category table inREADME.md, and a real project name used as illustrative sample data in a design spec. - The Windows/Python profile resolvers diverged on an empty
"profiles": []. Python'sif not cfgtreats an empty array as unset (unfiltered); the JS port'sif (!cfg)doesn't, since an empty array is truthy — silently activating filtering on the Windows path. Fixed, with a parity test covering the case directly. - GCP cloud-project detection (
gate,cloud-security) was case-sensitive, missing the lowercasegcp_project:key the new.claude/100xprism.ymlscaffold documents and writes. Both greps are now case-insensitive.
Install / upgrade:
# New install
bash -c "$(curl -fsSL https://raw.githubusercontent.com/rajitsaha/100xprism/main/install.sh)"
# Existing users
~/100xprism/update.sh