@freeappstore/cli 0.3.1 → 0.3.3

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 CHANGED
@@ -74,6 +74,21 @@ fas publish \
74
74
 
75
75
  `~/.fas/config.json` (mode `0600`) holds the GitHub OAuth token + the platform session token. `fas logout` deletes both.
76
76
 
77
+ ## Brand and UI rules (mandated)
78
+
79
+ Every app and game on the platform shares the same visual language — colors, fonts, spacing — so the storefront and detail pages stay predictable. `fas check` enforces:
80
+
81
+ | Check | Rule |
82
+ |---|---|
83
+ | `No template placeholders` | Every `APPNAME` placeholder substituted before publish. |
84
+ | `No tracking SDKs` | None of 8 known trackers (Google Analytics, Plausible, Mixpanel, …). |
85
+ | `Brand fonts present` | Manrope (body) + Fraunces (display) both referenced in CSS / HTML. |
86
+ | `No brand overrides` | No app redefines a platform CSS token (`--paper`, `--ink`, `--accent`, `--line`, `--line-strong`, `--panel`, `--muted`) outside the canonical theme file; no non-brand `font-family` declarations. |
87
+ | `PWA manifest` | `web/public/manifest.json` with `name`, `display`, `start_url`. |
88
+ | `Bundle size` | Main bundle under 300 KB gzipped. |
89
+
90
+ `fas publish` auto-runs `fas check` and aborts on hard failures (override with `--skip-checks`, admin review will still catch issues).
91
+
77
92
  ## How `fas publish` works
78
93
 
79
94
  1. **Compliance gate**: runs the same checks as `fas check`. Hard failures abort.
@@ -54,7 +54,7 @@ export const publishCommand = new Command('publish')
54
54
  .option('--type <kind>', 'App type: "standalone" or "connected". Skips the prompt.')
55
55
  .option('--oneliner <text>', 'One-line description shown on the storefront. Skips the prompt.')
56
56
  .option('--demo <url>', 'Optional demo URL. Skips the prompt.')
57
- .option('--yes, -y', 'Non-interactive: fail rather than prompt for any missing fields. Pair with --name/--category/--type/--oneliner.')
57
+ .option('-y, --yes', 'Non-interactive: fail rather than prompt for any missing fields. Pair with --name/--category/--type/--oneliner.')
58
58
  .action(async (opts) => {
59
59
  const store = opts.store === 'games' ? 'games' : 'apps';
60
60
  if (opts.store && opts.store !== 'apps' && opts.store !== 'games') {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@freeappstore/cli",
3
- "version": "0.3.1",
3
+ "version": "0.3.3",
4
4
  "description": "fas — CLI for publishing free apps to freeappstore.online",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -38,7 +38,7 @@
38
38
  "ink-text-input": "^6.0.0",
39
39
  "prompts": "^2.4.2",
40
40
  "react": "^19.2.5",
41
- "@freeappstore/compliance": "0.1.0"
41
+ "@freeappstore/compliance": "0.2.0"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@types/node": "^22.0.0",