@ai-outfitter/outfitter 1.11.0 → 1.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/.outfitter/skills/outfitter/SKILL.md +4 -0
  2. package/README.md +5 -1
  3. package/dist/cli/OutfitterCli.js +2 -0
  4. package/dist/cli/OutfitterCli.js.map +1 -1
  5. package/dist/cli/commands/RunAgentCommand.d.ts +5 -0
  6. package/dist/cli/commands/RunAgentCommand.js +16 -1
  7. package/dist/cli/commands/RunAgentCommand.js.map +1 -1
  8. package/dist/cli/commands/SetupCommand.d.ts +2 -1
  9. package/dist/cli/commands/SetupCommand.js +1 -0
  10. package/dist/cli/commands/SetupCommand.js.map +1 -1
  11. package/dist/cli/commands/SourcesCommand.d.ts +19 -0
  12. package/dist/cli/commands/SourcesCommand.js +85 -0
  13. package/dist/cli/commands/SourcesCommand.js.map +1 -0
  14. package/dist/cli/commands/SyncCommand.js +8 -0
  15. package/dist/cli/commands/SyncCommand.js.map +1 -1
  16. package/dist/schemas/settings.schema.json +5 -0
  17. package/dist/settings/Settings.d.ts +6 -0
  18. package/dist/settings/Settings.js +1 -0
  19. package/dist/settings/Settings.js.map +1 -1
  20. package/dist/settings/SettingsLoader.js +1 -0
  21. package/dist/settings/SettingsLoader.js.map +1 -1
  22. package/dist/settings/SettingsMerger.js +3 -0
  23. package/dist/settings/SettingsMerger.js.map +1 -1
  24. package/dist/setup/DefaultCatalog.js +18 -2
  25. package/dist/setup/DefaultCatalog.js.map +1 -1
  26. package/dist/sources/SourceCachePolicy.d.ts +11 -0
  27. package/dist/sources/SourceCachePolicy.js +48 -0
  28. package/dist/sources/SourceCachePolicy.js.map +1 -0
  29. package/dist/sources/SourceState.d.ts +32 -0
  30. package/dist/sources/SourceState.js +90 -0
  31. package/dist/sources/SourceState.js.map +1 -0
  32. package/docs/documentation/README.md +5 -3
  33. package/docs/documentation/ai-outfitter.md +259 -0
  34. package/docs/documentation/assets/feature-to-pr.svg +70 -0
  35. package/docs/documentation/cli.md +8 -0
  36. package/docs/documentation/containers.md +3 -80
  37. package/docs/documentation/settings.md +5 -0
  38. package/package.json +1 -1
  39. package/src/schemas/settings.schema.json +5 -0
@@ -13,9 +13,6 @@ servers, or other use-case behavior. The default runtime user and group are
13
13
  both `1000` (named `outfitter`), with `/tmp` as the home directory and
14
14
  `/workspace` as the working directory.
15
15
 
16
- A Nix closure variant of the image is also published under the `-nix` suffix;
17
- see [the `-nix` variant](#the--nix-variant) below.
18
-
19
16
  ## Run a resident agent
20
17
 
21
18
  A resident container is an ordinary `outfitter run` whose harness stays in RPC
@@ -47,7 +44,7 @@ spec:
47
44
  fsGroup: 1000
48
45
  containers:
49
46
  - name: agent
50
- # The primary Debian-based image; append -nix for the Nix variant.
47
+ # The published Debian-based image.
51
48
  image: ghcr.io/ai-outfitter/outfitter:<version>
52
49
  stdin: true
53
50
  workingDir: /workspace
@@ -85,8 +82,8 @@ The image is a normal Debian base: extend it with an ordinary Dockerfile.
85
82
  `apt-get` works, and so does `COPY`ing binaries. A dynamically linked binary
86
83
  runs when it matches the image — same architecture, glibc-linked, and its
87
84
  shared-library dependencies present. The standard ELF interpreter is where
88
- tools expect it (unlike the `-nix` variant), but the slim base ships a small
89
- library set: `apt-get install` a binary's runtime libraries when it needs more.
85
+ tools expect it, but the slim base ships a small library set. Use `apt-get
86
+ install` when a binary needs more runtime libraries.
90
87
  Switch to `root` for the layers that install, then drop back to `1000`:
91
88
 
92
89
  ```dockerfile
@@ -111,77 +108,3 @@ docker run --rm --entrypoint /bin/sh example-agent \
111
108
 
112
109
  The entrypoint stays `outfitter`; override `ENTRYPOINT` only when the derived
113
110
  image wraps the launch itself.
114
-
115
- ## The `-nix` variant
116
-
117
- The Nix closure image that was previously the primary tag remains published
118
- for `lib.mkContainer` consumers:
119
-
120
- ```text
121
- ghcr.io/ai-outfitter/outfitter:<version>-nix
122
- ```
123
-
124
- It is built by the flake, includes the Nix CLI, Bash, core utilities, Git,
125
- SSH, and CA certificates, and its entrypoint is an absolute `/nix/store` path.
126
- It is not conventionally extensible — there is no apt, and foreign dynamic
127
- binaries do not run — so extend it through Nix instead: the flake exports
128
- `lib.mkContainer` for reproducible derivative images:
129
-
130
- ```nix
131
- {
132
- inputs = {
133
- nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
134
- outfitter = {
135
- url = "github:ai-outfitter/outfitter/v1.4.0";
136
- inputs.nixpkgs.follows = "nixpkgs";
137
- };
138
- };
139
-
140
- outputs =
141
- { nixpkgs, outfitter, ... }:
142
- let
143
- system = "x86_64-linux";
144
- pkgs = nixpkgs.legacyPackages.${system};
145
- in
146
- {
147
- packages.${system}.default = outfitter.lib.mkContainer {
148
- inherit pkgs;
149
- outfitterPackage = outfitter.packages.${system}.outfitter;
150
- name = "example-agent";
151
- extraPackages = [
152
- pkgs.jq
153
- pkgs.ripgrep
154
- ];
155
- };
156
- };
157
- }
158
- ```
159
-
160
- Build and exercise the exact image:
161
-
162
- ```sh
163
- nix build
164
- docker load < result
165
- docker run --rm example-agent:latest --version
166
- docker run --rm --entrypoint /bin/sh example-agent:latest \
167
- -c 'nix --version && jq --version && rg --version'
168
- ```
169
-
170
- Prefer adding known runtime packages through `extraPackages`. The resulting
171
- image stays reproducible, and it avoids the trap below.
172
-
173
- **Do not mount an empty volume over `/nix` of the `-nix` variant.** That image
174
- _is_ its Nix store: the entrypoint is an absolute store path and every binary
175
- in `/bin` is a symlink into `/nix/store`. Mounting a fresh volume there hides
176
- all of it, so the container cannot start — it fails before it could initialize
177
- the very store you mounted the volume to populate. (The primary Debian image
178
- has no `/nix` and is not affected.)
179
-
180
- Runtime installation in the `-nix` variant therefore needs one of:
181
-
182
- - a volume **pre-populated** with the image's closure, seeded from the image
183
- before the agent starts (an init container copying `/nix` into the volume);
184
- - an **overlay** whose lower layer is the image's `/nix`, so the closure stays
185
- visible while writes land in the upper layer; or
186
- - writable Nix **state** only — `/nix/var` and a per-user profile — leaving the
187
- store itself as the image shipped it.
@@ -41,6 +41,8 @@ remote_settings:
41
41
  ref: 9c47d1e2b8a05f36c4d7e90a12b3f8c5d6e71a04
42
42
 
43
43
  cache_directory: ./cache # optional; relative to this settings file
44
+ source_cache:
45
+ policy: repair # repair (default), locked, or offline
44
46
 
45
47
  # Pseudonymous product analytics consent; defaults to true when absent.
46
48
  telemetry:
@@ -53,6 +55,9 @@ telemetry:
53
55
  - `remote_settings` — shared settings a repository distributes; cached locally and merged below your project and user settings, so anything you set locally wins.
54
56
  - `cache_directory` — the repository cache root used consistently by sync, remote settings, remote
55
57
  source resolution, and default-catalog setup. It defaults to `~/.agents/cache`; repositories live
58
+ - `source_cache.policy` — verifies remote caches before `run`: `repair` reuses healthy caches and
59
+ atomically repairs unhealthy ones, `locked` also requires full commit pins, and `offline` never
60
+ accesses the network.
56
61
  below its `repos/` directory.
57
62
  - `telemetry.enabled` — the primary and sole persistent control for pseudonymous product analytics. Edit it directly to enable or disable telemetry. See [Telemetry](./telemetry.md) for consent precedence, automatic identifier cleanup, the event contract, and the current inert-build status.
58
63
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-outfitter/outfitter",
3
- "version": "1.11.0",
3
+ "version": "1.12.0",
4
4
  "description": "Profile-oriented wrapper for launching pi, Claude Code, and future agent CLIs with reproducible configuration.",
5
5
  "type": "module",
6
6
  "repository": {
@@ -11,6 +11,11 @@
11
11
  "description": "Whether a run stands on the machine's native harness configuration (inherit, the default) or on the projection alone (isolated). Honored only from home-scope settings."
12
12
  },
13
13
  "cache_directory": { "type": "string", "minLength": 1 },
14
+ "source_cache": {
15
+ "type": "object",
16
+ "properties": { "policy": { "enum": ["repair", "locked", "offline"] } },
17
+ "additionalProperties": false
18
+ },
14
19
  "state_persistence": {
15
20
  "type": "object",
16
21
  "description": "Maps adapter-declared state paths to a persistence strategy.",