novaforge-appkit 0.1.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/LICENSE +21 -0
- package/README.md +131 -0
- package/adapters/claude-code/README.md +25 -0
- package/adapters/codex/AGENTS.section.md +53 -0
- package/adapters/codex/README.md +20 -0
- package/bin/appkit.js +171 -0
- package/install.sh +131 -0
- package/kit/agents/builder-agent.md +49 -0
- package/kit/agents/product-agent.md +48 -0
- package/kit/agents/release-agent.md +46 -0
- package/kit/agents/reviewer-agent.md +42 -0
- package/kit/commands/build.md +30 -0
- package/kit/commands/fix.md +33 -0
- package/kit/commands/idea.md +28 -0
- package/kit/commands/init.md +29 -0
- package/kit/commands/release.md +32 -0
- package/kit/commands/shape.md +33 -0
- package/kit/commands/verify.md +35 -0
- package/kit/constitution.md +79 -0
- package/kit/orchestrator.md +63 -0
- package/kit/policy-rules/admob.md +25 -0
- package/kit/policy-rules/apple-app-store.md +31 -0
- package/kit/policy-rules/google-play.md +33 -0
- package/kit/policy-rules/privacy.md +25 -0
- package/kit/profiles/android.md +31 -0
- package/kit/profiles/flutter.md +45 -0
- package/kit/profiles/ios.md +32 -0
- package/kit/scripts/_common.sh +24 -0
- package/kit/scripts/analyze.sh +6 -0
- package/kit/scripts/build-android.sh +12 -0
- package/kit/scripts/build-ios.sh +23 -0
- package/kit/scripts/capture-screenshots.sh +20 -0
- package/kit/scripts/compare-goldens.sh +21 -0
- package/kit/scripts/extract-dependencies.sh +23 -0
- package/kit/scripts/extract-permissions.sh +22 -0
- package/kit/scripts/format.sh +11 -0
- package/kit/scripts/scan-secrets.sh +15 -0
- package/kit/scripts/test.sh +12 -0
- package/kit/scripts/validate-ad-ids.sh +22 -0
- package/kit/scripts/validate-release.sh +30 -0
- package/kit/skills/admob-best-practices/SKILL.md +74 -0
- package/kit/skills/mobile-app-development/SKILL.md +69 -0
- package/kit/skills/mobile-privacy-and-permissions/SKILL.md +71 -0
- package/kit/skills/mobile-store-release/SKILL.md +74 -0
- package/kit/skills/mobile-testing-and-visual-qa/SKILL.md +79 -0
- package/kit/skills/small-app-product-design/SKILL.md +68 -0
- package/kit/templates/app-spec.template.md +89 -0
- package/kit/templates/idea.template.md +60 -0
- package/kit/templates/privacy-policy.template.md +41 -0
- package/kit/templates/release-manifest.template.yaml +46 -0
- package/kit/templates/store-listing.template.md +37 -0
- package/kit/templates/tasks.template.md +46 -0
- package/kit/templates/verification-report.template.md +58 -0
- package/package.json +43 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mobile-testing-and-visual-qa
|
|
3
|
+
description: Define and run testing and visual QA for Flutter apps. Use during Build, Verify and Fix for unit/widget/integration tests, deterministic seed data, the screenshot catalog and capture, golden comparison, the AI visual-review rubric, structured defect format, accessibility checks and release smoke testing.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Mobile Testing & Visual QA
|
|
7
|
+
|
|
8
|
+
Evidence is what makes an app "done". This skill defines the tests and the visual review.
|
|
9
|
+
|
|
10
|
+
## Test pyramid (small-app sizing)
|
|
11
|
+
- **Unit** — most tests. Business rules, validation, formatting, calculations, state
|
|
12
|
+
transitions, storage behavior, error handling, ad-eligibility/frequency logic.
|
|
13
|
+
- **Widget** — important screens: input, validation errors, empty/populated/error states,
|
|
14
|
+
primary navigation, ad-container behavior, accessibility labels where practical.
|
|
15
|
+
- **Integration** (`integration_test/`) — critical journeys only: first launch, main flow,
|
|
16
|
+
persistence across restart, settings change, error recovery, offline behavior, ad-unavailable
|
|
17
|
+
behavior, release-config smoke flow.
|
|
18
|
+
|
|
19
|
+
## Conventions
|
|
20
|
+
- Name tests after behavior: `create_screen_shows_error_on_empty_title`.
|
|
21
|
+
- Aim for meaningful coverage of logic (not a number target); cover every acceptance criterion.
|
|
22
|
+
- Make tests **deterministic**: inject a fixed clock, fixed ids, and a fake repository. No
|
|
23
|
+
network, no real ads, no wall-clock time.
|
|
24
|
+
|
|
25
|
+
## Deterministic seed data
|
|
26
|
+
Provide a `SeedData` helper used by integration and screenshot runs so every state is
|
|
27
|
+
reproducible (e.g. exactly 3 items with fixed titles/dates). Screenshots must be byte-stable.
|
|
28
|
+
|
|
29
|
+
## Screenshot catalog
|
|
30
|
+
Defined in `app-spec.md`. Each entry: `id`, `screen`, `state`.
|
|
31
|
+
```yaml
|
|
32
|
+
screenshots:
|
|
33
|
+
- { id: home_empty, screen: HOME, state: empty }
|
|
34
|
+
- { id: home_populated, screen: HOME, state: populated }
|
|
35
|
+
- { id: create_validation_error, screen: CREATE, state: invalid_input }
|
|
36
|
+
- { id: settings, screen: SETTINGS, state: default }
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Capture workflow
|
|
40
|
+
1. Launch a deterministic build (`APP_ENV=dev`, seed data, test ads).
|
|
41
|
+
2. Navigate automatically via the integration driver.
|
|
42
|
+
3. Capture each catalog state to `.appkit/screenshots/qa/<id>.png` (stable names).
|
|
43
|
+
4. Compare against `.appkit/screenshots/baselines/` when a baseline exists (golden compare).
|
|
44
|
+
5. Submit images to AI visual review; write findings to `.appkit/screenshots/findings/`.
|
|
45
|
+
|
|
46
|
+
Use Flutter's `integration_test` + `IntegrationTestWidgetsFlutterBinding.takeScreenshot`, or
|
|
47
|
+
`flutter test --update-goldens` for widget goldens. Keep a single test device profile for v1.
|
|
48
|
+
|
|
49
|
+
## AI visual-review rubric (inspect every screenshot for)
|
|
50
|
+
clipped text · overflow · overlapping components · broken safe areas · wrong keyboard
|
|
51
|
+
handling · inconsistent spacing · missing content · low contrast · weak hierarchy ·
|
|
52
|
+
misaligned controls · unclear primary action · broken dark mode · ad obstruction ·
|
|
53
|
+
accidental-click risk · empty unused ad space · debug info · placeholder content ·
|
|
54
|
+
platform-inappropriate UI.
|
|
55
|
+
|
|
56
|
+
## Structured defect format
|
|
57
|
+
```yaml
|
|
58
|
+
id: VQA-003
|
|
59
|
+
category: visual # visual | accessibility | functional | ...
|
|
60
|
+
severity: major # critical | major | minor | informational
|
|
61
|
+
screen: CREATE
|
|
62
|
+
state: keyboard_open
|
|
63
|
+
requirement: AC-3
|
|
64
|
+
evidence: .appkit/screenshots/qa/create_keyboard_open.png
|
|
65
|
+
issue: Primary action is hidden behind the keyboard
|
|
66
|
+
expected: Primary action remains reachable
|
|
67
|
+
recommended_fix: Add keyboard-aware inset and scroll support
|
|
68
|
+
status: open
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Accessibility basics (lean checklist)
|
|
72
|
+
text scaling (up to ~200%) · contrast (WCAG AA) · touch targets ≥ 48dp · semantic labels on
|
|
73
|
+
controls · meaningful button names · no color-only signaling · sane focus order · screen-reader
|
|
74
|
+
reachability of the critical flow. Use the Flutter `meetsGuideline` semantics matchers.
|
|
75
|
+
|
|
76
|
+
## Regression & smoke
|
|
77
|
+
- Every fix adds a regression test reproducing the bug.
|
|
78
|
+
- Release smoke: build release, install, launch, run the core flow, confirm no debug/test-ad
|
|
79
|
+
config — see `mobile-store-release`.
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: small-app-product-design
|
|
3
|
+
description: Generate, evaluate and shape small mobile app ideas. Use for idea scoring, MVP scope reduction, target-user and primary-outcome definition, screen inventory, user flows, acceptance criteria, monetization fit and policy-risk screening during the Idea and Shape phases.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Small App Product Design
|
|
7
|
+
|
|
8
|
+
Guidance for turning a vague request into a small, coherent, launchable product.
|
|
9
|
+
|
|
10
|
+
## Selection criteria — a good small app
|
|
11
|
+
- One clear user problem and one primary outcome.
|
|
12
|
+
- Buildable in days, not months. 3–6 screens, 1–2 core flows.
|
|
13
|
+
- Works **offline / local-first**; no login, no backend, no personal data.
|
|
14
|
+
- Repeat usage (a reason to open it again) and a natural ad surface if monetized.
|
|
15
|
+
- Low store-review risk (no sensitive category, no high-risk permission).
|
|
16
|
+
|
|
17
|
+
## Idea scoring (rate each 1–5, then decide)
|
|
18
|
+
Clarity of problem · usefulness · MVP size (smaller = better) · technical complexity
|
|
19
|
+
(lower = better) · offline suitability · backend dependency (lower = better) · personal-data
|
|
20
|
+
exposure (lower = better) · permission risk (lower = better) · AdMob suitability · repeat
|
|
21
|
+
usage · differentiation · store-review risk (lower = better) · release speed.
|
|
22
|
+
|
|
23
|
+
**Decision:** `GO` · `GO WITH REDUCED SCOPE` · `REVISE` · `HOLD` · `REJECT`.
|
|
24
|
+
Reject ideas that need a backend, sensitive data, accounts, or a regulated category for the
|
|
25
|
+
MVP — or steer them to a smaller adjacent idea.
|
|
26
|
+
|
|
27
|
+
## MVP reduction rules
|
|
28
|
+
- Cut any feature that does not serve the primary outcome.
|
|
29
|
+
- Replace configuration with sensible defaults.
|
|
30
|
+
- Defer: accounts, sync, sharing, theming, settings beyond the essentials, analytics.
|
|
31
|
+
- One "delight" feature maximum. Everything else is post-launch.
|
|
32
|
+
- If you cannot describe the app in one sentence, it is too big.
|
|
33
|
+
|
|
34
|
+
## Defining the product
|
|
35
|
+
- **Target user**: one concrete persona and the moment they reach for the app.
|
|
36
|
+
- **Primary outcome**: the single thing the user accomplishes ("convert a recipe's servings").
|
|
37
|
+
- **Core features**: 3–5 bullets, each tied to the outcome.
|
|
38
|
+
- **Out of scope**: list explicitly — this is as important as the in-scope list.
|
|
39
|
+
|
|
40
|
+
## Screen inventory (per screen)
|
|
41
|
+
id · name · purpose · entry points · exit points · primary action · secondary actions ·
|
|
42
|
+
displayed data · empty / error / loading / keyboard states · ad placement · accessibility
|
|
43
|
+
notes · screenshot states. Every distinct visual **state** becomes a screenshot id.
|
|
44
|
+
|
|
45
|
+
## User flows
|
|
46
|
+
Describe the main flow as an ordered list of (screen → action → result). Cover first launch,
|
|
47
|
+
the core flow, persistence across restart, and one error-recovery path.
|
|
48
|
+
|
|
49
|
+
## Acceptance criteria
|
|
50
|
+
Write them testable and observable, e.g.:
|
|
51
|
+
> AC-3: When the user submits an empty title, the Create screen shows an inline error and
|
|
52
|
+
> does not save. (verified by widget test `create_validation_error`)
|
|
53
|
+
Each criterion should map to at least one test and, when visual, one screenshot.
|
|
54
|
+
|
|
55
|
+
## Monetization fit
|
|
56
|
+
Decide during shaping (see `admob-best-practices`). If ads do not fit the usage pattern
|
|
57
|
+
(very short sessions, sensitive context, child-directed), recommend no ads or a one-time
|
|
58
|
+
paid model rather than forcing placements.
|
|
59
|
+
|
|
60
|
+
## Policy-risk screening (early)
|
|
61
|
+
Flag any: children as audience, health/finance/legal claims, gambling, UGC, social comms,
|
|
62
|
+
location tracking, high-risk permissions, content licensing. Any flag triggers a
|
|
63
|
+
human-confirmation question (constitution §8) before shaping continues.
|
|
64
|
+
|
|
65
|
+
## When to ask the human
|
|
66
|
+
Ask only high-value questions: target audience, monetization intensity, Android-first vs
|
|
67
|
+
simultaneous, paid vs free. Make safe assumptions for everything else and record them under
|
|
68
|
+
"Assumptions" in `app-spec.md`.
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Application Specification
|
|
2
|
+
|
|
3
|
+
> Lean spec for a small app. Keep it proportional — delete sections that don't apply.
|
|
4
|
+
|
|
5
|
+
## 1. Product Summary
|
|
6
|
+
## 2. Product Objective
|
|
7
|
+
## 3. Target Users
|
|
8
|
+
## 4. Primary User Outcome
|
|
9
|
+
## 5. Core Features
|
|
10
|
+
<!-- 3–5, each tied to the outcome. -->
|
|
11
|
+
## 6. Out of Scope
|
|
12
|
+
<!-- Explicit. As important as in-scope. -->
|
|
13
|
+
## 7. Main User Flow
|
|
14
|
+
<!-- Ordered screen → action → result. -->
|
|
15
|
+
|
|
16
|
+
## 8. Screen Inventory
|
|
17
|
+
| ID | Name | Purpose | States |
|
|
18
|
+
|----|------|---------|--------|
|
|
19
|
+
| HOME | Home | | empty, populated, error |
|
|
20
|
+
|
|
21
|
+
## 9. Screen Specifications
|
|
22
|
+
<!-- Per screen: -->
|
|
23
|
+
```yaml
|
|
24
|
+
screen_id: HOME
|
|
25
|
+
name: Home
|
|
26
|
+
purpose:
|
|
27
|
+
entry_points: []
|
|
28
|
+
exit_points: []
|
|
29
|
+
primary_action:
|
|
30
|
+
secondary_actions: []
|
|
31
|
+
displayed_data: []
|
|
32
|
+
states: [empty, populated, error, loading, keyboard]
|
|
33
|
+
ads:
|
|
34
|
+
placement_id: home_bottom_banner
|
|
35
|
+
format: anchored_adaptive_banner
|
|
36
|
+
accessibility_notes:
|
|
37
|
+
screenshots: [home_empty, home_populated]
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## 10. Data Model
|
|
41
|
+
## 11. Local Storage
|
|
42
|
+
<!-- Tech + repository interface + migration/version. -->
|
|
43
|
+
## 12. Permissions
|
|
44
|
+
| Permission | Feature | User benefit | Runtime explanation | Store declaration |
|
|
45
|
+
|---|---|---|---|---|
|
|
46
|
+
<!-- An unjustified permission is a release blocker. -->
|
|
47
|
+
|
|
48
|
+
## 13. Third-Party SDKs
|
|
49
|
+
| SDK | Category | Data collected | Privacy manifest? |
|
|
50
|
+
|---|---|---|---|
|
|
51
|
+
|
|
52
|
+
## 14. AdMob Plan
|
|
53
|
+
<!-- Per placement: -->
|
|
54
|
+
```yaml
|
|
55
|
+
placement_id: home_bottom_banner
|
|
56
|
+
format: anchored_adaptive_banner
|
|
57
|
+
screen: HOME
|
|
58
|
+
trigger: screen_visible
|
|
59
|
+
frequency: sdk_managed
|
|
60
|
+
critical_interaction_conflict: false
|
|
61
|
+
accidental_click_risk: low
|
|
62
|
+
loading_behavior: preserve_layout
|
|
63
|
+
failure_behavior: collapse_or_preserve_clean_space
|
|
64
|
+
development_ad_id: test
|
|
65
|
+
production_ad_id_source: environment_configuration
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## 15. Privacy Plan
|
|
69
|
+
<!-- Data inventory + Data Safety / App Privacy mapping + policy URL placeholder. -->
|
|
70
|
+
## 16. Technical Approach
|
|
71
|
+
<!-- Profile, structure, state mgmt, navigation, env config. -->
|
|
72
|
+
## 17. Testing Strategy
|
|
73
|
+
<!-- Unit / widget / integration coverage + screenshot catalog. -->
|
|
74
|
+
|
|
75
|
+
## Screenshot Catalog
|
|
76
|
+
```yaml
|
|
77
|
+
screenshots:
|
|
78
|
+
- { id: home_empty, screen: HOME, state: empty }
|
|
79
|
+
- { id: home_populated, screen: HOME, state: populated }
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## 18. Accessibility Requirements
|
|
83
|
+
## 19. Acceptance Criteria
|
|
84
|
+
<!-- AC-n: observable + testable, mapped to a test/screenshot. -->
|
|
85
|
+
## 20. Store Risks
|
|
86
|
+
## 21. Release Targets
|
|
87
|
+
<!-- platforms, stores, OS targets, version. -->
|
|
88
|
+
## 22. Assumptions
|
|
89
|
+
<!-- Every safe default chosen automatically. -->
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# App Idea
|
|
2
|
+
|
|
3
|
+
## Working Title
|
|
4
|
+
|
|
5
|
+
## Problem
|
|
6
|
+
<!-- The one concrete problem this app solves. -->
|
|
7
|
+
|
|
8
|
+
## Target User
|
|
9
|
+
<!-- One persona and the moment they reach for the app. -->
|
|
10
|
+
|
|
11
|
+
## Core Value / Primary Outcome
|
|
12
|
+
<!-- The single thing the user accomplishes. -->
|
|
13
|
+
|
|
14
|
+
## Primary Use Case
|
|
15
|
+
|
|
16
|
+
## Proposed MVP
|
|
17
|
+
<!-- 3–6 bullets, each tied to the outcome. -->
|
|
18
|
+
|
|
19
|
+
## Main Screens
|
|
20
|
+
<!-- Rough list; full inventory comes in Shape. -->
|
|
21
|
+
|
|
22
|
+
## Why It Fits The Kit
|
|
23
|
+
<!-- Small, local-first, low-permission, low-policy-risk, launchable fast. -->
|
|
24
|
+
|
|
25
|
+
## Monetization Concept
|
|
26
|
+
<!-- Ads? Which format? Or none / paid. -->
|
|
27
|
+
|
|
28
|
+
## Privacy Considerations
|
|
29
|
+
<!-- Data touched, ideally none beyond on-device. -->
|
|
30
|
+
|
|
31
|
+
## Permission Considerations
|
|
32
|
+
|
|
33
|
+
## Store Risks
|
|
34
|
+
<!-- Any policy-sensitive aspects. -->
|
|
35
|
+
|
|
36
|
+
## Recommended Platforms
|
|
37
|
+
<!-- android | ios | both, with reasoning. -->
|
|
38
|
+
|
|
39
|
+
## Complexity Estimate
|
|
40
|
+
<!-- size, screens, days. -->
|
|
41
|
+
|
|
42
|
+
## Idea Scores (1–5)
|
|
43
|
+
| Dimension | Score |
|
|
44
|
+
|---|---|
|
|
45
|
+
| Problem clarity | |
|
|
46
|
+
| Usefulness | |
|
|
47
|
+
| MVP size (smaller=better) | |
|
|
48
|
+
| Technical complexity (lower=better) | |
|
|
49
|
+
| Offline suitability | |
|
|
50
|
+
| Backend dependency (lower=better) | |
|
|
51
|
+
| Personal-data exposure (lower=better) | |
|
|
52
|
+
| Permission risk (lower=better) | |
|
|
53
|
+
| AdMob suitability | |
|
|
54
|
+
| Repeat usage | |
|
|
55
|
+
| Differentiation | |
|
|
56
|
+
| Store-review risk (lower=better) | |
|
|
57
|
+
| Release speed | |
|
|
58
|
+
|
|
59
|
+
## Decision
|
|
60
|
+
<!-- GO | GO WITH REDUCED SCOPE | REVISE | HOLD | REJECT + one-line rationale. -->
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Privacy Policy — <APP_NAME>
|
|
2
|
+
|
|
3
|
+
> DRAFT. Every `<PLACEHOLDER>` must be reviewed and completed by a human before publishing.
|
|
4
|
+
> This is not legal advice. Host this at a stable URL and reference it in both stores.
|
|
5
|
+
|
|
6
|
+
**Effective date:** <DATE>
|
|
7
|
+
**Developer:** <DEVELOPER_NAME / ENTITY>
|
|
8
|
+
**Contact:** <SUPPORT_EMAIL>
|
|
9
|
+
|
|
10
|
+
## Summary
|
|
11
|
+
<APP_NAME> is a local-first mobile app. <STATE_WHETHER_ANY_DATA_LEAVES_THE_DEVICE.>
|
|
12
|
+
|
|
13
|
+
## Data We Collect
|
|
14
|
+
<!-- From the data inventory. For a pure local app this may be "none". -->
|
|
15
|
+
| Data | Purpose | Stored | Shared | Retention |
|
|
16
|
+
|---|---|---|---|---|
|
|
17
|
+
| <e.g. app content> | <app function> | on device | no | until user deletes |
|
|
18
|
+
|
|
19
|
+
## Data We Do Not Collect
|
|
20
|
+
<!-- Be specific to build trust: no account, no precise location, no contacts, etc. -->
|
|
21
|
+
|
|
22
|
+
## Third-Party Services
|
|
23
|
+
<!-- List each SDK and link its policy. e.g. Google AdMob. -->
|
|
24
|
+
- **Google AdMob** (if ads enabled): may collect device/advertising identifiers to serve ads.
|
|
25
|
+
See Google's policy: https://policies.google.com/privacy. Personalized ads are gated on
|
|
26
|
+
consent where required (EEA/UK/CCPA). <STATE_PERSONALIZED_OR_NON_PERSONALIZED.>
|
|
27
|
+
|
|
28
|
+
## Advertising & Consent
|
|
29
|
+
<DESCRIBE_UMP_CONSENT_FLOW_AND_AD_PERSONALIZATION.>
|
|
30
|
+
|
|
31
|
+
## Children
|
|
32
|
+
<STATE_WHETHER_DIRECTED_TO_CHILDREN_AND_RELEVANT_PROTECTIONS, or "not directed to children".>
|
|
33
|
+
|
|
34
|
+
## Your Rights
|
|
35
|
+
<DATA_ACCESS_DELETION_MECHANISM — e.g. uninstalling removes all local data.>
|
|
36
|
+
|
|
37
|
+
## Changes
|
|
38
|
+
We may update this policy; changes will be posted at <HOSTED_URL>.
|
|
39
|
+
|
|
40
|
+
## Contact
|
|
41
|
+
<SUPPORT_EMAIL>
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Release Manifest — generated by /appkit.release
|
|
2
|
+
app:
|
|
3
|
+
name: <APP_NAME>
|
|
4
|
+
android_application_id: <com.example.app>
|
|
5
|
+
ios_bundle_id: <com.example.app>
|
|
6
|
+
version:
|
|
7
|
+
name: <1.0.0>
|
|
8
|
+
android_version_code: <1>
|
|
9
|
+
ios_build: <1>
|
|
10
|
+
verification:
|
|
11
|
+
status: <ready | ready_with_warnings_approved>
|
|
12
|
+
report: .appkit/verification-report.md
|
|
13
|
+
unresolved_blockers: 0
|
|
14
|
+
targets: [android, ios]
|
|
15
|
+
stores: [google_play, apple_app_store]
|
|
16
|
+
monetization:
|
|
17
|
+
admob: <true|false>
|
|
18
|
+
ad_ids_source: environment_configuration
|
|
19
|
+
artifacts:
|
|
20
|
+
android_aab: release/builds/android/<app>-release.aab
|
|
21
|
+
ios_archive: release/builds/ios/<app>.xcarchive # or instructions
|
|
22
|
+
metadata:
|
|
23
|
+
google_play: release/metadata/google-play.md
|
|
24
|
+
app_store: release/metadata/app-store.md
|
|
25
|
+
release_notes: release/metadata/release-notes.md
|
|
26
|
+
review_notes: release/metadata/review-notes.md
|
|
27
|
+
privacy:
|
|
28
|
+
policy: release/privacy/privacy-policy.md
|
|
29
|
+
google_data_safety: release/privacy/google-data-safety.md
|
|
30
|
+
apple_app_privacy: release/privacy/apple-app-privacy.md
|
|
31
|
+
compliance:
|
|
32
|
+
google_play: release/compliance/google-play-review.md
|
|
33
|
+
apple_app_store: release/compliance/apple-app-store-review.md
|
|
34
|
+
admob: release/compliance/admob-review.md
|
|
35
|
+
privacy: release/compliance/privacy-review.md
|
|
36
|
+
checklists:
|
|
37
|
+
android: release/checklists/android-release.md
|
|
38
|
+
ios: release/checklists/ios-release.md
|
|
39
|
+
signing:
|
|
40
|
+
android: { play_app_signing: true, secrets_in_repo: false }
|
|
41
|
+
ios: { provisioning_ready: <true|false>, secrets_in_repo: false }
|
|
42
|
+
human_approval:
|
|
43
|
+
required: true
|
|
44
|
+
granted: false # human sets true before submission
|
|
45
|
+
placeholders_remaining: [] # must be empty before submission
|
|
46
|
+
generated_at: <DATE>
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Store Listing — <APP_NAME>
|
|
2
|
+
|
|
3
|
+
> Draft metadata. Mark every `<PLACEHOLDER>`. No misleading claims; do not show unavailable
|
|
4
|
+
> features. Keep within each store's length limits.
|
|
5
|
+
|
|
6
|
+
## Common
|
|
7
|
+
- **App name:** <APP_NAME>
|
|
8
|
+
- **Category:** <CATEGORY>
|
|
9
|
+
- **Privacy policy URL:** <HOSTED_URL>
|
|
10
|
+
- **Support URL:** <SUPPORT_URL>
|
|
11
|
+
- **Marketing URL:** <OPTIONAL>
|
|
12
|
+
|
|
13
|
+
## Google Play
|
|
14
|
+
- **Short description (≤80 chars):**
|
|
15
|
+
- **Full description (≤4000 chars):**
|
|
16
|
+
- **Release notes:**
|
|
17
|
+
- **Content rating:** <IARC_QUESTIONNAIRE_RESULT>
|
|
18
|
+
- **Target audience & content:** <AGE_GROUPS>
|
|
19
|
+
- **Ads declaration:** <CONTAINS_ADS: yes/no>
|
|
20
|
+
- **Data Safety:** see `privacy/google-data-safety.md`
|
|
21
|
+
|
|
22
|
+
## Apple App Store
|
|
23
|
+
- **Subtitle (≤30 chars):**
|
|
24
|
+
- **Promotional text (≤170 chars):**
|
|
25
|
+
- **Description:**
|
|
26
|
+
- **Keywords (≤100 chars, comma-separated):**
|
|
27
|
+
- **What's New (release notes):**
|
|
28
|
+
- **Age rating:** <RATING>
|
|
29
|
+
- **App Privacy:** see `privacy/apple-app-privacy.md`
|
|
30
|
+
- **Export compliance:** <USUALLY "No" for standard HTTPS>
|
|
31
|
+
|
|
32
|
+
## Reviewer Notes (both stores)
|
|
33
|
+
<!-- Explain non-obvious behavior, how to reach ad-bearing screens, demo/login if any. -->
|
|
34
|
+
|
|
35
|
+
## Screenshots
|
|
36
|
+
- Source: `release/screenshots/store-final/`
|
|
37
|
+
- Required sizes: <PER_PLATFORM_DEVICE_SIZES>
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Tasks
|
|
2
|
+
|
|
3
|
+
## Status Legend
|
|
4
|
+
- [ ] Not started
|
|
5
|
+
- [~] In progress
|
|
6
|
+
- [x] Complete
|
|
7
|
+
- [!] Blocked
|
|
8
|
+
|
|
9
|
+
> Group by vertical slice. Each task links feature, screen, acceptance criteria, test
|
|
10
|
+
> expectation, and policy consideration.
|
|
11
|
+
|
|
12
|
+
## Slice 1: Application shell
|
|
13
|
+
### TASK-001
|
|
14
|
+
- **Feature:** project setup
|
|
15
|
+
- **Screen:** —
|
|
16
|
+
- **Description:** Initialize project, package ids, navigation, theme, initial tests.
|
|
17
|
+
- **Acceptance:** AC-? · **Tests:** smoke test passes · **Policy:** —
|
|
18
|
+
- **Status:** [ ]
|
|
19
|
+
|
|
20
|
+
## Slice 2: Core flow
|
|
21
|
+
### TASK-002
|
|
22
|
+
- **Feature:** · **Screen:** HOME
|
|
23
|
+
- **Description:**
|
|
24
|
+
- **Acceptance:** AC-? · **Tests:** unit + widget · **Policy:** —
|
|
25
|
+
- **Status:** [ ]
|
|
26
|
+
|
|
27
|
+
## Slice 3: Persistence
|
|
28
|
+
### TASK-003
|
|
29
|
+
- **Feature:** local storage · **Screen:** —
|
|
30
|
+
- **Description:** Repository + migration + persistence tests.
|
|
31
|
+
- **Acceptance:** AC-? · **Tests:** unit (storage) · **Policy:** data inventory updated
|
|
32
|
+
- **Status:** [ ]
|
|
33
|
+
|
|
34
|
+
## Slice 4: Advertising
|
|
35
|
+
### TASK-004
|
|
36
|
+
- **Feature:** AdMob · **Screen:** HOME
|
|
37
|
+
- **Description:** Ad adapter, test ad config, banner placement, failure-state handling.
|
|
38
|
+
- **Acceptance:** AC-? · **Tests:** widget (ad container, failure) · **Policy:** AdMob placement rules
|
|
39
|
+
- **Status:** [ ]
|
|
40
|
+
|
|
41
|
+
## Slice 5: Verification readiness
|
|
42
|
+
### TASK-005
|
|
43
|
+
- **Feature:** QA · **Screen:** all
|
|
44
|
+
- **Description:** Deterministic seed data, screenshot scenarios, critical integration test.
|
|
45
|
+
- **Acceptance:** screenshot catalog reachable · **Tests:** integration · **Policy:** —
|
|
46
|
+
- **Status:** [ ]
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Verification Report
|
|
2
|
+
|
|
3
|
+
**Overall Status:** <!-- READY | READY WITH WARNINGS | NOT READY | HUMAN CONFIRMATION REQUIRED -->
|
|
4
|
+
**Date:** · **Mode:** <!-- full | changed | android | ios | visual | policy -->
|
|
5
|
+
|
|
6
|
+
## Build Information
|
|
7
|
+
<!-- profile, app id/bundle id, version, env, flutter/dart versions -->
|
|
8
|
+
|
|
9
|
+
## Test Summary
|
|
10
|
+
| Suite | Result | Notes |
|
|
11
|
+
|---|---|---|
|
|
12
|
+
| Static analysis | | |
|
|
13
|
+
| Unit | | |
|
|
14
|
+
| Widget | | |
|
|
15
|
+
| Integration | | |
|
|
16
|
+
|
|
17
|
+
## Unit Test Results
|
|
18
|
+
## Component (Widget) Test Results
|
|
19
|
+
## Integration Test Results
|
|
20
|
+
|
|
21
|
+
## Screenshot Coverage
|
|
22
|
+
| Catalog id | Captured | Golden | Result |
|
|
23
|
+
|---|---|---|---|
|
|
24
|
+
|
|
25
|
+
## Findings
|
|
26
|
+
> One block per finding.
|
|
27
|
+
```yaml
|
|
28
|
+
id: VQA-001
|
|
29
|
+
category: visual
|
|
30
|
+
severity: major # critical | major | minor | informational
|
|
31
|
+
status: open # open | fixed | accepted
|
|
32
|
+
screen:
|
|
33
|
+
state:
|
|
34
|
+
requirement:
|
|
35
|
+
evidence:
|
|
36
|
+
issue:
|
|
37
|
+
expected:
|
|
38
|
+
recommended_fix:
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Visual QA Findings
|
|
42
|
+
## Accessibility Findings
|
|
43
|
+
## Permission Findings
|
|
44
|
+
## SDK & Privacy Findings
|
|
45
|
+
## AdMob Findings
|
|
46
|
+
## Google Play Findings
|
|
47
|
+
## Apple App Store Findings
|
|
48
|
+
## Release Build Findings
|
|
49
|
+
|
|
50
|
+
## Blocking Issues
|
|
51
|
+
<!-- critical + unresolved major -->
|
|
52
|
+
## Warnings
|
|
53
|
+
<!-- minor -->
|
|
54
|
+
## Recommended Fixes
|
|
55
|
+
<!-- ordered, minimal -->
|
|
56
|
+
|
|
57
|
+
## Final Decision
|
|
58
|
+
<!-- verdict + the next command -->
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "novaforge-appkit",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Lean Mobile App Launch Kit — take a small mobile app from idea to a store-ready release with Claude Code or Codex.",
|
|
5
|
+
"bin": {
|
|
6
|
+
"appkit": "bin/appkit.js"
|
|
7
|
+
},
|
|
8
|
+
"type": "commonjs",
|
|
9
|
+
"engines": {
|
|
10
|
+
"node": ">=16"
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"bin/",
|
|
14
|
+
"kit/",
|
|
15
|
+
"adapters/",
|
|
16
|
+
"install.sh",
|
|
17
|
+
"README.md"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"test": "node bin/appkit.js --help"
|
|
21
|
+
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"appkit",
|
|
24
|
+
"mobile",
|
|
25
|
+
"flutter",
|
|
26
|
+
"claude-code",
|
|
27
|
+
"codex",
|
|
28
|
+
"spec-kit",
|
|
29
|
+
"admob",
|
|
30
|
+
"app-store",
|
|
31
|
+
"google-play",
|
|
32
|
+
"ai-agents"
|
|
33
|
+
],
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "git+ssh://git@github.com/NovaForgeOrg/appkit.git"
|
|
37
|
+
},
|
|
38
|
+
"homepage": "https://github.com/NovaForgeOrg/appkit#readme",
|
|
39
|
+
"bugs": {
|
|
40
|
+
"url": "https://github.com/NovaForgeOrg/appkit/issues"
|
|
41
|
+
},
|
|
42
|
+
"license": "MIT"
|
|
43
|
+
}
|