tkinter was imported at module level, before the try/except that was
meant to catch a missing display or toolkit. On a Python install without
the (often separately packaged) tkinter module, the script crashed
instead of falling back to notify-send. The import is now wrapped in its
own try/except with the same fallback.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The Stop hook only runs a ~500ms visual flash; 20 seconds was far more
than any realistic process-start latency needs, including the one-time
native shim compile on Windows.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
max_threads is a legacy alias; the current Codex config sample only
documents max_concurrent_threads_per_session under [agents]. Confirmed
against the official sample configuration before renaming.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Bash equivalent of the PowerShell build-validation test, using a tar-based
repo copy per case to check the same four rejected-defect scenarios.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Runs the build against temporary full-repo copies, each with one injected
defect, and asserts the build rejects it: invalid Claude settings.json,
a duplicate agent name, a duplicate plugin name, and a leftover template
placeholder.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Bash equivalent of the PowerShell managed-manifest test, covering the same
idempotency, stale-removal, modified-file-protection, foreign-file, and
side-effect-free dry-run scenarios against sync_managed_destination.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Exercises Sync-ManagedDestination directly against a throwaway
source/destination pair: idempotent second install (no writes, no
backups), removal of a stale-and-untouched file, protection of a
stale-but-locally-modified file (backed up, left in place, warned), a
foreign file that was never installed staying untouched, and a dry run
that reports the planned removal without any side effects.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Bash equivalent of the PowerShell doctor change: dynamic agent/skill count
checks, JSON validation of installed settings.json (jq, falling back to a
functional python3 probe), a config.toml balance check, a fast tree-wide
placeholder scan, and managed-manifest missing/modified-file reporting.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Doctor now compares generated agent/skill counts against the source
directories and the rule-skills manifest, parses installed settings.json
as JSON, sanity-checks installed config.toml for balanced quotes and
brackets, scans generated output for leftover template placeholders, and
reports missing or locally modified files from each destination's managed
manifest. All checks stay local and file-based; no network calls.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Bash equivalent of the PowerShell installer change: delegates to
sync_managed_destination, adds --client/--platform for non-interactive
runs (falling back to the existing interactive prompts when omitted), and
requires --update-plugins to update already-installed plugins instead of
doing so by default.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
install.ps1 now delegates every destination to Sync-ManagedDestination
instead of a blind copy-and-backup loop, so repeated installs are cheap
and safe by default.
Adds -Client and -Platform parameters so CI or scripts can run fully
non-interactively (install.ps1 -Client Both -Platform Windows); both fall
back to the existing interactive prompts when omitted. Plugin updates now
require an explicit -UpdatePlugins switch instead of always updating
already-installed plugins, so a configuration update never silently
changes third-party plugin code.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Bash equivalent of the PowerShell manifest module: sync_managed_destination
plus its read/write/hash helpers, using sha256sum and a TSV manifest so
the same idempotent-install, stale-detection, and local-modification
protection behavior is available without a PowerShell dependency.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Adds Sync-ManagedDestination and its manifest helpers: a per-destination
TSV of path -> SHA-256 that makes installation idempotent (unchanged files
are neither rewritten nor backed up), detects files this setup previously
installed that the source no longer ships (removed after backup, unless
changed locally, in which case they are backed up and left in place with
a warning), and never touches a file it never installed. Backups for a
run land together under backups/<stamp>/ instead of one suffix per file.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Bash equivalent of the PowerShell test change. Also relaxes the platform
dry-run assertion to match on "-$platform" instead of "-$platform/", since
the installer now reports one destination summary line per sync instead of
one line per copied file.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Replaces the hardcoded 5-agent/22-skill expectations with counts computed
from shared/agents, shared/skills, and the new rule-skills manifest, so
adding an agent, skill, or Claude rule skill no longer requires touching
an unrelated magic number in this test.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Bash equivalent of the PowerShell build change: Claude gets general.md
inlined into CLAUDE.md plus one generated skill per rule-skills.tsv entry;
Codex keeps every rule as a plain file with unchanged AGENTS.md text.
Adds the same build-time validation as the PowerShell script: duplicate
agent/plugin/rule-skill names, JSON validity (jq, falling back to a
functional python3 probe), balanced TOML quotes/brackets, and a
tree-wide (not per-file) leftover-placeholder scan for speed.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude's package now gets general.md inlined into CLAUDE.md plus one
generated skill per rule-skills.tsv entry under skills/rules/, instead of
copying every rule file into the always-loaded rules/ directory. Codex is
unaffected: it still receives every rule as a plain file and the original
rule-loading text, byte-for-byte.
Also adds build-time validation: duplicate agent/plugin/rule-skill names
fail the build, generated settings.json must parse as JSON, generated
config.toml must have balanced quotes/brackets, and no __PLACEHOLDER__
tokens may remain unresolved (__AI_CONFIG_ROOT__ excepted, since it is
only resolved at install time).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Adds adapters/claude/rule-skills.tsv, mapping each technology- or
situation-specific rule to a Claude skill name and trigger description.
Replaces the hardcoded rule-loading block in the shared instructions
template with a __RULE_LOADING__ placeholder so each client's build step
can substitute its own loading mechanism without duplicating the shared
orchestration text.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Ensures shell scripts keep LF and PowerShell scripts keep CRLF across
Windows and Linux checkouts.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>