frontier-os-app-builder 1.0.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 +92 -0
- package/agents/fos-executor.md +460 -0
- package/agents/fos-plan-checker.md +386 -0
- package/agents/fos-planner.md +416 -0
- package/agents/fos-researcher.md +358 -0
- package/agents/fos-verifier.md +491 -0
- package/bin/fos-tools.cjs +794 -0
- package/bin/install.js +234 -0
- package/commands/fos/add-feature.md +29 -0
- package/commands/fos/discuss.md +31 -0
- package/commands/fos/execute.md +35 -0
- package/commands/fos/new-app.md +39 -0
- package/commands/fos/new-milestone.md +28 -0
- package/commands/fos/next.md +29 -0
- package/commands/fos/plan.md +37 -0
- package/commands/fos/ship.md +29 -0
- package/commands/fos/status.md +22 -0
- package/package.json +30 -0
- package/references/app-patterns.md +501 -0
- package/references/deployment.md +395 -0
- package/references/module-inference.md +349 -0
- package/references/sdk-surface.md +1622 -0
- package/references/verification-rules.md +404 -0
- package/templates/app/gitignore +25 -0
- package/templates/app/index.css +111 -0
- package/templates/app/index.html +19 -0
- package/templates/app/layout.tsx +45 -0
- package/templates/app/main-router.tsx +17 -0
- package/templates/app/main-simple.tsx +19 -0
- package/templates/app/package.json +36 -0
- package/templates/app/postcss.config.js +5 -0
- package/templates/app/router.tsx +22 -0
- package/templates/app/sdk-context.tsx +33 -0
- package/templates/app/test-setup.ts +19 -0
- package/templates/app/tsconfig.json +22 -0
- package/templates/app/vercel.json +127 -0
- package/templates/app/vite.config.ts +15 -0
- package/templates/state/context.md +248 -0
- package/templates/state/manifest.json +11 -0
- package/templates/state/plan.md +187 -0
- package/templates/state/project.md +118 -0
- package/templates/state/requirements.md +133 -0
- package/templates/state/roadmap.md +129 -0
- package/templates/state/state.md +131 -0
- package/templates/state/summary.md +273 -0
- package/workflows/add-feature.md +234 -0
- package/workflows/discuss.md +310 -0
- package/workflows/execute-plan.md +222 -0
- package/workflows/execute.md +338 -0
- package/workflows/new-app.md +331 -0
- package/workflows/new-milestone.md +258 -0
- package/workflows/next.md +157 -0
- package/workflows/plan.md +310 -0
- package/workflows/ship.md +296 -0
- package/workflows/status.md +145 -0
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
<purpose>
|
|
2
|
+
Research existing Frontier OS apps for relevant patterns, then create detailed execution plans for a phase. Uses a three-agent pipeline: researcher -> planner -> plan-checker, with a revision loop if the checker finds issues. Produces RESEARCH.md and one or more PLAN.md files that the execute workflow will consume.
|
|
3
|
+
</purpose>
|
|
4
|
+
|
|
5
|
+
<required_reading>
|
|
6
|
+
Read all files referenced by the invoking prompt's execution_context before starting.
|
|
7
|
+
</required_reading>
|
|
8
|
+
|
|
9
|
+
<available_agent_types>
|
|
10
|
+
Valid FOS subagent types (use exact names):
|
|
11
|
+
- fos-researcher — Researches existing Frontier OS apps for patterns
|
|
12
|
+
- fos-planner — Creates detailed execution plans from research + context
|
|
13
|
+
- fos-plan-checker — Reviews plan quality before execution
|
|
14
|
+
- fos-executor — Executes plan tasks, commits, creates SUMMARY.md
|
|
15
|
+
- fos-verifier — Verifies phase completion, checks quality gates
|
|
16
|
+
</available_agent_types>
|
|
17
|
+
|
|
18
|
+
<process>
|
|
19
|
+
|
|
20
|
+
<step name="initialize" priority="first">
|
|
21
|
+
**Phase number from argument (required).**
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
INIT=$(node "$HOME/.claude/frontier-os-app-builder/bin/fos-tools.cjs" init plan "$PHASE")
|
|
25
|
+
if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Parse JSON for: `phase`, `phase_dir`, `has_context`, `has_research`, `existing_plans`, `manifest`, `state`, `project_path`, `roadmap_path`, `template_home`, `version`.
|
|
29
|
+
|
|
30
|
+
**If .frontier-app/ not found:**
|
|
31
|
+
```
|
|
32
|
+
Error: No .frontier-app/ directory found.
|
|
33
|
+
|
|
34
|
+
Run `/fos:new-app` first to initialize your Frontier OS app.
|
|
35
|
+
```
|
|
36
|
+
Exit workflow.
|
|
37
|
+
|
|
38
|
+
**If `phase_dir` is null:** Create the phase directory:
|
|
39
|
+
```bash
|
|
40
|
+
PADDED=$(printf "%02d" $PHASE)
|
|
41
|
+
# Extract phase name from ROADMAP.md
|
|
42
|
+
mkdir -p ".frontier-app/phases/${PADDED}-${PHASE_SLUG}"
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**If `has_context` is false and PHASE > 1:**
|
|
46
|
+
```
|
|
47
|
+
Warning: No CONTEXT.md for Phase [N]. Planning without user context may
|
|
48
|
+
produce plans that miss important decisions.
|
|
49
|
+
|
|
50
|
+
Recommended: Run `/fos:discuss [N]` first to capture implementation decisions.
|
|
51
|
+
Continue anyway? (y/n)
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**If `existing_plans` is not empty:**
|
|
55
|
+
Use AskUserQuestion:
|
|
56
|
+
- header: "Existing Plans"
|
|
57
|
+
- question: "Phase [N] already has [count] plan(s). What do you want to do?"
|
|
58
|
+
- options:
|
|
59
|
+
- "Replan" — Delete existing plans and create new ones
|
|
60
|
+
- "View plans" — Show existing plans before deciding
|
|
61
|
+
- "Keep them" — Skip planning, proceed to execution
|
|
62
|
+
|
|
63
|
+
**If "Keep them":** Exit with next-up `/fos:execute N`.
|
|
64
|
+
**If "Replan":** Continue (plans will be overwritten).
|
|
65
|
+
</step>
|
|
66
|
+
|
|
67
|
+
<step name="spawn_researcher">
|
|
68
|
+
**Spawn fos-researcher to study existing Frontier OS apps.**
|
|
69
|
+
|
|
70
|
+
The researcher examines production apps at `~/frontieros/frontier-os-app-*` to find patterns relevant to this phase.
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
Task(
|
|
74
|
+
subagent_type="fos-researcher",
|
|
75
|
+
prompt="
|
|
76
|
+
<objective>
|
|
77
|
+
Research existing Frontier OS apps for patterns relevant to Phase $PHASE: $PHASE_NAME.
|
|
78
|
+
Produce RESEARCH.md with concrete, copy-ready findings for the planner.
|
|
79
|
+
</objective>
|
|
80
|
+
|
|
81
|
+
<execution_context>
|
|
82
|
+
@$HOME/.claude/frontier-os-app-builder/agents/fos-researcher.md
|
|
83
|
+
@$HOME/.claude/frontier-os-app-builder/references/sdk-surface.md
|
|
84
|
+
@$HOME/.claude/frontier-os-app-builder/references/app-patterns.md
|
|
85
|
+
</execution_context>
|
|
86
|
+
|
|
87
|
+
<files_to_read>
|
|
88
|
+
Read these files at execution start using the Read tool:
|
|
89
|
+
- .frontier-app/PROJECT.md (App vision, SDK modules, constraints)
|
|
90
|
+
- .frontier-app/manifest.json (Declared permissions and metadata)
|
|
91
|
+
- .frontier-app/ROADMAP.md (Phase goal and requirements)
|
|
92
|
+
- $PHASE_DIR/$PADDED-CONTEXT.md (User decisions, if exists)
|
|
93
|
+
</files_to_read>
|
|
94
|
+
|
|
95
|
+
<output>
|
|
96
|
+
Write RESEARCH.md to: $PHASE_DIR/$PADDED-RESEARCH.md
|
|
97
|
+
</output>
|
|
98
|
+
"
|
|
99
|
+
)
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
**After researcher completes:** Verify RESEARCH.md was created:
|
|
103
|
+
```bash
|
|
104
|
+
test -f "$PHASE_DIR/$PADDED-RESEARCH.md" && echo "RESEARCH.md created" || echo "RESEARCH.md missing"
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**If Phase 1 (Scaffold):** Research is minimal — the scaffold pattern is standardized. The researcher should focus on confirming the latest SDK initialization pattern and any recent changes to production app structure. Keep research lightweight.
|
|
108
|
+
</step>
|
|
109
|
+
|
|
110
|
+
<step name="spawn_planner">
|
|
111
|
+
**Spawn fos-planner to create execution plans.**
|
|
112
|
+
|
|
113
|
+
The planner reads RESEARCH.md + CONTEXT.md + PROJECT.md and creates one or more PLAN.md files.
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
Task(
|
|
117
|
+
subagent_type="fos-planner",
|
|
118
|
+
prompt="
|
|
119
|
+
<objective>
|
|
120
|
+
Create execution plans for Phase $PHASE: $PHASE_NAME.
|
|
121
|
+
Each plan is a vertical slice — model + logic + UI for one coherent piece of functionality.
|
|
122
|
+
Plans must be specific enough for an executor agent to implement without asking questions.
|
|
123
|
+
</objective>
|
|
124
|
+
|
|
125
|
+
<execution_context>
|
|
126
|
+
@$HOME/.claude/frontier-os-app-builder/templates/state/plan.md
|
|
127
|
+
@$HOME/.claude/frontier-os-app-builder/references/sdk-surface.md
|
|
128
|
+
@$HOME/.claude/frontier-os-app-builder/references/app-patterns.md
|
|
129
|
+
@$HOME/.claude/frontier-os-app-builder/references/verification-rules.md
|
|
130
|
+
</execution_context>
|
|
131
|
+
|
|
132
|
+
<files_to_read>
|
|
133
|
+
Read these files at execution start using the Read tool:
|
|
134
|
+
- .frontier-app/PROJECT.md (App vision, SDK modules, constraints)
|
|
135
|
+
- .frontier-app/manifest.json (Declared permissions and metadata)
|
|
136
|
+
- .frontier-app/ROADMAP.md (Phase goal, success criteria, requirements)
|
|
137
|
+
- $PHASE_DIR/$PADDED-RESEARCH.md (Research findings from production apps)
|
|
138
|
+
- $PHASE_DIR/$PADDED-CONTEXT.md (User decisions, if exists)
|
|
139
|
+
</files_to_read>
|
|
140
|
+
|
|
141
|
+
<planning_rules>
|
|
142
|
+
- Phase 1 (Scaffold): ALWAYS exactly 1 plan. Uses templates from templates/app/.
|
|
143
|
+
- Feature phases: 1-3 plans. Prefer fewer, larger plans over many small ones.
|
|
144
|
+
- Each plan gets 2-3 tasks. Tasks are atomic — one clear action each.
|
|
145
|
+
- Wave 1 = no dependencies. Wave 2 = depends on Wave 1. Usually 1 wave is enough.
|
|
146
|
+
- Vertical slices: Plan 01 = Event listing (hook + component + route), NOT Plan 01 = All hooks.
|
|
147
|
+
- SDK methods: Specify exact import, method signature, expected return type.
|
|
148
|
+
- Every plan MUST include verification tasks (build, typecheck, dev server).
|
|
149
|
+
- Every plan MUST reference the execute-plan workflow in execution_context.
|
|
150
|
+
- Use the plan template frontmatter format exactly.
|
|
151
|
+
</planning_rules>
|
|
152
|
+
|
|
153
|
+
<output>
|
|
154
|
+
Write plan files to: $PHASE_DIR/${PADDED}-01-PLAN.md, ${PADDED}-02-PLAN.md, etc.
|
|
155
|
+
</output>
|
|
156
|
+
"
|
|
157
|
+
)
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
**After planner completes:** Verify plans were created:
|
|
161
|
+
```bash
|
|
162
|
+
ls "$PHASE_DIR/"*-PLAN.md 2>/dev/null | wc -l
|
|
163
|
+
```
|
|
164
|
+
</step>
|
|
165
|
+
|
|
166
|
+
<step name="spawn_plan_checker">
|
|
167
|
+
**Spawn fos-plan-checker to verify plan quality.**
|
|
168
|
+
|
|
169
|
+
```
|
|
170
|
+
Task(
|
|
171
|
+
subagent_type="fos-plan-checker",
|
|
172
|
+
prompt="
|
|
173
|
+
<objective>
|
|
174
|
+
Review the plans for Phase $PHASE: $PHASE_NAME.
|
|
175
|
+
Check for completeness, correctness, and executability.
|
|
176
|
+
Return PASS or FAIL with specific feedback.
|
|
177
|
+
</objective>
|
|
178
|
+
|
|
179
|
+
<files_to_read>
|
|
180
|
+
Read these files at execution start using the Read tool:
|
|
181
|
+
- .frontier-app/PROJECT.md (App vision — verify plans align)
|
|
182
|
+
- .frontier-app/ROADMAP.md (Phase requirements — verify all covered)
|
|
183
|
+
- $PHASE_DIR/$PADDED-CONTEXT.md (User decisions — verify plans honor them)
|
|
184
|
+
- All PLAN.md files in $PHASE_DIR/
|
|
185
|
+
</files_to_read>
|
|
186
|
+
|
|
187
|
+
<check_criteria>
|
|
188
|
+
1. **Coverage:** Do plans address all phase requirements from ROADMAP.md?
|
|
189
|
+
2. **Context honor:** Do plans respect all decisions in CONTEXT.md? No locked decisions overridden?
|
|
190
|
+
3. **SDK correctness:** Are SDK methods referenced with correct signatures and permissions?
|
|
191
|
+
4. **Task specificity:** Is every task concrete enough to implement without ambiguity?
|
|
192
|
+
5. **Verification:** Does every plan include build + typecheck verification?
|
|
193
|
+
6. **Dependencies:** Are wave assignments correct? No circular deps?
|
|
194
|
+
7. **File conflicts:** Do any plans modify the same files in the same wave?
|
|
195
|
+
8. **Frontier compliance:** Dark theme, iframe detection, SdkProvider wrapping — all covered?
|
|
196
|
+
</check_criteria>
|
|
197
|
+
|
|
198
|
+
<output>
|
|
199
|
+
Return a structured result:
|
|
200
|
+
- verdict: PASS or FAIL
|
|
201
|
+
- issues: list of specific issues found (if FAIL)
|
|
202
|
+
- suggestions: optional improvements (even if PASS)
|
|
203
|
+
</output>
|
|
204
|
+
"
|
|
205
|
+
)
|
|
206
|
+
```
|
|
207
|
+
</step>
|
|
208
|
+
|
|
209
|
+
<step name="revision_loop">
|
|
210
|
+
**If plan-checker returns FAIL: revise plans.**
|
|
211
|
+
|
|
212
|
+
Maximum 3 revision loops. Each loop:
|
|
213
|
+
|
|
214
|
+
1. Parse the checker's feedback — extract specific issues
|
|
215
|
+
2. Re-spawn the planner with the feedback:
|
|
216
|
+
|
|
217
|
+
```
|
|
218
|
+
Task(
|
|
219
|
+
subagent_type="fos-planner",
|
|
220
|
+
prompt="
|
|
221
|
+
<objective>
|
|
222
|
+
REVISE execution plans for Phase $PHASE: $PHASE_NAME.
|
|
223
|
+
The plan-checker found issues that must be fixed.
|
|
224
|
+
</objective>
|
|
225
|
+
|
|
226
|
+
<feedback>
|
|
227
|
+
[Paste specific issues from plan-checker]
|
|
228
|
+
</feedback>
|
|
229
|
+
|
|
230
|
+
<files_to_read>
|
|
231
|
+
- All existing PLAN.md files in $PHASE_DIR/ (read and revise in place)
|
|
232
|
+
- .frontier-app/PROJECT.md
|
|
233
|
+
- .frontier-app/ROADMAP.md
|
|
234
|
+
- $PHASE_DIR/$PADDED-CONTEXT.md
|
|
235
|
+
- $PHASE_DIR/$PADDED-RESEARCH.md
|
|
236
|
+
</files_to_read>
|
|
237
|
+
|
|
238
|
+
<output>
|
|
239
|
+
Overwrite the existing PLAN.md files with corrected versions.
|
|
240
|
+
</output>
|
|
241
|
+
"
|
|
242
|
+
)
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
3. Re-spawn plan-checker on revised plans
|
|
246
|
+
4. If PASS: break loop. If FAIL again: loop (up to 3 times)
|
|
247
|
+
|
|
248
|
+
**If still FAIL after 3 loops:**
|
|
249
|
+
```
|
|
250
|
+
Warning: Plan-checker found issues after 3 revision attempts.
|
|
251
|
+
Remaining issues:
|
|
252
|
+
- [issue 1]
|
|
253
|
+
- [issue 2]
|
|
254
|
+
|
|
255
|
+
You can:
|
|
256
|
+
- Proceed to execution with known issues
|
|
257
|
+
- Manually review and fix plans in $PHASE_DIR/
|
|
258
|
+
- Re-run /fos:plan $PHASE to start fresh
|
|
259
|
+
```
|
|
260
|
+
</step>
|
|
261
|
+
|
|
262
|
+
<step name="commit_and_update_state">
|
|
263
|
+
**Commit planning artifacts and update state.**
|
|
264
|
+
|
|
265
|
+
```bash
|
|
266
|
+
git add ".frontier-app/phases/"
|
|
267
|
+
git commit -m "docs: Phase $PHASE plans — [plan_count] plan(s) created
|
|
268
|
+
|
|
269
|
+
Phase: $PHASE_NAME
|
|
270
|
+
Plans: [list of plan names/objectives]
|
|
271
|
+
Checker: [PASS/FAIL with loop count]"
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
**Update STATE.md:**
|
|
275
|
+
```bash
|
|
276
|
+
node "$HOME/.claude/frontier-os-app-builder/bin/fos-tools.cjs" state update status "ready-to-execute"
|
|
277
|
+
node "$HOME/.claude/frontier-os-app-builder/bin/fos-tools.cjs" state update next_action "/fos:execute $PHASE"
|
|
278
|
+
node "$HOME/.claude/frontier-os-app-builder/bin/fos-tools.cjs" state update phase "$PHASE"
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
Also update STATE.md body:
|
|
282
|
+
- Last activity: [today] — Planned Phase [N]: [count] plans
|
|
283
|
+
- Session Continuity: next-command = /fos:execute N
|
|
284
|
+
</step>
|
|
285
|
+
|
|
286
|
+
<step name="next_up">
|
|
287
|
+
**Display completion and next step.**
|
|
288
|
+
|
|
289
|
+
```
|
|
290
|
+
## Phase [N]: [Name] — Plans Created
|
|
291
|
+
|
|
292
|
+
Created [count] plan(s):
|
|
293
|
+
|
|
294
|
+
| Plan | Wave | Objective | Tasks |
|
|
295
|
+
|------|------|-----------|-------|
|
|
296
|
+
| $PADDED-01 | 1 | [objective] | [count] |
|
|
297
|
+
| $PADDED-02 | 1 | [objective] | [count] |
|
|
298
|
+
|
|
299
|
+
Plan checker: [PASS / PASS after N revisions]
|
|
300
|
+
|
|
301
|
+
────────────────────────────────────────
|
|
302
|
+
Next up: `/fos:execute [N]`
|
|
303
|
+
Execute the plans — build the code, commit atomically, verify results.
|
|
304
|
+
|
|
305
|
+
Run `/clear` first to free your context window.
|
|
306
|
+
────────────────────────────────────────
|
|
307
|
+
```
|
|
308
|
+
</step>
|
|
309
|
+
|
|
310
|
+
</process>
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
<purpose>
|
|
2
|
+
Deploy the Frontier OS app to Vercel and optionally register it in the Frontier app store. Runs preflight checks (build, typecheck, tests), deploys to Vercel, and guides through app registration via the ThirdParty SDK module.
|
|
3
|
+
</purpose>
|
|
4
|
+
|
|
5
|
+
<required_reading>
|
|
6
|
+
Read all files referenced by the invoking prompt's execution_context before starting.
|
|
7
|
+
</required_reading>
|
|
8
|
+
|
|
9
|
+
<available_agent_types>
|
|
10
|
+
Valid FOS subagent types (use exact names):
|
|
11
|
+
- fos-researcher — Researches existing Frontier OS apps for patterns
|
|
12
|
+
- fos-planner — Creates detailed execution plans from research + context
|
|
13
|
+
- fos-plan-checker — Reviews plan quality before execution
|
|
14
|
+
- fos-executor — Executes plan tasks, commits, creates SUMMARY.md
|
|
15
|
+
- fos-verifier — Verifies phase completion, checks quality gates
|
|
16
|
+
</available_agent_types>
|
|
17
|
+
|
|
18
|
+
<process>
|
|
19
|
+
|
|
20
|
+
<step name="initialize" priority="first">
|
|
21
|
+
**Load project state and verify readiness.**
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
INIT=$(node "$HOME/.claude/frontier-os-app-builder/bin/fos-tools.cjs" init ship)
|
|
25
|
+
if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Parse JSON for: `manifest`, `state`, `all_verified`, `project_path`, `roadmap_path`, `version`.
|
|
29
|
+
|
|
30
|
+
**If .frontier-app/ not found:**
|
|
31
|
+
```
|
|
32
|
+
Error: No .frontier-app/ directory found.
|
|
33
|
+
|
|
34
|
+
Run `/fos:new-app` first to initialize your Frontier OS app.
|
|
35
|
+
```
|
|
36
|
+
Exit workflow.
|
|
37
|
+
|
|
38
|
+
**If `all_verified` is false:**
|
|
39
|
+
```
|
|
40
|
+
Warning: Not all phases have been verified.
|
|
41
|
+
|
|
42
|
+
Recommended: Run `/fos:status` to see which phases are incomplete.
|
|
43
|
+
Continue with deployment anyway? Some features may be missing.
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Use AskUserQuestion:
|
|
47
|
+
- header: "Incomplete Phases"
|
|
48
|
+
- question: "Deploy with incomplete phases?"
|
|
49
|
+
- options:
|
|
50
|
+
- "Deploy anyway" — Ship what's built
|
|
51
|
+
- "Check status first" — Run /fos:status to see what's missing
|
|
52
|
+
- "Cancel" — Go back and finish phases
|
|
53
|
+
|
|
54
|
+
**If "Check status first" or "Cancel":** Exit workflow.
|
|
55
|
+
|
|
56
|
+
**Display ship summary:**
|
|
57
|
+
```
|
|
58
|
+
## Ship: [App Name]
|
|
59
|
+
|
|
60
|
+
**Description:** [from manifest]
|
|
61
|
+
**SDK Modules:** [from manifest]
|
|
62
|
+
**Permissions:** [count]
|
|
63
|
+
**Dev Port:** [from manifest]
|
|
64
|
+
```
|
|
65
|
+
</step>
|
|
66
|
+
|
|
67
|
+
<step name="preflight_checks">
|
|
68
|
+
**Run all preflight checks. ALL must pass before deployment.**
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
echo "=== Preflight Checks ==="
|
|
72
|
+
|
|
73
|
+
# 1. TypeScript compilation
|
|
74
|
+
echo "--- TypeScript ---"
|
|
75
|
+
npx tsc --noEmit 2>&1
|
|
76
|
+
TSC_STATUS=$?
|
|
77
|
+
|
|
78
|
+
# 2. Vite build
|
|
79
|
+
echo "--- Build ---"
|
|
80
|
+
npm run build 2>&1
|
|
81
|
+
BUILD_STATUS=$?
|
|
82
|
+
|
|
83
|
+
# 3. Tests (if configured)
|
|
84
|
+
echo "--- Tests ---"
|
|
85
|
+
if grep -q '"test"' package.json 2>/dev/null; then
|
|
86
|
+
npx vitest run --reporter=verbose 2>&1
|
|
87
|
+
TEST_STATUS=$?
|
|
88
|
+
else
|
|
89
|
+
echo "No test script found — skipping"
|
|
90
|
+
TEST_STATUS=0
|
|
91
|
+
fi
|
|
92
|
+
|
|
93
|
+
# 4. FOS structure validation
|
|
94
|
+
echo "--- Structure ---"
|
|
95
|
+
node "$HOME/.claude/frontier-os-app-builder/bin/fos-tools.cjs" validate structure
|
|
96
|
+
STRUCT_STATUS=$?
|
|
97
|
+
|
|
98
|
+
# 5. FOS permissions validation
|
|
99
|
+
echo "--- Permissions ---"
|
|
100
|
+
node "$HOME/.claude/frontier-os-app-builder/bin/fos-tools.cjs" validate permissions
|
|
101
|
+
PERMS_STATUS=$?
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
**Report results:**
|
|
105
|
+
```
|
|
106
|
+
## Preflight Results
|
|
107
|
+
|
|
108
|
+
| Check | Status |
|
|
109
|
+
|-------|--------|
|
|
110
|
+
| TypeScript | [PASS/FAIL] |
|
|
111
|
+
| Build | [PASS/FAIL] |
|
|
112
|
+
| Tests | [PASS/FAIL/SKIPPED] |
|
|
113
|
+
| Structure | [PASS/FAIL] |
|
|
114
|
+
| Permissions | [PASS/FAIL] |
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
**If ANY check fails:**
|
|
118
|
+
```
|
|
119
|
+
Preflight failed. Fix the issues above before deploying.
|
|
120
|
+
|
|
121
|
+
[For TypeScript errors: show the specific errors]
|
|
122
|
+
[For build errors: show the Vite error output]
|
|
123
|
+
[For test failures: show failing test names]
|
|
124
|
+
[For structure issues: list missing files or patterns]
|
|
125
|
+
[For permission issues: list missing permissions]
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
**Do NOT proceed to deployment if preflight fails.** The user must fix issues and re-run `/fos:ship`.
|
|
129
|
+
</step>
|
|
130
|
+
|
|
131
|
+
<step name="check_vercel_cli">
|
|
132
|
+
**Check if Vercel CLI is available.**
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
which vercel 2>/dev/null && vercel --version 2>/dev/null
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
**If Vercel CLI not found:**
|
|
139
|
+
```
|
|
140
|
+
Vercel CLI is not installed. Install it to deploy:
|
|
141
|
+
|
|
142
|
+
npm i -g vercel
|
|
143
|
+
|
|
144
|
+
Then log in:
|
|
145
|
+
|
|
146
|
+
vercel login
|
|
147
|
+
|
|
148
|
+
After that, re-run `/fos:ship`.
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Use AskUserQuestion:
|
|
152
|
+
- header: "Vercel CLI"
|
|
153
|
+
- question: "Vercel CLI is not installed. What do you want to do?"
|
|
154
|
+
- options:
|
|
155
|
+
- "Install it now" — Run `npm i -g vercel` and continue
|
|
156
|
+
- "Skip deployment" — Just run preflight, I'll deploy manually
|
|
157
|
+
- "Cancel" — Exit
|
|
158
|
+
|
|
159
|
+
**If "Install it now":**
|
|
160
|
+
```bash
|
|
161
|
+
npm i -g vercel
|
|
162
|
+
echo "Vercel installed. Run 'vercel login' to authenticate, then re-run /fos:ship."
|
|
163
|
+
```
|
|
164
|
+
Exit — user needs to authenticate manually.
|
|
165
|
+
|
|
166
|
+
**If "Skip deployment":** Jump to update_state step, mark as "preflight-passed".
|
|
167
|
+
</step>
|
|
168
|
+
|
|
169
|
+
<step name="deploy_to_vercel">
|
|
170
|
+
**Deploy to Vercel production.**
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
# Check if already linked to a Vercel project
|
|
174
|
+
if [ -d ".vercel" ]; then
|
|
175
|
+
echo "Vercel project already linked."
|
|
176
|
+
else
|
|
177
|
+
echo "First deployment — Vercel will prompt for project setup."
|
|
178
|
+
fi
|
|
179
|
+
|
|
180
|
+
# Deploy to production
|
|
181
|
+
vercel --prod 2>&1
|
|
182
|
+
DEPLOY_STATUS=$?
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
**If deployment succeeds:**
|
|
186
|
+
Extract the deployment URL from output.
|
|
187
|
+
|
|
188
|
+
```
|
|
189
|
+
## Deployed
|
|
190
|
+
|
|
191
|
+
URL: [deployment URL]
|
|
192
|
+
Status: Live
|
|
193
|
+
|
|
194
|
+
The app is now accessible at the URL above.
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
**If deployment fails:**
|
|
198
|
+
```
|
|
199
|
+
Deployment failed. Common issues:
|
|
200
|
+
- Not authenticated: run `vercel login`
|
|
201
|
+
- Build error on Vercel: check the build output above
|
|
202
|
+
- Missing environment variables: check Vercel dashboard
|
|
203
|
+
```
|
|
204
|
+
</step>
|
|
205
|
+
|
|
206
|
+
<step name="app_registration">
|
|
207
|
+
**Optionally register the app in the Frontier app store.**
|
|
208
|
+
|
|
209
|
+
Use AskUserQuestion:
|
|
210
|
+
- header: "App Store"
|
|
211
|
+
- question: "Register this app in the Frontier app store? This makes it discoverable to Frontier OS users."
|
|
212
|
+
- options:
|
|
213
|
+
- "Register now" — Guide me through ThirdParty.createApp()
|
|
214
|
+
- "Later" — Skip registration, I'll do it manually
|
|
215
|
+
- "Not needed" — This is a private/internal app
|
|
216
|
+
|
|
217
|
+
**If "Register now":**
|
|
218
|
+
```
|
|
219
|
+
## App Registration
|
|
220
|
+
|
|
221
|
+
To register your app in the Frontier app store, you'll need to call the
|
|
222
|
+
ThirdParty SDK module's createApp() method. Here's how:
|
|
223
|
+
|
|
224
|
+
1. Open the Frontier OS developer portal
|
|
225
|
+
2. Navigate to "My Apps"
|
|
226
|
+
3. Click "Register New App"
|
|
227
|
+
4. Fill in:
|
|
228
|
+
- **Name:** [from manifest]
|
|
229
|
+
- **Description:** [from manifest]
|
|
230
|
+
- **URL:** [deployment URL from step 4]
|
|
231
|
+
- **Permissions:** [from manifest — the permissions your app requests]
|
|
232
|
+
|
|
233
|
+
Or use the SDK programmatically:
|
|
234
|
+
```typescript
|
|
235
|
+
const thirdParty = sdk.getThirdParty();
|
|
236
|
+
await thirdParty.createApp({
|
|
237
|
+
name: "[app name]",
|
|
238
|
+
description: "[description]",
|
|
239
|
+
url: "[deployment URL]",
|
|
240
|
+
permissions: [/* from manifest */]
|
|
241
|
+
});
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
Note: App registration requires developer access. If you don't have it,
|
|
245
|
+
contact a Frontier OS admin.
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
**If "Later" or "Not needed":** Continue to update_state.
|
|
249
|
+
</step>
|
|
250
|
+
|
|
251
|
+
<step name="update_state">
|
|
252
|
+
**Update STATE.md for ship completion.**
|
|
253
|
+
|
|
254
|
+
```bash
|
|
255
|
+
node "$HOME/.claude/frontier-os-app-builder/bin/fos-tools.cjs" state update status "shipped"
|
|
256
|
+
node "$HOME/.claude/frontier-os-app-builder/bin/fos-tools.cjs" state update next_action "/fos:new-milestone"
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
Update STATE.md body:
|
|
260
|
+
- Status: Shipped
|
|
261
|
+
- Last activity: [today] — Deployed to Vercel
|
|
262
|
+
- Deployment URL: [URL if available]
|
|
263
|
+
- App store: [Registered / Not registered]
|
|
264
|
+
- Next command: /fos:new-milestone or /fos:add-feature
|
|
265
|
+
|
|
266
|
+
```bash
|
|
267
|
+
git add .frontier-app/
|
|
268
|
+
git commit -m "docs: v1 shipped — deployed to Vercel
|
|
269
|
+
|
|
270
|
+
URL: [deployment URL or 'manual deployment']
|
|
271
|
+
Preflight: all checks passed
|
|
272
|
+
App store: [registered/skipped]"
|
|
273
|
+
```
|
|
274
|
+
</step>
|
|
275
|
+
|
|
276
|
+
<step name="next_up">
|
|
277
|
+
**Display completion and next steps.**
|
|
278
|
+
|
|
279
|
+
```
|
|
280
|
+
## Shipped: [App Name]
|
|
281
|
+
|
|
282
|
+
[If deployed:] Live at: [URL]
|
|
283
|
+
[If skipped:] Preflight passed — deploy manually when ready.
|
|
284
|
+
|
|
285
|
+
Milestone v1 is complete. What's next?
|
|
286
|
+
|
|
287
|
+
────────────────────────────────────────
|
|
288
|
+
Next up: `/fos:new-milestone` or `/fos:add-feature`
|
|
289
|
+
Start v2 with new features, or add a feature to the current milestone.
|
|
290
|
+
|
|
291
|
+
Run `/clear` first to free your context window.
|
|
292
|
+
────────────────────────────────────────
|
|
293
|
+
```
|
|
294
|
+
</step>
|
|
295
|
+
|
|
296
|
+
</process>
|