Files
daily-notification-plugin/ci/README.md
Matthew Raymer eb1fc9f220 feat(docs): complete P2.6 type safety cleanup and P2.7 system invariants
P2.6: Type Safety Cleanup
- Replaced 'any' return types in vite-plugin.ts with concrete types (UserConfig, transform return type)
- Documented TypeScript mixin 'any[]' exception in PlatformServiceMixin.ts
- Audit confirmed: zero 'any' in codebase except documented TS mixin limitation
- All external boundaries use 'unknown', all data payloads use 'Record<string, unknown>'

P2.7: System Invariants Documentation
- Created SYSTEM_INVARIANTS.md documenting all 6 enforced invariants
- Added to docs/00-INDEX.md under Policy & Contracts section
- Each invariant includes: What, Why, How, Where

Progress Docs Updates:
- Updated 00-STATUS.md: marked P2.6/P2.7 complete, added type safety invariant note
- Updated 01-CHANGELOG-WORK.md: added 2025-12-22 entries for P2.6/P2.7
- Updated 03-TEST-RUNS.md: added P2.6 type safety audit test run
- Updated P2-DESIGN.md: marked P2.6 acceptance criteria complete
- Updated SYSTEM_INVARIANTS.md: added Type Safety Notes section

Baseline Tag:
- Created v1.0.11-p0-p1.4-p1.5-p2.6-p2.7-complete

TypeScript compilation:  PASSES
Build:  PASSES
CI:  All checks pass
2025-12-22 10:56:00 +00:00

126 lines
2.8 KiB
Markdown

# Local CI
This repo uses **local CI** via `./ci/run.sh` (which wraps `./scripts/verify.sh`).
> **Contract / Policy-as-code:** `./ci/run.sh` is the *only* supported CI entrypoint for this repo. Any release gate, merge gate, or automation must invoke `./ci/run.sh` (not `npm run build` directly). `./scripts/verify.sh` encodes enforced invariants (packaging + core purity + exports).
> See also: `docs/progress/00-STATUS.md` for invariants and baseline tags.
## Quick Start
```bash
./ci/run.sh
```
## What It Checks
The CI runs `./scripts/verify.sh`, which performs:
1. **Environment Diagnostics** - Node.js, npm, Java, Swift, xcodebuild availability
2. **Dependencies** - npm install if needed
3. **Native Code Location** - Ensures no native code in `src/` directories
4. **TypeScript** - Lint, typecheck, unit tests
5. **Build** - `npm run build` must succeed
6. **Package** - `npm pack --dry-run` with forbidden files check
7. **Android** - Build check (if gradlew available)
8. **iOS** - Build and test check (if xcodebuild available)
## Platform-Specific Behavior
### Linux (CI/Development)
- ✅ TypeScript checks
- ✅ Build checks
- ✅ Package checks (forbidden files)
- ⚠️ Android builds: Skipped (requires gradlew)
- ⚠️ iOS builds: Skipped (requires xcodebuild)
### macOS (Full CI)
- ✅ All Linux checks
- ✅ iOS builds: Run if xcodebuild available
- ✅ iOS tests: Run if xcodebuild available
## Required Tooling
### Linux
- Node.js 18+
- npm
- Java 17+ (for Android builds, optional)
- TypeScript compiler
### macOS
- All Linux requirements
- Xcode (for iOS builds/tests)
- xcodebuild command-line tools
## Integration Points
### Release Gate
Add to your release process:
```bash
./ci/run.sh && npm publish
```
### Pre-Merge Gate
Run before merging PRs:
```bash
./ci/run.sh
```
### Git Hook (Recommended)
Install the pre-push hook to automatically run CI before pushing:
```bash
# One-time setup
git config core.hooksPath githooks
```
After setup, `githooks/pre-push` will automatically run `./ci/run.sh` before allowing pushes.
**To skip the hook (not recommended):**
```bash
git push --no-verify
```
### Makefile Target
```bash
# Run local CI
make ci
```
This is equivalent to `./ci/run.sh` and provides a convenient alias.
## Exit Codes
- `0` - All checks passed
- `1` - Verification failed
## Forbidden Files Check
The CI hard-fails if `npm pack --dry-run` contains:
- `xcuserdata/`
- `*.xcuserstate`
- `DerivedData/`
- `ios/App/`
- `.DS_Store`
- `*.swp`, `*.swo`
- `*.orig`, `*.rej`
This ensures the package is publish-safe.
## See Also
- `./scripts/verify.sh` - The actual verification script
- `docs/progress/00-STATUS.md` - Current status and packaging invariants
- `docs/_reference/github-actions-ci.yml` - Reference GitHub Actions template (not used)