Repository navigation
v0.10.0
0.9.0 put the mirror location in one global external: block, but the identity of each pack — its url and its ref — stayed duplicated inside every sources.* entry that used it. A pack spanning rules, agents and skills carried its url@ref three times, and nothing detected the drift when only two of them were bumped: rules pinned at one commit and skills at another is a config that looks fine and reads wrong. packs: inverts it — a remote is declared once and referenced by name.
Highlights
Added
packs:— declared remote sources, referenced by name.packs.<name>.{url,ref,mirror}sits at three levels, exactly liketargets:, so it is read by the existingget_nested_yaml_valueand adds no parser. A source entry becomes@<pack>[/<subpath>], and every section referencing that pack shares one clone and one pin.mirror:is both the location and the switch. Present, the pack is materialized there and committed, so bumpingref:reads as an ordinarygit diff; absent, the pack stays transient in the run cache — 0.9.0's default behaviour, with no flag needed to express it.- An undeclared
@packreference fails the run (exit 1, naming the pack and listing the declared ones), deliberately unlike a missing local path, which only warns: the config claims to know that name, so a typo must not silently drop a whole rule set. The check runs up front, invalidate_pack_refs, becauseresolve_source_diris always called inside$( )— an error raised there would exit the substitution subshell, not the sync. - Inline
git+<url>[@<ref>][#<subpath>]specs keep working as anonymous packs: no name, no mirror, always transient.
Changed
- The mirror directory is declared, never derived. The whole name-derivation machinery 0.9.0 needed is gone — no basename extraction, no charset sanitizing, no
pack-<key>fallback, no collision suffix. A pack name is now purely a reference handle that never becomes a path component. - Ownership of a mirror is the presence of its
.packstamp, not the url inside it. A stamped directory stays the pack's even after you editurl:, so a moved or renamed upstream refreshes the mirror instead of freezing it at the old content while the generated output silently follows the new repo. A non-empty directory without a stamp is still never touched. - Two packs declaring the same
mirror:are refused with exit 1 naming both, as is a mirror that resolves to the repo root, escapes the repo, or sits inside a configuredsources.*directory.
Fixed
get_nested_yaml_valuecut values at the last colon, not the first. The value strip was a greedy.*:[[:space:]]*, which onurl: https://host/repo.gitmatched throughhttps:and yielded//host/repo.git. It is now anchored at the first colon, and an unquoted value additionally drops a trailing# commentper YAML while a#inside quotes stays content. Latent in 0.9.0 — nothing read a URL through this helper — but it also silently truncated anymodels.<ide>.<tier>value containing a colon.- A sub-key is matched literally, never interpolated into a regex. A pack named
my.packwould otherwise have matchedmyXpack. - A pack could lose every subpath but the last when the run cache was unset.
materialize_packrecorded its "already cleared this run" claim only whenIS_REMOTE_CACHEwas exported, yet cleared the directory unconditionally.
Breaking
external: { dir: … } is replaced by packs:; migrate_to_0_10_0 rewrites the config automatically and preserves comments. Every inline git+ spec becomes a declared pack plus an @name reference, external.dir becomes each pack's mirror: so vendored content keeps landing where it already is, and the external: block is dropped. Post-condition: no external: key in config.yaml, and a packs: block declaring every remote previously reached inline. Idempotent — a config with no external: key and no git+ token is left untouched.
Full changelog: https://github.com/ainova-systems/intelligence-sync/blob/v0.10.0/CHANGELOG.md
Install
Set up intelligence-sync in this project: clone https://github.com/ainova-systems/intelligence-sync, copy its `intelligence/` folder here, and follow intelligence/sync/INIT.md to bootstrap config.yaml and the first rules, agents and skills.
Already installed? Paste this instead:
Update intelligence-sync: fetch the latest engine from https://github.com/ainova-systems/intelligence-sync and run its update flow to migrate this project to the newest version. Leave my rules, agents, and project skills untouched. If it fails, read the CHANGELOG "### Breaking" entries between my version and the latest, base your fix plan on them, make sure you are running the latest scripts, and retry; ask me only if it still fails.