@rizom/ops 0.2.0-alpha.45 → 0.2.0-alpha.451

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 (70) hide show
  1. package/README.md +82 -1
  2. package/dist/age-key-bootstrap.d.ts +1 -1
  3. package/dist/brains-ops.js +736 -335
  4. package/dist/capability-bundle-migration.d.ts +22 -0
  5. package/dist/cert-bootstrap.d.ts +4 -2
  6. package/dist/content-repo-ref.d.ts +10 -0
  7. package/dist/content-repo.d.ts +1 -1
  8. package/dist/deploy.js +110 -166
  9. package/dist/directory-sync-stress-system.d.ts +75 -0
  10. package/dist/directory-sync-stress.d.ts +117 -0
  11. package/dist/entries/deploy.d.ts +4 -2
  12. package/dist/health-watchdog-smoke.d.ts +54 -0
  13. package/dist/image-inventory.d.ts +4 -0
  14. package/dist/image-types.d.ts +7 -0
  15. package/dist/images.d.ts +82 -0
  16. package/dist/index.d.ts +8 -0
  17. package/dist/index.js +736 -323
  18. package/dist/legacy-pilot-migration.d.ts +11 -0
  19. package/dist/legacy-projection-job-recovery.d.ts +29 -0
  20. package/dist/load-registry.d.ts +61 -6
  21. package/dist/observed-status.d.ts +1 -1
  22. package/dist/parse-args.d.ts +2 -12
  23. package/dist/preview-domain.d.ts +9 -0
  24. package/dist/reconcile-dry-run.d.ts +9 -0
  25. package/dist/run-command.d.ts +20 -4
  26. package/dist/schema.d.ts +126 -163
  27. package/dist/secrets-encrypt.d.ts +7 -13
  28. package/dist/secrets-push.d.ts +1 -1
  29. package/dist/ssh-key-bootstrap.d.ts +1 -26
  30. package/dist/stage-legacy-crossover.d.ts +25 -0
  31. package/dist/stress-command.d.ts +14 -0
  32. package/dist/stress-git-checkout.d.ts +21 -0
  33. package/dist/stress-health-monitor.d.ts +46 -0
  34. package/dist/upgrade.d.ts +10 -0
  35. package/dist/user-offboard.d.ts +61 -0
  36. package/dist/verify-user.d.ts +22 -0
  37. package/package.json +50 -42
  38. package/templates/rover-pilot/.env.schema +20 -5
  39. package/templates/rover-pilot/.github/actions/varlock-env/action.yml +47 -0
  40. package/templates/rover-pilot/.github/workflows/build.yml +70 -17
  41. package/templates/rover-pilot/.github/workflows/deploy.yml +74 -57
  42. package/templates/rover-pilot/.github/workflows/directory-sync-stress.yml +119 -0
  43. package/templates/rover-pilot/.github/workflows/health-watchdog-smoke.yml +95 -0
  44. package/templates/rover-pilot/.github/workflows/offboard.yml +107 -0
  45. package/templates/rover-pilot/.github/workflows/reconcile.yml +10 -4
  46. package/templates/rover-pilot/.github/workflows/upgrade.yml +104 -0
  47. package/templates/rover-pilot/README.md +13 -5
  48. package/templates/rover-pilot/deploy/scripts/create-predeploy-backup.ts +936 -0
  49. package/templates/rover-pilot/deploy/scripts/decrypt-user-secrets.ts +80 -24
  50. package/templates/rover-pilot/deploy/scripts/helpers.ts +2 -0
  51. package/templates/rover-pilot/deploy/scripts/install-health-watchdog.ts +144 -0
  52. package/templates/rover-pilot/deploy/scripts/provision-server.ts +51 -21
  53. package/templates/rover-pilot/deploy/scripts/resolve-deploy-handles.ts +4 -0
  54. package/templates/rover-pilot/deploy/scripts/resolve-missing-images.ts +13 -0
  55. package/templates/rover-pilot/deploy/scripts/resolve-user-config.ts +40 -9
  56. package/templates/rover-pilot/deploy/scripts/sync-content-repo.ts +51 -47
  57. package/templates/rover-pilot/deploy/scripts/update-dns.ts +72 -16
  58. package/templates/rover-pilot/deploy/scripts/validate-secrets.ts +12 -1
  59. package/templates/rover-pilot/deploy/scripts/verify-runtime-image.ts +18 -0
  60. package/templates/rover-pilot/docs/canonical-crossover-record.md +107 -0
  61. package/templates/rover-pilot/docs/onboarding-checklist.md +23 -14
  62. package/templates/rover-pilot/docs/operator-playbook.md +357 -29
  63. package/templates/rover-pilot/docs/user-onboarding.md +48 -463
  64. package/templates/rover-pilot/package.json +1 -0
  65. package/templates/rover-pilot/pilot.yaml +6 -4
  66. package/dist/origin-ca.d.ts +0 -1
  67. package/dist/push-secrets.d.ts +0 -9
  68. package/dist/push-target.d.ts +0 -2
  69. package/dist/run-subprocess.d.ts +0 -6
  70. package/templates/rover-pilot/.kamal/hooks/pre-deploy +0 -9
@@ -0,0 +1,104 @@
1
+ name: Upgrade
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ version:
7
+ description: Explicit @rizom/ops version (empty means latest)
8
+ required: false
9
+ type: string
10
+ schedule:
11
+ # Weekday morning check for new operator tooling releases.
12
+ - cron: "17 6 * * 1-5"
13
+
14
+ permissions:
15
+ contents: read
16
+
17
+ concurrency:
18
+ group: upgrade
19
+ cancel-in-progress: false
20
+
21
+ jobs:
22
+ upgrade:
23
+ runs-on: ubuntu-latest
24
+ steps:
25
+ # Check only presence here; the private key itself is never exposed to
26
+ # this step. A missing private-key secret fails before checkout.
27
+ - name: Require upgrade App configuration
28
+ env:
29
+ APP_ID: ${{ vars.OPS_UPGRADE_APP_ID }}
30
+ HAS_PRIVATE_KEY: ${{ secrets.OPS_UPGRADE_APP_PRIVATE_KEY != '' }}
31
+ run: |
32
+ missing=""
33
+ if [ -z "$APP_ID" ]; then
34
+ missing="OPS_UPGRADE_APP_ID"
35
+ fi
36
+ if [ "$HAS_PRIVATE_KEY" != "true" ]; then
37
+ missing="${missing:+$missing and }OPS_UPGRADE_APP_PRIVATE_KEY"
38
+ fi
39
+ if [ -n "$missing" ]; then
40
+ echo "$missing is not set for this repository." >&2
41
+ echo "Configure the upgrade GitHub App as described in docs/operator-playbook.md." >&2
42
+ exit 1
43
+ fi
44
+
45
+ # No credential is persisted in .git/config while the workflow installs
46
+ # and executes a freshly published @rizom/ops package.
47
+ - uses: actions/checkout@v5
48
+ with:
49
+ persist-credentials: false
50
+
51
+ - uses: oven-sh/setup-bun@v2
52
+
53
+ - name: Install operator tooling
54
+ run: bun install
55
+
56
+ - name: Upgrade operator tooling
57
+ env:
58
+ VERSION_INPUT: ${{ inputs.version }}
59
+ run: bunx brains-ops upgrade . --to "${VERSION_INPUT:-latest}"
60
+
61
+ - name: Detect upgrade changes
62
+ id: upgrade-changes
63
+ run: |
64
+ if [ -z "$(git status --porcelain)" ]; then
65
+ echo "Already up to date."
66
+ echo "changed=false" >> "$GITHUB_OUTPUT"
67
+ else
68
+ echo "changed=true" >> "$GITHUB_OUTPUT"
69
+ fi
70
+
71
+ - name: Create repository-scoped upgrade token
72
+ if: steps.upgrade-changes.outputs.changed == 'true'
73
+ id: upgrade-token
74
+ uses: actions/create-github-app-token@v2
75
+ with:
76
+ app-id: ${{ vars.OPS_UPGRADE_APP_ID }}
77
+ private-key: ${{ secrets.OPS_UPGRADE_APP_PRIVATE_KEY }}
78
+ permission-contents: write
79
+ permission-pull-requests: write
80
+ permission-workflows: write
81
+
82
+ - name: Open upgrade PR
83
+ if: steps.upgrade-changes.outputs.changed == 'true'
84
+ env:
85
+ GH_TOKEN: ${{ steps.upgrade-token.outputs.token }}
86
+ run: |
87
+ VERSION=$(bun -e 'console.log(JSON.parse(await Bun.file("package.json").text()).devDependencies["@rizom/ops"])')
88
+ BRANCH="ops/upgrade-rizom-ops-$VERSION"
89
+ git config user.name "github-actions[bot]"
90
+ git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
91
+ git checkout -B "$BRANCH"
92
+ git add -A
93
+ git commit -m "chore(ops): upgrade @rizom/ops to $VERSION"
94
+ git push --force \
95
+ "https://x-access-token:${GH_TOKEN}@github.com/${GITHUB_REPOSITORY}.git" \
96
+ "$BRANCH"
97
+ if [ -n "$(gh pr list --head "$BRANCH" --state open --json number --jq '.[].number')" ]; then
98
+ echo "PR already open for $BRANCH"
99
+ exit 0
100
+ fi
101
+ gh pr create \
102
+ --title "chore(ops): upgrade @rizom/ops to $VERSION" \
103
+ --body "Automated operator tooling upgrade. Review the scaffold diff, then merge; deploys stay operator-dispatched." \
104
+ --head "$BRANCH"
@@ -1,6 +1,6 @@
1
- # rover-pilot
1
+ # private brain pilot
2
2
 
3
- Private desired-state repo for the rover pilot.
3
+ Private desired-state repository for the hosted brain pilot. The generated repository/service name may remain `rover-pilot` for deployment identity compatibility.
4
4
 
5
5
  This is a single operator-owned repo. Pilot users do not get their own brain repos.
6
6
  Per-user deploy config lives under `users/<handle>/`, while content stays in per-user content repos.
@@ -30,14 +30,15 @@ The repo also checks in its deploy contract:
30
30
 
31
31
  `.env.schema` is the single source of truth for required and sensitive deploy vars.
32
32
  Use separate GitHub tokens: `CONTENT_REPO_ADMIN_TOKEN` for operator-side content repo creation/checks, and `GIT_SYNC_TOKEN` for runtime directory-sync git access.
33
- The shared pilot image tag is `brain-${brainVersion}` end to end.
34
- When `pilot.yaml.brainVersion` changes and you push, CI rebuilds the shared tag, refreshes generated user env files, and redeploys affected users.
33
+ The fleet publishes one immutable `brain-${brainVersion}` image per effective Brain version. New images install the exact site/theme package union across the entire fleet, so smoke-to-fleet promotion reuses the tested image. Build and Deploy verify installed package versions before reusing existing images.
34
+ When an effective brain version (`pilot.yaml.brainVersion`, or a cohort override) changes and you push, CI builds every missing version image, refreshes generated user env files, and redeploys affected users. Every external site and theme package keeps its own exact version pin; change that package set only together with a fresh Brain version so published tags remain immutable.
35
35
  When a push changes only deploy contract files, CI prints `No affected user configs; skipping deploy.` and stops before Kamal.
36
36
 
37
37
  ## Commands
38
38
 
39
39
  - `brains-ops init <repo>`
40
- - `brains-ops render <repo>` — regenerates `views/users.md` with live DNS, `/health`, and unauthenticated `/mcp` status checks
40
+ - `brains-ops upgrade <repo>` — bumps `@rizom/ops` (or `--to <version>`) and refreshes the generated scaffold; the Upgrade workflow runs this on a schedule and opens a PR
41
+ - `brains-ops render <repo>` — regenerates `views/users.md` with live DNS, `/health/ready`, and unauthenticated `/mcp` status checks
41
42
  - `brains-ops user:add <repo> <handle> --cohort <cohort>` — scaffolds a user file, per-user secrets template, and cohort membership
42
43
  - `brains-ops onboard <repo> <handle>` — creates/seeds the user's content repo with separate admin and sync tokens
43
44
  - `brains-ops age-key:bootstrap <repo>`
@@ -46,3 +47,10 @@ When a push changes only deploy contract files, CI prints `No affected user conf
46
47
  - `brains-ops secrets:encrypt <repo> <handle>`
47
48
  - `brains-ops reconcile-cohort <repo> <cohort>`
48
49
  - `brains-ops reconcile-all <repo>`
50
+ - `brains-ops reconcile-all <repo> --dry-run` (isolated, no external content-repository access; lists both passes' changed files)
51
+
52
+ `render` owns the observational `views/users.md` projection. Reconcile owns generated per-user config and never rewrites observed status rows.
53
+
54
+ The Upgrade workflow uses a repository-scoped GitHub App token because an Actions `GITHUB_TOKEN` cannot update generated files under `.github/workflows/`. Checkout persists no credential, and the App token is minted only after the freshly published tooling finishes and only when there is a change to push. Configure the App and its `OPS_UPGRADE_APP_ID` Actions variable and `OPS_UPGRADE_APP_PRIVATE_KEY` Actions secret as described in `docs/operator-playbook.md`. If token creation or the upgrade push fails, stop; do not substitute an operator's personal credentials.
55
+
56
+ Use `docs/canonical-crossover-record.md` to record exact forward and rollback artifact pins before an approved crossover window.