@msn-control/liftoff 0.7.0 → 0.9.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.
- package/README.md +13 -1
- package/assets/governance/single-maintainer-gitflow/policy.md +705 -0
- package/assets/locks/frontend/package-lock.json +1012 -1694
- package/assets/locks/frontend/package.json +5 -6
- package/assets/locks/go-backend/go.mod +17 -0
- package/assets/locks/go-backend/go.sum +159 -0
- package/assets/locks/node-backend/package-lock.json +1473 -2320
- package/assets/locks/node-backend/package.json +8 -7
- package/assets/locks/opentofu-azure/.terraform.lock.hcl +39 -0
- package/assets/locks/opentofu-azure/versions.tf +10 -0
- package/assets/locks/python-genai/function-requirements.txt +1734 -0
- package/assets/locks/python-genai/liftoff_template_python_genai.egg-info/PKG-INFO +25 -0
- package/assets/locks/python-genai/liftoff_template_python_genai.egg-info/SOURCES.txt +6 -0
- package/assets/locks/python-genai/liftoff_template_python_genai.egg-info/dependency_links.txt +1 -0
- package/assets/locks/python-genai/liftoff_template_python_genai.egg-info/requires.txt +23 -0
- package/assets/locks/python-genai/liftoff_template_python_genai.egg-info/top_level.txt +1 -0
- package/assets/locks/python-genai/pyproject.toml +42 -0
- package/assets/locks/python-genai/uv.lock +2536 -0
- package/assets/locks/python-standard/pyproject.toml +36 -0
- package/assets/locks/python-standard/uv.lock +1780 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/catalog.json +4 -4
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/package-lock.json +667 -1108
- package/assets/supported-stack.json +711 -0
- package/dist/args.js +14 -0
- package/dist/args.js.map +1 -1
- package/dist/catalogs.d.ts +3 -1
- package/dist/catalogs.js +29 -7
- package/dist/catalogs.js.map +1 -1
- package/dist/cli.js +2 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands.d.ts +6 -0
- package/dist/commands.js +331 -41
- package/dist/commands.js.map +1 -1
- package/dist/container-validation.d.ts +2 -0
- package/dist/container-validation.js +26 -0
- package/dist/container-validation.js.map +1 -0
- package/dist/file-system.js +130 -5
- package/dist/file-system.js.map +1 -1
- package/dist/framework-adapters.d.ts +1 -1
- package/dist/framework-adapters.js +10 -3
- package/dist/framework-adapters.js.map +1 -1
- package/dist/framework-validation.d.ts +1 -0
- package/dist/framework-validation.js +26 -0
- package/dist/framework-validation.js.map +1 -1
- package/dist/go-template-assets.d.ts +2 -0
- package/dist/go-template-assets.js +14 -0
- package/dist/go-template-assets.js.map +1 -0
- package/dist/init-filesystem.js +5 -4
- package/dist/init-filesystem.js.map +1 -1
- package/dist/interactive.d.ts +13 -0
- package/dist/interactive.js +25 -7
- package/dist/interactive.js.map +1 -1
- package/dist/openspec-profile.d.ts +28 -0
- package/dist/openspec-profile.js +172 -0
- package/dist/openspec-profile.js.map +1 -0
- package/dist/opentofu-template-assets.d.ts +2 -0
- package/dist/opentofu-template-assets.js +10 -0
- package/dist/opentofu-template-assets.js.map +1 -0
- package/dist/package-identity.d.ts +8 -0
- package/dist/package-identity.js +16 -0
- package/dist/package-identity.js.map +1 -0
- package/dist/planner.js +61 -4
- package/dist/planner.js.map +1 -1
- package/dist/power-apps-templates.js +18 -0
- package/dist/power-apps-templates.js.map +1 -1
- package/dist/project-dependencies.d.ts +1 -1
- package/dist/project-dependencies.js +15 -34
- package/dist/project-dependencies.js.map +1 -1
- package/dist/published-verifier.js +11 -1
- package/dist/published-verifier.js.map +1 -1
- package/dist/python-template-assets.d.ts +4 -0
- package/dist/python-template-assets.js +34 -0
- package/dist/python-template-assets.js.map +1 -0
- package/dist/repository-governance.d.ts +17 -0
- package/dist/repository-governance.js +507 -0
- package/dist/repository-governance.js.map +1 -0
- package/dist/runtime.d.ts +1 -1
- package/dist/runtime.js +3 -1
- package/dist/runtime.js.map +1 -1
- package/dist/self-upgrade.d.ts +77 -0
- package/dist/self-upgrade.js +499 -0
- package/dist/self-upgrade.js.map +1 -0
- package/dist/stable-release.d.ts +18 -0
- package/dist/stable-release.js +66 -0
- package/dist/stable-release.js.map +1 -0
- package/dist/standard-templates.js +28 -97
- package/dist/standard-templates.js.map +1 -1
- package/dist/supported-stack.d.ts +115 -0
- package/dist/supported-stack.js +439 -0
- package/dist/supported-stack.js.map +1 -0
- package/dist/telemetry/contract.d.ts +1 -1
- package/dist/telemetry/contract.js +1 -0
- package/dist/telemetry/contract.js.map +1 -1
- package/dist/templates.js +238 -127
- package/dist/templates.js.map +1 -1
- package/dist/types.d.ts +21 -1
- package/dist/workstation-catalog.js +15 -12
- package/dist/workstation-catalog.js.map +1 -1
- package/dist/workstation.js +16 -6
- package/dist/workstation.js.map +1 -1
- package/docs/cli-reference.md +72 -2
- package/docs/configuration-and-manifests.md +13 -5
- package/docs/existing-repositories.md +44 -8
- package/docs/getting-started.md +34 -9
- package/docs/prerequisites.md +47 -4
- package/docs/project-structure.md +27 -1
- package/docs/repository-governance.md +91 -0
- package/docs/safety-and-consent.md +50 -13
- package/docs/spec-workflows-and-agents.md +61 -9
- package/docs/supported-stack.md +89 -0
- package/docs/telemetry.md +6 -0
- package/docs/troubleshooting.md +115 -0
- package/docs/workloads.md +14 -5
- package/package.json +14 -6
|
@@ -1,33 +1,61 @@
|
|
|
1
1
|
# Safety and consent
|
|
2
2
|
|
|
3
|
-
Liftoff separates project decisions, file replacement, workstation tools,
|
|
4
|
-
|
|
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
|
-
| `--
|
|
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
|
|
|
20
|
+
Selecting repository governance or passing `--yes` authorizes only deterministic
|
|
21
|
+
local handoff files. It never authorizes agent execution, Git mutation, GitHub
|
|
22
|
+
APIs, rulesets, security configuration, deployment, monitoring, file
|
|
23
|
+
replacement, machine tools, or project dependencies. Live activation begins
|
|
24
|
+
only after commit, push, read-only Phase 0, and explicit plan approval.
|
|
25
|
+
|
|
26
|
+
## CLI self-upgrade boundary
|
|
27
|
+
|
|
28
|
+
`liftoff upgrade` is itself the narrow authorization to replace a supported
|
|
29
|
+
global npm installation with one exact stable version. It accepts no project
|
|
30
|
+
path, `--yes`, `--force`, tool-install, or dependency-install permission.
|
|
31
|
+
`liftoff upgrade --check` is read-only and invokes no npm installation.
|
|
32
|
+
|
|
33
|
+
Both modes operate from a temporary neutral directory so a project `.npmrc`
|
|
34
|
+
cannot redirect machine-level discovery. Canonical npm selects the target while
|
|
35
|
+
the configured registry must provide that exact release. Liftoff does not expose
|
|
36
|
+
registry credentials, rewrite npm configuration, bypass a stale mirror, invoke
|
|
37
|
+
`sudo` or another elevation mechanism, or touch project files.
|
|
38
|
+
|
|
39
|
+
npm replacement is not a Liftoff file transaction. If npm or post-install
|
|
40
|
+
verification fails, Liftoff reports an exact-version repair command and does not
|
|
41
|
+
claim automatic rollback.
|
|
42
|
+
|
|
17
43
|
## Staged initialization
|
|
18
44
|
|
|
19
45
|
Initialization does not write generated files directly into the destination.
|
|
20
46
|
Liftoff:
|
|
21
47
|
|
|
22
48
|
1. Resolves and validates a project plan.
|
|
23
|
-
2.
|
|
24
|
-
|
|
25
|
-
|
|
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
|
|
26
54
|
malformed output.
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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.
|
|
31
59
|
|
|
32
60
|
Unrelated destination files are preserved.
|
|
33
61
|
|
|
@@ -77,6 +105,8 @@ Update mode is selected explicitly rather than from terminal interactivity:
|
|
|
77
105
|
- Default update skips conflicts and lists them by portable relative path.
|
|
78
106
|
After reviewing every listed overwrite, `liftoff update --force` extends the
|
|
79
107
|
transaction only to those guarded conflicts.
|
|
108
|
+
- Unrecorded governance conflicts remain outside manifest ownership and produce
|
|
109
|
+
`handoff-partial` until a later update safely writes or adopts every artifact.
|
|
80
110
|
- Orphans are reported and left on disk for manual review.
|
|
81
111
|
- Dependency definitions may be updated, but update never installs
|
|
82
112
|
dependencies.
|
|
@@ -98,6 +128,13 @@ does not claim framework-owned files in durable artifact hashes.
|
|
|
98
128
|
One-time seed content is also omitted from durable hashes so it can follow its
|
|
99
129
|
own lifecycle after generation.
|
|
100
130
|
|
|
131
|
+
OpenSpec workflow profile and delivery are global machine preferences. Liftoff
|
|
132
|
+
changes them only after dedicated consent and verifies the result before
|
|
133
|
+
staging. That global choice is not part of the project-file transaction and is
|
|
134
|
+
not automatically rolled back after a later failure. The Copilot cloud choice
|
|
135
|
+
is separate, defaults off, and is persisted by OpenSpec in the generated
|
|
136
|
+
project config.
|
|
137
|
+
|
|
101
138
|
## Telemetry boundary
|
|
102
139
|
|
|
103
140
|
Liftoff sends only a recognized command name, CLI version, and zero/nonzero
|
|
@@ -7,19 +7,31 @@ Liftoff workload.
|
|
|
7
7
|
|
|
8
8
|
### OpenSpec
|
|
9
9
|
|
|
10
|
-
OpenSpec organizes proposed behavior changes as reviewable artifacts
|
|
11
|
-
implementation. Liftoff runs
|
|
12
|
-
temporary staging
|
|
10
|
+
OpenSpec 1.11.0 organizes proposed behavior changes as reviewable artifacts
|
|
11
|
+
before implementation. Liftoff runs that pinned official initializer in
|
|
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
|
-
|
|
15
|
-
|
|
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
|
|
|
19
|
-
Spec Kit provides a specification, planning, and implementation workflow.
|
|
20
|
-
Liftoff initializes the selected default coding agent first, adds every
|
|
21
|
-
|
|
22
|
-
set.
|
|
32
|
+
Spec Kit 1.0.1 provides a specification, planning, and implementation workflow.
|
|
33
|
+
Liftoff initializes the selected default coding agent first, adds every secondary
|
|
34
|
+
integration, and records the default separately from the full agent set.
|
|
23
35
|
|
|
24
36
|
Generated projects contain `.specify/`, `specs/`, and the selected agent
|
|
25
37
|
integration markers.
|
|
@@ -66,6 +78,46 @@ Framework files remain owned by the official initializer. Liftoff validates
|
|
|
66
78
|
them but excludes framework-owned output from durable artifact hashes so a
|
|
67
79
|
framework can manage its own lifecycle.
|
|
68
80
|
|
|
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 durable Liftoff files at the exact
|
|
93
|
+
Copilot prompt and Claude command paths documented in
|
|
94
|
+
[repository governance](repository-governance.md). They reference one canonical
|
|
95
|
+
policy and context rather than duplicating framework-owned content. After
|
|
96
|
+
read-only Phase 0 and explicit approval, the agent creates a new change using
|
|
97
|
+
the selected framework; Liftoff never pre-creates or restores that change.
|
|
98
|
+
|
|
99
|
+
Install the exact selected framework release with its supported package manager:
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
npm install -g @fission-ai/openspec@1.11.0
|
|
103
|
+
uv tool install specify-cli==1.0.1
|
|
104
|
+
```
|
|
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
|
+
|
|
69
121
|
## Optional Code Apps plugin
|
|
70
122
|
|
|
71
123
|
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.
|
package/docs/troubleshooting.md
CHANGED
|
@@ -7,6 +7,8 @@ Check the canonical release:
|
|
|
7
7
|
```bash
|
|
8
8
|
npm view @msn-control/liftoff@latest version --registry=https://registry.npmjs.org
|
|
9
9
|
liftoff --version
|
|
10
|
+
liftoff upgrade --check
|
|
11
|
+
liftoff upgrade
|
|
10
12
|
```
|
|
11
13
|
|
|
12
14
|
Versions before 0.3.0 are unsupported.
|
|
@@ -16,6 +18,40 @@ mirror owner to synchronize or approve the release. Liftoff does not modify
|
|
|
16
18
|
`.npmrc`. A successful installation of an older mirrored package does not make
|
|
17
19
|
that version supported.
|
|
18
20
|
|
|
21
|
+
Versions that predate `liftoff upgrade` require one manual global installation:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npm install -g @msn-control/liftoff@latest --registry=https://registry.npmjs.org
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## CLI upgrade is blocked by installation origin
|
|
28
|
+
|
|
29
|
+
Automatic replacement supports only the canonical package at npm's effective
|
|
30
|
+
global package root. A local dependency, `npx` cache copy, linked checkout, or
|
|
31
|
+
another package-manager installation is intentionally refused. Use the manual
|
|
32
|
+
global npm command shown by Liftoff; do not try to make upgrade replace a
|
|
33
|
+
different installation.
|
|
34
|
+
|
|
35
|
+
## CLI upgrade is blocked by a stale managed registry
|
|
36
|
+
|
|
37
|
+
Canonical npm defines the exact stable target, but Liftoff installs through the
|
|
38
|
+
configured registry. Ask the mirror owner to synchronize or approve that exact
|
|
39
|
+
version, then rerun `liftoff upgrade --check`. Liftoff does not edit `.npmrc` or
|
|
40
|
+
bypass the managed registry.
|
|
41
|
+
|
|
42
|
+
## npm cannot write the global prefix
|
|
43
|
+
|
|
44
|
+
Liftoff does not run `sudo`, request administrator credentials, or retry with
|
|
45
|
+
elevation. Resolve Node/npm global-prefix ownership through the approved
|
|
46
|
+
workstation process, then rerun the command.
|
|
47
|
+
|
|
48
|
+
## CLI replacement verification fails
|
|
49
|
+
|
|
50
|
+
Liftoff reports `failed` even when npm exited zero unless installed metadata and
|
|
51
|
+
`liftoff --version` both match the exact target. Run the exact-version global npm
|
|
52
|
+
repair command printed in the result. Liftoff does not claim an automatic
|
|
53
|
+
rollback after npm may have partially changed global state.
|
|
54
|
+
|
|
19
55
|
## An installed tool is still reported missing
|
|
20
56
|
|
|
21
57
|
Installers that change `PATH` may require a new terminal. Open one, rerun:
|
|
@@ -49,6 +85,43 @@ Review the complete replacement list. Approve interactively or rerun with
|
|
|
49
85
|
manifest, or a non-empty migration target. Move or rename the structural
|
|
50
86
|
conflict and retry.
|
|
51
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
|
+
|
|
52
125
|
## A handled write failed
|
|
53
126
|
|
|
54
127
|
Liftoff reports whether rollback completed. Correct the filesystem problem and
|
|
@@ -81,6 +154,48 @@ hand-edited unsafe path.
|
|
|
81
154
|
Commit or copy local work before overwriting. Transaction rollback protects a
|
|
82
155
|
failed update, but Liftoff keeps no backup after success.
|
|
83
156
|
|
|
157
|
+
For a new governance policy or launcher conflict, review that exact local file
|
|
158
|
+
before considering `liftoff update --force`; do not delete it or activate remote
|
|
159
|
+
governance merely to make update pass. The schema-v5 manifest records
|
|
160
|
+
`handoff-partial` and no ownership entry for each preserved unrecorded conflict.
|
|
161
|
+
Run `liftoff update --check` to inspect the remaining paths. Once each path is
|
|
162
|
+
absent or matches the current artifact, plain update promotes the handoff to
|
|
163
|
+
`handoff-generated`. Setting `governanceProfile` to `none` turns previously
|
|
164
|
+
managed handoff files into preserved orphans rather than deleting them; an
|
|
165
|
+
unrecorded conflicting file remains user-owned and is not reported as an
|
|
166
|
+
orphan.
|
|
167
|
+
|
|
168
|
+
## Governance handoff exists but nothing is enforced
|
|
169
|
+
|
|
170
|
+
That is the expected initial state. The manifest records `handoff-generated`,
|
|
171
|
+
not active enforcement. Commit and push the repository, run the selected-agent
|
|
172
|
+
launcher, review its read-only Phase 0 report, and explicitly approve the plan
|
|
173
|
+
before the agent creates a governance change.
|
|
174
|
+
|
|
175
|
+
Missing licenses, a private Staging runner, alert routes, parallel deployment,
|
|
176
|
+
or sufficient canary traffic must be reported as blockers or inapplicable
|
|
177
|
+
controls. Do not replace them with duplicate scanners or placeholder success.
|
|
178
|
+
|
|
179
|
+
Do not run an older Liftoff release to reverse a completed baseline migration.
|
|
180
|
+
Restore the affected generated files and `liftoff.manifest.json` through version
|
|
181
|
+
control, then reinstall from the restored locks.
|
|
182
|
+
|
|
183
|
+
## A frozen Python install cannot reach the package index
|
|
184
|
+
|
|
185
|
+
Keep the committed `pyproject.toml` and `uv.lock` unchanged and retry the
|
|
186
|
+
generated `uv sync --frozen` command when registry connectivity is restored.
|
|
187
|
+
Do not regenerate the lock as a connectivity workaround.
|
|
188
|
+
|
|
189
|
+
Python Dockerfiles also accept a credential-free PEP 503 mirror while retaining
|
|
190
|
+
the lock's exact versions and hashes:
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
docker build --build-arg UV_DEFAULT_INDEX=https://packages.example.test/simple/ .
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
Do not place credentials in build arguments. Configure authenticated registries
|
|
197
|
+
through an approved secret-aware build mechanism.
|
|
198
|
+
|
|
84
199
|
## Power Apps dependencies or CLI are missing
|
|
85
200
|
|
|
86
201
|
From the project root:
|
package/docs/workloads.md
CHANGED
|
@@ -7,12 +7,12 @@ prerequisites, generated artifacts, and maintenance checks that apply to it.
|
|
|
7
7
|
|
|
8
8
|
| Workload | Primary choices | Required runtime | Liftoff-generated platform areas |
|
|
9
9
|
| --- | --- | --- | --- |
|
|
10
|
-
| GenAI application | Pattern, Azure region, environments, optional frontend | Python 3.12 and Node.js 20
|
|
11
|
-
| API application | Python, Node.js, or Go API stack; Azure region; environments; optional frontend | Selected API runtime and Node.js 20
|
|
12
|
-
| Power Apps code app | Spec workflow, agents, optional Code Apps plugin | Node.js
|
|
10
|
+
| GenAI application | Pattern, Azure region, environments, optional frontend | Python 3.14, `uv` 0.12.7+, and Node.js 24.20+ | API, orchestration, data, messaging, Docker, Azure OpenTofu |
|
|
11
|
+
| API application | Python 3.14, Node.js 24, or Go 1.27 API stack; Azure region; environments; optional frontend | Selected API runtime and Node.js 24.20+ | API, data, Docker, Azure OpenTofu |
|
|
12
|
+
| Power Apps code app | Spec workflow, agents, optional Code Apps plugin | Node.js 24.20+ | Official React/Vite starter and project-local Power Apps tooling |
|
|
13
13
|
|
|
14
14
|
All three workloads continue into the common OpenSpec or Spec Kit and coding
|
|
15
|
-
agent flow.
|
|
15
|
+
agent flow and the default local repository-governance handoff.
|
|
16
16
|
|
|
17
17
|
## GenAI application
|
|
18
18
|
|
|
@@ -29,11 +29,14 @@ The selected pattern fixes the API stack to Python, FastAPI, and PydanticAI.
|
|
|
29
29
|
### Generated output
|
|
30
30
|
|
|
31
31
|
- FastAPI backend and Scalar/OpenAPI integration.
|
|
32
|
+
- A committed `uv.lock` consumed through `uv sync --frozen`.
|
|
32
33
|
- PydanticAI orchestration, prompts, and model configuration boundaries.
|
|
33
34
|
- PostgreSQL and pattern-specific Redis or Azure Service Bus boundaries.
|
|
34
35
|
- Offline-testable tracing and integration adapters.
|
|
35
36
|
- Docker Compose and Azure OpenTofu.
|
|
36
37
|
- Optional Vue frontend and pattern-specific Azure Functions workers.
|
|
38
|
+
- Versioned repository-governance policy, workload context, guide, and
|
|
39
|
+
selected-agent launcher unless `none` is selected.
|
|
37
40
|
|
|
38
41
|
### Deferred actions
|
|
39
42
|
|
|
@@ -55,9 +58,12 @@ infrastructure before applying it.
|
|
|
55
58
|
### Generated output
|
|
56
59
|
|
|
57
60
|
- Stack-native API, OpenAPI, tests, and database migrations.
|
|
61
|
+
- Ecosystem-native locked metadata: `uv.lock`, `package-lock.json`, or
|
|
62
|
+
`go.mod` plus `go.sum`.
|
|
58
63
|
- PostgreSQL, Redis, Azurite, and Mailpit local services where applicable.
|
|
59
64
|
- Docker Compose and Azure OpenTofu.
|
|
60
65
|
- Optional Vue frontend.
|
|
66
|
+
- Versioned local repository-governance handoff unless explicitly disabled.
|
|
61
67
|
|
|
62
68
|
### Deferred actions
|
|
63
69
|
|
|
@@ -87,9 +93,12 @@ environment, API frontend, Docker, or OpenTofu selection.
|
|
|
87
93
|
- React, Vite, TypeScript, Tailwind, and the Power Apps SDK and Vite plugin.
|
|
88
94
|
- Locked root `package.json` and `package-lock.json`.
|
|
89
95
|
- Project-local `power-apps` CLI supplied by the generated dependency graph.
|
|
90
|
-
- `liftoff.config.json`, schema-
|
|
96
|
+
- `liftoff.config.json`, schema-v5 `liftoff.manifest.json`, starter provenance,
|
|
91
97
|
and third-party attribution.
|
|
92
98
|
- Official OpenSpec or Spec Kit output and every selected agent marker.
|
|
99
|
+
- The common local governance policy and selected-agent launcher, with backend,
|
|
100
|
+
container, OpenTofu, custom deployment, and API DAST controls marked
|
|
101
|
+
inapplicable.
|
|
93
102
|
|
|
94
103
|
Liftoff does not create an API backend, `docker-compose.yml`,
|
|
95
104
|
`infrastructure/`, API environments, or an environment-bound
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@msn-control/liftoff",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
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",
|
|
@@ -32,7 +32,9 @@
|
|
|
32
32
|
"files": [
|
|
33
33
|
"dist",
|
|
34
34
|
"assets/locks",
|
|
35
|
+
"assets/governance",
|
|
35
36
|
"assets/power-apps-code-app",
|
|
37
|
+
"assets/supported-stack.json",
|
|
36
38
|
"docs",
|
|
37
39
|
"README.md",
|
|
38
40
|
"LICENSE"
|
|
@@ -45,25 +47,31 @@
|
|
|
45
47
|
"build": "tsc -p tsconfig.json",
|
|
46
48
|
"test": "vitest run",
|
|
47
49
|
"audit:template-dependencies": "node scripts/audit-template-dependencies.mjs",
|
|
50
|
+
"refresh:supported-stack": "node scripts/refresh-supported-stack-baseline.mjs --write",
|
|
51
|
+
"check:supported-stack": "node scripts/refresh-supported-stack-baseline.mjs",
|
|
52
|
+
"check:supported-stack-freshness": "node scripts/check-supported-stack-freshness.mjs",
|
|
53
|
+
"canonicalize:python-locks": "node scripts/canonicalize-uv-lock.mjs assets/locks/python-standard/uv.lock assets/locks/python-genai/uv.lock",
|
|
48
54
|
"refresh:power-apps-starter": "node scripts/refresh-power-apps-starter.mjs",
|
|
49
55
|
"smoke:package": "npm run build && node scripts/package-smoke-test.mjs",
|
|
50
56
|
"verify:standard-node-templates": "npm run build && node scripts/verify-standard-node-templates.mjs",
|
|
57
|
+
"verify:generated-containers": "npm run build && node scripts/verify-generated-containers.mjs",
|
|
51
58
|
"verify:power-apps-starter": "npm run build && node scripts/verify-power-apps-starter.mjs",
|
|
52
59
|
"verify:release-identity": "npm run build && node scripts/verify-release-identity.mjs",
|
|
53
60
|
"verify:published": "npm run build && node scripts/verify-published-package.mjs",
|
|
54
|
-
"check": "npm run build && npm test"
|
|
61
|
+
"check": "npm run check:supported-stack && npm run build && npm test"
|
|
55
62
|
},
|
|
56
63
|
"engines": {
|
|
57
|
-
"node": ">=20
|
|
64
|
+
"node": ">=24.20"
|
|
58
65
|
},
|
|
59
66
|
"devDependencies": {
|
|
60
67
|
"@types/cross-spawn": "^6.0.6",
|
|
61
|
-
"@types/node": "^
|
|
68
|
+
"@types/node": "^24.6.0",
|
|
62
69
|
"typescript": "^7.0.2",
|
|
63
|
-
"
|
|
70
|
+
"vite": "8.2.2",
|
|
71
|
+
"vitest": "4.1.11"
|
|
64
72
|
},
|
|
65
73
|
"dependencies": {
|
|
66
|
-
"@inquirer/prompts": "^
|
|
74
|
+
"@inquirer/prompts": "^8.6.0",
|
|
67
75
|
"cross-spawn": "^7.0.6",
|
|
68
76
|
"picocolors": "^1.1.1"
|
|
69
77
|
}
|