You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Packs in monorepos can now share content via symlinks (e.g.
rules/shared.md -> ../../shared/base.md). Symlinks are resolved to
regular files at install time. Targets must stay within the repository
boundary — absolute paths, .git traversal, and directory symlinks are
rejected.
Remote pack fetches for SSH URLs now use shallow clone universally,
matching the behavior of all non-GitHub URLs. This fixes content
discovery for packs that rely on directory-walking rather than explicit
manifest inventory.
Signed-off-by: David Foster <david.foster@oracle.com>
Signed-off-by: davidfos <david.d.foster@oracle.com>
Copy file name to clipboardExpand all lines: CHANGELOG.md
+10Lines changed: 10 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -6,6 +6,16 @@ The format is based on Keep a Changelog, and releases use semantic versioning ta
6
6
7
7
## Unreleased
8
8
9
+
## [0.11.7]
10
+
11
+
### Added
12
+
13
+
- Symlinks in pack content are now resolved at install time when the target is within the source repository boundary. This enables packs in monorepos to share content via symlinks (e.g. `rules/shared.md -> ../../shared/base.md`). The installed pack always contains regular files. Symlinks that escape the repo boundary, point to directories, traverse `.git/`, or use absolute targets are rejected. The `--link` install method is unchanged.
14
+
15
+
### Changed
16
+
17
+
- Bitbucket Server SSH URLs (port 7999) now use shallow clone instead of `git archive --remote`. This fixes auto-discovery for packs with incomplete manifests and simplifies the install pipeline. Packs previously installed via archive will update via clone on next `pack update`.
Installs a pack into `~/.config/aipack/packs/<name>/`. Supports three sources:
66
66
67
67
-**Local path** (symlinked by default, `--copy` for full copy)
68
-
-**URL** (`--url` — fetched via `git archive` with automatic fallback to shallow clone)
68
+
-**URL** (`--url` — fetched via HTTP tarball for GitHub, shallow clone for everything else)
69
69
-**Registry name** (bare name like `my-team-pack` — looked up in registry, then fetched)
70
70
71
71
`aipack install` is a top-level alias for `aipack pack install`.
72
72
73
73
With `-m`/`--missing`, installs all missing packs from the active profile by looking them up in the registry. This is the easiest way to catch up after setting a profile or after new packs are added to a shared profile.
74
74
75
-
Remote packs are fetched using a two-phase process: first the manifest (`pack.json`) is retrieved to determine declared content, then only the declared files are fetched. This avoids downloading the full repository. When the remote doesn't support `git archive --remote` (e.g. GitHub), aipack falls back to a shallow clone automatically.
75
+
Remote packs from GitHub HTTPS URLs are fetched as HTTP tarballs (no git binary required). All other URLs use a shallow clone (`git clone --depth 1`).
76
76
77
77
Both HTTPS and SSH URLs are supported. SSH URLs (`git@host:path` or `ssh://`) avoid credential prompts.
78
78
@@ -108,7 +108,7 @@ aipack pack install ./my-pack --profile production
108
108
109
109
### pack list
110
110
111
-
Lists all installed packs with name, install method (link/copy/clone/archive), version, origin, and broken-link status.
111
+
Lists all installed packs with name, install method (link/copy/clone/http-tarball), version, origin, and broken-link status.
112
112
113
113
```bash
114
114
aipack pack list
@@ -126,7 +126,7 @@ aipack pack show my-pack --json
126
126
127
127
### pack update
128
128
129
-
Updates installed pack(s) to latest version from their origin. For archive-installed packs, re-fetches declared content and shows a file-level diff of changes. For git-cloned packs, runs `git pull`. For copied packs, re-copies from the recorded origin. For symlinked packs, re-validates the link target. Exactly one of `<name>` or `--all` is required.
129
+
Updates installed pack(s) to latest version from their origin. For cloned packs, runs `git pull`. For HTTP-tarball packs, re-downloads and shows a file-level diff. For copied packs, re-copies from the recorded origin. For symlinked packs, re-validates the link target. Exactly one of `<name>` or `--all` is required.
@@ -497,7 +497,7 @@ Several flags follow a common resolution chain across commands:
497
497
498
498
**Diff kinds:**`create` (file doesn't exist on disk), `identical` (desired matches on-disk), `managed` (on-disk matches ledger — safe to update), `conflict` (user-modified since last sync), `untracked` (exists on disk but not in ledger), `error` (classification failed)
499
499
500
-
**Install methods:**`archive` (git archive fetch), `clone` (shallow git clone), `copy` (copied from local path), `link` (symlinked to local path), `local` (already in packs directory, registered in-place)
500
+
**Install methods:**`clone` (shallow git clone), `http-tarball` (GitHub HTTP tarball), `copy` (copied from local path), `link` (symlinked to local path), `local` (already in packs directory, registered in-place), `archive` (legacy — treated as clone on update)
| `ref` | string | Git ref used at install time (remote only) |
97
97
| `sub_path` | string | Subdirectory within the repo (remote only) |
@@ -121,10 +121,10 @@ Packs live under `~/.config/aipack/packs/<name>/`. Four install methods produce
121
121
| `link` | Symlink to source directory | Yes — edits at either location hit the same files | Re-validates symlink target |
122
122
| `copy` | Full copy from local path | No — edits are local only | Re-copies from recorded origin |
123
123
| `clone` | Shallow git clone | Yes (with `git pull`) | `git pull` in the clone |
124
-
| `archive` | Extracted from `git archive` | No — edits are local only | Re-fetches via archive, shows file-level diff |
124
+
| `http-tarball` | Downloaded from GitHub | No — edits are local only | Re-downloads tarball, shows file-level diff |
125
125
| `local` | Pack already in packs directory | Yes — it's the source | Registered in-place, no fetch |
126
126
127
-
`link`is the default for local installs and is the best choice for pack development — you edit the source and `sync --watch` picks up changes automatically. `archive` is the default for remote installs and is the most space-efficient for consumers.
127
+
`link`is the default for local installs and is the best choice for pack development — you edit the source and `sync --watch` picks up changes automatically. `clone` is the default for SSH remote installs; `http-tarball` is used for GitHub HTTPS URLs.
Copy file name to clipboardExpand all lines: docs/pack-format.md
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -499,8 +499,8 @@ Without the override declaration, duplicate IDs across packs are treated as erro
499
499
500
500
Packs are installed from git repositories. Two fetch strategies are supported:
501
501
502
-
1. **Archive fetch** (preferred) — `git archive --remote` retrieves only declared content. Two phases: manifest first (to discover content), then declared files. Efficient for large repos where the pack is a subdirectory.
503
-
2. **Shallow clone** (fallback) — used when the remote doesn't support `git archive` (e.g., GitHub). Performs a depth-1 clone.
502
+
1. **HTTP tarball** — GitHub HTTPS URLs download a tarball directly (no git binary required).
503
+
2. **Shallow clone** — all other URLs use `git clone --depth 1`.
504
504
505
505
Both HTTPS and SSH URLs are supported. Packs can live in a subdirectory of a larger repository (common for team mono-repos).
506
506
@@ -560,7 +560,7 @@ aipack sync
560
560
561
561
Pack versioning uses git refs. The `version` field in `pack.json` is informational. The authoritative version is the git ref (branch, tag, or commit) used at install time.
562
562
563
-
For archive-installed packs, the commit hash at install time is recorded, enabling update detection.
563
+
For remotely installed packs, the commit hash at install time is recorded, enabling update detection.
returnpackInstallResult{}, fmt.Errorf("pack.json declares content not found in the repository — check that all listed rules/skills/workflows are committed: %w", err)
398
-
}
399
-
returnpackInstallResult{}, fmt.Errorf("fetching pack content from %s: %w", info.RepoURL, err)
0 commit comments