@msn-control/liftoff 0.7.0 → 0.8.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 (106) hide show
  1. package/README.md +10 -1
  2. package/assets/governance/single-maintainer-gitflow/policy.md +705 -0
  3. package/assets/locks/frontend/package-lock.json +1012 -1694
  4. package/assets/locks/frontend/package.json +5 -6
  5. package/assets/locks/go-backend/go.mod +17 -0
  6. package/assets/locks/go-backend/go.sum +159 -0
  7. package/assets/locks/node-backend/package-lock.json +1473 -2320
  8. package/assets/locks/node-backend/package.json +8 -7
  9. package/assets/locks/opentofu-azure/.terraform.lock.hcl +39 -0
  10. package/assets/locks/opentofu-azure/versions.tf +10 -0
  11. package/assets/locks/python-genai/function-requirements.txt +1734 -0
  12. package/assets/locks/python-genai/liftoff_template_python_genai.egg-info/PKG-INFO +25 -0
  13. package/assets/locks/python-genai/liftoff_template_python_genai.egg-info/SOURCES.txt +6 -0
  14. package/assets/locks/python-genai/liftoff_template_python_genai.egg-info/dependency_links.txt +1 -0
  15. package/assets/locks/python-genai/liftoff_template_python_genai.egg-info/requires.txt +23 -0
  16. package/assets/locks/python-genai/liftoff_template_python_genai.egg-info/top_level.txt +1 -0
  17. package/assets/locks/python-genai/pyproject.toml +42 -0
  18. package/assets/locks/python-genai/uv.lock +2536 -0
  19. package/assets/locks/python-standard/pyproject.toml +36 -0
  20. package/assets/locks/python-standard/uv.lock +1780 -0
  21. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/catalog.json +4 -4
  22. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/package-lock.json +667 -1108
  23. package/assets/supported-stack.json +711 -0
  24. package/dist/args.js +12 -0
  25. package/dist/args.js.map +1 -1
  26. package/dist/catalogs.d.ts +3 -1
  27. package/dist/catalogs.js +29 -7
  28. package/dist/catalogs.js.map +1 -1
  29. package/dist/cli.js +2 -1
  30. package/dist/cli.js.map +1 -1
  31. package/dist/commands.d.ts +6 -0
  32. package/dist/commands.js +243 -40
  33. package/dist/commands.js.map +1 -1
  34. package/dist/container-validation.d.ts +2 -0
  35. package/dist/container-validation.js +26 -0
  36. package/dist/container-validation.js.map +1 -0
  37. package/dist/file-system.js +130 -5
  38. package/dist/file-system.js.map +1 -1
  39. package/dist/framework-adapters.js +1 -0
  40. package/dist/framework-adapters.js.map +1 -1
  41. package/dist/go-template-assets.d.ts +2 -0
  42. package/dist/go-template-assets.js +14 -0
  43. package/dist/go-template-assets.js.map +1 -0
  44. package/dist/init-filesystem.js +5 -4
  45. package/dist/init-filesystem.js.map +1 -1
  46. package/dist/interactive.js +11 -7
  47. package/dist/interactive.js.map +1 -1
  48. package/dist/opentofu-template-assets.d.ts +2 -0
  49. package/dist/opentofu-template-assets.js +10 -0
  50. package/dist/opentofu-template-assets.js.map +1 -0
  51. package/dist/package-identity.d.ts +8 -0
  52. package/dist/package-identity.js +16 -0
  53. package/dist/package-identity.js.map +1 -0
  54. package/dist/planner.js +42 -3
  55. package/dist/planner.js.map +1 -1
  56. package/dist/power-apps-templates.js +6 -0
  57. package/dist/power-apps-templates.js.map +1 -1
  58. package/dist/project-dependencies.d.ts +1 -1
  59. package/dist/project-dependencies.js +15 -34
  60. package/dist/project-dependencies.js.map +1 -1
  61. package/dist/published-verifier.js +11 -1
  62. package/dist/published-verifier.js.map +1 -1
  63. package/dist/python-template-assets.d.ts +4 -0
  64. package/dist/python-template-assets.js +34 -0
  65. package/dist/python-template-assets.js.map +1 -0
  66. package/dist/repository-governance.d.ts +17 -0
  67. package/dist/repository-governance.js +507 -0
  68. package/dist/repository-governance.js.map +1 -0
  69. package/dist/runtime.d.ts +1 -1
  70. package/dist/runtime.js +3 -1
  71. package/dist/runtime.js.map +1 -1
  72. package/dist/self-upgrade.d.ts +77 -0
  73. package/dist/self-upgrade.js +499 -0
  74. package/dist/self-upgrade.js.map +1 -0
  75. package/dist/stable-release.d.ts +18 -0
  76. package/dist/stable-release.js +66 -0
  77. package/dist/stable-release.js.map +1 -0
  78. package/dist/standard-templates.js +28 -97
  79. package/dist/standard-templates.js.map +1 -1
  80. package/dist/supported-stack.d.ts +115 -0
  81. package/dist/supported-stack.js +439 -0
  82. package/dist/supported-stack.js.map +1 -0
  83. package/dist/telemetry/contract.d.ts +1 -1
  84. package/dist/telemetry/contract.js +1 -0
  85. package/dist/telemetry/contract.js.map +1 -1
  86. package/dist/templates.js +214 -123
  87. package/dist/templates.js.map +1 -1
  88. package/dist/types.d.ts +18 -1
  89. package/dist/workstation-catalog.js +15 -12
  90. package/dist/workstation-catalog.js.map +1 -1
  91. package/dist/workstation.js +16 -6
  92. package/dist/workstation.js.map +1 -1
  93. package/docs/cli-reference.md +59 -2
  94. package/docs/configuration-and-manifests.md +13 -5
  95. package/docs/existing-repositories.md +21 -0
  96. package/docs/getting-started.md +23 -7
  97. package/docs/prerequisites.md +30 -4
  98. package/docs/project-structure.md +20 -1
  99. package/docs/repository-governance.md +91 -0
  100. package/docs/safety-and-consent.md +25 -0
  101. package/docs/spec-workflows-and-agents.md +19 -6
  102. package/docs/supported-stack.md +89 -0
  103. package/docs/telemetry.md +6 -0
  104. package/docs/troubleshooting.md +78 -0
  105. package/docs/workloads.md +14 -5
  106. package/package.json +14 -6
@@ -5,6 +5,7 @@ Run `liftoff help` or command-specific help for the authoritative syntax:
5
5
  ```bash
6
6
  liftoff init --help
7
7
  liftoff migrate --help
8
+ liftoff upgrade --help
8
9
  liftoff update --help
9
10
  ```
10
11
 
@@ -14,7 +15,7 @@ duplicates, and extra positional arguments fail before generation.
14
15
  ## Lifecycle
15
16
 
16
17
  ```text
17
- plan -> init or migrate -> validate and doctor -> update -> dev and infra helpers
18
+ install -> upgrade CLI -> plan -> init or migrate -> validate and doctor -> update project -> dev and infra helpers
18
19
  ```
19
20
 
20
21
  | Command | Behavior |
@@ -24,6 +25,8 @@ plan -> init or migrate -> validate and doctor -> update -> dev and infra helper
24
25
  | `liftoff migrate <source>` | Creates a new sibling scaffold and filtered source copy without changing the source |
25
26
  | `liftoff validate [project]` | Validates manifest identity, durable files, workload metadata, and framework markers |
26
27
  | `liftoff doctor [project]` | Runs read-only workload-derived project and workstation diagnostics |
28
+ | `liftoff upgrade` | Replaces a verified global npm installation with the exact canonical stable release exposed by the configured registry |
29
+ | `liftoff upgrade --check` | Checks installation origin and registry parity without installing; exits 2 when an installable update exists |
27
30
  | `liftoff update [project]` | Applies safe managed drift immediately, preserves unforced conflicts and orphans, and records the resulting manifest |
28
31
  | `liftoff update --check` | Reports drift without preflight or mutation; exits 0 when clean and 2 when drift exists |
29
32
  | `liftoff update --force` | Applies safe changes and overwrites only the exact guarded conflicts reported by update |
@@ -38,6 +41,11 @@ plan -> init or migrate -> validate and doctor -> update -> dev and infra helper
38
41
  The former `liftoff create` command is intentionally rejected with guidance to
39
42
  use `liftoff init`; there is no compatibility alias.
40
43
 
44
+ Generation, validation, doctor, and update consume the packaged
45
+ [supported-stack baseline](supported-stack.md). The current contract uses
46
+ Node.js 24 LTS, Python 3.14, Go 1.27, OpenTofu 1.12, OpenSpec 1.11, and Spec Kit
47
+ 1.0 release lines; these commands never resolve mutable latest versions.
48
+
41
49
  ## Planning and initialization options
42
50
 
43
51
  Common noninteractive inputs include:
@@ -53,6 +61,7 @@ Common noninteractive inputs include:
53
61
  --spec openspec|spec-kit
54
62
  --agents copilot,claude
55
63
  --default-agent copilot|claude
64
+ --governance single-maintainer-gitflow|none
56
65
  --code-apps-plugin | --no-code-apps-plugin
57
66
  ```
58
67
 
@@ -60,6 +69,44 @@ Power Apps rejects API, pattern, cloud, region, frontend, and API environment
60
69
  options rather than ignoring them.
61
70
 
62
71
  Consent options are documented in [safety and consent](safety-and-consent.md).
72
+ Repository governance defaults to `single-maintainer-gitflow`. It generates a
73
+ local policy handoff only; `none` omits it. See
74
+ [repository governance](repository-governance.md).
75
+
76
+ ## CLI upgrade modes
77
+
78
+ ```bash
79
+ liftoff upgrade
80
+ liftoff upgrade --check
81
+ liftoff upgrade --json
82
+ liftoff upgrade --check --json
83
+ ```
84
+
85
+ `liftoff upgrade` is an imperative request to replace the supported global npm
86
+ installation of `@msn-control/liftoff`; it does not prompt or accept `--yes`,
87
+ `--force`, `--install-tools`, project paths, or project dependency flags.
88
+ Automatic replacement is refused for local dependencies, `npx` execution-cache
89
+ copies, linked checkouts, unknown package-manager stores, ambiguous roots, or
90
+ unsafe paths.
91
+
92
+ Canonical npm's stable `latest` metadata selects one exact target. The effective
93
+ configured npm registry remains the delivery path and must expose that exact
94
+ version. Liftoff never edits `.npmrc`, embeds registry credentials, forces a
95
+ canonical bypass around a stale mirror, invokes elevation, installs a
96
+ prerelease, or performs a downgrade.
97
+
98
+ `--check` performs the same origin, target, and parity checks without invoking
99
+ installation. Apply uses one shell-free exact npm command with lifecycle scripts,
100
+ audit, and funding prompts disabled, then verifies installed metadata, the
101
+ confined binary, and exact `Liftoff <version>` output. A failed install or
102
+ verification is not automatically rolled back; use the exact-version repair
103
+ command printed by Liftoff.
104
+
105
+ JSON results use schema version 1 and expose only `mode`, `status`,
106
+ `currentVersion`, applicable `targetVersion`, applicable `registryKind`, and a
107
+ stable `reasonCode`. Status is one of `current`, `update-available`, `upgraded`,
108
+ `blocked`, or `failed`. Child progress goes to stderr so stdout remains one JSON
109
+ object.
63
110
 
64
111
  ## Update modes
65
112
 
@@ -75,6 +122,9 @@ Plain `liftoff update` is imperative and prompt-free. It applies safe new,
75
122
  missing, untouched-upgrade, clean-move, and recorded-state changes in
76
123
  interactive terminals, redirected streams, and automation. Local or user-owned
77
124
  conflicts are skipped and reported. Orphans are reported without deletion.
125
+ During legacy governance adoption, preserved unrecorded conflicts remain
126
+ outside manifest ownership and set local state to `handoff-partial` until a
127
+ later update can write or byte-identically adopt every required artifact.
78
128
 
79
129
  Use `--check` whenever no project bytes may change. Human check mode prints each
80
130
  drift state and recommends plain update for safe changes or a reviewed
@@ -92,6 +142,10 @@ stack, GenAI pattern, framework, selected-agent, or user-supplied Power Apps
92
142
  starter identity changes, and it cannot bypass project-boundary, symlink,
93
143
  structural-collision, or manifest guards.
94
144
 
145
+ For a breaking supported-stack release, inspect `liftoff update --check` before
146
+ plain update. Restore an unwanted applied migration through version control;
147
+ running an older CLI is not a supported automatic downgrade.
148
+
95
149
  ### Migration from 0.6.x
96
150
 
97
151
  The `--apply` flag was removed in 0.7.0. These are historical 0.6.x commands,
@@ -113,6 +167,8 @@ Machine-readable maintenance contracts bypass decorative presentation:
113
167
  ```bash
114
168
  liftoff validate --json
115
169
  liftoff doctor --json
170
+ liftoff upgrade --json
171
+ liftoff upgrade --check --json
116
172
  liftoff update --json
117
173
  liftoff update --check --json
118
174
  ```
@@ -125,7 +181,8 @@ Exit codes:
125
181
 
126
182
  - `0`: success or a clean check.
127
183
  - `1`: invalid input, unsafe state, or command failure.
128
- - `2`: explicit update check mode found drift.
184
+ - `2`: an explicit update check found project drift, or upgrade check found an
185
+ installable CLI release.
129
186
 
130
187
  Raw installer, framework, and dependency child stdout and stderr are forwarded
131
188
  unchanged.
@@ -24,6 +24,7 @@ A Power Apps configuration contains only applicable fields:
24
24
  "projectType": "power-apps-code-app",
25
25
  "specWorkflow": "openspec",
26
26
  "agents": ["github-copilot"],
27
+ "governanceProfile": "single-maintainer-gitflow",
27
28
  "codeAppsPlugin": false
28
29
  }
29
30
  ```
@@ -33,7 +34,7 @@ workload rather than silently ignored.
33
34
 
34
35
  ## `liftoff.manifest.json`: CLI-owned compatibility record
35
36
 
36
- New projects use manifest schema v4. Its common project identity includes the
37
+ New projects use manifest schema v5. Its common project identity includes the
37
38
  name, spec workflow, selected agents, and applicable Spec Kit default. A
38
39
  discriminated `project.workload` object contains only fields valid for one
39
40
  workload:
@@ -50,6 +51,8 @@ The manifest also records:
50
51
  - Durable artifact logical names.
51
52
  - OS-neutral path-part arrays.
52
53
  - `sha256:` content hashes.
54
+ - Repository governance profile, policy version, and local
55
+ `handoff-generated`, `handoff-partial`, or disabled state.
53
56
 
54
57
  Power Apps source identity uses explicit repository, path, and 40-character
55
58
  commit fields. It is not inferred from mutable URLs or generated file paths.
@@ -60,16 +63,21 @@ paths, or hashes.
60
63
 
61
64
  ## Compatibility
62
65
 
63
- Readers support schemas v2, v3, and v4:
66
+ Readers support schemas v2, v3, v4, and v5:
64
67
 
65
68
  - V2 normalizes the legacy flat API identity and records framework state as
66
69
  uncertain without inventing agents.
67
70
  - V3 normalizes flat GenAI or API identity plus framework and agent metadata.
68
71
  - V4 represents the discriminated workload model, including Power Apps.
72
+ - V5 adds repository-governance handoff identity without claiming live
73
+ enforcement.
69
74
 
70
75
  `liftoff update --check`, including `--check --json`, leaves an old manifest
71
- byte-for-byte unchanged. A successful plain update writes v4 only after the
72
- file transaction succeeds. Skipped conflicts retain their recorded hashes.
76
+ byte-for-byte unchanged. A successful plain update writes v5 only after the
77
+ file transaction succeeds. Previously recorded skipped conflicts retain their
78
+ hashes. A preserved unrecorded governance conflict has no artifact entry and
79
+ sets the update-written manifest to `handoff-partial`; resolving every such
80
+ conflict promotes the next manifest to `handoff-generated`.
73
81
 
74
82
  ## Artifact ownership
75
83
 
@@ -88,7 +96,7 @@ can follow their own lifecycle.
88
96
 
89
97
  ## Contract conventions
90
98
 
91
- - Writers use `artifactVersion` 4; readers support v2, v3, and v4.
99
+ - Writers use `artifactVersion` 5; readers support v2, v3, v4, and v5.
92
100
  - Artifact logical names and catalog identifiers are append-only.
93
101
  - Rendering is deterministic and does not depend on timestamps, host versions,
94
102
  or network state.
@@ -74,6 +74,27 @@ automation, while preserving conflicts and orphans. Review every reported
74
74
  conflict and commit or copy local work before choosing `liftoff update --force`.
75
75
  For CI drift gates, use `liftoff update --check --json`.
76
76
 
77
+ Projects created before manifest schema v5 automatically preview the default
78
+ repository-governance handoff as new named drift. Plain update safely adopts
79
+ collision-free policy, context, guide, and selected-agent launchers without
80
+ rewriting a configuration that omitted `governanceProfile`. Existing different
81
+ files remain unowned conflicts and the v5 manifest records `handoff-partial`.
82
+ Resolving every conflict promotes a later update to `handoff-generated`.
83
+ Selecting `none` leaves previously managed handoff files as undeleted orphans
84
+ while unrecorded conflicts remain user-owned. No update mode runs an agent or
85
+ activates GitHub settings.
86
+
87
+ Major supported-stack releases can report many runtime, lock, Docker, provider,
88
+ and framework artifact changes at once. Treat those releases as breaking:
89
+ commit or copy local work, inspect `liftoff update --check`, and apply only after
90
+ reviewing all upgrades and conflicts. Plain update preserves conflicting local
91
+ bytes and never requires `--force` as the default migration path.
92
+
93
+ If an applied baseline migration must be reversed, restore the project and
94
+ manifest through version control and reinstall from the restored locks. Liftoff
95
+ does not automatically downgrade generated dependencies and retains no backup
96
+ after a successful update.
97
+
77
98
  ## Existing non-Liftoff application
78
99
 
79
100
  Use migration when you want a fresh governed scaffold and a filtered source
@@ -5,8 +5,8 @@ standard APIs, and Power Apps code apps.
5
5
 
6
6
  ## 1. Install the CLI
7
7
 
8
- Liftoff requires Node.js 20.19 or newer. Power Apps code app projects require
9
- Node.js 22.12 or newer for their generated framework.
8
+ Liftoff and generated Node.js workloads require Node.js 24.20 or newer.
9
+ Python workloads use Python 3.14 with frozen `uv` dependency locks.
10
10
 
11
11
  The canonical release registry is `https://registry.npmjs.org`:
12
12
 
@@ -23,6 +23,18 @@ canonical npm. Stop if the mirror is older or rejects the explicit current
23
23
  version; ask the mirror owner to synchronize or approve the release. Liftoff
24
24
  does not modify `.npmrc` or bypass registry policy.
25
25
 
26
+ Versions predating the self-upgrade command require that manual global install
27
+ once. After a capable version is installed globally with npm, use:
28
+
29
+ ```bash
30
+ liftoff upgrade --check
31
+ liftoff upgrade
32
+ ```
33
+
34
+ `upgrade` replaces only the supported global CLI installation. It does not read
35
+ or update a generated project; inspect project template changes separately with
36
+ `liftoff update --check`.
37
+
26
38
  See [prerequisites](prerequisites.md) for the complete plan-derived tool model.
27
39
 
28
40
  ## 2. Start interactive initialization
@@ -37,16 +49,20 @@ The guided flow asks for:
37
49
 
38
50
  1. Project identity and workload: GenAI, API, or Power Apps code app.
39
51
  2. Only the architecture choices applicable to that workload.
40
- 3. OpenSpec or Spec Kit.
41
- 4. One or both coding agents. On a real TTY, Space toggles agents and Enter
52
+ 3. Whether to generate the default single-maintainer GitFlow repository-
53
+ governance handoff. Accepting it creates local files only.
54
+ 4. OpenSpec or Spec Kit.
55
+ 5. One or both coding agents. On a real TTY, Space toggles agents and Enter
42
56
  confirms the selection.
43
- 5. A Spec Kit default agent when both agents are selected.
44
- 6. The optional Preview Code Apps plugin preference for Power Apps projects.
45
- 7. Plan confirmation, workstation readiness, and any separate install or
57
+ 6. A Spec Kit default agent when both agents are selected.
58
+ 7. The optional Preview Code Apps plugin preference for Power Apps projects.
59
+ 8. Plan confirmation, workstation readiness, and any separate install or
46
60
  overwrite permissions that are needed.
47
61
 
48
62
  Liftoff renders into temporary staging, runs the official framework initializer
49
63
  there, validates the complete result, and only then merges it into the target.
64
+ Governance activation is a later selected-agent action after commit and push;
65
+ see [repository governance](repository-governance.md).
50
66
 
51
67
  ## 3. Understand the target
52
68
 
@@ -6,13 +6,21 @@ and a Go API is not asked to install Python.
6
6
 
7
7
  ## Baseline
8
8
 
9
- - Liftoff CLI: Node.js 20.19 or newer.
10
- - Power Apps code app: Node.js 22.12 or newer.
11
- - Selected framework: the Liftoff-tested OpenSpec or Spec Kit contract.
9
+ - Liftoff CLI and generated Node.js workloads: Node.js 24.20 or newer.
10
+ - Python projects: Python 3.14 and `uv` 0.12.7 or newer.
11
+ - Go projects: Go 1.27 or newer.
12
+ - Generated Azure infrastructure: OpenTofu 1.12.6 or newer.
13
+ - Selected framework: OpenSpec 1.11.0 or Spec Kit 1.0.1 exactly.
12
14
  - Selected agents: GitHub Copilot, Claude Code, or both.
13
15
 
16
+ Automatic `liftoff upgrade` additionally requires that the running canonical
17
+ `@msn-control/liftoff` package is a normal global npm installation beneath
18
+ `npm root --global`. Local dependencies, `npx` cache copies, linked checkouts,
19
+ and other package-manager stores use the documented manual global npm command
20
+ instead. Liftoff never requests elevation.
21
+
14
22
  API workloads additionally require their selected Python, Node.js, or Go
15
- runtime. GenAI uses Python 3.12 and the Python/FastAPI/PydanticAI stack.
23
+ runtime. GenAI uses Python 3.14 and the Python/FastAPI/PydanticAI stack.
16
24
 
17
25
  ## Blocking and advisory checks
18
26
 
@@ -32,6 +40,11 @@ Advisory checks describe useful but deferrable capabilities:
32
40
  Authentication checks are read-only. Liftoff never stores credentials or signs
33
41
  in to a cloud or agent on your behalf.
34
42
 
43
+ The default repository-governance handoff has no additional initialization
44
+ prerequisite. `gh`, a remote, licensed GitHub security features, private runners,
45
+ Slack, and deployment access are discovered only during post-push Phase 0 and
46
+ may be reported as gaps; they do not block local generation.
47
+
35
48
  ## Preview requirements without writes
36
49
 
37
50
  `liftoff plan` shows both generated artifacts and workstation requirements
@@ -76,6 +89,19 @@ the project is ready.
76
89
  GenAI and API projects use their generated stack-native locked dependency
77
90
  commands.
78
91
 
92
+ Python projects use the generated lock without resolving new versions:
93
+
94
+ ```bash
95
+ uv sync --frozen --project backend --extra test
96
+ ```
97
+
98
+ Worker-enabled GenAI projects add `--extra functions`. Node.js projects use
99
+ `npm ci`, and Go projects use `go mod download`.
100
+
101
+ Liftoff's npm locks are generated with npm 12.0.2 and verified in the supported
102
+ compatibility lanes. Do not replace a committed lock with an install from
103
+ open-ended manifest ranges.
104
+
79
105
  ## Power Apps local CLI
80
106
 
81
107
  The Power Apps CLI is supplied by the generated project dependency graph.
@@ -14,7 +14,13 @@ project/
14
14
  |-- .env.example
15
15
  |-- Dockerfile
16
16
  |-- docker-compose.yml
17
+ |-- .liftoff/
18
+ | `-- governance/ # durable local handoff when enabled
19
+ | |-- policy.md
20
+ | |-- context.json
21
+ | `-- README.md
17
22
  |-- backend/
23
+ | `-- uv.lock # Python stacks only
18
24
  |-- database/
19
25
  | |-- alembic.ini or stack-native migration config
20
26
  | |-- migrations/
@@ -26,7 +32,10 @@ project/
26
32
  |-- infrastructure/
27
33
  | `-- opentofu/
28
34
  | `-- azure/
35
+ | `-- .terraform.lock.hcl
29
36
  |-- openspec/ or .specify/
37
+ |-- .github/prompts/liftoff-repository-governance.prompt.md
38
+ | or .claude/commands/liftoff-repository-governance.md
30
39
  |-- frontend/ # only when selected
31
40
  |-- functions/<worker-name>/ # only for worker-enabled GenAI patterns
32
41
  `-- migration/legacy/ # only after liftoff migrate
@@ -45,7 +54,11 @@ project/
45
54
  Functions settings when a worker is generated.
46
55
  - `docker-compose.yml` starts the selected backend, PostgreSQL, Redis,
47
56
  Azurite, and Mailpit. GenAI projects use pgvector where needed and include an
48
- optional Langfuse profile.
57
+ optional Langfuse v4 web/worker profile backed by ClickHouse, dedicated Redis,
58
+ and MinIO.
59
+ - Python Docker builds export the committed `uv.lock` in frozen mode and install
60
+ only hash-verified requirements. `UV_DEFAULT_INDEX` can select a
61
+ credential-free managed mirror without changing the lock.
49
62
  - `infrastructure/opentofu/azure` contains modules, environment tfvars, local
50
63
  state configuration, and a remote-state example.
51
64
  - `openspec` is created for OpenSpec. `.specify` and `specs` are created for
@@ -87,6 +100,12 @@ project/
87
100
  `-- openspec/ or .specify/
88
101
  ```
89
102
 
103
+ The exact selected-agent governance launcher is generated only when the
104
+ repository-governance profile is enabled. It is Liftoff-owned; neighboring
105
+ framework files remain framework-owned. Agent-created governance changes and
106
+ `governance/activation-baseline.json` remain user-owned and are not listed in
107
+ the manifest.
108
+
90
109
  This root follows the pinned official Microsoft starter. It includes the
91
110
  Power Apps SDK, Vite plugin, and project-local CLI through locked npm
92
111
  dependencies.
@@ -0,0 +1,91 @@
1
+ # Repository governance handoff
2
+
3
+ Repository governance is a common Liftoff project choice. The default
4
+ `single-maintainer-gitflow` profile generates a deterministic local handoff;
5
+ `none` opts out:
6
+
7
+ **Local handoff generated; live enforcement is not active.**
8
+
9
+ ```bash
10
+ liftoff plan --governance single-maintainer-gitflow
11
+ liftoff init --governance none
12
+ ```
13
+
14
+ Accepting the default or passing `--yes` authorizes only local project files. It
15
+ does not run an agent, mutate Git, contact GitHub, configure security, install a
16
+ ruleset, deploy, or create monitoring.
17
+
18
+ ## Generated files
19
+
20
+ An enabled profile adds durable, hash-managed artifacts:
21
+
22
+ ```text
23
+ .liftoff/governance/policy.md
24
+ .liftoff/governance/context.json
25
+ .liftoff/governance/README.md
26
+ .github/prompts/liftoff-repository-governance.prompt.md # Copilot selected
27
+ .claude/commands/liftoff-repository-governance.md # Claude selected
28
+ ```
29
+
30
+ The complete canonical policy is also packaged with Liftoff at
31
+ [`assets/governance/single-maintainer-gitflow/policy.md`](../assets/governance/single-maintainer-gitflow/policy.md).
32
+ It covers GitFlow, zero-human-approval repository rules, designated security
33
+ tools, fail-closed checks, immutable release evidence, build-once promotion,
34
+ deployment and rollback, monitoring and health, DORA metrics, ruleset
35
+ sequencing, negative tests, documentation, and workload adaptation.
36
+
37
+ `context.json` contains generated project facts only. GitHub repository state,
38
+ runner access, licensed features, deployments, monitoring, alert routes,
39
+ traffic, and rollout capabilities remain `undiscovered`. Power Apps context
40
+ explicitly marks Liftoff backend, Docker, OpenTofu, custom container promotion,
41
+ and API DAST as inapplicable.
42
+
43
+ ## Activate after commit and push
44
+
45
+ 1. Review the policy and context.
46
+ 2. Commit the project and push it to the intended GitHub repository.
47
+ 3. Run `/liftoff-repository-governance` with a selected agent.
48
+ 4. The agent performs read-only Phase 0 and reports repository identity,
49
+ artifacts, working commands, refs, workflows and exact checks, rulesets,
50
+ releases, environments, security, runners, deployments, monitoring, alerts,
51
+ health depth, platform capabilities, gaps, and inapplicable controls.
52
+ 5. The agent proposes the current `main` SHA as the activation baseline,
53
+ presents an ordered plan, and stops.
54
+ 6. Explicitly approve or revise the conversational plan. This is not a human
55
+ merge or deployment approval gate.
56
+ 7. After approval, the agent creates a new OpenSpec or Spec Kit governance
57
+ change, proves required contexts green and deliberately red, applies
58
+ repository-scoped rulesets last, and reads live enforcement back.
59
+
60
+ The user-owned `governance/activation-baseline.json` is created only after
61
+ approval. Liftoff never owns or recreates it or the agent-created governance
62
+ change. Complete local handoffs say `handoff-generated`, partial adoptions say
63
+ `handoff-partial`, and neither state means `active`.
64
+
65
+ ## Existing projects
66
+
67
+ Configurations without `governanceProfile` normalize to the enabled default
68
+ without rewriting `liftoff.config.json`:
69
+
70
+ ```bash
71
+ liftoff update --check
72
+ liftoff update
73
+ ```
74
+
75
+ Check mode previews the schema-v5 manifest and new named artifacts without
76
+ writing. Plain update applies collision-free files; differing existing files
77
+ remain conflicts unless individually reviewed with `--force`. An unrecorded
78
+ conflict remains outside Liftoff ownership and produces `handoff-partial`.
79
+ After every conflict is removed or matches the current artifact, the next
80
+ update records the full artifact set as `handoff-generated`.
81
+
82
+ Setting `"governanceProfile": "none"` stops future rendering. Previously managed
83
+ handoff files are reported once as orphans and left on disk; Liftoff never
84
+ deletes them automatically or changes live repository settings.
85
+
86
+ ## Capability gaps
87
+
88
+ Phase 0 must report missing GitHub licenses, private runners, staging access,
89
+ monitoring routes, parallel-version mechanisms, or statistically meaningful
90
+ canary traffic. It must mark controls inapplicable or blocked rather than
91
+ creating a skipped, hanging, duplicate, or success-shaped placeholder.
@@ -14,6 +14,29 @@ project dependencies. No one permission implies another.
14
14
 
15
15
  Interactive sessions ask separately at the point each permission is needed.
16
16
 
17
+ Selecting repository governance or passing `--yes` authorizes only deterministic
18
+ local handoff files. It never authorizes agent execution, Git mutation, GitHub
19
+ APIs, rulesets, security configuration, deployment, monitoring, file
20
+ replacement, machine tools, or project dependencies. Live activation begins
21
+ only after commit, push, read-only Phase 0, and explicit plan approval.
22
+
23
+ ## CLI self-upgrade boundary
24
+
25
+ `liftoff upgrade` is itself the narrow authorization to replace a supported
26
+ global npm installation with one exact stable version. It accepts no project
27
+ path, `--yes`, `--force`, tool-install, or dependency-install permission.
28
+ `liftoff upgrade --check` is read-only and invokes no npm installation.
29
+
30
+ Both modes operate from a temporary neutral directory so a project `.npmrc`
31
+ cannot redirect machine-level discovery. Canonical npm selects the target while
32
+ the configured registry must provide that exact release. Liftoff does not expose
33
+ registry credentials, rewrite npm configuration, bypass a stale mirror, invoke
34
+ `sudo` or another elevation mechanism, or touch project files.
35
+
36
+ npm replacement is not a Liftoff file transaction. If npm or post-install
37
+ verification fails, Liftoff reports an exact-version repair command and does not
38
+ claim automatic rollback.
39
+
17
40
  ## Staged initialization
18
41
 
19
42
  Initialization does not write generated files directly into the destination.
@@ -77,6 +100,8 @@ Update mode is selected explicitly rather than from terminal interactivity:
77
100
  - Default update skips conflicts and lists them by portable relative path.
78
101
  After reviewing every listed overwrite, `liftoff update --force` extends the
79
102
  transaction only to those guarded conflicts.
103
+ - Unrecorded governance conflicts remain outside manifest ownership and produce
104
+ `handoff-partial` until a later update safely writes or adopts every artifact.
80
105
  - Orphans are reported and left on disk for manual review.
81
106
  - Dependency definitions may be updated, but update never installs
82
107
  dependencies.
@@ -7,8 +7,8 @@ Liftoff workload.
7
7
 
8
8
  ### OpenSpec
9
9
 
10
- OpenSpec organizes proposed behavior changes as reviewable artifacts before
11
- implementation. Liftoff runs the pinned official OpenSpec initializer in
10
+ OpenSpec 1.11.0 organizes proposed behavior changes as reviewable artifacts
11
+ before implementation. Liftoff runs that pinned official initializer in
12
12
  temporary staging and passes every selected coding agent in stable order.
13
13
 
14
14
  Generated projects contain `openspec/` plus the selected agent integration
@@ -16,10 +16,9 @@ markers.
16
16
 
17
17
  ### Spec Kit
18
18
 
19
- Spec Kit provides a specification, planning, and implementation workflow.
20
- Liftoff initializes the selected default coding agent first, adds every
21
- secondary integration, and records the default separately from the full agent
22
- set.
19
+ Spec Kit 1.0.1 provides a specification, planning, and implementation workflow.
20
+ Liftoff initializes the selected default coding agent first, adds every secondary
21
+ integration, and records the default separately from the full agent set.
23
22
 
24
23
  Generated projects contain `.specify/`, `specs/`, and the selected agent
25
24
  integration markers.
@@ -66,6 +65,20 @@ Framework files remain owned by the official initializer. Liftoff validates
66
65
  them but excludes framework-owned output from durable artifact hashes so a
67
66
  framework can manage its own lifecycle.
68
67
 
68
+ Repository-governance launchers are separate durable Liftoff files at the exact
69
+ Copilot prompt and Claude command paths documented in
70
+ [repository governance](repository-governance.md). They reference one canonical
71
+ policy and context rather than duplicating framework-owned content. After
72
+ read-only Phase 0 and explicit approval, the agent creates a new change using
73
+ the selected framework; Liftoff never pre-creates or restores that change.
74
+
75
+ Install the exact selected framework release with its supported package manager:
76
+
77
+ ```bash
78
+ npm install -g @fission-ai/openspec@1.11.0
79
+ uv tool install specify-cli==1.0.1
80
+ ```
81
+
69
82
  ## Optional Code Apps plugin
70
83
 
71
84
  Power Apps projects can request Microsoft's
@@ -0,0 +1,89 @@
1
+ # Supported stack baseline
2
+
3
+ Each Liftoff release packages one tested dependency baseline in
4
+ `assets/supported-stack.json`. Project generation and update use that committed
5
+ file; they never resolve mutable `latest` versions.
6
+
7
+ ## Runtime and framework baseline
8
+
9
+ | Surface | Tested release |
10
+ | --- | --- |
11
+ | Node.js | 24.20.0 LTS |
12
+ | npm | 12.0.2 |
13
+ | Python | 3.14.7 |
14
+ | `uv` | 0.12.7 |
15
+ | Go | 1.27.0 |
16
+ | OpenTofu | 1.12.6 |
17
+ | OpenSpec | 1.11.0 |
18
+ | Spec Kit | 1.0.1 |
19
+ | AzureRM provider | 5.3.0 |
20
+ | Power Apps SDK | 1.2.7 |
21
+
22
+ Power Apps SDK 1.2.7 is an explicit compatibility selection. Versions 1.2.12
23
+ and newer remove the project-local `power-apps` CLI required by Liftoff's
24
+ current workload contract. Moving to Microsoft's global `pa` CLI is a separate
25
+ reviewed workload migration; the freshness check recognizes only the recorded
26
+ 1.3.0 exclusion and will reopen the decision when a newer candidate appears.
27
+
28
+ Generated npm projects include `package-lock.json`. Python projects include
29
+ `uv.lock` and use `uv sync --frozen`. Go projects include `go.mod` and
30
+ `go.sum`. Generated OpenTofu includes a multi-platform `.terraform.lock.hcl`.
31
+
32
+ Container references include a readable stable tag and an immutable
33
+ multi-architecture digest. The optional Langfuse profile uses the v4 web and
34
+ worker services with pinned ClickHouse, Redis, and MinIO dependencies.
35
+
36
+ ## Refresh policy
37
+
38
+ Maintainers compare the committed baseline with canonical ecosystem sources:
39
+
40
+ ```bash
41
+ npm run check:supported-stack
42
+ npm run check:supported-stack-freshness
43
+ ```
44
+
45
+ The first command verifies that package manifests and lockfiles match the
46
+ committed baseline. The second is a networked, fail-closed freshness check.
47
+ A newer release is not promoted automatically: update manifests and source for
48
+ compatibility, regenerate ecosystem-native locks, review immutable image
49
+ digests and upstream provenance, then run:
50
+
51
+ ```bash
52
+ npm run refresh:supported-stack
53
+ npm run check
54
+ npm run verify:standard-node-templates
55
+ npm run verify:power-apps-starter
56
+ ```
57
+
58
+ Power Apps source is refreshed only through its reviewed immutable upstream
59
+ commit workflow. Do not edit Microsoft-owned starter files independently.
60
+
61
+ ## Existing generated projects
62
+
63
+ Upgrade the globally installed Liftoff CLI, then inspect project-managed changes
64
+ as a separate operation:
65
+
66
+ ```bash
67
+ liftoff upgrade --check
68
+ liftoff upgrade
69
+ liftoff update --check
70
+ liftoff update
71
+ liftoff validate
72
+ liftoff doctor
73
+ ```
74
+
75
+ Untouched managed files and new lockfiles can be updated automatically.
76
+ Locally modified files remain conflicts unless explicitly reviewed with
77
+ `liftoff update --force`. Liftoff never installs the updated project
78
+ dependencies during `update`; run the generated `npm ci`, `uv sync --frozen`,
79
+ or `go mod download` command afterward. CLI upgrade does not discover or modify
80
+ the project.
81
+
82
+ This baseline is a breaking release boundary: it raises the Node.js, Python, Go,
83
+ and OpenTofu floors and includes major framework, provider, frontend, container,
84
+ and dependency migrations. Commit or otherwise preserve local work, run
85
+ `liftoff update --check`, and review every named upgrade and conflict before
86
+ applying. Do not use an older Liftoff release as an automatic downgrade tool.
87
+ After a successful update, recover unwanted changes through version control and
88
+ then reinstall from the restored locks; Liftoff does not retain a post-success
89
+ backup.
package/docs/telemetry.md CHANGED
@@ -24,6 +24,12 @@ code. It is an exit-status class, not an error diagnosis. Help requests are
24
24
  recorded as `help`, and rejected input that never resolves to a recognized
25
25
  command is not recorded.
26
26
 
27
+ `upgrade` is recorded only as the aggregate command value. Check/apply mode,
28
+ target or configured-registry details, installation origin, paths, npm output,
29
+ reason codes, and errors are not added. The replacement binary's verification
30
+ process runs with telemetry and disclosure disabled, so at most the originally
31
+ invoked parent command emits an event.
32
+
27
33
  Liftoff does **not** send:
28
34
 
29
35
  - An installation, user, device, or session identifier.