osborn 0.9.37 → 0.9.38

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 (2) hide show
  1. package/Dockerfile.sandbox +34 -0
  2. package/package.json +1 -1
@@ -31,10 +31,23 @@ RUN npm install -g "osborn@${OSBORN_VERSION}" @anthropic-ai/claude-code
31
31
  # Persistent workspace + claude config dirs
32
32
  RUN mkdir -p /workspace /root/.claude
33
33
 
34
+ # Marker so orchestration (machines.ts isManifestAware) can detect this image
35
+ # supports the manifest-driven update flow. Pre-marker machines fall back to
36
+ # the image-swap update path, which brings them onto a marker-aware image;
37
+ # from then on, all updates use the manifest flow defined in the entrypoint.
38
+ RUN touch /etc/osborn-manifest-aware
39
+
34
40
  ENV OSBORN_CWD=/workspace
35
41
  ENV OSBORN_API_PORT=8741
36
42
  ENV NODE_ENV=production
37
43
 
44
+ # HOME points at the volume so user-space config from any tool that respects
45
+ # HOME (gh, git, ssh, aws, etc.) automatically writes to the persistent
46
+ # volume instead of the ephemeral container overlay. The existing /root/.claude
47
+ # symlink machinery below stays in place — it's redundant with HOME=/workspace
48
+ # but harmless.
49
+ ENV HOME=/workspace
50
+
38
51
  WORKDIR /workspace
39
52
 
40
53
  EXPOSE 8741
@@ -52,6 +65,10 @@ ln -sf /workspace/.claude /root/.claude
52
65
  # Suppress Claude Code interactive onboarding prompts
53
66
  ONBOARDING_JSON='{"numStartups":10,"installMethod":"npm","autoUpdates":false,"hasCompletedOnboarding":true,"hasTrustDialogAccepted":true,"hasTrustDialogHooksAccepted":true,"hasCompletedProjectOnboarding":true,"hasAcknowledgedCostThreshold":true,"effortCalloutV2Dismissed":true,"theme":"dark","projects":{"/workspace":{"hasTrustDialogAccepted":true,"hasTrustDialogHooksAccepted":true,"hasCompletedProjectOnboarding":true}}}'
54
67
  echo "$ONBOARDING_JSON" > /root/.claude.json
68
+ # Additional write at $HOME/.claude.json. With HOME=/workspace this is where
69
+ # Claude Code actually reads its top-level config from; the /root/.claude.json
70
+ # write above becomes dead but is left in place (harmless).
71
+ echo "$ONBOARDING_JSON" > /workspace/.claude.json
55
72
  mkdir -p /workspace/.claude
56
73
  echo "$ONBOARDING_JSON" > /workspace/.claude/.config.json
57
74
  echo "$ONBOARDING_JSON" > /workspace/.claude/claude.json
@@ -79,6 +96,23 @@ if [ -d "$PKG_SKILLS_DIR" ]; then
79
96
  done
80
97
  fi
81
98
 
99
+ # Manifest-driven version check.
100
+ # Orchestration writes /workspace/.osborn-want-version on update (machines.ts
101
+ # updateViaManifest). On every boot we compare to the currently-installed
102
+ # osborn and run `npm install -g osborn@<want>` if they differ. The install
103
+ # lands in the container overlay (default npm prefix) — Fly wipes overlay on
104
+ # stop/start so the install re-runs on every boot until the base image is
105
+ # rebuilt with that version baked in. Update is fast between Fly restarts;
106
+ # only the first boot after a restart pays the npm install cost.
107
+ WANT=$(cat /workspace/.osborn-want-version 2>/dev/null | tr -d '[:space:]')
108
+ if [ -n "$WANT" ]; then
109
+ CURRENT=$(osborn --version 2>/dev/null | head -1 | tr -d '[:space:]')
110
+ if [ "$WANT" != "$CURRENT" ]; then
111
+ echo "[sandbox] osborn ${CURRENT:-none} → ${WANT} (manifest install)"
112
+ npm install -g "osborn@${WANT}" || echo "[sandbox] install failed — running ${CURRENT:-image-baked} version"
113
+ fi
114
+ fi
115
+
82
116
  exec osborn
83
117
  ENTRYPOINT
84
118
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "osborn",
3
- "version": "0.9.37",
3
+ "version": "0.9.38",
4
4
  "description": "Voice AI coding assistant - local agent that connects to Osborn frontend",
5
5
  "type": "module",
6
6
  "bin": {