@msn-control/liftoff 0.9.0 → 0.9.2

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 (42) hide show
  1. package/README.md +8 -5
  2. package/assets/locks/frontend/package-lock.json +51 -51
  3. package/assets/locks/frontend/package.json +1 -1
  4. package/assets/locks/node-backend/package-lock.json +353 -12
  5. package/assets/locks/node-backend/package.json +3 -3
  6. package/assets/supported-stack.json +9 -9
  7. package/dist/args.js +5 -5
  8. package/dist/args.js.map +1 -1
  9. package/dist/artifact-lifecycle.d.ts +4 -0
  10. package/dist/artifact-lifecycle.js +38 -0
  11. package/dist/artifact-lifecycle.js.map +1 -0
  12. package/dist/commands.js +327 -76
  13. package/dist/commands.js.map +1 -1
  14. package/dist/file-system.d.ts +1 -1
  15. package/dist/file-system.js +171 -29
  16. package/dist/file-system.js.map +1 -1
  17. package/dist/init-filesystem.js +2 -2
  18. package/dist/init-filesystem.js.map +1 -1
  19. package/dist/power-apps-templates.js +3 -1
  20. package/dist/power-apps-templates.js.map +1 -1
  21. package/dist/reconcile.js +4 -10
  22. package/dist/reconcile.js.map +1 -1
  23. package/dist/repository-governance.js +4 -0
  24. package/dist/repository-governance.js.map +1 -1
  25. package/dist/stable-release.js +1 -1
  26. package/dist/stable-release.js.map +1 -1
  27. package/dist/templates.d.ts +5 -1
  28. package/dist/templates.js +102 -56
  29. package/dist/templates.js.map +1 -1
  30. package/dist/types.d.ts +24 -4
  31. package/docs/cli-reference.md +39 -25
  32. package/docs/configuration-and-manifests.md +39 -24
  33. package/docs/existing-repositories.md +15 -15
  34. package/docs/getting-started.md +3 -2
  35. package/docs/project-structure.md +6 -1
  36. package/docs/repository-governance.md +2 -2
  37. package/docs/safety-and-consent.md +22 -17
  38. package/docs/spec-workflows-and-agents.md +5 -4
  39. package/docs/supported-stack.md +14 -17
  40. package/docs/troubleshooting.md +16 -8
  41. package/docs/workloads.md +9 -8
  42. package/package.json +1 -1
@@ -23,13 +23,13 @@ install -> upgrade CLI -> plan -> init or migrate -> validate and doctor -> upda
23
23
  | `liftoff plan` | Resolves decisions and previews artifacts and requirements without side effects |
24
24
  | `liftoff init [project-name]` | Initializes a named child or the exact current Git root through staged readiness and framework setup |
25
25
  | `liftoff migrate <source>` | Creates a new sibling scaffold and filtered source copy without changing the source |
26
- | `liftoff validate [project]` | Validates manifest identity, durable files, workload metadata, and framework markers |
26
+ | `liftoff validate [project]` | Validates manifest identity, managed-core hashes, project provenance, workload metadata, and framework markers |
27
27
  | `liftoff doctor [project]` | Runs read-only workload-derived project and workstation diagnostics |
28
28
  | `liftoff upgrade` | Replaces a verified global npm installation with the exact canonical stable release exposed by the configured registry |
29
29
  | `liftoff upgrade --check` | Checks installation origin and registry parity without installing; exits 2 when an installable update exists |
30
- | `liftoff update [project]` | Applies safe managed drift immediately, preserves unforced conflicts and orphans, and records the resulting manifest |
31
- | `liftoff update --check` | Reports drift without preflight or mutation; exits 0 when clean and 2 when drift exists |
32
- | `liftoff update --force` | Applies safe changes and overwrites only the exact guarded conflicts reported by update |
30
+ | `liftoff update [project]` | Applies safe managed-core maintenance and authorized create-only component provisioning |
31
+ | `liftoff update --check` | Reports core maintenance and provisioning without mutation; exits 0 when clean and 2 when actionable |
32
+ | `liftoff update --force` | Overwrites only exact guarded managed-core conflicts; project-owned files remain unreachable |
33
33
  | `liftoff dev` | Prints workload-appropriate local development commands; it does not execute them |
34
34
  | `liftoff infra` | Prints OpenTofu guidance for API workloads and reports infrastructure as not applicable for Power Apps |
35
35
  | `liftoff patterns` | Lists GenAI patterns |
@@ -132,32 +132,44 @@ liftoff update --check --json
132
132
  ```
133
133
 
134
134
  Plain `liftoff update` is imperative and prompt-free. It applies safe new,
135
- missing, untouched-upgrade, clean-move, and recorded-state changes in
136
- interactive terminals, redirected streams, and automation. Local or user-owned
137
- conflicts are skipped and reported. Orphans are reported without deletion.
138
- During legacy governance adoption, preserved unrecorded conflicts remain
139
- outside manifest ownership and set local state to `handoff-partial` until a
140
- later update can write or byte-identically adopt every required artifact.
141
-
142
- Use `--check` whenever no project bytes may change. Human check mode prints each
143
- drift state and recommends plain update for safe changes or a reviewed
144
- `--force` invocation for conflicts. `--check --force` is invalid because check
145
- mode never authorizes writes.
135
+ missing, untouched-upgrade, clean-move, and recorded-state changes only for
136
+ explicit `managed-core` artifacts. Core conflicts are skipped and core orphans
137
+ are reported without deletion. During legacy governance adoption, preserved
138
+ unrecorded conflicts remain outside managed ownership and set local state to
139
+ `handoff-partial`.
140
+
141
+ Application source, tests, dependencies and locks, database assets, Docker and
142
+ Compose files, environment files, documentation, Power Apps starter files, and
143
+ OpenTofu topology are `project` artifacts after generation. Update does not
144
+ compare them with newer templates, restore deleted paths, or overwrite them
145
+ under `--force`.
146
+
147
+ Changing desired state from no frontend to frontend, or adding an environment,
148
+ can authorize one create-only provisioning group. All destinations are
149
+ preflighted together. Absent files are created and byte-identical files are
150
+ adopted as provenance; any differing destination blocks the group even with
151
+ `--force`. Disabling or re-enabling a previously provisioned group never
152
+ recreates or deletes project files.
153
+
154
+ Use `--check` whenever no project bytes may change. Human check mode prints
155
+ managed-core drift, ownership-only manifest migration, and authorized
156
+ provisioning. It recommends `--force` only for core conflicts. `--check
157
+ --force` is invalid because check mode never authorizes writes.
146
158
 
147
159
  `--json` selects output format, not safety. `liftoff update --json` applies safe
148
160
  changes and emits the versioned apply result. `liftoff update --check --json`
149
161
  is the read-only automation gate.
150
162
 
151
163
  Update never installs dependencies. Transaction snapshots restore a failed
152
- update, but Liftoff retains no backup after a successful overwrite; commit or
153
- copy local work before using `--force`. Force does not permit workload, API
154
- stack, GenAI pattern, framework, selected-agent, or user-supplied Power Apps
155
- starter identity changes, and it cannot bypass project-boundary, symlink,
156
- structural-collision, or manifest guards.
164
+ core update, but Liftoff retains no backup after a successful core overwrite.
165
+ Force cannot bypass the ownership, project-boundary, symlink, structural,
166
+ identity, or manifest guards.
157
167
 
158
- For a breaking supported-stack release, inspect `liftoff update --check` before
159
- plain update. Restore an unwanted applied migration through version control;
160
- running an older CLI is not a supported automatic downgrade.
168
+ New dependency, runtime, container, database, application, Power Apps starter,
169
+ and infrastructure templates apply to newly generated projects. Existing
170
+ production projects adopt them through a separately reviewed project change.
171
+ The existing `liftoff migrate` command only adopts a non-Liftoff source into a
172
+ fresh target; it is not an in-place template upgrade.
161
173
 
162
174
  ### Migration from 0.6.x
163
175
 
@@ -186,7 +198,9 @@ liftoff update --json
186
198
  liftoff update --check --json
187
199
  ```
188
200
 
189
- Each JSON object has a top-level numeric `schemaVersion`.
201
+ Each JSON object has a top-level numeric `schemaVersion`. Update JSON uses
202
+ schema version 2 and includes `scope: "managed-core"`, ownership-migration
203
+ state, and a separate provisioning collection.
190
204
  Operational warnings, such as a dirty-worktree warning before JSON apply, are
191
205
  written to stderr so stdout remains one parseable JSON object.
192
206
 
@@ -194,7 +208,7 @@ Exit codes:
194
208
 
195
209
  - `0`: success or a clean check.
196
210
  - `1`: invalid input, unsafe state, or command failure.
197
- - `2`: an explicit update check found project drift, or upgrade check found an
211
+ - `2`: an explicit update check found core maintenance or provisioning, or upgrade check found an
198
212
  installable CLI release.
199
213
 
200
214
  Raw installer, framework, and dependency child stdout and stderr are forwarded
@@ -9,9 +9,14 @@ machine-rewrite it afterward.
9
9
 
10
10
  Supported edits are reconciled by `liftoff update`:
11
11
 
12
- - API workloads can add or remove environments and enable applicable generated
13
- areas such as the frontend.
14
- - Power Apps can change the optional Code Apps plugin preference.
12
+ - API workloads can select a previously absent environment or frontend. Update
13
+ provisions that component once only when its destinations are absent or
14
+ byte-identical; a differing destination blocks the complete component and
15
+ cannot be forced.
16
+ - Removing or re-enabling a previously provisioned component never deletes,
17
+ restores, or overwrites its project-owned files.
18
+ - Power Apps can change the optional Code Apps plugin preference; only manifest
19
+ intent and applicable managed-core context change.
15
20
 
16
21
  Workload kind, API stack, GenAI pattern, spec workflow, selected agents, and a
17
22
  user-supplied Power Apps starter source change are not ordinary updates.
@@ -34,7 +39,7 @@ workload rather than silently ignored.
34
39
 
35
40
  ## `liftoff.manifest.json`: CLI-owned compatibility record
36
41
 
37
- New projects use manifest schema v5. Its common project identity includes the
42
+ New projects use manifest schema v6. Its common project identity includes the
38
43
  name, spec workflow, selected agents, and applicable Spec Kit default. A
39
44
  discriminated `project.workload` object contains only fields valid for one
40
45
  workload:
@@ -46,11 +51,14 @@ workload:
46
51
 
47
52
  The manifest also records:
48
53
 
49
- - Generating Liftoff version.
54
+ - Last manifest-writing Liftoff version.
50
55
  - Official framework adapter, state, and tested contract version when known.
51
- - Durable artifact logical names.
56
+ - `managedArtifacts`: exact Liftoff core logical names, paths, and
57
+ reconciliation `contentHash` values.
58
+ - `projectArtifacts`: starter provenance with the original path, generating
59
+ Liftoff version, `generationHash`, and provisioning group. These hashes never
60
+ authorize update writes.
52
61
  - OS-neutral path-part arrays.
53
- - `sha256:` content hashes.
54
62
  - Repository governance profile, policy version, and local
55
63
  `handoff-generated`, `handoff-partial`, or disabled state.
56
64
 
@@ -63,7 +71,7 @@ paths, or hashes.
63
71
 
64
72
  ## Compatibility
65
73
 
66
- Readers support schemas v2, v3, v4, and v5:
74
+ Readers support schemas v2, v3, v4, v5, and v6:
67
75
 
68
76
  - V2 normalizes the legacy flat API identity and records framework state as
69
77
  uncertain without inventing agents.
@@ -71,32 +79,39 @@ Readers support schemas v2, v3, v4, and v5:
71
79
  - V4 represents the discriminated workload model, including Power Apps.
72
80
  - V5 adds repository-governance handoff identity without claiming live
73
81
  enforcement.
82
+ - V6 separates managed-core update authority from project generation
83
+ provenance.
74
84
 
75
85
  `liftoff update --check`, including `--check --json`, leaves an old manifest
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`.
86
+ byte-for-byte unchanged. A successful plain update writes v6 only after the
87
+ transaction succeeds. V2-v5 backend, frontend, database, dependency, container,
88
+ environment, documentation, Power Apps, and infrastructure entries become
89
+ project provenance without reading or changing current production bytes.
90
+ Intentionally deleted files remain absent. Only exact current core logical
91
+ names retain write authority.
81
92
 
82
93
  ## Artifact ownership
83
94
 
84
- Durable Liftoff artifacts carry logical names and hashes. That lets validate,
85
- doctor, and update distinguish:
95
+ Every generated artifact has an explicit lifecycle independent from its
96
+ category or filename:
86
97
 
87
- - Current template bytes.
88
- - An untouched file with a template upgrade.
89
- - A developer edit that conflicts with a template change.
90
- - A named artifact moved by the template.
91
- - Missing, new, and orphaned artifacts.
98
+ | Lifecycle | Owner after initialization | Update behavior |
99
+ | --- | --- | --- |
100
+ | `managed-core` | Liftoff | Safe reconciliation; reviewed core conflicts may use `--force` |
101
+ | `project` | Developer/project | Provenance only; never compared, restored, moved, or overwritten |
102
+ | `desired-state` | Developer | Read as input and never machine-rewritten |
103
+ | `framework` | Official framework | Validated through framework markers and maintained by that framework |
104
+ | `seed` | Developer/project | Written once and never reconciled |
92
105
 
93
- Framework-owned OpenSpec and Spec Kit files are validated separately and are
94
- not claimed in durable hashes. One-time seed files are also excluded so they
95
- can follow their own lifecycle.
106
+ The manifest is a CLI-owned transaction record rather than an ordinary
107
+ template artifact. Current managed core is limited to the exact repository
108
+ governance policy, context, guide, and selected-agent launchers. A name such as
109
+ `config.go`, a `configuration` category, or a path under `.github` does not
110
+ grant update authority.
96
111
 
97
112
  ## Contract conventions
98
113
 
99
- - Writers use `artifactVersion` 5; readers support v2, v3, v4, and v5.
114
+ - Writers use `artifactVersion` 6; readers support v2, v3, v4, v5, and v6.
100
115
  - Artifact logical names and catalog identifiers are append-only.
101
116
  - Rendering is deterministic and does not depend on timestamps, host versions,
102
117
  or network state.
@@ -70,10 +70,10 @@ liftoff update
70
70
  ```
71
71
 
72
72
  Use `--check` first when the invocation must be read-only. Plain update applies
73
- safe managed changes immediately and without prompting in terminals and
74
- automation, while preserving conflicts and orphans. Review every reported
75
- conflict and commit or copy local work before choosing `liftoff update --force`.
76
- For CI drift gates, use `liftoff update --check --json`.
73
+ safe managed-core changes immediately and preserves core conflicts and orphans.
74
+ `--force` can replace only listed core conflicts. Project-owned production
75
+ files are not compared and remain unreachable from every update mode. For CI
76
+ core-maintenance gates, use `liftoff update --check --json`.
77
77
 
78
78
  OpenSpec skills and commands remain framework-owned. To give an existing
79
79
  project all 12 workflows as both skills and commands, run:
@@ -88,26 +88,26 @@ Select both delivery modes and every workflow in the profile picker. Plain
88
88
  hosted Copilot agent later, update `githubCopilot.cloudAgent` through OpenSpec
89
89
  and run `openspec update`.
90
90
 
91
- Projects created before manifest schema v5 automatically preview the default
91
+ Projects created before manifest schema v6 automatically preview the default
92
92
  repository-governance handoff as new named drift. Plain update safely adopts
93
93
  collision-free policy, context, guide, and selected-agent launchers without
94
94
  rewriting a configuration that omitted `governanceProfile`. Existing different
95
- files remain unowned conflicts and the v5 manifest records `handoff-partial`.
95
+ files remain unowned conflicts and the v6 manifest records `handoff-partial`.
96
96
  Resolving every conflict promotes a later update to `handoff-generated`.
97
97
  Selecting `none` leaves previously managed handoff files as undeleted orphans
98
98
  while unrecorded conflicts remain user-owned. No update mode runs an agent or
99
99
  activates GitHub settings.
100
100
 
101
- Major supported-stack releases can report many runtime, lock, Docker, provider,
102
- and framework artifact changes at once. Treat those releases as breaking:
103
- commit or copy local work, inspect `liftoff update --check`, and apply only after
104
- reviewing all upgrades and conflicts. Plain update preserves conflicting local
105
- bytes and never requires `--force` as the default migration path.
101
+ The schema-v6 transition releases every legacy non-core artifact into project
102
+ provenance without writing, restoring, moving, or deleting its path.
103
+ Intentionally removed infrastructure stays absent and production source stays
104
+ byte-for-byte unchanged.
106
105
 
107
- If an applied baseline migration must be reversed, restore the project and
108
- manifest through version control and reinstall from the restored locks. Liftoff
109
- does not automatically downgrade generated dependencies and retains no backup
110
- after a successful update.
106
+ Major supported-stack releases apply to new scaffolds. Existing projects adopt
107
+ runtime, lock, Docker, provider, framework, and application changes through a
108
+ normal reviewed project change. Ordinary update and force cannot perform that
109
+ migration, and the existing `liftoff migrate` command remains a fresh-target
110
+ workflow for non-Liftoff sources.
111
111
 
112
112
  ## Existing non-Liftoff application
113
113
 
@@ -32,8 +32,9 @@ liftoff upgrade
32
32
  ```
33
33
 
34
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`.
35
+ or update a generated project. Inspect Liftoff-managed core maintenance
36
+ separately with `liftoff update --check`; production template modernization is
37
+ a reviewed project change.
37
38
 
38
39
  See [prerequisites](prerequisites.md) for the complete plan-derived tool model.
39
40
 
@@ -4,6 +4,11 @@ Generated paths are logical examples. Liftoff uses platform-correct filesystem
4
4
  handling on Windows, macOS, and Linux, and manifests store path-part arrays
5
5
  instead of joined strings.
6
6
 
7
+ After initialization, workload paths shown below are project-owned production
8
+ assets. Their manifest entries preserve generation provenance but
9
+ `liftoff update`, including `--force`, cannot compare, restore, move, or replace
10
+ them. Only exact files labeled as managed core retain Liftoff write authority.
11
+
7
12
  ## GenAI and API projects
8
13
 
9
14
  ```text
@@ -15,7 +20,7 @@ project/
15
20
  |-- Dockerfile
16
21
  |-- docker-compose.yml
17
22
  |-- .liftoff/
18
- | `-- governance/ # durable local handoff when enabled
23
+ | `-- governance/ # managed-core local handoff when enabled
19
24
  | |-- policy.md
20
25
  | |-- context.json
21
26
  | `-- README.md
@@ -72,9 +72,9 @@ liftoff update --check
72
72
  liftoff update
73
73
  ```
74
74
 
75
- Check mode previews the schema-v5 manifest and new named artifacts without
75
+ Check mode previews the schema-v6 manifest and new named core artifacts without
76
76
  writing. Plain update applies collision-free files; differing existing files
77
- remain conflicts unless individually reviewed with `--force`. An unrecorded
77
+ remain managed-core conflicts unless individually reviewed with `--force`. An unrecorded
78
78
  conflict remains outside Liftoff ownership and produces `handoff-partial`.
79
79
  After every conflict is removed or matches the current artifact, the next
80
80
  update records the full artifact set as `handoff-generated`.
@@ -78,10 +78,10 @@ Individual project files use temporary-file replacement. Initialization keeps
78
78
  backups for replaced files and records created files and directories. A handled
79
79
  merge failure restores or removes those entries in reverse order.
80
80
 
81
- Plain `liftoff update` preflights all affected paths and applies generated file,
82
- move, delete, and manifest mutations as one rollback-capable transaction.
83
- Schema upgrades are committed only after the other mutations succeed. A
84
- corrected retry converges from the restored state.
81
+ Plain `liftoff update` preflights every eligible managed-core or authorized
82
+ create-only provisioning path and applies those writes, managed-core moves or
83
+ deletes, and the manifest as one rollback-capable transaction. Schema upgrades
84
+ are committed only after the other mutations succeed.
85
85
 
86
86
  If automatic rollback itself cannot safely restore a path because another
87
87
  process changed it, Liftoff reports the incomplete rollback rather than
@@ -94,30 +94,35 @@ does not retain them as backups after success.
94
94
 
95
95
  Update mode is selected explicitly rather than from terminal interactivity:
96
96
 
97
- - Clean generated files remain unchanged.
97
+ - Existing project artifacts are never compared with current template bytes.
98
98
  - Plain `liftoff update` immediately applies safe new, missing,
99
- untouched-upgrade, clean-move, and recorded-state changes without prompting,
100
- including with redirected input or output.
99
+ untouched-upgrade, clean-move, and recorded-state changes only for exact
100
+ managed-core artifacts.
101
101
  - `liftoff update --check` is read-only and performs no preflight or mutation.
102
102
  - `liftoff update --json` applies safe changes and returns an apply result;
103
103
  `liftoff update --check --json` is the read-only machine drift gate.
104
- - Developer edits that also differ from the current template are conflicts.
105
- - Default update skips conflicts and lists them by portable relative path.
106
- After reviewing every listed overwrite, `liftoff update --force` extends the
107
- transaction only to those guarded conflicts.
104
+ - Managed-core developer edits are conflicts. Project edits are outside update.
105
+ - Default update skips core conflicts and lists them by portable relative path.
106
+ `liftoff update --force` extends authority only to those guarded core
107
+ conflicts.
108
+ - Project source, dependencies, schemas, containers, environments,
109
+ documentation, and infrastructure cannot be restored or overwritten by any
110
+ update mode.
111
+ - A newly selected frontend or environment is provisioned once only at absent
112
+ or byte-identical destinations. A collision blocks the complete group and
113
+ cannot be forced.
108
114
  - Unrecorded governance conflicts remain outside manifest ownership and produce
109
115
  `handoff-partial` until a later update safely writes or adopts every artifact.
110
116
  - Orphans are reported and left on disk for manual review.
111
- - Dependency definitions may be updated, but update never installs
112
- dependencies.
117
+ - Dependency definitions and locks are project-owned; update neither changes
118
+ nor installs them.
113
119
 
114
120
  `--force` cannot be combined with `--check` and cannot weaken project-boundary,
115
121
  symlink, collision, manifest, or transaction guards.
116
122
 
117
- Power Apps reconciliation reads only the packaged immutable starter. It does
118
- not fetch the upstream repository. Workload kind and user-edited starter
119
- repository, template path, or commit changes are rejected before artifact
120
- access.
123
+ Power Apps starter source and metadata are project-owned after generation.
124
+ Update does not fetch upstream source or transition an existing project to a
125
+ newer packaged starter.
121
126
 
122
127
  ## Framework and seed ownership
123
128
 
@@ -89,7 +89,7 @@ Select **Both (skills + commands)** and every workflow in the profile picker.
89
89
  Plain `liftoff update` intentionally does not regenerate these framework-owned
90
90
  files.
91
91
 
92
- Repository-governance launchers are separate durable Liftoff files at the exact
92
+ Repository-governance launchers are separate managed-core Liftoff files at the exact
93
93
  Copilot prompt and Claude command paths documented in
94
94
  [repository governance](repository-governance.md). They reference one canonical
95
95
  policy and context rather than duplicating framework-owned content. After
@@ -140,6 +140,7 @@ invoke `/create-code-app`. The plugin's connector and deployment skills remain
140
140
  available for post-creation work.
141
141
 
142
142
  Changing the valid plugin preference in `liftoff.config.json` is reconciled by
143
- plain `liftoff update`; it immediately updates generated guidance and manifest
144
- intent without creating API or infrastructure artifacts. Use
145
- `liftoff update --check` to inspect that drift without writing.
143
+ plain `liftoff update`; it updates manifest intent and applicable managed-core
144
+ governance context without rewriting the project-owned Power Apps README or
145
+ starter. Use `liftoff update --check` to inspect that maintenance without
146
+ writing.
@@ -60,8 +60,8 @@ commit workflow. Do not edit Microsoft-owned starter files independently.
60
60
 
61
61
  ## Existing generated projects
62
62
 
63
- Upgrade the globally installed Liftoff CLI, then inspect project-managed changes
64
- as a separate operation:
63
+ Upgrade the globally installed Liftoff CLI, then inspect Liftoff core
64
+ maintenance as a separate operation:
65
65
 
66
66
  ```bash
67
67
  liftoff upgrade --check
@@ -72,18 +72,15 @@ liftoff validate
72
72
  liftoff doctor
73
73
  ```
74
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.
75
+ Only explicit Liftoff core files are updated automatically. Package manifests,
76
+ locks, runtime files, containers, and providers are project-owned after
77
+ generation; ordinary update and force do not replace them. Liftoff also never
78
+ installs project dependencies during update. CLI upgrade does not discover or
79
+ modify the project.
80
+
81
+ This baseline is a breaking generation boundary: it raises the Node.js, Python,
82
+ Go, and OpenTofu floors and includes major framework, provider, frontend,
83
+ container, and dependency migrations for new scaffolds. Existing production
84
+ projects adopt those changes through separately reviewed project work, not
85
+ `liftoff update` or `--force`. Do not use an older Liftoff release as an
86
+ automatic downgrade tool.
@@ -138,25 +138,27 @@ Restore `liftoff.manifest.json` from version control or regenerate the project
138
138
  with the matching Liftoff version. Do not weaken path validation or retain a
139
139
  hand-edited unsafe path.
140
140
 
141
- ## Update reports conflicts or orphans
141
+ ## Update reports managed-core conflicts or orphans
142
142
 
143
- `liftoff update` applies safe managed changes immediately and skips conflicts.
143
+ `liftoff update` applies safe managed-core changes immediately and skips core
144
+ conflicts.
144
145
 
145
146
  - Use `liftoff update --check` for a read-only human report or
146
147
  `liftoff update --check --json` for an automation drift gate.
147
- - Local or user-owned conflicts remain untouched by default.
148
+ - Project-owned application files never enter the report or mutation set.
149
+ - Managed-core conflicts remain untouched by default.
148
150
  - Use `liftoff update --force` only after reviewing every listed path and
149
- deciding that each overwrite is intended.
150
- - Orphans are never deleted automatically.
151
- - Update reports dependency-definition impact but does not install
152
- dependencies.
151
+ deciding that each core overwrite is intended. Force cannot cross into
152
+ project files or component-provisioning collisions.
153
+ - Managed-core orphans are never deleted automatically.
154
+ - Update neither changes nor installs project dependencies.
153
155
 
154
156
  Commit or copy local work before overwriting. Transaction rollback protects a
155
157
  failed update, but Liftoff keeps no backup after success.
156
158
 
157
159
  For a new governance policy or launcher conflict, review that exact local file
158
160
  before considering `liftoff update --force`; do not delete it or activate remote
159
- governance merely to make update pass. The schema-v5 manifest records
161
+ governance merely to make update pass. The schema-v6 manifest records
160
162
  `handoff-partial` and no ownership entry for each preserved unrecorded conflict.
161
163
  Run `liftoff update --check` to inspect the remaining paths. Once each path is
162
164
  absent or matches the current artifact, plain update promotes the handoff to
@@ -165,6 +167,12 @@ managed handoff files into preserved orphans rather than deleting them; an
165
167
  unrecorded conflicting file remains user-owned and is not reported as an
166
168
  orphan.
167
169
 
170
+ If a newer Liftoff release contains different source, dependencies, schemas,
171
+ containers, environment files, Power Apps starter files, or infrastructure,
172
+ ordinary update intentionally reports nothing for those project-owned
173
+ differences. Review and migrate them as production changes. The existing
174
+ `liftoff migrate` command does not perform an in-place Liftoff project upgrade.
175
+
168
176
  ## Governance handoff exists but nothing is enforced
169
177
 
170
178
  That is the expected initial state. The manifest records `handoff-generated`,
package/docs/workloads.md CHANGED
@@ -93,7 +93,7 @@ environment, API frontend, Docker, or OpenTofu selection.
93
93
  - React, Vite, TypeScript, Tailwind, and the Power Apps SDK and Vite plugin.
94
94
  - Locked root `package.json` and `package-lock.json`.
95
95
  - Project-local `power-apps` CLI supplied by the generated dependency graph.
96
- - `liftoff.config.json`, schema-v5 `liftoff.manifest.json`, starter provenance,
96
+ - `liftoff.config.json`, schema-v6 `liftoff.manifest.json`, starter provenance,
97
97
  and third-party attribution.
98
98
  - Official OpenSpec or Spec Kit output and every selected agent marker.
99
99
  - The common local governance policy and selected-agent launcher, with backend,
@@ -131,11 +131,12 @@ created the application.
131
131
 
132
132
  ## Change workload later
133
133
 
134
- `liftoff update` reconciles supported desired-state changes within the recorded
135
- workload. It does not convert among GenAI, API, and Power Apps or change an API
136
- stack, GenAI pattern, or user-supplied starter identity. Initialize a fresh
137
- project or use a supported migration flow instead.
134
+ `liftoff update` maintains explicit Liftoff core files and can provision a
135
+ previously absent frontend or environment once after a corresponding desired
136
+ state edit. It does not convert workloads, change API stacks or GenAI patterns,
137
+ transition a Power Apps starter, or modernize production project templates.
138
138
 
139
- Plain update applies safe changes immediately for every workload. Use
140
- `liftoff update --check` for read-only inspection and review all reported
141
- conflicts before using `liftoff update --force`; orphans remain untouched.
139
+ Plain update applies safe core changes immediately. Use `liftoff update
140
+ --check` for read-only inspection. `--force` applies only to listed
141
+ managed-core conflicts; project-owned source, dependencies, schemas,
142
+ containers, environments, documentation, and infrastructure remain untouched.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@msn-control/liftoff",
3
- "version": "0.9.0",
3
+ "version": "0.9.2",
4
4
  "description": "Interactive CLI for governed GenAI, API, and Power Apps code app projects.",
5
5
  "type": "module",
6
6
  "license": "GPL-3.0-only",