@msn-control/liftoff 0.4.1 → 0.5.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 +65 -256
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/UPSTREAM_LICENSE.txt +21 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/catalog.json +520 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/packaged/gitignore +27 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/README.md +25 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/components.json +22 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/eslint.config.js +23 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/index.html +13 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/package-lock.json +6597 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/package.json +60 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/public/power-apps.svg +55 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/App.tsx +17 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/assets/react.svg +1 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/mode-toggle.tsx +37 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/badge.tsx +46 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/button.tsx +60 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/calendar.tsx +211 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/card.tsx +92 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/chart.tsx +355 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/checkbox.tsx +32 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/command.tsx +184 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/dialog.tsx +141 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/dropdown-menu.tsx +257 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/input.tsx +21 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/label.tsx +22 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/popover.tsx +46 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/progress.tsx +29 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/select.tsx +185 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/separator.tsx +26 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/skeleton.tsx +13 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/table.tsx +114 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/tabs.tsx +66 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/textarea.tsx +18 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/tooltip.tsx +61 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/hooks/use-theme.ts +11 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/index.css +131 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/lib/utils.ts +6 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/main.tsx +10 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/pages/_layout.tsx +31 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/pages/home.tsx +59 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/pages/not-found.tsx +14 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/providers/query-provider.tsx +26 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/providers/sonner-provider.tsx +23 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/providers/theme-provider.tsx +64 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/router.tsx +24 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/tsconfig.app.json +34 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/tsconfig.json +13 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/tsconfig.node.json +26 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/vite.config.ts +19 -0
- package/assets/power-apps-code-app/README.md +27 -0
- package/dist/args.js +7 -1
- package/dist/args.js.map +1 -1
- package/dist/catalogs.d.ts +3 -1
- package/dist/catalogs.js +23 -0
- package/dist/catalogs.js.map +1 -1
- package/dist/code-apps-plugin.d.ts +13 -0
- package/dist/code-apps-plugin.js +69 -0
- package/dist/code-apps-plugin.js.map +1 -0
- package/dist/commands.js +282 -55
- package/dist/commands.js.map +1 -1
- package/dist/file-system.d.ts +16 -1
- package/dist/file-system.js +320 -10
- package/dist/file-system.js.map +1 -1
- package/dist/genai-templates.d.ts +6 -6
- package/dist/genai-templates.js +0 -3
- package/dist/genai-templates.js.map +1 -1
- package/dist/interactive.d.ts +40 -3
- package/dist/interactive.js +180 -24
- package/dist/interactive.js.map +1 -1
- package/dist/migrate-plan.d.ts +4 -4
- package/dist/migrate-plan.js +1 -1
- package/dist/migrate-plan.js.map +1 -1
- package/dist/planner.js +177 -40
- package/dist/planner.js.map +1 -1
- package/dist/power-apps-assets.d.ts +30 -0
- package/dist/power-apps-assets.js +131 -0
- package/dist/power-apps-assets.js.map +1 -0
- package/dist/power-apps-templates.d.ts +3 -0
- package/dist/power-apps-templates.js +140 -0
- package/dist/power-apps-templates.js.map +1 -0
- package/dist/power-apps-validation.d.ts +1 -0
- package/dist/power-apps-validation.js +79 -0
- package/dist/power-apps-validation.js.map +1 -0
- package/dist/project-dependencies.d.ts +1 -0
- package/dist/project-dependencies.js +12 -1
- package/dist/project-dependencies.js.map +1 -1
- package/dist/standard-templates.d.ts +4 -4
- package/dist/standard-templates.js.map +1 -1
- package/dist/templates.d.ts +2 -2
- package/dist/templates.js +196 -50
- package/dist/templates.js.map +1 -1
- package/dist/types.d.ts +73 -15
- package/dist/workstation.d.ts +10 -5
- package/dist/workstation.js +25 -10
- package/dist/workstation.js.map +1 -1
- package/docs/assets/liftoff-terminal.svg +33 -0
- package/docs/azure-deployment.md +66 -0
- package/docs/cli-reference.md +128 -0
- package/docs/configuration-and-manifests.md +102 -0
- package/docs/existing-repositories.md +87 -0
- package/docs/getting-started.md +114 -0
- package/docs/prerequisites.md +99 -0
- package/docs/project-structure.md +119 -0
- package/docs/safety-and-consent.md +98 -0
- package/docs/spec-workflows-and-agents.md +92 -0
- package/docs/troubleshooting.md +133 -0
- package/docs/workloads.md +128 -0
- package/package.json +8 -2
package/README.md
CHANGED
|
@@ -1,274 +1,83 @@
|
|
|
1
|
-
# Liftoff
|
|
1
|
+
# Liftoff
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**Initialize governed GenAI applications, APIs, and Power Apps code apps from one
|
|
4
|
+
interactive CLI.** Liftoff combines production-oriented scaffolds with OpenSpec or
|
|
5
|
+
Spec Kit and integrates GitHub Copilot, Claude Code, or both from the first commit.
|
|
4
6
|
|
|
5
|
-
|
|
7
|
+
[](https://www.npmjs.com/package/@msn-control/liftoff)
|
|
8
|
+
[](https://github.com/voyager163/liftoff/actions/workflows/ci.yml)
|
|
9
|
+
[](LICENSE)
|
|
10
|
+
[](package.json)
|
|
6
11
|
|
|
7
|
-
|
|
12
|
+
## Start here
|
|
8
13
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
The authoritative Liftoff release registry is `https://registry.npmjs.org`. Where direct public npm access is permitted, verify and install the latest stable CLI explicitly from that registry:
|
|
14
|
+
Install the published CLI from canonical npm, then launch the guided experience:
|
|
12
15
|
|
|
13
16
|
```bash
|
|
14
|
-
npm view @msn-control/liftoff@latest version --registry=https://registry.npmjs.org
|
|
15
17
|
npm install -g @msn-control/liftoff@latest --registry=https://registry.npmjs.org
|
|
18
|
+
liftoff init
|
|
16
19
|
```
|
|
17
20
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
liftoff --version
|
|
22
|
-
liftoff help
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
Versions before 0.3.0 are unsupported and must not be used for new projects. If npm is configured to use a managed registry or mirror, query `@msn-control/liftoff@latest` through that registry before installing and compare it with the canonical version. Stop if the managed registry exposes an older version or rejects the current explicit version; ask the mirror owner to synchronize or approve the release before onboarding resumes. Liftoff does not modify `.npmrc` or bypass managed-registry policy automatically.
|
|
26
|
-
|
|
27
|
-
## Quick Start
|
|
28
|
-
|
|
29
|
-
Preview a project and its derived workstation requirements without writing files or running installers:
|
|
30
|
-
|
|
31
|
-
```bash
|
|
32
|
-
liftoff plan --pattern rag --cloud azure --region eastus --frontend --agents copilot,claude
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
Initialize a named project. Liftoff probes required runtimes, the selected spec framework, cloud/development tools, and every selected AI coding agent before it writes:
|
|
21
|
+
Liftoff asks you to choose a workload and spec workflow, select one or more coding
|
|
22
|
+
agents with Space, review workstation readiness, and confirm the project plan before
|
|
23
|
+
it writes. After initialization:
|
|
36
24
|
|
|
37
25
|
```bash
|
|
38
|
-
liftoff init claims-copilot --pattern rag --cloud azure --region eastus --spec openspec --agents copilot,claude --frontend --yes
|
|
39
|
-
cd claims-copilot
|
|
40
|
-
cp .env.example .env
|
|
41
26
|
liftoff validate
|
|
42
27
|
liftoff doctor
|
|
43
28
|
```
|
|
44
29
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
To initialize an existing Git worktree root in place, run `liftoff init` at that exact root. With no project name, Liftoff uses the repository directory name; a supplied name changes project identity without creating a child directory.
|
|
48
|
-
|
|
49
|
-
```bash
|
|
50
|
-
cd existing-repository
|
|
51
|
-
liftoff init --no-genai --api node --cloud azure --region eastus --spec spec-kit --agents copilot,claude --default-agent copilot
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
In a non-Git directory or below (but not at) a Git root, a project name creates a named child. Standard API choices are `python` (FastAPI), `node` (Fastify with TypeScript), and `go` (Huma v2 with Chi). A GenAI `--pattern` selects the Python/FastAPI/PydanticAI stack.
|
|
55
|
-
|
|
56
|
-
For an existing application, migration creates a fresh sibling scaffold, runs the same readiness and official-framework pipeline, stages a filtered source copy, and leaves the source byte-for-byte unchanged:
|
|
57
|
-
|
|
58
|
-
```bash
|
|
59
|
-
liftoff migrate ../legacy-app --region eastus --agents copilot,claude --yes
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
## Terminal Interface
|
|
63
|
-
|
|
64
|
-
Interactive `init`, `migrate`, and `plan` sessions open with the Liftoff identity before discovery or the first question. Human-readable help, prompts, plans, readiness checks, consent details, maintenance results, catalogs, errors, remedies, and completion summaries use the same presentation hierarchy:
|
|
65
|
-
|
|
66
|
-
```text
|
|
67
|
-
┌──────────────────────────────────────────────────────────────────────────────┐
|
|
68
|
-
│ ██╗ ██╗███████╗████████╗ ██████╗ ███████╗███████╗ │
|
|
69
|
-
│ ██║ ██║██╔════╝╚══██╔══╝██╔═══██╗██╔════╝██╔════╝ │
|
|
70
|
-
│ ██║ ██║█████╗ ██║ ██║ ██║█████╗ █████╗ │
|
|
71
|
-
│ ██║ ██║██╔══╝ ██║ ██║ ██║██╔══╝ ██╔══╝ │
|
|
72
|
-
│ ███████╗██║██║ ██║ ╚██████╔╝██║ ██║ │
|
|
73
|
-
│ ╚══════╝╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ │
|
|
74
|
-
└──────────────────────────────────────────────────────────────────────────────┘
|
|
75
|
-
◆ Configure project
|
|
76
|
-
┌─ Resolved project plan ──────────────────────────────────────────────────────┐
|
|
77
|
-
│ Project claims-copilot │
|
|
78
|
-
│ Spec workflow OpenSpec │
|
|
79
|
-
│ Coding agents GitHub Copilot, Claude Code │
|
|
80
|
-
└──────────────────────────────────────────────────────────────────────────────┘
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
TTYs at least 96 columns receive the rich wordmark, Unicode sections, aligned tables, and restrained semantic color. Widths from 64 through 95 columns use the compact identity and wrapped sections. Narrow or redirected output is deterministic plain text with no ANSI sequences or decorative borders, so paths, commands, labels, values, and remedies remain copyable.
|
|
84
|
-
|
|
85
|
-
Set `NO_COLOR=1` to retain the selected layout and hierarchy without ANSI color:
|
|
86
|
-
|
|
87
|
-
```bash
|
|
88
|
-
NO_COLOR=1 liftoff init
|
|
89
|
-
liftoff doctor > readiness.txt
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
Machine contracts bypass presentation. `liftoff doctor --json` and `liftoff update --json` emit only their documented JSON values, while `liftoff --version` remains exactly one line. Liftoff labels installer, framework, and dependency stages, then forwards child stdout and stderr unchanged.
|
|
93
|
-
|
|
94
|
-
## Lifecycle
|
|
95
|
-
|
|
96
|
-
```text
|
|
97
|
-
plan -> init or migrate -> validate and doctor -> update -> dev and infra helpers
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
- `liftoff plan` resolves project decisions, previews artifacts and requirements, and has no side effects.
|
|
101
|
-
- `liftoff init` initializes a new child or the exact current Git root, checks workstation readiness, runs the pinned official OpenSpec or Spec Kit initializer in temporary staging, validates all output, and merges transactionally.
|
|
102
|
-
- `liftoff migrate <path>` scans a non-Liftoff source, requires a new or empty sibling target, and uses the same staged framework and optional dependency phases. `--force` never permits a non-empty migration target.
|
|
103
|
-
- `liftoff validate` checks the manifest's durable files plus the declared framework contract and selected-agent markers.
|
|
104
|
-
- `liftoff doctor` performs read-only plan-derived probes with blocking, advisory, authentication-health, framework, drift, runtime, and cloud layers. JSON output uses stable requirement identifiers and states.
|
|
105
|
-
- `liftoff update` is a read-only drift check by default. `liftoff update --apply` writes safe durable changes, skips conflicts unless `--force` is supplied, and reports orphans without deleting them.
|
|
106
|
-
- `liftoff dev` and `liftoff infra` print Docker Compose and OpenTofu helper commands; they do not execute them.
|
|
107
|
-
|
|
108
|
-
Catalog discovery remains available:
|
|
109
|
-
|
|
110
|
-
```bash
|
|
111
|
-
liftoff patterns
|
|
112
|
-
liftoff providers
|
|
113
|
-
liftoff regions
|
|
114
|
-
liftoff regions search korea --cloud azure
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
Azure is the available V1 provider. AWS and GCP remain planned and are rejected before generation.
|
|
118
|
-
|
|
119
|
-
## Workstation Readiness
|
|
120
|
-
|
|
121
|
-
Liftoff automatically detects requirements derived from the full project plan:
|
|
122
|
-
|
|
123
|
-
- Blocking: Node.js 20.19+, the selected Python/Node/Go runtime, the exact tested OpenSpec or Spec Kit CLI, and every selected Copilot or Claude Code integration.
|
|
124
|
-
- Advisory: Docker and daemon health, OpenTofu, Azure CLI, and cloud authentication.
|
|
125
|
-
- Authentication: Liftoff reports observable health but never stores credentials or signs in on the developer's behalf.
|
|
126
|
-
|
|
127
|
-
On macOS, allowlisted recipes use Homebrew, npm, or `uv`; on Windows they use WinGet, npm, or `uv`. Liftoff prints each command and requires `--install-tools` or separate interactive approval. Linux system packages are never installed with automatic elevation: Liftoff gives distribution-appropriate official guidance, while npm/`uv` framework recipes remain separately consented. PATH-changing installs are re-probed and may require a new terminal.
|
|
128
|
-
|
|
129
|
-
Copilot is detected through its CLI or supported VS Code extensions. Claude Code is checked with its version and doctor commands. Both agents may be selected together; Spec Kit additionally records one selected agent as its default integration.
|
|
130
|
-
|
|
131
|
-
## Target, Ownership, And Consent Safety
|
|
132
|
-
|
|
133
|
-
Liftoff renders into a temporary staging directory, runs official framework commands there, rejects symlinks and unexpected framework roots, validates the complete tree, then computes one immutable destination preflight. Existing unrelated files are preserved. Different regular files are disclosed as one conflict set; structural collisions, symlink paths, unsafe ancestors, and an existing `liftoff.manifest.json` are non-overridable blockers. Writes are atomic and handled failures roll back created or replaced files.
|
|
30
|
+

|
|
134
31
|
|
|
135
|
-
|
|
32
|
+
## One flow, three workloads
|
|
136
33
|
|
|
137
|
-
|
|
|
34
|
+
| Workload | Generated foundation | Deferred until you choose |
|
|
138
35
|
| --- | --- | --- |
|
|
139
|
-
|
|
|
140
|
-
|
|
|
141
|
-
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
liftoff
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|-- liftoff.manifest.json
|
|
188
|
-
|-- .env.example
|
|
189
|
-
|-- Dockerfile
|
|
190
|
-
|-- docker-compose.yml
|
|
191
|
-
|-- backend/ # internals depend on the selected API stack
|
|
192
|
-
|-- database/
|
|
193
|
-
| |-- alembic.ini
|
|
194
|
-
| |-- migrations/
|
|
195
|
-
| `-- models/
|
|
196
|
-
|-- environments/
|
|
197
|
-
| |-- dev/
|
|
198
|
-
| |-- test/
|
|
199
|
-
| `-- prod/
|
|
200
|
-
|-- infrastructure/
|
|
201
|
-
| `-- opentofu/
|
|
202
|
-
| `-- azure/
|
|
203
|
-
|-- openspec/ or .specify/
|
|
204
|
-
|-- frontend/ # only when frontend generation is selected
|
|
205
|
-
|-- functions/<worker-name>/ # only for worker-enabled Azure patterns
|
|
206
|
-
`-- migration/legacy/ # only for projects created by liftoff migrate
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
Core generated areas:
|
|
210
|
-
|
|
211
|
-
- `backend` contains the selected API stack and Scalar/OpenAPI wiring. Python uses `backend/apis`, Node.js uses `backend/src`, and Go uses `backend/cmd/api` plus `backend/internal`.
|
|
212
|
-
- `backend/orchestration` appears only in GenAI projects and contains PydanticAI agents, prompts, model configuration, and integration boundaries.
|
|
213
|
-
- `database` contains stack-native migrations and SQL schema assets: SQLAlchemy/Alembic for Python, Drizzle for Node.js, or pgx/Goose for Go.
|
|
214
|
-
- `environments/<env>` contains environment-specific backend settings, and Functions settings when a worker is generated.
|
|
215
|
-
- `docker-compose.yml` starts the selected backend runtime, PostgreSQL, Redis, Azurite, and Mailpit. GenAI projects use pgvector when required and include the optional Langfuse observability profile.
|
|
216
|
-
- `infrastructure/opentofu/azure` contains Azure OpenTofu modules, environment tfvars, local state configuration, and a remote state example.
|
|
217
|
-
- `openspec` is generated for the OpenSpec workflow; `.specify` and `specs` are generated for the Spec Kit workflow.
|
|
218
|
-
|
|
219
|
-
Conditional areas:
|
|
220
|
-
|
|
221
|
-
- `frontend` is generated only when `--frontend` is selected. It uses Vue 3 and Tailwind with a generic API starter for standard projects or an experience matched to the selected GenAI pattern.
|
|
222
|
-
- `functions/<worker-name>` is generated only for worker-enabled Azure GenAI patterns such as RAG, agent, multi-agent, and workflow. Azure Functions trigger adapters live there; reusable GenAI orchestration stays under `backend/orchestration`.
|
|
223
|
-
- `backend/workers` appears for worker-backed patterns as backend-adjacent or containerized worker code, separate from Azure Functions runtime files.
|
|
224
|
-
- `migration/legacy` appears only after `liftoff migrate` and contains a filtered copy of the source project for guided migration work.
|
|
225
|
-
|
|
226
|
-
## Configuration And Manifest
|
|
227
|
-
|
|
228
|
-
Generated projects contain two root files with different ownership models:
|
|
229
|
-
|
|
230
|
-
- `liftoff.config.json` is user-owned desired state after creation. Liftoff writes it once during generation and does not machine-rewrite it afterwards. Supported changes, such as adding an environment or enabling frontend output, are reconciled by `liftoff update`. Project type, API stack, and GenAI pattern changes are migrations and should use `liftoff migrate`.
|
|
231
|
-
- `liftoff.manifest.json` is the CLI-owned compatibility record. Manifest schema v3 records the generating `liftoffVersion`, project identity, selected agents, applicable default agent, official framework adapter and tested contract version, and durable generated artifact `logicalName`s with OS-neutral path parts and `sha256:` content hashes. V2 manifests remain readable as explicit legacy framework state.
|
|
232
|
-
|
|
233
|
-
The manifest lets `liftoff validate`, `liftoff doctor`, and `liftoff update` distinguish clean generated files from local edits. Seed content, such as the initial OpenSpec bootstrap change, is written once and intentionally omitted from the durable manifest so it can follow its own lifecycle. Treat the manifest as CLI-owned: restore or regenerate it when validation fails rather than hand-editing artifact paths or hashes.
|
|
234
|
-
|
|
235
|
-
## Contract Conventions
|
|
236
|
-
|
|
237
|
-
Generated projects contain persistent files that outlive any CLI release. The following rules are the compatibility contract, enforced by `tests/contract.test.ts` where possible:
|
|
238
|
-
|
|
239
|
-
- **Manifest schema**: writers use `artifactVersion` 3; readers support v2 legacy and v3 initialized framework state and reject other versions with a remedy. Durable artifacts retain `sha256:`-prefixed hashes, while framework-owned and seed files are validated separately.
|
|
240
|
-
- **Append-only identifiers**: artifact `logicalName`s and catalog ids (project types, API stacks, patterns, providers, environments, spec workflows) are never renamed or removed, only added. The contract test snapshots the logical-name sets.
|
|
241
|
-
- **Deterministic rendering**: artifact content depends only on the project plan and the template code, with no timestamps, randomness, or environment leakage. Verified by a double-render byte-equality test.
|
|
242
|
-
- **Reserved namespaces**: `.liftoff/` in generated projects is reserved for future CLI-managed state; no new CLI-managed root-level files beyond `liftoff.config.json` and `liftoff.manifest.json`. `liftoff.config.json` is written once at generation and never machine-written afterwards.
|
|
243
|
-
- **Portable paths**: machine-readable files store OS-neutral path-part arrays, never joined path strings.
|
|
244
|
-
- **Exit codes**: 0 = success or clean check, 1 = failure, 2 = a check mode found drift.
|
|
245
|
-
- **Machine output**: every `--json` output carries a top-level numeric `schemaVersion`.
|
|
246
|
-
|
|
247
|
-
## Development
|
|
248
|
-
|
|
249
|
-
Clone the public repository and install its development dependencies:
|
|
250
|
-
|
|
251
|
-
```bash
|
|
252
|
-
npm ci
|
|
253
|
-
```
|
|
254
|
-
|
|
255
|
-
Run contributor commands from the repository root:
|
|
256
|
-
|
|
257
|
-
```bash
|
|
258
|
-
npm run check
|
|
259
|
-
npm run build
|
|
260
|
-
npm test
|
|
261
|
-
npm run smoke:package
|
|
262
|
-
```
|
|
263
|
-
|
|
264
|
-
The complete test suite exercises generated Python, Node.js, and Go projects. Install Python 3.12, Go 1.23, and OpenTofu 1.12 when working on generated-stack or infrastructure behavior.
|
|
265
|
-
|
|
266
|
-
See [CONTRIBUTING.md](CONTRIBUTING.md) for the contribution workflow and [SECURITY.md](SECURITY.md) for private vulnerability reporting.
|
|
267
|
-
|
|
268
|
-
## Release
|
|
269
|
-
|
|
270
|
-
The `Release Liftoff` workflow builds, tests, packs, smoke-installs, and publishes `@msn-control/liftoff` from this repository. Stable versions publish with the `latest` npm dist-tag; prerelease versions publish with `next`. After publication, the workflow waits for canonical npm propagation, clean-installs the selected dist-tag into an isolated prefix, verifies its package version, and executes installed CLI commands. A mismatch fails the workflow even though npm has already accepted immutable package bytes.
|
|
271
|
-
|
|
272
|
-
Releases use npm trusted publishing with provenance from this public repository. Publishing remains blocked unless npm authorizes `.github/workflows/release.yml` for `voyager163/liftoff`.
|
|
273
|
-
|
|
274
|
-
Canonical publication does not prove that an external managed mirror has synchronized. Organizations using a mirror should gate their internal release announcement on that mirror exposing the canonical stable version. See [CONTRIBUTING.md](CONTRIBUTING.md) for post-publish recovery and historical-version deprecation procedures.
|
|
36
|
+
| **GenAI application** | Python, FastAPI, PydanticAI, data and messaging boundaries, optional frontend, Docker, and Azure OpenTofu | Model credentials, cloud sign-in, deployment |
|
|
37
|
+
| **API application** | Python/FastAPI, Node.js/Fastify, or Go/Huma API, database assets, optional frontend, Docker, and Azure OpenTofu | Service configuration, cloud sign-in, deployment |
|
|
38
|
+
| **Power Apps code app** | Microsoft's pinned React, Vite, TypeScript, Power Apps SDK starter and project-local CLI | Environment binding, connectors, `power-apps push` |
|
|
39
|
+
|
|
40
|
+
Every workload can use **OpenSpec** or **Spec Kit** with **GitHub Copilot**,
|
|
41
|
+
**Claude Code**, or both. The optional Microsoft Code Apps agent plugin remains an
|
|
42
|
+
explicit, Preview-only choice.
|
|
43
|
+
|
|
44
|
+
[Compare workload questions and outputs](docs/workloads.md) |
|
|
45
|
+
[Choose a spec workflow and agents](docs/spec-workflows-and-agents.md)
|
|
46
|
+
|
|
47
|
+
## Existing repository friendly
|
|
48
|
+
|
|
49
|
+
Run `liftoff init` at the exact current Git root to initialize that repository in
|
|
50
|
+
place; Liftoff does not create an unnecessary child folder. In other locations, a
|
|
51
|
+
project name creates a named child directory.
|
|
52
|
+
|
|
53
|
+
All output is rendered and validated in temporary staging first. Liftoff discloses
|
|
54
|
+
regular-file replacements, asks before overwrite, rejects structural and symlink
|
|
55
|
+
conflicts, keeps tool/dependency permissions independent, and rolls back handled
|
|
56
|
+
write failures.
|
|
57
|
+
|
|
58
|
+
[Initialize an existing repository](docs/existing-repositories.md) |
|
|
59
|
+
[Understand target and consent safety](docs/safety-and-consent.md)
|
|
60
|
+
|
|
61
|
+
## Documentation
|
|
62
|
+
|
|
63
|
+
| Guide | Use it to |
|
|
64
|
+
| --- | --- |
|
|
65
|
+
| [Getting started](docs/getting-started.md) | Install safely and complete the first interactive project |
|
|
66
|
+
| [Workloads](docs/workloads.md) | Compare GenAI, API, and Power Apps choices and outputs |
|
|
67
|
+
| [Spec workflows and agents](docs/spec-workflows-and-agents.md) | Configure OpenSpec, Spec Kit, Copilot, Claude, and the optional Code Apps plugin |
|
|
68
|
+
| [Existing repositories](docs/existing-repositories.md) | Understand in-place, child-directory, and migration behavior |
|
|
69
|
+
| [Prerequisites](docs/prerequisites.md) | Review plan-derived runtimes, tools, authentication, and dependency setup |
|
|
70
|
+
| [Safety and consent](docs/safety-and-consent.md) | Review staging, overwrite, install, rollback, and ownership guarantees |
|
|
71
|
+
| [CLI reference](docs/cli-reference.md) | Find commands, flags, terminal modes, JSON, and exit-code contracts |
|
|
72
|
+
| [Generated project structure](docs/project-structure.md) | Locate workload-specific and conditional generated areas |
|
|
73
|
+
| [Configuration and manifests](docs/configuration-and-manifests.md) | Edit desired state and understand manifest schema v4 |
|
|
74
|
+
| [Azure deployment](docs/azure-deployment.md) | Review generated Azure and OpenTofu contracts for API workloads |
|
|
75
|
+
| [Troubleshooting](docs/troubleshooting.md) | Recover from registry, readiness, validation, update, and plugin issues |
|
|
76
|
+
|
|
77
|
+
## Contributing and security
|
|
78
|
+
|
|
79
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for build, test, packaging, starter-refresh,
|
|
80
|
+
and release procedures. Report vulnerabilities through the private process in
|
|
81
|
+
[SECURITY.md](SECURITY.md).
|
|
82
|
+
|
|
83
|
+
Liftoff is licensed under [GPL-3.0-only](LICENSE).
|
package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/UPSTREAM_LICENSE.txt
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
Copyright (c) Microsoft Corporation.
|
|
2
|
+
|
|
3
|
+
MIT License
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|