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