Releases: rajitsaha/100xprism
Releases · rajitsaha/100xprism
Release list
v3.3.0
Added
- Hermes/OpenClaw adapter — first-class support for the Hermes Agent desktop app and OpenClaw framework. 68 modules emit native
~/.hermes/skills/100xprism/<slug>/SKILL.mdconfig with a strict ≤57-char description budget (enforced byhermes_description()guard, with frontmatter override). Auto-detected on install/update, never touches machines without Hermes. Mirrors the Claude Code adapter's reconciliation pattern: manifest-guarded add/update/prune,PRISM_SKILLS/slimsupport, resolver catalog for on-demand loading, user-skill isolation (only100xprism/category managed). New100xprism hermesCLI subcommand for manual sync.
Changed
AGENTS.md/README.mdupdated: module must now work across all 5 adapters (Claude Code · Cursor · Codex · Pi · Hermes/OpenClaw).- Documentation site (
gh-pages): title/meta/JSON-LD/FAQ/emit-support table all list Hermes/OpenClaw as the 5th supported tool; token-observability table honestly marked "not yet supported" for Hermes.
Added
100xprism pack— external skill packs, ownership-tracked install/remove/sync for Claude Code, with a pack registry, schema validation, and a detection engine (Databricks is the first pack). Prefers the upstream vendor CLI where one exists and falls back to per-platform installers otherwise. Pack sync and detection are wired intoinstall,update, anduninstall. (#103)- Lean cross-tool token observability. Lean must-have defaults with on-demand resolver routing across Claude Code, Cursor, Codex, and Pi; honest cross-tool token reporting with
exact/best-effort/activity-onlymeasurement labels instead of a single unqualified number. (#104) auditandoptimizesubcommands, context-footprint budgets, and managed-only cleanup for plugins and hooks. (#104)- Pi package support, cache accounting, independent reviewer enforcement, and fail-closed security hooks. (#104)
Fixed
- Ownership state is tracked as an obligation set, not a ranked status. A pack's installed components (commands, plugins, platform artifacts) are independent obligations — each can be owned, partially owned, or already removed — rather than a single linear status that could silently regress or resurrect completed removals. Removal is now driven from ownership, not from a status label, so
uninstallnever discards removal state or re-issues a command that was already cleaned up. (#103) - Nested
ownedshapes (owned.plugins, per-platform values) are validated on both the JS (uninstall.js) and Python (packs.py) removal paths, including sparse/legacy state written by older installs. (#103) - Obligations render as human-readable text in user-facing output instead of a raw Python list
repr. (#103)
Install / upgrade:
# New install
bash -c "$(curl -fsSL https://raw.githubusercontent.com/rajitsaha/100xprism/main/install.sh)"
# Existing users
~/100xprism/update.shv3.2.0
Added
100xprism pack— external skill packs, ownership-tracked install/remove/sync for Claude Code, with a pack registry, schema validation, and a detection engine (Databricks is the first pack). Prefers the upstream vendor CLI where one exists and falls back to per-platform installers otherwise. Pack sync and detection are wired intoinstall,update, anduninstall. (#103)- Lean cross-tool token observability. Lean must-have defaults with on-demand resolver routing across Claude Code, Cursor, Codex, and Pi; honest cross-tool token reporting with
exact/best-effort/activity-onlymeasurement labels instead of a single unqualified number. (#104) auditandoptimizesubcommands, context-footprint budgets, and managed-only cleanup for plugins and hooks. (#104)- Pi package support, cache accounting, independent reviewer enforcement, and fail-closed security hooks. (#104)
Fixed
- Ownership state is tracked as an obligation set, not a ranked status. A pack's installed components (commands, plugins, platform artifacts) are independent obligations — each can be owned, partially owned, or already removed — rather than a single linear status that could silently regress or resurrect completed removals. Removal is now driven from ownership, not from a status label, so
uninstallnever discards removal state or re-issues a command that was already cleaned up. (#103) - Nested
ownedshapes (owned.plugins, per-platform values) are validated on both the JS (uninstall.js) and Python (packs.py) removal paths, including sparse/legacy state written by older installs. (#103) - Obligations render as human-readable text in user-facing output instead of a raw Python list
repr. (#103)
Install / upgrade:
# New install
bash -c "$(curl -fsSL https://raw.githubusercontent.com/rajitsaha/100xprism/main/install.sh)"
# Existing users
~/100xprism/update.shv3.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.shv3.0.1
Fixed
- CI never ran on PRs stacked against a non-main base.
.github/workflows/meta.yml'spull_requesttrigger was scoped tobranches: [main, master], which filters on the PR's base, not its source — so a PR opened against another feature branch got zero CI until manually retargeted. The filter is dropped; it now fires regardless of base branch. - pair-loop: a same-model reviewer approval could pass silently (#93). Independence was configured (a fallback model pin, vendor rotation) but never verified — a same-vendor fallback left unpinned, or a plain
coder == reviewermisconfiguration, could approve a change on the exact model that wrote it.reviewnow resolves the coder's and the reviewer's session transcripts to the model each actually ran and refuses anAPPROVEDverdict when they match, adding aprocessfinding and surfacing it in the PR summary. Still best-effort — it needs both session_ids to resolve, which isn't guaranteed (no session lookup for Cursor yet).
Changed
- Cursor's always-on context footprint cut 61% (~52K → ~20K chars). Re-tiered 9 modules —
release,pair-loop,pr,fix-bugs,lint,orchestrate,spec,grill-me,update-claude-md— fromcoretoon-demand.tieronly drives Cursor'salwaysApplymapping; this has no effect on Claude Code, Codex, or slash-command availability, and no content changed. Keptcore:commit,push,gate(the enforcement trio), andbranch. - Refreshed stale Claude model version strings (Sonnet 4.6 → Sonnet 5, Opus 4.8 → Opus 5) across
adapters/lib/modules.py'sMODEL_ALIASES, thecommit/releaseskill Co-Authored-By trailers, and docs.
Install / upgrade:
# New install
bash -c "$(curl -fsSL https://raw.githubusercontent.com/rajitsaha/100xprism/main/install.sh)"
# Existing users
~/100xprism/update.shv3.0.0
Removed
- BREAKING: Windsurf, Copilot, Gemini, and Antigravity are no longer supported. These four tools consumed a single concatenated instruction file produced by
emit-concat: all 13tier: coremodule bodies inlined, plus a one-line index of the rest — 60,164 characters (~15K tokens) resident in context on every turn, regardless of what the user was doing. That is the opposite of progressive disclosure, and it made those four the most expensive surfaces the project shipped while giving them the least capability (no auto-trigger for on-demand modules). Claude Code, Cursor, and Codex all load bodies on demand and are unaffected.
Removed:adapters/windsurf.sh,adapters/gemini.sh,adapters/copilot.sh,adapters/antigravity.sh, theemit-concatsubcommand,render_concat,render_index_only, and the_run_concat/_run_generateshell helpers.
Migration is automatic, and reversible.100xprism updateprunes.windsurfrules,GEMINI.md,ANTIGRAVITY.md, and.github/copilot-instructions.mdfrom every project in~/.100xprism/tracked-projects;100xprism initprunes the project it runs in, which covers repos the tracked list never knew about (cloned fresh, or set up on another machine). Native Windows gets the same treatment through a JS mirror of the same logic.
Because this deletes files inside your repositories, it enforces three guarantees, each covered by tests:- Ownership — the file must carry the
Generated by 100xprismmarker in its header region. A hand-written.windsurfrules, or a file that merely mentions us further down, is never touched. - Containment — the resolved path must remain inside the resolved project. A symlinked
.githubpointing at a shared config directory cannot let a delete escape into another repository. - Recoverability — every file is copied to
~/.100xprism/removed-artifacts/<timestamp>/<full-project-path>/before removal, and is removed only if that copy succeeded. A file you edited but never committed is still removed, but never unrecoverably. Backups are keyed by the project's full path, not its basename, so two projects namedappcannot overwrite each other's backup. IfHOMEis unset there is nowhere to guarantee recovery, so nothing is deleted. Failures are reported, not swallowed.
- Ownership — the file must carry the
Added
- Cursor parity on Windows.
lib/adapters/windows.jspreviously had no per-rule emitter and fell back to writing the concatenated config to a single.cursorrulesfile. It now shipsemitCursorRules(), a port ofcmd_emit_cursorthat writes one.cursor/rules/<slug>.mdcper module with byte-identical output to the shell adapter. Windows Cursor users get description-based auto-trigger and on-demand bodies for the first time.
Fixed
- Cursor rules for removed modules were never pruned. Both
cmd_emit_cursorand its JS port scanned only the first 6 lines of an existing.mdcfor the generation marker — but the emitters write that marker on line 7, below the frontmatter block. The check therefore matched nothing, and every module removed upstream orphaned its rule in every Cursor project indefinitely. The window now reaches past the marker in both implementations, and the constant is shared rather than duplicated as a literal. The regression tests previously passed against a hand-written fixture with the marker on line 5 — a file the emitter never produces — so they now prune real emitter output and assert the marker falls inside the scanned window. 100xprism updateskipped the tracked-project pass entirely on the "already up to date" path, so a v3 migration interrupted after the pull would never be retried onceHEADmatchedorigin. Both paths now reconcile projects.
Changed
100xprism updateregenerates Cursor rules when it finds.cursor/rules/, not only the legacy.cursorrulesfile — projects initialised after the move to per-rule.mdcfiles were silently skipped by update.- Instruction-file discovery across 14 modules and
_lib/reference.mdnow probesCLAUDE.md AGENTS.md .cursorrulesinstead of a six-entry list including.windsurfrules,GEMINI.md, and.github/copilot-instructions.md. - The
install/inittool pickers offer three tools instead of seven, and installer output no longer advertises Cursor as.cursorrules(it has written.cursor/rules/since v2.x).
Install / upgrade:
# New install
bash -c "$(curl -fsSL https://raw.githubusercontent.com/rajitsaha/100xprism/main/install.sh)"
# Existing users
~/100xprism/update.shv2.4.9
Added
- AI economics dashboard and GitHub PR insights. The local dashboard now separates token economics, observable delivery, and unmeasured business value. It surfaces attribution coverage, delivery unit cost, files, churn, commits, merged PRs, and explicit outcome scopes without presenting engineering activity as ROI. Optional GitHub CLI integration fetches bounded, linked PR details for local remotes plus configured users/repos, including status, author, title, comments, sampled file/churn detail, and update dates, cached for 30 minutes.
- Dashboard CLI commands.
100xprism tokensand100xprism dashboardnow start/open the AI economics dashboard, and100xprism valueprints the observable-delivery report for a directory.
Removed
- 11 orphaned module reference files. Files under
copywriting/,page-cro/, andseo-audit/that had shipped in every install since the v2.0.0 unification but were never linked from anySKILL.md, so no adapter path could reach them. Two were byte-identical duplicates of filesemail-sequence/already links. Package-weight only — references load on demand, so context cost is unchanged.
Fixed
- Dashboard install messaging is explicit. Ordinary install output now says the AI economics dashboard is not started by default and prints the command to start and open it. URL output is reserved for paths that actually request dashboard startup.
- Installer no longer causes shell/Claude startup side effects: the token dashboard and update check are opt-in (
--dashboard) instead of auto-starting fromaliases.shor aSessionStarthook. - Install now runs a cleanup-first pass (
lib/uninstall.js --preinstall-cleanup) across both the npm/mise launcher and thecurl | bashpath, stopping any owned dashboard, stripping legacy rcsource …/aliases.shlines (including custom$DEV_100X_HOMEpaths), and removing stale command symlinks. 100xprism uninstallpreserves healthy npm/mise launchers (stale-only link removal); only npmpreuninstallremoves live links.- Malformed or unreadable
~/.claude/settings.jsonnow warns and continues instead of aborting install/update, and unchanged settings are no longer rewritten. - Stale-link removal failures (e.g. unwritable bin dir) warn instead of aborting.
- Dashboard shutdown waits for process exit and escalates to
SIGKILLbefore an opt-in restart, avoiding the port race;mise reshim nodeguidance prints only when a mise link was actually removed.
Install / upgrade:
# New install
bash -c "$(curl -fsSL https://raw.githubusercontent.com/rajitsaha/100xprism/main/install.sh)"
# Existing users
~/100xprism/update.shv2.4.8
Fixed
- Reduced generated Codex
AGENTS.mdcontext by moving the full skill catalog to.agents/100x-index.mdwhile preserving progressive skill loading.
Install / upgrade:
# New install
bash -c "$(curl -fsSL https://raw.githubusercontent.com/rajitsaha/100xprism/main/install.sh)"
# Existing users
~/100xprism/update.shv2.4.7
(Minor maintenance release)
Install / upgrade:
# New install
bash -c "$(curl -fsSL https://raw.githubusercontent.com/rajitsaha/100xprism/main/install.sh)"
# Existing users
~/100xprism/update.shv2.4.5
(Minor maintenance release)
Install / upgrade:
# New install
bash -c "$(curl -fsSL https://raw.githubusercontent.com/rajitsaha/100xprism/main/install.sh)"
# Existing users
~/100xprism/update.shv2.4.4
Fixed
- Portable Codex hook artifacts. The generated Codex hook is now a project-local wrapper (
adapters/templates/codex-run-hook.py) so committed hooks no longer embed the generating machine's absolute paths, and it invokes the inner hook viasys.executableso it runs under whatever Python the consumer has. The Python and Windows adapters share a single wrapper template (parity enforced by tests), the Windows adapter now mirrors Codex-nativeAGENTS, repo skills, and hook output, and install-time version-skew failures are clearer. Adds regression coverage for Codex portability, Python/Windows wrapper parity, custom-skill preservation, and Claude Code hook separation.
Install / upgrade:
# New install
bash -c "$(curl -fsSL https://raw.githubusercontent.com/rajitsaha/100xprism/main/install.sh)"
# Existing users
~/100xprism/update.sh