Skip to content
Merged

Dev #13

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
932a7fd
refactor: relocate-flutter-study-app [relocate-flutter-study-app]
lizy-coding Aug 14, 2026
a2cfdbc
merge: decompose relocate-flutter-study-app (integration commit 932a7fd)
lizy-coding Aug 14, 2026
7ef5bee
refactor: establish-package-boundary-contracts [establish-package-bou…
lizy-coding Aug 14, 2026
5defea6
refactor: fix-dio-retry-interceptor-resolution [fix-dio-retry-interce…
lizy-coding Aug 17, 2026
0938961
refactor: fix-popup-overlay-protected-set-state [fix-popup-overlay-pr…
lizy-coding Aug 17, 2026
a070426
refactor: replace-media-plugin-with-video-player [replace-media-plugi…
lizy-coding Aug 17, 2026
f636020
refactor: rename-main-app-package [rename-main-app-package]
lizy-coding Aug 17, 2026
ae327a1
refactor: rename-project-to-flutter-forge [rename-project-to-flutter-…
lizy-coding Aug 19, 2026
f8befa6
fix: align Flutter Forge validation paths
lizy-coding Aug 19, 2026
118a9ca
chore: refresh Flutter Forge macOS pods
lizy-coding Aug 19, 2026
a7d77ff
feat:更新 yaml
lizy-coding Aug 22, 2026
eed5b6d
refactor: complete flutter_forge rename (remote, docs, agent-hub regi…
lizy-coding Aug 22, 2026
70bd693
chore(deps): pin flutterguard via git ref
lizy-coding Aug 22, 2026
ec19644
refactor: generate route table from single source
lizy-coding Aug 22, 2026
bf58017
fix(dio): handle transformTimeout and align dio to 5.11.0
lizy-coding Aug 22, 2026
c1811a6
style: apply dart fix const/final cleanup
lizy-coding Aug 22, 2026
05f177d
chore(gate): enforce bare flutter analyze
lizy-coding Aug 22, 2026
7ea5cb6
ci: drop flutterguard scan from quality-gate
lizy-coding Aug 22, 2026
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
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@

```bash
git clone <repository-url>
cd flutter_study
cd flutter_forge
```

2. **安装依赖**
Expand Down Expand Up @@ -101,7 +101,7 @@
## 📁 项目结构

```
flutter_study/
flutter_forge/
├── lib/
│ ├── main.dart # 应用入口
│ ├── app.dart # App 配置
Expand Down
4 changes: 2 additions & 2 deletions .githooks/pre-commit
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
set -euo pipefail

echo "🔍 Running FlutterGuard static scan..."
if ! dart run flutterguard_cli:flutterguard scan . --fail-on high; then
if ! (cd apps/flutter_forge && dart run flutterguard_cli:flutterguard scan . --fail-on high); then
echo ""
echo "❌ FlutterGuard 检测到高优问题,提交被阻止。"
echo " 运行 'dart run flutterguard_cli:flutterguard scan' 查看详情。"
echo " 运行 'cd apps/flutter_forge && dart run flutterguard_cli:flutterguard scan . --fail-on high' 查看详情。"
exit 1
fi

Expand Down
13 changes: 0 additions & 13 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,6 @@ jobs:
steps:
- uses: actions/checkout@v4

- name: Checkout pinned FlutterGuard
uses: actions/checkout@v4
with:
repository: lizy-coding/flutterguard
ref: 9f9be84a73dc4b99a956a8529b8c334849566b03
path: flutterguard

- name: Prepare sibling FlutterGuard dependency
run: mv flutterguard ../flutterguard

- name: Setup Flutter
uses: subosito/flutter-action@v2
with:
Expand Down Expand Up @@ -59,6 +49,3 @@ jobs:

- name: Tests
run: bash tool/test_all.sh

- name: FlutterGuard scan
run: dart run flutterguard_cli:flutterguard scan . --fail-on high
8 changes: 4 additions & 4 deletions .hermes/README.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
# Hermes Agent 项目架构记录

> flutter_study 项目 Hermes Agent 托管架构 — 完全托管模式
> flutter_forge 项目 Hermes Agent 托管架构 — 完全托管模式
> 里程碑: online_video_player_landed | 阶段: agent_managed | 更新: 2026-08-02

## 项目概述

flutter_study 是一个 Flutter 模块化学习应用,涵盖基础机制、异步并发、状态管理、UI 动效、弹窗列表、网络平台六大分类共 18 个学习模块。通过 Dart Pub Workspace 管理 4 个内部共享包。
flutter_forge 是一个 Flutter 模块化学习应用,涵盖基础机制、异步并发、状态管理、UI 动效、弹窗列表、网络平台六大分类共 18 个学习模块。通过 Dart Pub Workspace 管理 4 个内部共享包。

## Agent 文档体系

```
flutter_study/
flutter_forge/
├── AGENTS.md # Agent 行为契约(入口)
├── AI_ANALYSIS_SCHEMA.json # 文档 schema 定义
├── AI_PROJECT_CONTEXT.md # 项目架构上下文(JSON 机器契约)
Expand Down Expand Up @@ -160,4 +160,4 @@ bash tool/quality_gate.sh
4. 门禁: bash tool/quality_gate.sh
5. 禁止: 提交/推送/合并(除非用户明确授权)
6. 禁止: 手改 AI_MODULE_INDEX.md / AI_PROJECT_CONTEXT.md / REFACTOR_PLAN.md / packages/*/AI_ANALYSIS.md
7. 任务提词: 写入 .hermes/<task>.codex.json(schema: flutter_study.agent_task.v1),Codex 只执行提词,Hermes 独立验收
7. 任务提词: 写入 .hermes/<task>.codex.json(schema: flutter_forge.agent_task.v1),Codex 只执行提词,Hermes 独立验收
18 changes: 14 additions & 4 deletions .hermes/online-video-player-macos.codex.json
Original file line number Diff line number Diff line change
@@ -1,17 +1,20 @@
{
"schema": "flutter_study.agent_task.v1",
"schema": "flutter_forge.agent_task.v1",
"task_id": "FEAT-20260802-online-video-player-macos",
"objective": "macos_first_online_video_player_module",
"scope": "macos_only",
"agent_role": "code_executor",
"background": {
"repo": "/Users/forest/code/flutter_study",
"repo": "/Users/forest/code/langGraph/flutter_forge",
"branch": "dev",
"host": "macos",
"flutter": "3.44.6",
"macos_deployment_target": "10.15",
"workspace": "pub_workspace, 4 internal packages",
"existing_platform_modules": ["dio_interceptor", "usb_detector"],
"existing_platform_modules": [
"dio_interceptor",
"usb_detector"
],
"reference_module": "lib/modules/platform/usb_detector",
"learning_package": "packages/flutter_study_learning (exports LearningScaffold, LearningObjectives, ConceptChips, CodeSnippetCard, CommonPitfalls, ExerciseCard)",
"plugin_decision": "media_kit ^1.2.6 + media_kit_video ^2.0.1 + media_kit_libs_video ^1.0.7. NOT flutter official video_player (no first-class macOS support).",
Expand All @@ -31,7 +34,14 @@
"difficulty": "intermediate",
"title": "在线视频播放",
"subtitle": "使用 media_kit 播放在线 HTTP 视频流并操控播放参数",
"concepts": ["media_kit", "libmpv", "HTTP 流", "播放控制", "倍速", "Player 生命周期"],
"concepts": [
"media_kit",
"libmpv",
"HTTP 流",
"播放控制",
"倍速",
"Player 生命周期"
],
"estimatedMinutes": 35,
"status": "ready",
"required_files": [
Expand Down
6 changes: 6 additions & 0 deletions .run/Flutter_Forge_macOS.run.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Flutter Forge macOS" type="FlutterRunConfigurationType" factoryName="Flutter">
<option name="filePath" value="$PROJECT_DIR$/apps/flutter_forge/lib/main.dart" />
<method v="2" />
</configuration>
</component>
4 changes: 2 additions & 2 deletions AI_ANALYSIS.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
"schema": "vibecoding.harness.ai_analysis.v2",
"mode": "index",
"node": {
"id": "flutter_study.root",
"id": "flutter_forge.root",
"kind": "workspace_index",
"package": "main_app",
"package": "flutter_forge_app",
"path": ".",
"status": "active"
},
Expand Down
2 changes: 1 addition & 1 deletion AI_ANALYSIS_SCHEMA.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"schema": "flutter_study.agent_docs.schema.v2",
"schema": "flutter_forge.agent_docs.schema.v2",
"syntax": "json_config",
"prose": "forbidden",
"markdown": "forbidden",
Expand Down
6 changes: 3 additions & 3 deletions AI_PROJECT_CONTEXT.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"schema": "flutter_study.agent_docs.project_context.v1",
"schema": "flutter_forge.agent_docs.project_context.v1",
"consumer": "coding_agent",
"package": {
"name": "main_app",
"name": "flutter_forge_app",
"type": "flutter_modular_learning_app",
"sdk": [
"flutter_3",
Expand Down Expand Up @@ -74,7 +74,7 @@
"url": "https://github.com/lizy-coding/flutterguard.git",
"ref": "9f9be84a73dc4b99a956a8529b8c334849566b03",
"immutable": true,
"lock_status": "active"
"lock_status": "git_pinned"
}
],
"layers": [
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Flutter 学习实验室

本项目是面向 Flutter 初学者的学习项目集合,所有学习模块位于 `lib/modules/` 目录下,按主题分类,通过路由切换进入不同模块。项目同时维护 `app/` 应用壳、`module_registry/` 模块元数据和 `shared/` 共享能力,让示例既能独立学习,也能按真实工程方式演进。
![demo](https://raw.githubusercontent.com/lizy-coding/flutter_study/master/assets/demo.gif)
![demo](https://raw.githubusercontent.com/lizy-coding/flutter_forge/master/assets/demo.gif)

Full video: https://github.com/user-attachments/assets/6af279c0-7d82-42bc-81b1-624071b0e2ea

Expand Down
4 changes: 2 additions & 2 deletions REFACTOR_PLAN.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"schema": "flutter_study.agent_docs.refactor_plan.v1",
"schema": "flutter_forge.agent_docs.refactor_plan.v1",
"objective": "android_readiness_after_architecture_convergence",
"active_phase": "agent_managed",
"completed_milestones": [
Expand Down Expand Up @@ -27,7 +27,7 @@
"url": "https://github.com/lizy-coding/flutterguard.git",
"ref": "9f9be84a73dc4b99a956a8529b8c334849566b03",
"immutable": true,
"lock_status": "active"
"lock_status": "git_pinned"
}
},
"work_queue": [
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes
File renamed without changes.
4 changes: 2 additions & 2 deletions lib/AI_ANALYSIS.md → apps/flutter_forge/lib/AI_ANALYSIS.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
"schema": "vibecoding.harness.ai_analysis.v2",
"mode": "index",
"node": {
"id": "main_app.lib",
"id": "flutter_forge_app.lib",
"kind": "source_index",
"package": "main_app",
"package": "flutter_forge_app",
"path": "lib",
"status": "active"
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"schema": "flutter_study.agent_docs.module_index.v1",
"schema": "flutter_forge.agent_docs.module_index.v1",
"registry": "lib/app/router/app_route_table.dart",
"count": 20,
"modules": [
Expand Down Expand Up @@ -262,8 +262,7 @@
"status": "ready",
"depends": [
"flutter_study_learning",
"media_kit",
"media_kit_video",
"video_player",
"module_registry"
],
"analysis": "lib/modules/platform/online_video_player/AI_ANALYSIS.md"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
"schema": "vibecoding.harness.ai_analysis.v2",
"mode": "index",
"node": {
"id": "main_app.app",
"id": "flutter_forge_app.app",
"kind": "app_index",
"package": "main_app",
"package": "flutter_forge_app",
"path": "lib/app",
"status": "active"
},
Expand Down
2 changes: 1 addition & 1 deletion lib/app/app.dart → apps/flutter_forge/lib/app/app.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ class App extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp.router(
routerConfig: AppRouter.router,
title: 'Flutter 学习实验室',
title: 'Flutter Forge',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
useMaterial3: true,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
import 'package:desktop_multi_window/desktop_multi_window.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:media_kit/media_kit.dart';

import '../shared/multi_window/multi_window_manager.dart';
import 'app.dart';
import 'category_window_app.dart';

/// Resolves the host-specific application shell before mounting Flutter.
Future<void> bootstrapFlutterStudyApp() async {
Future<void> bootstrapFlutterForgeApp() async {
WidgetsFlutterBinding.ensureInitialized();
MediaKit.ensureInitialized();

Widget root = const App();
if (MultiWindowManager.isSupported) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
"schema": "vibecoding.harness.ai_analysis.v2",
"mode": "index",
"node": {
"id": "main_app.app.router",
"id": "flutter_forge_app.app.router",
"kind": "router_index",
"package": "main_app",
"package": "flutter_forge_app",
"path": "lib/app/router",
"status": "active"
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
// GENERATED by tool/generate_agent_indexes.js - DO NOT EDIT

import 'package:go_router/go_router.dart';

import '../module_home_page.dart';
Expand Down Expand Up @@ -300,10 +302,17 @@ final List<ModuleEntry> _modules = [
ModuleEntry(
title: '在线视频播放',
path: '/online-video-player',
subtitle: '使用 media_kit 播放在线 HTTP 视频流并操控播放参数',
subtitle: '使用 video_player 播放在线 HTTP 视频流并操控播放参数',
category: ModuleCategory.platform,
difficulty: Difficulty.intermediate,
concepts: ['media_kit', 'libmpv', 'HTTP 流', '播放控制', '倍速', 'Player 生命周期'],
concepts: [
'video_player',
'平台播放器',
'HTTP 流',
'播放控制',
'倍速',
'Controller 生命周期',
],
estimatedMinutes: 35,
status: ModuleStatus.ready,
builder: (context) => const OnlineVideoPlayerEntry(),
Expand Down
3 changes: 3 additions & 0 deletions apps/flutter_forge/lib/main.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import 'app/app_bootstrap.dart';

Future<void> main() => bootstrapFlutterForgeApp();
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
"schema": "vibecoding.harness.ai_analysis.v2",
"mode": "index",
"node": {
"id": "main_app.module_registry",
"id": "flutter_forge_app.module_registry",
"kind": "registry_index",
"package": "main_app",
"package": "flutter_forge_app",
"path": "lib/module_registry",
"status": "active"
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
"schema": "vibecoding.harness.ai_analysis.v2",
"mode": "index",
"node": {
"id": "main_app.modules",
"id": "flutter_forge_app.modules",
"kind": "modules_index",
"package": "main_app",
"package": "flutter_forge_app",
"path": "lib/modules",
"status": "active"
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
"schema": "vibecoding.harness.ai_analysis.v2",
"mode": "index",
"node": {
"id": "main_app.modules.async",
"id": "flutter_forge_app.modules.async",
"kind": "module_category_index",
"package": "main_app",
"package": "flutter_forge_app",
"path": "lib/modules/async",
"status": "active"
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
"schema": "vibecoding.harness.ai_analysis.v2",
"mode": "module_contract",
"node": {
"id": "main_app.modules.async.isolate_basic",
"id": "flutter_forge_app.modules.async.isolate_basic",
"kind": "learning_module",
"package": "main_app",
"package": "flutter_forge_app",
"path": "lib/modules/async/isolate_basic",
"status": "ready"
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ class _WithIsolatePageState extends State<WithIsolatePage>
),
),
),
sections: [
sections: const [
LearningObjectives(
objectives: [
'理解 Isolate 在 Flutter 中的工作原理',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ class _WithoutIsolatePageState extends State<WithoutIsolatePage>
),
),
),
sections: [
sections: const [
LearningObjectives(
objectives: [
'理解主 Isolate 被阻塞时界面卡顿的原理',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
"schema": "vibecoding.harness.ai_analysis.v2",
"mode": "module_contract",
"node": {
"id": "main_app.modules.async.isolate_task_manager",
"id": "flutter_forge_app.modules.async.isolate_task_manager",
"kind": "learning_module",
"package": "main_app",
"package": "flutter_forge_app",
"path": "lib/modules/async/isolate_task_manager",
"status": "ready"
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
"schema": "vibecoding.harness.ai_analysis.v2",
"mode": "module_contract",
"node": {
"id": "main_app.modules.async.stream_subscription",
"id": "flutter_forge_app.modules.async.stream_subscription",
"kind": "learning_module",
"package": "main_app",
"package": "flutter_forge_app",
"path": "lib/modules/async/stream_subscription",
"status": "recommended"
},
Expand Down
Loading
Loading