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.
Files changed (55) hide show
  1. package/README.md +92 -0
  2. package/agents/fos-executor.md +460 -0
  3. package/agents/fos-plan-checker.md +386 -0
  4. package/agents/fos-planner.md +416 -0
  5. package/agents/fos-researcher.md +358 -0
  6. package/agents/fos-verifier.md +491 -0
  7. package/bin/fos-tools.cjs +794 -0
  8. package/bin/install.js +234 -0
  9. package/commands/fos/add-feature.md +29 -0
  10. package/commands/fos/discuss.md +31 -0
  11. package/commands/fos/execute.md +35 -0
  12. package/commands/fos/new-app.md +39 -0
  13. package/commands/fos/new-milestone.md +28 -0
  14. package/commands/fos/next.md +29 -0
  15. package/commands/fos/plan.md +37 -0
  16. package/commands/fos/ship.md +29 -0
  17. package/commands/fos/status.md +22 -0
  18. package/package.json +30 -0
  19. package/references/app-patterns.md +501 -0
  20. package/references/deployment.md +395 -0
  21. package/references/module-inference.md +349 -0
  22. package/references/sdk-surface.md +1622 -0
  23. package/references/verification-rules.md +404 -0
  24. package/templates/app/gitignore +25 -0
  25. package/templates/app/index.css +111 -0
  26. package/templates/app/index.html +19 -0
  27. package/templates/app/layout.tsx +45 -0
  28. package/templates/app/main-router.tsx +17 -0
  29. package/templates/app/main-simple.tsx +19 -0
  30. package/templates/app/package.json +36 -0
  31. package/templates/app/postcss.config.js +5 -0
  32. package/templates/app/router.tsx +22 -0
  33. package/templates/app/sdk-context.tsx +33 -0
  34. package/templates/app/test-setup.ts +19 -0
  35. package/templates/app/tsconfig.json +22 -0
  36. package/templates/app/vercel.json +127 -0
  37. package/templates/app/vite.config.ts +15 -0
  38. package/templates/state/context.md +248 -0
  39. package/templates/state/manifest.json +11 -0
  40. package/templates/state/plan.md +187 -0
  41. package/templates/state/project.md +118 -0
  42. package/templates/state/requirements.md +133 -0
  43. package/templates/state/roadmap.md +129 -0
  44. package/templates/state/state.md +131 -0
  45. package/templates/state/summary.md +273 -0
  46. package/workflows/add-feature.md +234 -0
  47. package/workflows/discuss.md +310 -0
  48. package/workflows/execute-plan.md +222 -0
  49. package/workflows/execute.md +338 -0
  50. package/workflows/new-app.md +331 -0
  51. package/workflows/new-milestone.md +258 -0
  52. package/workflows/next.md +157 -0
  53. package/workflows/plan.md +310 -0
  54. package/workflows/ship.md +296 -0
  55. package/workflows/status.md +145 -0
@@ -0,0 +1,349 @@
1
+ # SDK Module Inference
2
+
3
+ Maps business descriptions to Frontier SDK modules, methods, and permissions.
4
+
5
+ ---
6
+
7
+ ## Inference Algorithm
8
+
9
+ Given a natural-language business description of an app:
10
+
11
+ 1. **Tokenize** -- lowercase the description and split into words. Remove stop words.
12
+ 2. **Match against keyword patterns** -- for each SDK module, check if any of its trigger keywords appear in the token set.
13
+ 3. **Always include baseline modules:**
14
+ - **Storage** -- every app needs at least `storage:get` and `storage:set` for user preferences and local state.
15
+ - **Chain** -- every app needs `chain:getCurrentNetwork` and `chain:getContractAddresses` for environment context.
16
+ 4. **Include User if any user-facing features** -- if the app has any interactive UI (not purely informational), include `user:getDetails` and `user:getProfile`.
17
+ 5. **Present inferred modules to user for confirmation** -- show the matched modules, the keywords that triggered them, and the permissions that would be requested. Let the user add or remove modules before proceeding.
18
+
19
+ ---
20
+
21
+ ## Module Reference
22
+
23
+ ### Wallet
24
+
25
+ **Trigger keywords:** payment, pay, checkout, transfer, send, receive, money, balance, wallet, token, swap, deposit, withdraw, bank, fiat, dollar, FND, iFND, ERC20, purchase, buy, sell, fund, currency, on-ramp, off-ramp, tip, donate, subscription (when involving recurring payments)
26
+
27
+ **Most commonly used methods:**
28
+ - `getBalance()` / `getBalanceFormatted()` -- read wallet balance
29
+ - `getAddress()` -- get user's wallet address
30
+ - `transferFrontierDollar(to, amount)` -- send FND to another address
31
+ - `transferInternalFrontierDollar(to, amount)` -- send iFND
32
+ - `transferOverallFrontierDollar(to, amount)` -- send FND, preferring iFND first
33
+ - `payWithFrontierDollar(paymentRefId)` -- pay via PaymentRouter with a reference ID
34
+ - `swap(params)` / `quoteSwap(params)` -- token swap operations
35
+ - `getUsdDepositInstructions()` / `getEurDepositInstructions()` -- fiat on-ramp
36
+ - `getLinkedBanks()` / `linkUsBankAccount()` / `linkEuroAccount()` -- fiat off-ramp
37
+
38
+ **Permissions:**
39
+
40
+ | Permission | Description |
41
+ | --------------------------------------- | --------------------------------------------- |
42
+ | `wallet:getBalance` | Access wallet balance |
43
+ | `wallet:getBalanceFormatted` | Access formatted wallet balance |
44
+ | `wallet:getAddress` | Access wallet address |
45
+ | `wallet:getSmartAccount` | Access smart account details |
46
+ | `wallet:transferERC20` | Transfer ERC20 tokens |
47
+ | `wallet:approveERC20` | Approve ERC20 token spending |
48
+ | `wallet:transferNative` | Transfer native currency (ETH) |
49
+ | `wallet:transferFrontierDollar` | Transfer Frontier Dollars |
50
+ | `wallet:transferInternalFrontierDollar`| Transfer Internal Frontier Dollars |
51
+ | `wallet:transferOverallFrontierDollar` | Transfer FND with iFND preferred |
52
+ | `wallet:executeCall` | Execute arbitrary contract calls |
53
+ | `wallet:executeBatchCall` | Execute multiple contract calls atomically |
54
+ | `wallet:getSupportedTokens` | Get list of supported tokens for swaps |
55
+ | `wallet:swap` | Execute token swaps |
56
+ | `wallet:quoteSwap` | Get quotes for token swaps |
57
+ | `wallet:getUsdDepositInstructions` | Get USD bank deposit instructions |
58
+ | `wallet:getEurDepositInstructions` | Get EUR (SEPA) deposit instructions |
59
+ | `wallet:getLinkedBanks` | Get linked bank accounts |
60
+ | `wallet:linkUsBankAccount` | Link a US bank account |
61
+ | `wallet:linkEuroAccount` | Link a EUR/IBAN bank account |
62
+ | `wallet:deleteLinkedBank` | Delete a linked bank account |
63
+ | `wallet:getDeprecatedSmartAccounts` | Get deprecated smart accounts |
64
+ | `wallet:payWithFrontierDollar` | Pay via PaymentRouter with reference ID |
65
+
66
+ **Example business descriptions:**
67
+ - "A tipping app where users can send FND to content creators"
68
+ - "A checkout widget for purchasing physical goods with Frontier Dollars"
69
+ - "A savings dashboard showing the user's balance and deposit history"
70
+
71
+ ---
72
+
73
+ ### Storage
74
+
75
+ **Trigger keywords:** save, store, persist, preferences, settings, cache, remember, bookmark, favorite, history, draft, note, data, local
76
+
77
+ **Always included.** Every app needs storage for user preferences at minimum.
78
+
79
+ **Most commonly used methods:**
80
+ - `get(key)` -- read a value
81
+ - `set(key, value)` -- write a value
82
+ - `remove(key)` -- delete a value
83
+
84
+ **Permissions:**
85
+
86
+ | Permission | Description |
87
+ | ----------------- | --------------------- |
88
+ | `storage:get` | Read from storage |
89
+ | `storage:set` | Write to storage |
90
+ | `storage:remove` | Remove from storage |
91
+ | `storage:clear` | Clear all storage |
92
+
93
+ **Example business descriptions:**
94
+ - "An app that remembers the user's preferred language and notification settings"
95
+ - "A note-taking app that saves drafts locally"
96
+
97
+ ---
98
+
99
+ ### Chain
100
+
101
+ **Trigger keywords:** network, chain, contract, blockchain, onchain, smart contract, address, deploy, testnet, mainnet
102
+
103
+ **Always included.** Every app needs chain context for environment detection and contract addresses.
104
+
105
+ **Most commonly used methods:**
106
+ - `getCurrentNetwork()` -- get current network name
107
+ - `getContractAddresses()` -- get FND, iFND, PaymentRouter, SubscriptionManager addresses
108
+ - `getCurrentChainConfig()` -- full chain configuration
109
+
110
+ **Permissions:**
111
+
112
+ | Permission | Description |
113
+ | ------------------------------ | --------------------------------------- |
114
+ | `chain:getCurrentNetwork` | Get current network name |
115
+ | `chain:getAvailableNetworks` | Get list of available networks |
116
+ | `chain:switchNetwork` | Switch to a different network |
117
+ | `chain:getCurrentChainConfig` | Get full chain configuration |
118
+ | `chain:getContractAddresses` | Get contract addresses |
119
+
120
+ **Example business descriptions:**
121
+ - "A dashboard showing contract deployment status across networks"
122
+ - "An app that reads on-chain data from the SubscriptionManager"
123
+
124
+ ---
125
+
126
+ ### User
127
+
128
+ **Trigger keywords:** user, profile, account, member, membership, signup, register, login, identity, referral, invite, KYC, verification, contact, email, subscription status, access control
129
+
130
+ **Include if any user-facing features.** Most apps need at minimum `user:getDetails`.
131
+
132
+ **Most commonly used methods:**
133
+ - `getDetails()` -- current user details
134
+ - `getProfile()` -- user profile information
135
+ - `getVerifiedAccessControls()` -- cryptographically verified access controls (always use for gating)
136
+ - `createSignupRequest(params)` -- submit membership signup with crypto payment
137
+ - `getReferralOverview()` -- referral statistics
138
+
139
+ **Permissions:**
140
+
141
+ | Permission | Description |
142
+ | -------------------------------- | -------------------------------------------------- |
143
+ | `user:getDetails` | Access current user details |
144
+ | `user:getProfile` | Access current user profile information |
145
+ | `user:getReferralOverview` | Access referral statistics |
146
+ | `user:getReferralDetails` | Access detailed referral information |
147
+ | `user:addUserContact` | Add user contact information |
148
+ | `user:getOrCreateKyc` | Get or create KYC verification status |
149
+ | `user:createSignupRequest` | Submit a new membership signup request |
150
+ | `user:getVerifiedAccessControls` | Get cryptographically verified access controls |
151
+
152
+ **Important:** Always use `getVerifiedAccessControls()` when making access decisions -- never trust unsigned user data from other SDK methods for gating features, content, or permissions. The method returns a cryptographically signed payload verified against hardcoded per-environment public keys inside the iframe.
153
+
154
+ **Example business descriptions:**
155
+ - "A membership signup form with KYC verification"
156
+ - "A referral tracking dashboard showing invite statistics"
157
+ - "An app that shows different content based on subscription plan"
158
+
159
+ ---
160
+
161
+ ### Communities
162
+
163
+ **Trigger keywords:** community, communities, group, team, internship, intern, member management, reassign, transfer member, pass, organization
164
+
165
+ **Most commonly used methods:**
166
+ - `listCommunities()` -- list all visible communities (paginated)
167
+ - `getCommunity(id)` -- get a community by ID or slug
168
+ - `createInternshipPass(params)` -- create an internship pass
169
+ - `listInternshipPasses()` -- list internship passes (paginated)
170
+
171
+ **Permissions:**
172
+
173
+ | Permission | Description |
174
+ | ------------------------------------- | -------------------------------------------- |
175
+ | `communities:listCommunities` | List all visible communities |
176
+ | `communities:getCommunity` | Get a community by ID or slug |
177
+ | `communities:createInternshipPass` | Create an internship pass |
178
+ | `communities:listInternshipPasses` | List internship passes |
179
+ | `communities:getInternshipPass` | Retrieve an internship pass by ID |
180
+ | `communities:revokeInternshipPass` | Revoke an internship pass |
181
+ | `communities:createReassignRequest` | Create a member reassignment request |
182
+ | `communities:listReassignRequests` | List pending reassignment requests |
183
+ | `communities:getReassignRequest` | Retrieve a reassignment request by ID |
184
+ | `communities:acceptReassignRequest` | Accept a reassignment request |
185
+ | `communities:rejectReassignRequest` | Reject a reassignment request |
186
+
187
+ **Example business descriptions:**
188
+ - "An internship management tool for community leaders"
189
+ - "A community directory app"
190
+ - "A tool to manage member transfers between communities"
191
+
192
+ ---
193
+
194
+ ### Partnerships
195
+
196
+ **Trigger keywords:** sponsor, sponsorship, partner, partnership, brand, advertiser, promotion, pass, voucher, coupon
197
+
198
+ **Most commonly used methods:**
199
+ - `listSponsors()` -- list sponsors you manage (paginated)
200
+ - `createSponsorPass(params)` -- create a sponsor pass
201
+ - `listActiveSponsorPasses()` -- list active passes (paginated)
202
+
203
+ **Permissions:**
204
+
205
+ | Permission | Description |
206
+ | --------------------------------------- | ---------------------------------------- |
207
+ | `partnerships:listSponsors` | List sponsors you manage |
208
+ | `partnerships:getSponsor` | Retrieve a Sponsor by ID |
209
+ | `partnerships:createSponsorPass` | Create a SponsorPass |
210
+ | `partnerships:listActiveSponsorPasses` | List active SponsorPasses |
211
+ | `partnerships:listAllSponsorPasses` | List all SponsorPasses |
212
+ | `partnerships:getSponsorPass` | Retrieve a SponsorPass by ID |
213
+ | `partnerships:revokeSponsorPass` | Revoke a SponsorPass by ID |
214
+
215
+ **Example business descriptions:**
216
+ - "A sponsor management dashboard for partnership managers"
217
+ - "A tool for creating and distributing sponsor passes at events"
218
+ - "A brand promotion platform within the Frontier network"
219
+
220
+ ---
221
+
222
+ ### Events
223
+
224
+ **Trigger keywords:** event, events, calendar, meetup, gathering, conference, workshop, hackathon, location, venue, room, booking, schedule, RSVP, host
225
+
226
+ **Most commonly used methods:**
227
+ - `listEvents(filters)` -- list events with optional filters (paginated)
228
+ - `createEvent(params)` -- create a new event
229
+ - `listLocations()` -- list available locations
230
+ - `createRoomBooking(params)` -- create a room booking
231
+
232
+ **Permissions:**
233
+
234
+ | Permission | Description |
235
+ | ----------------------------- | ---------------------------------------- |
236
+ | `events:listEvents` | List events with optional filters |
237
+ | `events:createEvent` | Create a new event |
238
+ | `events:addEventHost` | Add a co-host to an event |
239
+ | `events:listLocations` | List available locations |
240
+ | `events:listRoomBookings` | List room bookings |
241
+ | `events:createRoomBooking` | Create a room booking |
242
+
243
+ **Example business descriptions:**
244
+ - "A room booking app for co-working spaces"
245
+ - "An event calendar with RSVP functionality"
246
+ - "A venue management tool for event organizers"
247
+
248
+ ---
249
+
250
+ ### Offices
251
+
252
+ **Trigger keywords:** office, access pass, access control, building, door, entry, coworking, membership contract, check-in, keycard
253
+
254
+ **Most commonly used methods:**
255
+ - `createAccessPass(params)` -- create an access pass for a membership contract
256
+ - `listAccessPasses()` -- list access passes (paginated)
257
+
258
+ **Permissions:**
259
+
260
+ | Permission | Description |
261
+ | ----------------------------- | -------------------------------------------------- |
262
+ | `offices:createAccessPass` | Create an access pass for a membership contract |
263
+ | `offices:listAccessPasses` | List access passes for managed contracts |
264
+ | `offices:getAccessPass` | Retrieve an access pass by ID |
265
+ | `offices:revokeAccessPass` | Revoke an access pass |
266
+
267
+ **Example business descriptions:**
268
+ - "A digital access pass manager for co-working spaces"
269
+ - "A building entry system for office members"
270
+ - "A tool for managing physical access to Frontier offices"
271
+
272
+ ---
273
+
274
+ ### ThirdParty
275
+
276
+ **Trigger keywords:** developer, API, webhook, app registration, integrate, third-party, 3rd party, platform, marketplace, SDK, developer portal
277
+
278
+ **Most commonly used methods:**
279
+ - `listDevelopers()` -- list developer accounts
280
+ - `createApp(params)` -- register a new app
281
+ - `createWebhook(params)` -- create a webhook
282
+ - `rotateWebhookSigningKey(webhookId)` -- rotate webhook signing key
283
+
284
+ **Permissions:**
285
+
286
+ | Permission | Description |
287
+ | ------------------------------------- | ---------------------------------------- |
288
+ | `thirdParty:listDevelopers` | List developer accounts |
289
+ | `thirdParty:getDeveloper` | Get developer details by ID |
290
+ | `thirdParty:updateDeveloper` | Update developer information |
291
+ | `thirdParty:rotateDeveloperApiKey` | Rotate developer API key |
292
+ | `thirdParty:listApps` | List registered apps |
293
+ | `thirdParty:createApp` | Register a new app |
294
+ | `thirdParty:getApp` | Get app details by ID |
295
+ | `thirdParty:updateApp` | Update an app |
296
+ | `thirdParty:deleteApp` | Request app deactivation |
297
+ | `thirdParty:listWebhooks` | List webhooks |
298
+ | `thirdParty:createWebhook` | Create a new webhook |
299
+ | `thirdParty:getWebhook` | Get webhook details by ID |
300
+ | `thirdParty:updateWebhook` | Update a webhook |
301
+ | `thirdParty:deleteWebhook` | Delete a webhook |
302
+ | `thirdParty:rotateWebhookSigningKey` | Rotate webhook signing key |
303
+
304
+ **Example business descriptions:**
305
+ - "A developer portal for managing apps and API keys"
306
+ - "A webhook configuration dashboard"
307
+ - "A tool for registering and monitoring third-party integrations"
308
+
309
+ ---
310
+
311
+ ## Inference Examples
312
+
313
+ ### Example 1: "A hotel booking app where users can browse rooms and pay with FND"
314
+
315
+ | Module | Matched keywords | Permissions |
316
+ | ----------- | --------------------------- | ------------------------------------------------ |
317
+ | Wallet | pay, FND | `wallet:getBalance`, `wallet:transferFrontierDollar` or `wallet:payWithFrontierDollar` |
318
+ | Storage | (always) | `storage:get`, `storage:set` |
319
+ | Chain | (always) | `chain:getCurrentNetwork`, `chain:getContractAddresses` |
320
+ | User | users, booking | `user:getDetails`, `user:getProfile` |
321
+ | Events | booking, rooms | `events:listLocations`, `events:createRoomBooking` |
322
+
323
+ ### Example 2: "A community directory showing all communities and their members"
324
+
325
+ | Module | Matched keywords | Permissions |
326
+ | ----------- | --------------------------- | ------------------------------------------------ |
327
+ | Communities | community, communities, members | `communities:listCommunities`, `communities:getCommunity` |
328
+ | Storage | (always) | `storage:get`, `storage:set` |
329
+ | Chain | (always) | `chain:getCurrentNetwork`, `chain:getContractAddresses` |
330
+ | User | members | `user:getDetails`, `user:getProfile` |
331
+
332
+ ### Example 3: "A subscription management tool for signing up and managing membership plans"
333
+
334
+ | Module | Matched keywords | Permissions |
335
+ | ----------- | --------------------------- | ------------------------------------------------ |
336
+ | Wallet | subscription (payments) | `wallet:getBalance`, `wallet:payWithFrontierDollar` |
337
+ | User | signup, membership, managing | `user:getDetails`, `user:getVerifiedAccessControls`, `user:createSignupRequest` |
338
+ | Storage | (always) | `storage:get`, `storage:set` |
339
+ | Chain | (always) | `chain:getCurrentNetwork`, `chain:getContractAddresses` |
340
+
341
+ ### Example 4: "A sponsor pass distribution tool for event organizers"
342
+
343
+ | Module | Matched keywords | Permissions |
344
+ | ------------ | --------------------------- | ------------------------------------------------ |
345
+ | Partnerships | sponsor, pass | `partnerships:listSponsors`, `partnerships:createSponsorPass` |
346
+ | Events | event | `events:listEvents` |
347
+ | Storage | (always) | `storage:get`, `storage:set` |
348
+ | Chain | (always) | `chain:getCurrentNetwork`, `chain:getContractAddresses` |
349
+ | User | organizers | `user:getDetails`, `user:getProfile` |