@msn-control/liftoff 0.6.2 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/README.md +15 -1
  2. package/assets/governance/single-maintainer-gitflow/policy.md +705 -0
  3. package/assets/locks/frontend/package-lock.json +1012 -1694
  4. package/assets/locks/frontend/package.json +5 -6
  5. package/assets/locks/go-backend/go.mod +17 -0
  6. package/assets/locks/go-backend/go.sum +159 -0
  7. package/assets/locks/node-backend/package-lock.json +1473 -2320
  8. package/assets/locks/node-backend/package.json +8 -7
  9. package/assets/locks/opentofu-azure/.terraform.lock.hcl +39 -0
  10. package/assets/locks/opentofu-azure/versions.tf +10 -0
  11. package/assets/locks/python-genai/function-requirements.txt +1734 -0
  12. package/assets/locks/python-genai/liftoff_template_python_genai.egg-info/PKG-INFO +25 -0
  13. package/assets/locks/python-genai/liftoff_template_python_genai.egg-info/SOURCES.txt +6 -0
  14. package/assets/locks/python-genai/liftoff_template_python_genai.egg-info/dependency_links.txt +1 -0
  15. package/assets/locks/python-genai/liftoff_template_python_genai.egg-info/requires.txt +23 -0
  16. package/assets/locks/python-genai/liftoff_template_python_genai.egg-info/top_level.txt +1 -0
  17. package/assets/locks/python-genai/pyproject.toml +42 -0
  18. package/assets/locks/python-genai/uv.lock +2536 -0
  19. package/assets/locks/python-standard/pyproject.toml +36 -0
  20. package/assets/locks/python-standard/uv.lock +1780 -0
  21. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/catalog.json +4 -4
  22. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/package-lock.json +667 -1108
  23. package/assets/supported-stack.json +711 -0
  24. package/dist/args.js +26 -1
  25. package/dist/args.js.map +1 -1
  26. package/dist/catalogs.d.ts +3 -1
  27. package/dist/catalogs.js +29 -7
  28. package/dist/catalogs.js.map +1 -1
  29. package/dist/cli.js +2 -1
  30. package/dist/cli.js.map +1 -1
  31. package/dist/commands.d.ts +6 -0
  32. package/dist/commands.js +364 -172
  33. package/dist/commands.js.map +1 -1
  34. package/dist/container-validation.d.ts +2 -0
  35. package/dist/container-validation.js +26 -0
  36. package/dist/container-validation.js.map +1 -0
  37. package/dist/file-system.d.ts +1 -0
  38. package/dist/file-system.js +141 -7
  39. package/dist/file-system.js.map +1 -1
  40. package/dist/framework-adapters.js +1 -0
  41. package/dist/framework-adapters.js.map +1 -1
  42. package/dist/go-template-assets.d.ts +2 -0
  43. package/dist/go-template-assets.js +14 -0
  44. package/dist/go-template-assets.js.map +1 -0
  45. package/dist/init-filesystem.js +5 -4
  46. package/dist/init-filesystem.js.map +1 -1
  47. package/dist/interactive.d.ts +0 -5
  48. package/dist/interactive.js +11 -73
  49. package/dist/interactive.js.map +1 -1
  50. package/dist/opentofu-template-assets.d.ts +2 -0
  51. package/dist/opentofu-template-assets.js +10 -0
  52. package/dist/opentofu-template-assets.js.map +1 -0
  53. package/dist/package-identity.d.ts +8 -0
  54. package/dist/package-identity.js +16 -0
  55. package/dist/package-identity.js.map +1 -0
  56. package/dist/planner.js +42 -3
  57. package/dist/planner.js.map +1 -1
  58. package/dist/power-apps-templates.js +6 -0
  59. package/dist/power-apps-templates.js.map +1 -1
  60. package/dist/project-dependencies.d.ts +1 -1
  61. package/dist/project-dependencies.js +15 -34
  62. package/dist/project-dependencies.js.map +1 -1
  63. package/dist/published-verifier.js +11 -1
  64. package/dist/published-verifier.js.map +1 -1
  65. package/dist/python-template-assets.d.ts +4 -0
  66. package/dist/python-template-assets.js +34 -0
  67. package/dist/python-template-assets.js.map +1 -0
  68. package/dist/repository-governance.d.ts +17 -0
  69. package/dist/repository-governance.js +507 -0
  70. package/dist/repository-governance.js.map +1 -0
  71. package/dist/runtime.d.ts +1 -1
  72. package/dist/runtime.js +3 -1
  73. package/dist/runtime.js.map +1 -1
  74. package/dist/self-upgrade.d.ts +77 -0
  75. package/dist/self-upgrade.js +499 -0
  76. package/dist/self-upgrade.js.map +1 -0
  77. package/dist/stable-release.d.ts +18 -0
  78. package/dist/stable-release.js +66 -0
  79. package/dist/stable-release.js.map +1 -0
  80. package/dist/standard-templates.js +28 -97
  81. package/dist/standard-templates.js.map +1 -1
  82. package/dist/supported-stack.d.ts +115 -0
  83. package/dist/supported-stack.js +439 -0
  84. package/dist/supported-stack.js.map +1 -0
  85. package/dist/telemetry/contract.d.ts +1 -1
  86. package/dist/telemetry/contract.js +1 -0
  87. package/dist/telemetry/contract.js.map +1 -1
  88. package/dist/templates.js +216 -125
  89. package/dist/templates.js.map +1 -1
  90. package/dist/types.d.ts +18 -1
  91. package/dist/workstation-catalog.js +15 -12
  92. package/dist/workstation-catalog.js.map +1 -1
  93. package/dist/workstation.js +16 -6
  94. package/dist/workstation.js.map +1 -1
  95. package/docs/cli-reference.md +99 -22
  96. package/docs/configuration-and-manifests.md +14 -7
  97. package/docs/existing-repositories.md +27 -6
  98. package/docs/getting-started.md +23 -7
  99. package/docs/prerequisites.md +30 -4
  100. package/docs/project-structure.md +20 -1
  101. package/docs/repository-governance.md +91 -0
  102. package/docs/safety-and-consent.md +42 -17
  103. package/docs/spec-workflows-and-agents.md +22 -8
  104. package/docs/supported-stack.md +89 -0
  105. package/docs/telemetry.md +6 -0
  106. package/docs/troubleshooting.md +84 -8
  107. package/docs/workloads.md +18 -5
  108. package/package.json +14 -6
  109. package/dist/update-impact.d.ts +0 -23
  110. package/dist/update-impact.js +0 -127
  111. package/dist/update-impact.js.map +0 -1
@@ -7,8 +7,8 @@ Liftoff workload.
7
7
 
8
8
  ### OpenSpec
9
9
 
10
- OpenSpec organizes proposed behavior changes as reviewable artifacts before
11
- implementation. Liftoff runs the pinned official OpenSpec initializer in
10
+ OpenSpec 1.11.0 organizes proposed behavior changes as reviewable artifacts
11
+ before implementation. Liftoff runs that pinned official initializer in
12
12
  temporary staging and passes every selected coding agent in stable order.
13
13
 
14
14
  Generated projects contain `openspec/` plus the selected agent integration
@@ -16,10 +16,9 @@ markers.
16
16
 
17
17
  ### Spec Kit
18
18
 
19
- Spec Kit provides a specification, planning, and implementation workflow.
20
- Liftoff initializes the selected default coding agent first, adds every
21
- secondary integration, and records the default separately from the full agent
22
- set.
19
+ Spec Kit 1.0.1 provides a specification, planning, and implementation workflow.
20
+ Liftoff initializes the selected default coding agent first, adds every secondary
21
+ integration, and records the default separately from the full agent set.
23
22
 
24
23
  Generated projects contain `.specify/`, `specs/`, and the selected agent
25
24
  integration markers.
@@ -66,6 +65,20 @@ Framework files remain owned by the official initializer. Liftoff validates
66
65
  them but excludes framework-owned output from durable artifact hashes so a
67
66
  framework can manage its own lifecycle.
68
67
 
68
+ Repository-governance launchers are separate durable Liftoff files at the exact
69
+ Copilot prompt and Claude command paths documented in
70
+ [repository governance](repository-governance.md). They reference one canonical
71
+ policy and context rather than duplicating framework-owned content. After
72
+ read-only Phase 0 and explicit approval, the agent creates a new change using
73
+ the selected framework; Liftoff never pre-creates or restores that change.
74
+
75
+ Install the exact selected framework release with its supported package manager:
76
+
77
+ ```bash
78
+ npm install -g @fission-ai/openspec@1.11.0
79
+ uv tool install specify-cli==1.0.1
80
+ ```
81
+
69
82
  ## Optional Code Apps plugin
70
83
 
71
84
  Power Apps projects can request Microsoft's
@@ -88,5 +101,6 @@ invoke `/create-code-app`. The plugin's connector and deployment skills remain
88
101
  available for post-creation work.
89
102
 
90
103
  Changing the valid plugin preference in `liftoff.config.json` is reconciled by
91
- `liftoff update`; it updates generated guidance and manifest intent without
92
- creating API or infrastructure artifacts.
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.
@@ -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.
@@ -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:
@@ -67,15 +103,13 @@ hand-edited unsafe path.
67
103
 
68
104
  ## Update reports conflicts or orphans
69
105
 
70
- In an interactive terminal, `liftoff update` shows an impact summary and asks
71
- before applying safe managed changes. The default answer is No.
106
+ `liftoff update` applies safe managed changes immediately and skips conflicts.
72
107
 
73
- - Local or user-owned conflicts are listed separately and require their own
74
- default-No overwrite confirmation.
75
- - With redirected input or output, review the report and apply safe changes
76
- with `liftoff update --apply`.
77
- - For prompt-free conflict replacement, use `liftoff update --apply --force`
78
- only after reviewing every listed path.
108
+ - Use `liftoff update --check` for a read-only human report or
109
+ `liftoff update --check --json` for an automation drift gate.
110
+ - Local or user-owned conflicts remain untouched by default.
111
+ - Use `liftoff update --force` only after reviewing every listed path and
112
+ deciding that each overwrite is intended.
79
113
  - Orphans are never deleted automatically.
80
114
  - Update reports dependency-definition impact but does not install
81
115
  dependencies.
@@ -83,6 +117,48 @@ before applying safe managed changes. The default answer is No.
83
117
  Commit or copy local work before overwriting. Transaction rollback protects a
84
118
  failed update, but Liftoff keeps no backup after success.
85
119
 
120
+ For a new governance policy or launcher conflict, review that exact local file
121
+ before considering `liftoff update --force`; do not delete it or activate remote
122
+ governance merely to make update pass. The schema-v5 manifest records
123
+ `handoff-partial` and no ownership entry for each preserved unrecorded conflict.
124
+ Run `liftoff update --check` to inspect the remaining paths. Once each path is
125
+ absent or matches the current artifact, plain update promotes the handoff to
126
+ `handoff-generated`. Setting `governanceProfile` to `none` turns previously
127
+ managed handoff files into preserved orphans rather than deleting them; an
128
+ unrecorded conflicting file remains user-owned and is not reported as an
129
+ orphan.
130
+
131
+ ## Governance handoff exists but nothing is enforced
132
+
133
+ That is the expected initial state. The manifest records `handoff-generated`,
134
+ not active enforcement. Commit and push the repository, run the selected-agent
135
+ launcher, review its read-only Phase 0 report, and explicitly approve the plan
136
+ before the agent creates a governance change.
137
+
138
+ Missing licenses, a private Staging runner, alert routes, parallel deployment,
139
+ or sufficient canary traffic must be reported as blockers or inapplicable
140
+ controls. Do not replace them with duplicate scanners or placeholder success.
141
+
142
+ Do not run an older Liftoff release to reverse a completed baseline migration.
143
+ Restore the affected generated files and `liftoff.manifest.json` through version
144
+ control, then reinstall from the restored locks.
145
+
146
+ ## A frozen Python install cannot reach the package index
147
+
148
+ Keep the committed `pyproject.toml` and `uv.lock` unchanged and retry the
149
+ generated `uv sync --frozen` command when registry connectivity is restored.
150
+ Do not regenerate the lock as a connectivity workaround.
151
+
152
+ Python Dockerfiles also accept a credential-free PEP 503 mirror while retaining
153
+ the lock's exact versions and hashes:
154
+
155
+ ```bash
156
+ docker build --build-arg UV_DEFAULT_INDEX=https://packages.example.test/simple/ .
157
+ ```
158
+
159
+ Do not place credentials in build arguments. Configure authenticated registries
160
+ through an approved secret-aware build mechanism.
161
+
86
162
  ## Power Apps dependencies or CLI are missing
87
163
 
88
164
  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.19+ | API, orchestration, data, messaging, Docker, Azure OpenTofu |
11
- | API application | Python, Node.js, or Go API stack; Azure region; environments; optional frontend | Selected API runtime and Node.js 20.19+ | API, data, Docker, Azure OpenTofu |
12
- | Power Apps code app | Spec workflow, agents, optional Code Apps plugin | Node.js 22.12+ | Official React/Vite starter and project-local Power Apps tooling |
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-v4 `liftoff.manifest.json`, starter provenance,
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
@@ -126,3 +135,7 @@ created the application.
126
135
  workload. It does not convert among GenAI, API, and Power Apps or change an API
127
136
  stack, GenAI pattern, or user-supplied starter identity. Initialize a fresh
128
137
  project or use a supported migration flow instead.
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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@msn-control/liftoff",
3
- "version": "0.6.2",
3
+ "version": "0.8.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.19"
64
+ "node": ">=24.20"
58
65
  },
59
66
  "devDependencies": {
60
67
  "@types/cross-spawn": "^6.0.6",
61
- "@types/node": "^20.14.10",
68
+ "@types/node": "^24.6.0",
62
69
  "typescript": "^7.0.2",
63
- "vitest": "^4.1.9"
70
+ "vite": "8.2.2",
71
+ "vitest": "4.1.11"
64
72
  },
65
73
  "dependencies": {
66
- "@inquirer/prompts": "^7.10.1",
74
+ "@inquirer/prompts": "^8.6.0",
67
75
  "cross-spawn": "^7.0.6",
68
76
  "picocolors": "^1.1.1"
69
77
  }
@@ -1,23 +0,0 @@
1
- import type { ReconcileEntry } from './reconcile.js';
2
- export declare const dependencyDefinitionLogicalNames: readonly ["backend-pyproject", "function-worker-requirements", "node-backend-package", "node-backend-lock", "go-backend-module", "go-backend-checksums", "frontend-package", "frontend-lock", "power-apps-package", "power-apps-lock"];
3
- export interface UpdateImpact {
4
- readonly creates: readonly string[];
5
- readonly restores: readonly string[];
6
- readonly replacements: readonly string[];
7
- readonly moves: readonly string[];
8
- readonly recordedStateRefreshes: readonly string[];
9
- readonly conflicts: readonly string[];
10
- readonly managedPathsRemoved: readonly string[];
11
- readonly managedPathsRemovedOnOverwrite: readonly string[];
12
- readonly orphansPreserved: readonly string[];
13
- readonly dependencyDefinitions: readonly string[];
14
- readonly safeActionCount: number;
15
- readonly localOrUserOwnedFilesAtRisk: number;
16
- readonly manifestWillUpdate: boolean;
17
- readonly installsDependencies: false;
18
- readonly deletesOrphans: false;
19
- readonly retainsBackupAfterSuccess: false;
20
- readonly hasSafeActions: boolean;
21
- readonly hasActionableChanges: boolean;
22
- }
23
- export declare function buildUpdateImpact(entries: readonly ReconcileEntry[]): UpdateImpact;
@@ -1,127 +0,0 @@
1
- import { manifestDisplayPath } from './file-system.js';
2
- export const dependencyDefinitionLogicalNames = Object.freeze([
3
- 'backend-pyproject',
4
- 'function-worker-requirements',
5
- 'node-backend-package',
6
- 'node-backend-lock',
7
- 'go-backend-module',
8
- 'go-backend-checksums',
9
- 'frontend-package',
10
- 'frontend-lock',
11
- 'power-apps-package',
12
- 'power-apps-lock'
13
- ]);
14
- const dependencyDefinitionLogicalNameSet = new Set(dependencyDefinitionLogicalNames);
15
- function comparePortable(left, right) {
16
- return left < right ? -1 : left > right ? 1 : 0;
17
- }
18
- function displayEntry(entry) {
19
- const current = manifestDisplayPath(entry.pathParts);
20
- return entry.previousPathParts
21
- ? `${manifestDisplayPath(entry.previousPathParts)} => ${current}`
22
- : current;
23
- }
24
- function freezeSorted(values) {
25
- return Object.freeze(values.sort(comparePortable));
26
- }
27
- function isActionable(entry) {
28
- return entry.status !== 'orphan' &&
29
- (entry.status !== 'unchanged' || entry.refreshHash === true);
30
- }
31
- export function buildUpdateImpact(entries) {
32
- const creates = [];
33
- const restores = [];
34
- const replacements = [];
35
- const moves = [];
36
- const recordedStateRefreshes = [];
37
- const conflicts = [];
38
- const managedPathsRemoved = [];
39
- const managedPathsRemovedOnOverwrite = [];
40
- const orphansPreserved = [];
41
- const dependencyDefinitions = [];
42
- for (const entry of entries) {
43
- switch (entry.status) {
44
- case 'new':
45
- creates.push(manifestDisplayPath(entry.pathParts));
46
- break;
47
- case 'missing':
48
- restores.push(manifestDisplayPath(entry.pathParts));
49
- break;
50
- case 'upgrade':
51
- replacements.push(manifestDisplayPath(entry.pathParts));
52
- break;
53
- case 'moved':
54
- if (entry.cleanMove) {
55
- moves.push(displayEntry(entry));
56
- if (entry.previousPathParts) {
57
- managedPathsRemoved.push(manifestDisplayPath(entry.previousPathParts));
58
- }
59
- }
60
- else {
61
- if (entry.sourceModified && entry.previousPathParts) {
62
- conflicts.push(manifestDisplayPath(entry.previousPathParts));
63
- }
64
- if (entry.destinationOccupied && !entry.destinationMatches) {
65
- conflicts.push(manifestDisplayPath(entry.pathParts));
66
- }
67
- if (entry.previousPathParts) {
68
- managedPathsRemovedOnOverwrite.push(manifestDisplayPath(entry.previousPathParts));
69
- }
70
- }
71
- break;
72
- case 'conflict':
73
- conflicts.push(manifestDisplayPath(entry.pathParts));
74
- break;
75
- case 'orphan':
76
- orphansPreserved.push(manifestDisplayPath(entry.pathParts));
77
- break;
78
- case 'unchanged':
79
- if (entry.refreshHash) {
80
- recordedStateRefreshes.push(manifestDisplayPath(entry.pathParts));
81
- }
82
- break;
83
- }
84
- if (isActionable(entry) &&
85
- dependencyDefinitionLogicalNameSet.has(entry.logicalName)) {
86
- dependencyDefinitions.push(manifestDisplayPath(entry.pathParts));
87
- }
88
- }
89
- const frozenCreates = freezeSorted(creates);
90
- const frozenRestores = freezeSorted(restores);
91
- const frozenReplacements = freezeSorted(replacements);
92
- const frozenMoves = freezeSorted(moves);
93
- const frozenRefreshes = freezeSorted(recordedStateRefreshes);
94
- const frozenConflicts = freezeSorted(conflicts);
95
- const frozenManagedPaths = freezeSorted(managedPathsRemoved);
96
- const frozenManagedOverwritePaths = freezeSorted(managedPathsRemovedOnOverwrite);
97
- const frozenOrphans = freezeSorted(orphansPreserved);
98
- const frozenDependencyDefinitions = freezeSorted(dependencyDefinitions);
99
- const safeActionCount = frozenCreates.length +
100
- frozenRestores.length +
101
- frozenReplacements.length +
102
- frozenMoves.length +
103
- frozenRefreshes.length;
104
- const hasSafeActions = safeActionCount > 0;
105
- const hasActionableChanges = hasSafeActions || frozenConflicts.length > 0;
106
- return Object.freeze({
107
- creates: frozenCreates,
108
- restores: frozenRestores,
109
- replacements: frozenReplacements,
110
- moves: frozenMoves,
111
- recordedStateRefreshes: frozenRefreshes,
112
- conflicts: frozenConflicts,
113
- managedPathsRemoved: frozenManagedPaths,
114
- managedPathsRemovedOnOverwrite: frozenManagedOverwritePaths,
115
- orphansPreserved: frozenOrphans,
116
- dependencyDefinitions: frozenDependencyDefinitions,
117
- safeActionCount,
118
- localOrUserOwnedFilesAtRisk: frozenConflicts.length,
119
- manifestWillUpdate: hasActionableChanges,
120
- installsDependencies: false,
121
- deletesOrphans: false,
122
- retainsBackupAfterSuccess: false,
123
- hasSafeActions,
124
- hasActionableChanges
125
- });
126
- }
127
- //# sourceMappingURL=update-impact.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"update-impact.js","sourceRoot":"","sources":["../src/update-impact.ts"],"names":[],"mappings":"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"}