Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .agents/skills/docs-gate/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ Use this skill before changing durable project knowledge.

- Root `README.md`: short project orientation, repository shape, command entry point.
- Root `AGENTS.md`: short working agreements for agents and humans.
- Root `LICENSE`, `TRADEMARKS.md`, and `THIRD_PARTY_NOTICES.md`: Apache-2.0 source license, brand usage, and attribution gate.
- `docs/README.md`: index and gate for project documentation.
- `docs/DEVELOPMENT_PLAN.md`: full product and implementation plan.
- `docs/product/ANDROID_GOALS.md`: Android MVP goals and non-goals.
Expand All @@ -19,12 +20,14 @@ Use this skill before changing durable project knowledge.
- `docs/product/RELEASE_CHECKLIST.md`: release readiness gate.
- `schemas/`: stable cross-platform data contracts.
- `fixtures/`: sanitized provider and dashboard examples.
- `brand/`: product identity assets that are not open source by default.

## Rules

- Link new durable docs from `docs/README.md`.
- Keep root docs concise; move detailed requirements into `docs/`.
- Keep root `AGENTS.md` aligned with `.agents/skills/*` when workflow checks or ownership boundaries change.
- Keep Apache-2.0 source licensing and WardPulse brand rights separate.
- Keep schemas aligned with Rust models when a contract becomes stable.
- Prefer closed JSON contracts with explicit nullable fields and `additionalProperties: false`.
- Keep fixtures sanitized: no secrets, raw prompts, authorization headers, or sensitive raw provider payloads.
Expand Down
8 changes: 6 additions & 2 deletions .agents/skills/finalization/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ description: Post-change finalization checklist for WardPulse (Rust core, Flutte
>
> Run this after implementation or documentation work to keep the monorepo coherent.
>
> Last Updated: 2026-06-27
> Last Updated: 2026-06-28

## 1. Scope Review

Expand Down Expand Up @@ -54,6 +54,7 @@ cd apps/phone_flutter && flutter analyze && flutter test

- [ ] If Android/Wear/WFF Gradle projects are generated, run the relevant Gradle test/build task.
- [ ] If schemas or fixtures changed, validate fixture shape manually or with `tools/validate-fixtures/` when available.
- [ ] If GitHub Actions workflows changed, run `actionlint .github/workflows/*.yml`.

## 5. Documentation Review

Expand All @@ -70,4 +71,7 @@ When finalization completes, report:
2. Commands run and pass/fail status.
3. Important files changed.
4. Remaining risks or intentionally deferred work.
5. Draft commit message only if the user asks for commit preparation.
5. Git staging status: staged, unstaged, and untracked state.
6. Idiomatic draft commit message for the staged set.

Do not create a commit unless the user explicitly asks for one.
2 changes: 2 additions & 0 deletions .agents/skills/project-structure/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ Use this skill before adding or moving project files.
- `schemas/`: shared JSON contracts.
- `fixtures/`: sanitized provider and dashboard examples.
- `bindings/`: generated bindings and thin platform wrappers.
- `brand/`: protected product identity assets and store artwork placeholders.
- `tools/`: repeatable local automation.
- `docs/product/`: durable product, provider, security, and release guidance.

Expand All @@ -34,6 +35,7 @@ Use this skill before adding or moving project files.
- Do not make Rust depend on Flutter, Android, Google Play APIs, or platform credential storage.
- Do not make platform apps own shared product math or provider normalization.
- Do not put long product requirements in root files.
- Do not treat files in `brand/` as Apache-2.0 licensed unless a file explicitly says so.
- Do not add cross-platform abstractions until they remove real duplication or encode a stable boundary.
- Prefer lightweight shells until a phase explicitly requires generated Flutter or Gradle projects.

Expand Down
27 changes: 20 additions & 7 deletions .github/workflows/core.yml
Original file line number Diff line number Diff line change
@@ -1,25 +1,38 @@
name: Core

on:
push:
paths:
- "core/**"
- ".github/workflows/core.yml"
pull_request:
branches: [main]
paths:
- "core/**"
- "fixtures/**"
- "schemas/**"
- "tools/validate-fixtures/**"
- ".github/workflows/core.yml"
workflow_dispatch:

permissions:
contents: read

jobs:
core:
name: Core (${{ matrix.rust }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
rust: ["1.75.0", stable]
defaults:
run:
working-directory: core
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ matrix.rust }}
components: rustfmt, clippy
- name: Validate JSON syntax
working-directory: .
run: python3 tools/validate-fixtures/validate_json.py
- run: cargo fmt --all -- --check
- run: cargo clippy --workspace --all-targets -- -D warnings
- run: cargo test --workspace
48 changes: 45 additions & 3 deletions .github/workflows/phone-android.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,52 @@
name: Phone Android

on:
workflow_dispatch:
pull_request:
branches: [main]
paths:
- "apps/phone_flutter/**"
- "bindings/dart/**"
- "core/**"
- "fixtures/**"
- "schemas/**"
- "tools/build-android-rust/**"
- ".github/workflows/phone-android.yml"

permissions:
contents: read

jobs:
placeholder:
phone-android:
name: Analyze, test, and build
runs-on: ubuntu-latest
timeout-minutes: 30
defaults:
run:
working-directory: apps/phone_flutter
steps:
- run: echo "TODO: enable flutter analyze, flutter test, and debug APK build during Phase 2."
- uses: actions/checkout@v6
- uses: actions/setup-java@v5
with:
distribution: temurin
java-version: "21"
cache: gradle
- name: Set up Android SDK
uses: android-actions/setup-android@v4
with:
packages: "ndk;29.0.14206865"
- uses: subosito/flutter-action@v2
with:
channel: stable
flutter-version: 3.44.6
cache: true
- uses: dtolnay/rust-toolchain@stable
with:
targets: aarch64-linux-android,x86_64-linux-android
- run: cargo install cargo-ndk --version 4.1.2 --locked
working-directory: .
- run: flutter pub get --enforce-lockfile
- run: flutter analyze
- run: flutter test
- run: tools/build-android-rust/build.sh
working-directory: .
- run: flutter build apk --debug
31 changes: 28 additions & 3 deletions .github/workflows/watchface.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,35 @@
name: Watch Face

on:
workflow_dispatch:
pull_request:
branches: [main]
paths:
- "apps/watchface_wff/**"
- "tools/validate-watchface/**"
- ".github/workflows/watchface.yml"

permissions:
contents: read

jobs:
placeholder:
watchface:
name: Validate, lint, and build
runs-on: ubuntu-latest
timeout-minutes: 15
defaults:
run:
working-directory: apps/watchface_wff
steps:
- run: echo "TODO: enable WFF build and validation during Phase 6."
- uses: actions/checkout@v6
- uses: actions/setup-java@v5
with:
distribution: temurin
java-version: "21"
cache: gradle
- name: Set up Android SDK
uses: android-actions/setup-android@v4
with:
packages: "platforms;android-37.1 build-tools;36.0.0"
- run: tools/validate-watchface/validate.sh
working-directory: .
- run: ./gradlew --no-daemon lintDebug assembleDebug bundleDebug
30 changes: 27 additions & 3 deletions .github/workflows/wear-android.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,34 @@
name: Wear Android

on:
workflow_dispatch:
pull_request:
branches: [main]
paths:
- "apps/wear_android/**"
- "fixtures/**"
- "schemas/**"
- ".github/workflows/wear-android.yml"

permissions:
contents: read

jobs:
placeholder:
wear-android:
name: Lint, test, and build
runs-on: ubuntu-latest
timeout-minutes: 20
defaults:
run:
working-directory: apps/wear_android
steps:
- run: echo "TODO: enable Wear OS Gradle test and assembleDebug during Phase 4."
- uses: actions/checkout@v6
- uses: actions/setup-java@v5
with:
distribution: temurin
java-version: "21"
cache: gradle
- name: Set up Android SDK
uses: android-actions/setup-android@v4
with:
packages: "platforms;android-37.1 build-tools;36.0.0"
- run: ./gradlew --no-daemon lintDebug testDebugUnitTest assembleDebug assembleDebugAndroidTest
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@ debug/
*.pdb
**/mutants.out*/

# Python
__pycache__/
*.py[cod]

# Flutter / Dart
.dart_tool/
.flutter-plugins
Expand Down
8 changes: 7 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
- Build WardPulse as a local-first AI tool usage dashboard for Android phone, Wear OS, and Watch Face Format surfaces.
- Keep one product repository with one Rust domain core, separate platform-native UI shells, shared schemas, fixtures, tests, and release process.
- Keep provider credentials local to user devices and keep fixtures/logs sanitized.
- Keep Apache-2.0 source licensing and WardPulse brand rights separate.
- Keep the code clean, conventional, and easy to extend.

## Working Agreements
Expand All @@ -17,6 +18,7 @@
- Prefer small, focused changes.
- Do not generate full Flutter or Gradle projects unless the current task explicitly requires it.
- Do not commit secrets, provider credentials, authorization headers, raw prompts, or sensitive raw provider payloads.
- Do not treat WardPulse brand assets as covered by Apache-2.0 unless a file explicitly says so.

## Required Checks

Expand All @@ -28,7 +30,11 @@ cd core && cargo clippy --workspace --all-targets -- -D warnings
cd core && cargo test --workspace
```

After schema or fixture changes, validate JSON syntax and keep examples sanitized.
After schema or fixture changes, validate JSON syntax and keep examples sanitized:

```bash
just validate-fixtures
```

After local skill changes, run:

Expand Down
Loading