@msn-control/liftoff 0.8.0 → 0.9.1

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 (55) hide show
  1. package/README.md +11 -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 +7 -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 +415 -77
  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/framework-adapters.d.ts +1 -1
  18. package/dist/framework-adapters.js +9 -3
  19. package/dist/framework-adapters.js.map +1 -1
  20. package/dist/framework-validation.d.ts +1 -0
  21. package/dist/framework-validation.js +26 -0
  22. package/dist/framework-validation.js.map +1 -1
  23. package/dist/init-filesystem.js +2 -2
  24. package/dist/init-filesystem.js.map +1 -1
  25. package/dist/interactive.d.ts +13 -0
  26. package/dist/interactive.js +14 -0
  27. package/dist/interactive.js.map +1 -1
  28. package/dist/openspec-profile.d.ts +28 -0
  29. package/dist/openspec-profile.js +172 -0
  30. package/dist/openspec-profile.js.map +1 -0
  31. package/dist/planner.js +19 -1
  32. package/dist/planner.js.map +1 -1
  33. package/dist/power-apps-templates.js +15 -1
  34. package/dist/power-apps-templates.js.map +1 -1
  35. package/dist/reconcile.js +4 -10
  36. package/dist/reconcile.js.map +1 -1
  37. package/dist/repository-governance.js +4 -0
  38. package/dist/repository-governance.js.map +1 -1
  39. package/dist/templates.d.ts +5 -1
  40. package/dist/templates.js +126 -60
  41. package/dist/templates.js.map +1 -1
  42. package/dist/types.d.ts +27 -4
  43. package/docs/cli-reference.md +52 -25
  44. package/docs/configuration-and-manifests.md +39 -24
  45. package/docs/existing-repositories.md +38 -23
  46. package/docs/getting-started.md +17 -7
  47. package/docs/prerequisites.md +17 -0
  48. package/docs/project-structure.md +13 -1
  49. package/docs/repository-governance.md +2 -2
  50. package/docs/safety-and-consent.md +47 -30
  51. package/docs/spec-workflows-and-agents.md +47 -7
  52. package/docs/supported-stack.md +14 -17
  53. package/docs/troubleshooting.md +53 -8
  54. package/docs/workloads.md +9 -8
  55. package/package.json +1 -1
@@ -1,16 +1,19 @@
1
1
  # Safety and consent
2
2
 
3
- Liftoff separates project decisions, file replacement, workstation tools, and
4
- project dependencies. No one permission implies another.
3
+ Liftoff separates project decisions, file replacement, workstation tools,
4
+ global OpenSpec profile configuration, Copilot cloud setup, and project
5
+ dependencies. No one permission implies another.
5
6
 
6
7
  ## Consent flags
7
8
 
8
9
  | Flag | Authorizes | Does not authorize |
9
10
  | --- | --- | --- |
10
- | `--yes` | Project defaults and plan confirmation | File replacement, machine installs, or project dependencies |
11
- | `--force` | During init, listed regular-file replacements; during update, exact reported conflicts | Manifest guards, symlinks, structural collisions, tools, dependencies, or non-empty migration targets |
12
- | `--install-tools` | Allowlisted workstation installation commands | Project decisions, overwrites, or project dependencies |
13
- | `--install-dependencies` | Locked project-local dependency commands after a successful merge | Machine tools, project decisions, or overwrites |
11
+ | `--yes` | Project defaults and plan confirmation | File replacement, machine installs, global OpenSpec changes, Copilot cloud opt-in, or project dependencies |
12
+ | `--force` | During init, listed regular-file replacements; during update, exact reported conflicts | Manifest guards, symlinks, structural collisions, tools, global profile changes, dependencies, or non-empty migration targets |
13
+ | `--install-tools` | Allowlisted workstation installation commands | Project decisions, overwrites, global profile changes, or project dependencies |
14
+ | `--configure-openspec-profile` | The displayed global OpenSpec workflow, delivery, and profile changes | Tools, project files, dependencies, or Copilot cloud opt-in |
15
+ | `--copilot-cloud` / `--no-copilot-cloud` | Enable or disable OpenSpec's project-local hosted Copilot agent files | Global profile changes, tools, dependencies, or unrelated project writes |
16
+ | `--install-dependencies` | Locked project-local dependency commands after a successful merge | Machine tools, global profile changes, project decisions, or overwrites |
14
17
 
15
18
  Interactive sessions ask separately at the point each permission is needed.
16
19
 
@@ -43,14 +46,16 @@ Initialization does not write generated files directly into the destination.
43
46
  Liftoff:
44
47
 
45
48
  1. Resolves and validates a project plan.
46
- 2. Renders Liftoff-owned artifacts into a temporary staging directory.
47
- 3. Runs the official OpenSpec or Spec Kit initializer in staging.
48
- 4. Rejects nested Git metadata, unexpected framework roots, symlinks, and
49
+ 2. Verifies the OpenSpec global profile when OpenSpec is selected and separately
50
+ authorizes any required machine-wide change.
51
+ 3. Renders Liftoff-owned artifacts into a temporary staging directory.
52
+ 4. Runs the official OpenSpec or Spec Kit initializer in staging.
53
+ 5. Rejects nested Git metadata, unexpected framework roots, symlinks, and
49
54
  malformed output.
50
- 5. Validates the full staged project.
51
- 6. Computes one immutable destination preflight.
52
- 7. Shows every different regular file that would be replaced.
53
- 8. Applies only an authorized preflight.
55
+ 6. Validates the full staged project.
56
+ 7. Computes one immutable destination preflight.
57
+ 8. Shows every different regular file that would be replaced.
58
+ 9. Applies only an authorized preflight.
54
59
 
55
60
  Unrelated destination files are preserved.
56
61
 
@@ -73,10 +78,10 @@ Individual project files use temporary-file replacement. Initialization keeps
73
78
  backups for replaced files and records created files and directories. A handled
74
79
  merge failure restores or removes those entries in reverse order.
75
80
 
76
- Plain `liftoff update` preflights all affected paths and applies generated file,
77
- move, delete, and manifest mutations as one rollback-capable transaction.
78
- Schema upgrades are committed only after the other mutations succeed. A
79
- 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.
80
85
 
81
86
  If automatic rollback itself cannot safely restore a path because another
82
87
  process changed it, Liftoff reports the incomplete rollback rather than
@@ -89,30 +94,35 @@ does not retain them as backups after success.
89
94
 
90
95
  Update mode is selected explicitly rather than from terminal interactivity:
91
96
 
92
- - Clean generated files remain unchanged.
97
+ - Existing project artifacts are never compared with current template bytes.
93
98
  - Plain `liftoff update` immediately applies safe new, missing,
94
- untouched-upgrade, clean-move, and recorded-state changes without prompting,
95
- including with redirected input or output.
99
+ untouched-upgrade, clean-move, and recorded-state changes only for exact
100
+ managed-core artifacts.
96
101
  - `liftoff update --check` is read-only and performs no preflight or mutation.
97
102
  - `liftoff update --json` applies safe changes and returns an apply result;
98
103
  `liftoff update --check --json` is the read-only machine drift gate.
99
- - Developer edits that also differ from the current template are conflicts.
100
- - Default update skips conflicts and lists them by portable relative path.
101
- After reviewing every listed overwrite, `liftoff update --force` extends the
102
- 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.
103
114
  - Unrecorded governance conflicts remain outside manifest ownership and produce
104
115
  `handoff-partial` until a later update safely writes or adopts every artifact.
105
116
  - Orphans are reported and left on disk for manual review.
106
- - Dependency definitions may be updated, but update never installs
107
- dependencies.
117
+ - Dependency definitions and locks are project-owned; update neither changes
118
+ nor installs them.
108
119
 
109
120
  `--force` cannot be combined with `--check` and cannot weaken project-boundary,
110
121
  symlink, collision, manifest, or transaction guards.
111
122
 
112
- Power Apps reconciliation reads only the packaged immutable starter. It does
113
- not fetch the upstream repository. Workload kind and user-edited starter
114
- repository, template path, or commit changes are rejected before artifact
115
- 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.
116
126
 
117
127
  ## Framework and seed ownership
118
128
 
@@ -123,6 +133,13 @@ does not claim framework-owned files in durable artifact hashes.
123
133
  One-time seed content is also omitted from durable hashes so it can follow its
124
134
  own lifecycle after generation.
125
135
 
136
+ OpenSpec workflow profile and delivery are global machine preferences. Liftoff
137
+ changes them only after dedicated consent and verifies the result before
138
+ staging. That global choice is not part of the project-file transaction and is
139
+ not automatically rolled back after a later failure. The Copilot cloud choice
140
+ is separate, defaults off, and is persisted by OpenSpec in the generated
141
+ project config.
142
+
126
143
  ## Telemetry boundary
127
144
 
128
145
  Liftoff sends only a recognized command name, CLI version, and zero/nonzero
@@ -9,10 +9,23 @@ Liftoff workload.
9
9
 
10
10
  OpenSpec 1.11.0 organizes proposed behavior changes as reviewable artifacts
11
11
  before implementation. Liftoff runs that pinned official initializer in
12
- temporary staging and passes every selected coding agent in stable order.
12
+ temporary staging, passes every selected coding agent in stable order, and
13
+ requires the complete custom profile with both skills and commands:
13
14
 
14
- Generated projects contain `openspec/` plus the selected agent integration
15
- markers.
15
+ ```text
16
+ propose, explore, new, continue, apply, update,
17
+ ff, sync, archive, bulk-archive, verify, onboard
18
+ ```
19
+
20
+ OpenSpec stores profile and delivery preferences globally. Before creating an
21
+ OpenSpec project, Liftoff reads that configuration through the pinned CLI. A
22
+ matching custom/both profile proceeds without a prompt. A different profile is
23
+ blocking until you separately approve the displayed global changes or pass
24
+ `--configure-openspec-profile`. `--yes` and other consent flags do not authorize
25
+ the machine-wide change.
26
+
27
+ Generated projects contain `openspec/` plus all 12 official workflow skills and
28
+ commands for each selected agent surface that supports them.
16
29
 
17
30
  ### Spec Kit
18
31
 
@@ -65,7 +78,18 @@ Framework files remain owned by the official initializer. Liftoff validates
65
78
  them but excludes framework-owned output from durable artifact hashes so a
66
79
  framework can manage its own lifecycle.
67
80
 
68
- Repository-governance launchers are separate durable Liftoff files at the exact
81
+ To align an existing OpenSpec project, configure both delivery and all workflows:
82
+
83
+ ```bash
84
+ openspec config profile
85
+ openspec update
86
+ ```
87
+
88
+ Select **Both (skills + commands)** and every workflow in the profile picker.
89
+ Plain `liftoff update` intentionally does not regenerate these framework-owned
90
+ files.
91
+
92
+ Repository-governance launchers are separate managed-core Liftoff files at the exact
69
93
  Copilot prompt and Claude command paths documented in
70
94
  [repository governance](repository-governance.md). They reference one canonical
71
95
  policy and context rather than duplicating framework-owned content. After
@@ -79,6 +103,21 @@ npm install -g @fission-ai/openspec@1.11.0
79
103
  uv tool install specify-cli==1.0.1
80
104
  ```
81
105
 
106
+ ## Optional GitHub Copilot cloud coding agent
107
+
108
+ When OpenSpec and GitHub Copilot are selected, Liftoff asks whether to configure
109
+ GitHub's hosted coding agent. This is separate from Copilot in an editor or
110
+ terminal and defaults to No.
111
+
112
+ Opting in writes official OpenSpec-owned files:
113
+
114
+ - `.github/workflows/copilot-setup-steps.yml`
115
+ - `.github/agents/openspec.agent.md`
116
+
117
+ Use `--copilot-cloud` or `--no-copilot-cloud` in automation. The choice is
118
+ recorded as `githubCopilot.cloudAgent` in `openspec/config.yaml`; it is not stored
119
+ as Liftoff overwrite or machine-configuration consent.
120
+
82
121
  ## Optional Code Apps plugin
83
122
 
84
123
  Power Apps projects can request Microsoft's
@@ -101,6 +140,7 @@ invoke `/create-code-app`. The plugin's connector and deployment skills remain
101
140
  available for post-creation work.
102
141
 
103
142
  Changing the valid plugin preference in `liftoff.config.json` is reconciled by
104
- plain `liftoff update`; it immediately updates generated guidance and manifest
105
- intent without creating API or infrastructure artifacts. Use
106
- `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.
@@ -85,6 +85,43 @@ Review the complete replacement list. Approve interactively or rerun with
85
85
  manifest, or a non-empty migration target. Move or rename the structural
86
86
  conflict and retry.
87
87
 
88
+ ## OpenSpec global profile is incompatible
89
+
90
+ Liftoff OpenSpec projects require profile `custom`, delivery `both`, and all 12
91
+ OpenSpec 1.11 workflows. Review the observed and required values printed by
92
+ Liftoff. Approve the separate interactive prompt or rerun the same command with
93
+ `--configure-openspec-profile` only when the machine-wide change is intended.
94
+
95
+ `--yes`, `--force`, `--install-tools`, and `--install-dependencies` do not
96
+ authorize this change. If configuration or verification fails, run
97
+ `openspec config list --json`, correct the reported OpenSpec issue, and retry
98
+ before any project files are written.
99
+
100
+ ## OpenSpec wants to replace workflow files immediately
101
+
102
+ A fresh Liftoff project should already contain all 12 workflows as skills and
103
+ commands. Confirm that the same OpenSpec 1.11.0 binary, selected tools, global
104
+ profile, delivery, and `githubCopilot.cloudAgent` choice are still in effect.
105
+
106
+ For an older project, use:
107
+
108
+ ```bash
109
+ openspec config profile
110
+ openspec update
111
+ ```
112
+
113
+ Select both delivery modes and every workflow. Do not use `liftoff update
114
+ --force` to manage OpenSpec-owned skills or commands.
115
+
116
+ ## Copilot cloud-agent files are missing
117
+
118
+ The GitHub-hosted coding agent is default-off and separate from Copilot in an
119
+ editor or terminal. Opt in during new initialization with `--copilot-cloud`.
120
+ For an existing project, set `githubCopilot.cloudAgent: true` in
121
+ `openspec/config.yaml` and run `openspec update`. The expected files are
122
+ `.github/workflows/copilot-setup-steps.yml` and
123
+ `.github/agents/openspec.agent.md`.
124
+
88
125
  ## A handled write failed
89
126
 
90
127
  Liftoff reports whether rollback completed. Correct the filesystem problem and
@@ -101,25 +138,27 @@ Restore `liftoff.manifest.json` from version control or regenerate the project
101
138
  with the matching Liftoff version. Do not weaken path validation or retain a
102
139
  hand-edited unsafe path.
103
140
 
104
- ## Update reports conflicts or orphans
141
+ ## Update reports managed-core conflicts or orphans
105
142
 
106
- `liftoff update` applies safe managed changes immediately and skips conflicts.
143
+ `liftoff update` applies safe managed-core changes immediately and skips core
144
+ conflicts.
107
145
 
108
146
  - Use `liftoff update --check` for a read-only human report or
109
147
  `liftoff update --check --json` for an automation drift gate.
110
- - 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.
111
150
  - Use `liftoff update --force` only after reviewing every listed path and
112
- deciding that each overwrite is intended.
113
- - Orphans are never deleted automatically.
114
- - Update reports dependency-definition impact but does not install
115
- 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.
116
155
 
117
156
  Commit or copy local work before overwriting. Transaction rollback protects a
118
157
  failed update, but Liftoff keeps no backup after success.
119
158
 
120
159
  For a new governance policy or launcher conflict, review that exact local file
121
160
  before considering `liftoff update --force`; do not delete it or activate remote
122
- governance merely to make update pass. The schema-v5 manifest records
161
+ governance merely to make update pass. The schema-v6 manifest records
123
162
  `handoff-partial` and no ownership entry for each preserved unrecorded conflict.
124
163
  Run `liftoff update --check` to inspect the remaining paths. Once each path is
125
164
  absent or matches the current artifact, plain update promotes the handoff to
@@ -128,6 +167,12 @@ managed handoff files into preserved orphans rather than deleting them; an
128
167
  unrecorded conflicting file remains user-owned and is not reported as an
129
168
  orphan.
130
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
+
131
176
  ## Governance handoff exists but nothing is enforced
132
177
 
133
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.8.0",
3
+ "version": "0.9.1",
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",