Skip to content
Closed
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
19 changes: 19 additions & 0 deletions .codeforge.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
[commands.format]
program = "dart"
args = ["format", "--output=none", "--set-exit-if-changed", "."]
timeout_secs = 300

[commands.lint]
program = "flutter"
args = ["analyze", "--no-fatal-warnings", "--no-fatal-infos", "lib", "test"]
timeout_secs = 900

[commands.test]
program = "flutter"
args = ["test", "--concurrency=1"]
timeout_secs = 1800

[commands.build]
program = "flutter"
args = ["build", "apk", "--debug"]
timeout_secs = 1800
2,848 changes: 2,848 additions & 0 deletions .codeforge/baseline.json

Large diffs are not rendered by default.

21 changes: 19 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,11 @@ jobs:
runner: ubuntu-latest

runs-on: ${{ matrix.runner }}
env:
ANDROID_KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}

steps:
- uses: actions/checkout@v4
Expand Down Expand Up @@ -197,7 +202,7 @@ jobs:
java-version: '17'

- name: Restore Android signing config
if: matrix.platform == 'android'
if: matrix.platform == 'android' && env.ANDROID_KEYSTORE_BASE64 != ''
env:
ANDROID_KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
Expand All @@ -213,7 +218,7 @@ jobs:
EOF

- name: Build Android APK
if: matrix.platform == 'android'
if: matrix.platform == 'android' && env.ANDROID_KEYSTORE_BASE64 != ''
run: |
flutter clean
flutter build apk --release --flavor=prod \
Expand All @@ -223,3 +228,15 @@ jobs:
--dart-define=SUPABASE_URL=${{ vars.SUPABASE_URL }} \
--dart-define=SUPABASE_PUBLISHABLE_KEY=${{ vars.SUPABASE_PUBLISHABLE_KEY }} \
--dart-define=GOOGLE_WEB_CLIENT_ID=${{ vars.GOOGLE_WEB_CLIENT_ID }}

- name: Build Android debug APK without signing secrets
if: matrix.platform == 'android' && env.ANDROID_KEYSTORE_BASE64 == ''
run: |
flutter clean
flutter build apk --debug --flavor=dev \
--target-platform android-arm64 \
--dart-define=API_BASE_URL=${{ vars.API_BASE_URL }} \
--dart-define=POSTHOG_HOST=${{ vars.POSTHOG_HOST }} \
--dart-define=SUPABASE_URL=${{ vars.SUPABASE_URL }} \
--dart-define=SUPABASE_PUBLISHABLE_KEY=${{ vars.SUPABASE_PUBLISHABLE_KEY }} \
--dart-define=GOOGLE_WEB_CLIENT_ID=${{ vars.GOOGLE_WEB_CLIENT_ID }}
63 changes: 63 additions & 0 deletions .github/workflows/codeforge-regression.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
name: CodeForge regression

on:
pull_request:

permissions:
contents: read

concurrency:
group: codeforge-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
codeforge:
name: CodeForge regression
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}
fetch-depth: 0

- name: Expose pull request diff to CodeForge --changed
shell: bash
run: |
git fetch --no-tags origin "${{ github.event.pull_request.base.sha }}"
git reset --soft "${{ github.event.pull_request.base.sha }}"

- uses: dtolnay/rust-toolchain@stable

- name: Cache CodeForge v0.2.1 build inputs
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
key: codeforge-v0.2.1-${{ runner.os }}-${{ runner.arch }}

- name: Install CodeForge Engine v0.2.1
shell: bash
run: |
if ! command -v codeforge >/dev/null 2>&1 || [ "$(codeforge --version)" != "codeforge 0.2.1" ]; then
cargo install --git https://github.com/styayur/codeforge-engine --tag v0.2.1 --locked codeforge-cli
fi

- name: Run CodeForge regression gate
shell: bash
run: |
codeforge ci \
--changed \
--baseline .codeforge/baseline.json \
--fail-on new \
--sarif codeforge.sarif \
--new-only

- name: Upload CodeForge SARIF
if: always()
uses: actions/upload-artifact@v4
with:
name: codeforge-sarif
path: codeforge.sarif
if-no-files-found: ignore
2 changes: 1 addition & 1 deletion PLAN.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ Echo Loop 是一个围绕“音频输入 + 句子级学习 + 间隔复习 + AI
## 关键 ADR 索引

- 媒体引擎与前台引擎分离:避免锁屏媒体会话与前台试听互相污染。
- 统一 TTS 架构:合成 → 文件 → 缓存 → 播放,支持平台 TTS 与 Kokoro 本地 TTS。
- 统一 TTS 架构:合成 → 文件 → 缓存 → 播放,支持平台 TTS 与 Kokoro 本地 TTS;Kokoro 使用官方 v1.1 中英多语言模型,并支持 Text → Lesson 与跟读参考音。
- 离线转录与本地模型:复用统一音频处理与模型下载能力。
- 平台 + 渠道统一识别:`platform + distribution` 决定支付实现和后端配额策略。
- 通用记忆调度基础设施:以独立调度快照与只追加复习事件建模;上层依赖应用自有接口,FSRS 仅限 adapter 内部,按逐项固定 Profile 保障可迁移与可审计性(见 [memory-scheduler-infrastructure-plan.md](./docs/memory-scheduler-infrastructure-plan.md))。
Expand Down
Loading