@ohos-cpf/3rdloop 0.0.11 → 0.0.13

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.
Files changed (46) hide show
  1. package/lib/cli.js +2 -2
  2. package/package.json +1 -1
  3. package/vendor/Server/Routes/controllers/LoopEngineController.js +36 -3
  4. package/vendor/Server/Routes/controllers/OrchestratorController.js +193 -9
  5. package/vendor/Server/Skills/flutter-build-test/SKILL.md +252 -0
  6. package/vendor/Server/Skills/flutter-build-test/assets/BUILDENV_TEMPLATE.md +42 -0
  7. package/vendor/Server/Skills/flutter-build-test/assets/BUILD_REPORT_TEMPLATE.md +64 -0
  8. package/vendor/Server/Skills/flutter-build-test/assets/README_SECTION_TEMPLATE.md +78 -0
  9. package/vendor/Server/Skills/flutter-build-test/references/BUILD_TROUBLESHOOTING.md +128 -0
  10. package/vendor/Server/Skills/flutter-build-test/references/DOC_UPDATE_GUIDE.md +119 -0
  11. package/vendor/Server/Skills/flutter-build-test/references/FLVM_GUIDE.md +89 -0
  12. package/vendor/Server/Skills/flutter-build-test/scripts/build-matrix.cjs +374 -0
  13. package/vendor/Server/Skills/flutter-build-test/scripts/locate-example.cjs +189 -0
  14. package/vendor/Server/Skills/flutter-build-test/scripts/update-buildenv.cjs +171 -0
  15. package/vendor/Server/Skills/flutter-code-use/SKILL.md +316 -0
  16. package/vendor/Server/Skills/flutter-code-use/references/event-channel.md +440 -0
  17. package/vendor/Server/Skills/flutter-code-use/references/federated.md +295 -0
  18. package/vendor/Server/Skills/flutter-code-use/references/ffi-binding-translate.md +130 -0
  19. package/vendor/Server/Skills/flutter-code-use/references/ffi-compile-from-source.md +169 -0
  20. package/vendor/Server/Skills/flutter-code-use/references/ffi-fetch-at-build.md +161 -0
  21. package/vendor/Server/Skills/flutter-code-use/references/ffi-prebuilt-bundle.md +175 -0
  22. package/vendor/Server/Skills/flutter-code-use/references/ffi-rhttp-guide.md +235 -0
  23. package/vendor/Server/Skills/flutter-code-use/references/ffi-rust-cross-compile.md +514 -0
  24. package/vendor/Server/Skills/flutter-code-use/references/ffi.md +220 -0
  25. package/vendor/Server/Skills/flutter-code-use/references/method-channel.md +643 -0
  26. package/vendor/Server/Skills/flutter-code-use/references/monorepo.md +188 -0
  27. package/vendor/Server/Skills/flutter-code-use/references/ohos-api-pitfalls.md +717 -0
  28. package/vendor/Server/Skills/flutter-code-use/references/platform-view.md +448 -0
  29. package/vendor/Server/Skills/flutter-code-use/references/pure-dart.md +180 -0
  30. package/vendor/Server/Skills/flutter-code-use/references/texture.md +459 -0
  31. package/vendor/Server/Skills/flutter-demo-code-generator/SKILL.md +270 -0
  32. package/vendor/Server/Skills/flutter-demo-code-generator/assets/PAGE_TEMPLATES.md +544 -0
  33. package/vendor/Server/Skills/flutter-demo-code-generator/references/CODE_STANDARDS.md +328 -0
  34. package/vendor/Server/Skills/flutter-demo-code-generator/references/DEMO_DOC_PARSING.md +126 -0
  35. package/vendor/Server/Skills/flutter-demo-code-generator/references/EXAMPLES.md +629 -0
  36. package/vendor/Server/Skills/flutter-demo-code-generator/scripts/validate-flutter-demo.cjs +268 -0
  37. package/vendor/Server/Skills/flutter-demo-doc-generator/SKILL.md +227 -0
  38. package/vendor/Server/Skills/flutter-demo-doc-generator/assets/DEMO_DOC_TEMPLATE.md +78 -0
  39. package/vendor/Server/Skills/flutter-demo-doc-generator/references/COVERAGE_REPORT_PARSING.md +174 -0
  40. package/vendor/Server/Skills/flutter-demo-doc-generator/references/EXAMPLES.md +162 -0
  41. package/vendor/Server/Skills/flutter-demo-doc-generator/references/MCP_TOOL_GUIDE.md +123 -0
  42. package/vendor/Server/Skills/flutter-demo-doc-generator/references/OUTPUT_FORMAT.md +190 -0
  43. package/vendor/Server/Skills/flutter-demo-doc-generator/references/QUALITY_CHECKLIST.md +83 -0
  44. package/vendor/Server/Skills/flutter-demo-doc-generator/scripts/validate-skill.cjs +259 -0
  45. package/vendor/Server/Skills/flutter-library-demo-coverage/SKILL.md +175 -0
  46. package/vendor/VERSION +3 -3
@@ -0,0 +1,544 @@
1
+ # Flutter Demo 页面代码模板
2
+
3
+ 本文件提供 `flutter-demo-code-generator` 技能生成代码时使用的标准模板,可直接复制并替换占位符。按接口类型选择模板一/二/三,主导航与应用入口使用模板四/五。
4
+
5
+ ---
6
+
7
+ ## 模板一:Demo 页面(异步接口)
8
+
9
+ **文件路径**:`lib/pages/{序号}_{snake_case描述}/{snake_case描述}_page.dart`
10
+
11
+ ```dart
12
+ /// Demo {序号}: {英文功能描述(PascalCase)}
13
+ ///
14
+ /// 功能说明:{从 Demo 描述文档提取的详细描述}
15
+ /// 对应接口:
16
+ /// - {接口签名 1}
17
+ /// - {接口签名 2}
18
+
19
+ import 'dart:developer' as dev;
20
+
21
+ import 'package:flutter/material.dart';
22
+ import 'package:{三方库包名}/{导入路径}';
23
+
24
+ // ─── 日志 Tag ─────────────────────────────────────────────────────────────
25
+ const String _kTag = '{LibraryName}_{UpperCamelCase组件名}';
26
+
27
+ /// {UpperCamelCase组件名}Page - {Demo 功能一句话说明}
28
+ ///
29
+ /// 展示 {库名} 的 {核心功能} 使用方法。
30
+ class {UpperCamelCase组件名}Page extends StatefulWidget {
31
+ const {UpperCamelCase组件名}Page({super.key});
32
+
33
+ @override
34
+ State<{UpperCamelCase组件名}Page> createState() =>
35
+ _{UpperCamelCase组件名}PageState();
36
+ }
37
+
38
+ class _{UpperCamelCase组件名}PageState
39
+ extends State<{UpperCamelCase组件名}Page> {
40
+ // ─── 状态变量(所有需要触发 UI 更新的变量) ────────────────────────────
41
+ String _resultText = '';
42
+ bool _isLoading = false;
43
+
44
+ // ─── 非响应式成员(库实例、订阅等,不直接触发重建) ─────────────────────
45
+ // {LibraryClass}? _controller;
46
+
47
+ // ─── 生命周期 ──────────────────────────────────────────────────────────
48
+
49
+ @override
50
+ void initState() {
51
+ super.initState();
52
+ dev.log('Page appeared', name: _kTag);
53
+ // 初始化逻辑(如创建实例、注册监听等)
54
+ }
55
+
56
+ @override
57
+ void dispose() {
58
+ dev.log('Page disposed, releasing resources', name: _kTag);
59
+ // 释放所有资源
60
+ // _controller?.dispose();
61
+ super.dispose();
62
+ }
63
+
64
+ // ─── 核心功能方法 ────────────────────────────────────────────────────────
65
+
66
+ /// {方法说明}
67
+ ///
68
+ /// 调用 [{接口名称}] 实现 {功能描述}。
69
+ Future<void> _{camelCase方法名}() async {
70
+ dev.log('_{camelCase方法名} called', name: _kTag);
71
+ setState(() => _isLoading = true);
72
+ try {
73
+ final result = await {libraryCall};
74
+ dev.log('_{camelCase方法名} succeeded: $result', name: _kTag);
75
+ if (!mounted) return; // 页面可能已销毁,不再更新状态
76
+ setState(() {
77
+ _resultText = '结果:$result';
78
+ _isLoading = false;
79
+ });
80
+ } catch (e, stack) {
81
+ dev.log(
82
+ '_{camelCase方法名} failed',
83
+ name: _kTag,
84
+ error: e,
85
+ stackTrace: stack,
86
+ );
87
+ if (!mounted) return;
88
+ setState(() {
89
+ _resultText = '错误:$e';
90
+ _isLoading = false;
91
+ });
92
+ }
93
+ }
94
+
95
+ // ─── UI 构建 ────────────────────────────────────────────────────────────
96
+
97
+ @override
98
+ Widget build(BuildContext context) {
99
+ return Scaffold(
100
+ appBar: AppBar(
101
+ title: const Text('[{序号}] {Demo 标题}'),
102
+ ),
103
+ body: SingleChildScrollView(
104
+ padding: const EdgeInsets.all(16),
105
+ child: Column(
106
+ crossAxisAlignment: CrossAxisAlignment.stretch,
107
+ children: [
108
+ // 说明区域
109
+ Card(
110
+ child: Padding(
111
+ padding: const EdgeInsets.all(12),
112
+ child: Text(
113
+ '{Demo 简要功能说明}',
114
+ style: Theme.of(context).textTheme.bodyMedium,
115
+ ),
116
+ ),
117
+ ),
118
+ const SizedBox(height: 16),
119
+
120
+ // 操作按钮区域
121
+ ElevatedButton(
122
+ onPressed: _isLoading ? null : _{camelCase方法名},
123
+ child: const Text('{按钮文字}'),
124
+ ),
125
+ const SizedBox(height: 16),
126
+
127
+ // 结果展示区域
128
+ _buildResultArea(),
129
+ ],
130
+ ),
131
+ ),
132
+ );
133
+ }
134
+
135
+ /// 构建结果展示区域
136
+ Widget _buildResultArea() {
137
+ if (_isLoading) {
138
+ return const Center(
139
+ child: Padding(
140
+ padding: EdgeInsets.all(16),
141
+ child: CircularProgressIndicator(),
142
+ ),
143
+ );
144
+ }
145
+ return Container(
146
+ padding: const EdgeInsets.all(12),
147
+ decoration: BoxDecoration(
148
+ color: Colors.grey[100],
149
+ borderRadius: BorderRadius.circular(8),
150
+ border: Border.all(color: Colors.grey[300]!),
151
+ ),
152
+ child: SelectableText(
153
+ _resultText.isEmpty ? '(暂无结果,点击上方按钮执行)' : _resultText,
154
+ style: const TextStyle(fontFamily: 'monospace'),
155
+ ),
156
+ );
157
+ }
158
+ }
159
+ ```
160
+
161
+ ---
162
+
163
+ ## 模板二:Demo 页面(仅同步接口)
164
+
165
+ ```dart
166
+ /// Demo {序号}: {英文功能描述}
167
+ ///
168
+ /// 功能说明:{描述}
169
+ /// 对应接口:
170
+ /// - {同步接口签名}
171
+
172
+ import 'dart:developer' as dev;
173
+
174
+ import 'package:flutter/material.dart';
175
+ import 'package:{三方库包名}/{导入路径}';
176
+
177
+ const String _kTag = '{LibraryName}_{ComponentName}';
178
+
179
+ /// {ComponentName}Page - {功能说明}
180
+ class {ComponentName}Page extends StatefulWidget {
181
+ const {ComponentName}Page({super.key});
182
+
183
+ @override
184
+ State<{ComponentName}Page> createState() => _{ComponentName}PageState();
185
+ }
186
+
187
+ class _{ComponentName}PageState extends State<{ComponentName}Page> {
188
+ String _resultText = '';
189
+
190
+ @override
191
+ void initState() {
192
+ super.initState();
193
+ dev.log('Page appeared', name: _kTag);
194
+ }
195
+
196
+ @override
197
+ void dispose() {
198
+ dev.log('Page disposed', name: _kTag);
199
+ super.dispose();
200
+ }
201
+
202
+ void _{syncMethod}() {
203
+ dev.log('_{syncMethod} called', name: _kTag);
204
+ try {
205
+ final result = {syncLibraryCall};
206
+ dev.log('_{syncMethod} result: $result', name: _kTag);
207
+ setState(() => _resultText = '结果:$result');
208
+ } catch (e, stack) {
209
+ dev.log('_{syncMethod} failed', name: _kTag, error: e, stackTrace: stack);
210
+ setState(() => _resultText = '错误:$e');
211
+ }
212
+ }
213
+
214
+ @override
215
+ Widget build(BuildContext context) {
216
+ return Scaffold(
217
+ appBar: AppBar(title: const Text('[{序号}] {标题}')),
218
+ body: Padding(
219
+ padding: const EdgeInsets.all(16),
220
+ child: Column(
221
+ crossAxisAlignment: CrossAxisAlignment.stretch,
222
+ children: [
223
+ ElevatedButton(
224
+ onPressed: _{syncMethod},
225
+ child: const Text('{按钮文字}'),
226
+ ),
227
+ const SizedBox(height: 16),
228
+ Container(
229
+ padding: const EdgeInsets.all(12),
230
+ color: Colors.grey[100],
231
+ child: Text(_resultText.isEmpty ? '(暂无结果)' : _resultText),
232
+ ),
233
+ ],
234
+ ),
235
+ ),
236
+ );
237
+ }
238
+ }
239
+ ```
240
+
241
+ ---
242
+
243
+ ## 模板三:Demo 页面(含监听器/回调)
244
+
245
+ ```dart
246
+ /// Demo {序号}: {英文功能描述(含事件监听)}
247
+ ///
248
+ /// 功能说明:{描述}
249
+ /// 对应接口:
250
+ /// - {addListener 接口签名}
251
+ /// - {removeListener 接口签名}
252
+ /// - {触发接口签名}
253
+
254
+ import 'dart:async';
255
+ import 'dart:developer' as dev;
256
+
257
+ import 'package:flutter/material.dart';
258
+ import 'package:{三方库包名}/{导入路径}';
259
+
260
+ const String _kTag = '{LibraryName}_{ComponentName}';
261
+
262
+ class {ComponentName}Page extends StatefulWidget {
263
+ const {ComponentName}Page({super.key});
264
+
265
+ @override
266
+ State<{ComponentName}Page> createState() => _{ComponentName}PageState();
267
+ }
268
+
269
+ class _{ComponentName}PageState extends State<{ComponentName}Page> {
270
+ // ─── 双计数器(诊断回调链路) ────────────────────────────────────────────
271
+ int _triggerCount = 0;
272
+ int _callbackCount = 0;
273
+
274
+ // ─── 状态 ────────────────────────────────────────────────────────────────
275
+ String _lastEvent = '';
276
+
277
+ // ─── 非响应式 ─────────────────────────────────────────────────────────────
278
+ StreamSubscription<{EventType}>? _subscription;
279
+ // {LibraryClass}? _instance;
280
+
281
+ @override
282
+ void initState() {
283
+ super.initState();
284
+ dev.log('Page appeared', name: _kTag);
285
+ _registerListener();
286
+ }
287
+
288
+ @override
289
+ void dispose() {
290
+ dev.log('Page disposed, releasing resources', name: _kTag);
291
+ _subscription?.cancel();
292
+ _subscription = null;
293
+ // _instance?.dispose();
294
+ super.dispose();
295
+ }
296
+
297
+ /// 注册监听器
298
+ void _registerListener() {
299
+ dev.log('_registerListener called', name: _kTag);
300
+ _subscription = {library}.{eventStream}.listen(
301
+ ({EventType} event) {
302
+ dev.log('Event received: $event', name: _kTag);
303
+ if (!mounted) return;
304
+ setState(() {
305
+ _callbackCount++;
306
+ _lastEvent = event.toString();
307
+ });
308
+ },
309
+ onError: (Object e, StackTrace stack) {
310
+ dev.log('Stream error', name: _kTag, error: e, stackTrace: stack);
311
+ if (!mounted) return;
312
+ setState(() => _lastEvent = '事件流异常:$e');
313
+ },
314
+ );
315
+ }
316
+
317
+ /// 触发操作,预期会产生回调事件
318
+ void _triggerAction() {
319
+ dev.log('_triggerAction called', name: _kTag);
320
+ setState(() => _triggerCount++);
321
+ try {
322
+ {library}.{triggerMethod}();
323
+ } catch (e, stack) {
324
+ dev.log('_triggerAction failed', name: _kTag, error: e, stackTrace: stack);
325
+ setState(() => _lastEvent = '触发失败:$e');
326
+ }
327
+ }
328
+
329
+ @override
330
+ Widget build(BuildContext context) {
331
+ return Scaffold(
332
+ appBar: AppBar(title: const Text('[{序号}] {标题}')),
333
+ body: SingleChildScrollView(
334
+ padding: const EdgeInsets.all(16),
335
+ child: Column(
336
+ crossAxisAlignment: CrossAxisAlignment.stretch,
337
+ children: [
338
+ // 操作按钮
339
+ ElevatedButton(
340
+ onPressed: _triggerAction,
341
+ child: const Text('{触发按钮文字}'),
342
+ ),
343
+ const SizedBox(height: 16),
344
+
345
+ // 诊断区域(双计数器)
346
+ Card(
347
+ child: Padding(
348
+ padding: const EdgeInsets.all(12),
349
+ child: Column(
350
+ crossAxisAlignment: CrossAxisAlignment.start,
351
+ children: [
352
+ const Text('诊断信息', style: TextStyle(fontWeight: FontWeight.bold)),
353
+ const SizedBox(height: 8),
354
+ Text('触发次数: $_triggerCount'),
355
+ Text('回调次数: $_callbackCount'),
356
+ if (_triggerCount > 0 && _callbackCount == 0)
357
+ const Text(
358
+ '⚠️ 已触发但回调未收到,请检查监听注册',
359
+ style: TextStyle(color: Colors.orange),
360
+ ),
361
+ if (_callbackCount > 0 && _triggerCount == _callbackCount)
362
+ const Text(
363
+ '✅ 链路正常',
364
+ style: TextStyle(color: Colors.green),
365
+ ),
366
+ ],
367
+ ),
368
+ ),
369
+ ),
370
+ const SizedBox(height: 16),
371
+
372
+ // 最近事件展示
373
+ Container(
374
+ padding: const EdgeInsets.all(12),
375
+ decoration: BoxDecoration(
376
+ color: Colors.grey[100],
377
+ borderRadius: BorderRadius.circular(8),
378
+ ),
379
+ child: Text(
380
+ _lastEvent.isEmpty ? '(尚未收到事件)' : '最近事件:\n$_lastEvent',
381
+ ),
382
+ ),
383
+ ],
384
+ ),
385
+ ),
386
+ );
387
+ }
388
+ }
389
+ ```
390
+
391
+ ---
392
+
393
+ ## 模板四:主导航页面
394
+
395
+ **文件路径**:`lib/pages/demo_home_page.dart`
396
+
397
+ ```dart
398
+ /// {LibraryName} Demo 主导航页面
399
+ ///
400
+ /// 展示所有可用的 Demo 列表,点击后跳转到对应 Demo 页面。
401
+
402
+ import 'dart:developer' as dev;
403
+
404
+ import 'package:flutter/material.dart';
405
+
406
+ // 导入所有 Demo 页面(按序号排列)
407
+ import '001_{描述}/{描述}_page.dart';
408
+ import '002_{描述}/{描述}_page.dart';
409
+ // ... 其余 Demo 页面
410
+
411
+ const String _kTag = '{LibraryName}_DemoHome';
412
+
413
+ /// Demo 条目数据结构(私有,仅此文件使用)
414
+ class _DemoEntry {
415
+ const _DemoEntry({
416
+ required this.id,
417
+ required this.title,
418
+ required this.description,
419
+ required this.builder,
420
+ });
421
+
422
+ final String id;
423
+ final String title;
424
+ final String description;
425
+ final WidgetBuilder builder;
426
+ }
427
+
428
+ /// Demo 列表配置(按序号排列,填写实际 Demo 信息)
429
+ final List<_DemoEntry> _demoList = [
430
+ _DemoEntry(
431
+ id: '001',
432
+ title: '{Demo 1 中文名称}',
433
+ description: '{Demo 1 一句话描述,不超过 40 字}',
434
+ builder: (_) => const {Demo1ClassName}Page(),
435
+ ),
436
+ _DemoEntry(
437
+ id: '002',
438
+ title: '{Demo 2 中文名称}',
439
+ description: '{Demo 2 一句话描述}',
440
+ builder: (_) => const {Demo2ClassName}Page(),
441
+ ),
442
+ // ... 其余 Demo 条目
443
+ ];
444
+
445
+ /// DemoHomePage - {LibraryName} Demo 示例主导航页
446
+ class DemoHomePage extends StatelessWidget {
447
+ const DemoHomePage({super.key});
448
+
449
+ @override
450
+ Widget build(BuildContext context) {
451
+ return Scaffold(
452
+ appBar: AppBar(
453
+ title: const Text('{LibraryName} Demo 示例'),
454
+ centerTitle: true,
455
+ ),
456
+ body: ListView.separated(
457
+ padding: const EdgeInsets.all(16),
458
+ itemCount: _demoList.length,
459
+ separatorBuilder: (_, __) => const SizedBox(height: 8),
460
+ itemBuilder: (context, index) {
461
+ final demo = _demoList[index];
462
+ return _DemoCard(
463
+ demo: demo,
464
+ onTap: () {
465
+ dev.log(
466
+ 'Navigate to demo: ${demo.id} - ${demo.title}',
467
+ name: _kTag,
468
+ );
469
+ Navigator.push(
470
+ context,
471
+ MaterialPageRoute(builder: demo.builder),
472
+ );
473
+ },
474
+ );
475
+ },
476
+ ),
477
+ );
478
+ }
479
+ }
480
+
481
+ /// Demo 列表卡片 Widget(私有)
482
+ class _DemoCard extends StatelessWidget {
483
+ const _DemoCard({required this.demo, required this.onTap});
484
+
485
+ final _DemoEntry demo;
486
+ final VoidCallback onTap;
487
+
488
+ @override
489
+ Widget build(BuildContext context) {
490
+ return Card(
491
+ child: ListTile(
492
+ leading: CircleAvatar(
493
+ child: Text(demo.id, style: const TextStyle(fontSize: 12)),
494
+ ),
495
+ title: Text(
496
+ '[${demo.id}] ${demo.title}',
497
+ style: const TextStyle(fontWeight: FontWeight.w500),
498
+ ),
499
+ subtitle: Text(
500
+ demo.description,
501
+ maxLines: 2,
502
+ overflow: TextOverflow.ellipsis,
503
+ ),
504
+ trailing: const Icon(Icons.arrow_forward_ios, size: 16),
505
+ onTap: onTap,
506
+ ),
507
+ );
508
+ }
509
+ }
510
+ ```
511
+
512
+ ---
513
+
514
+ ## 模板五:main.dart 应用入口
515
+
516
+ **文件路径**:`lib/main.dart`
517
+
518
+ ```dart
519
+ import 'package:flutter/material.dart';
520
+
521
+ import 'pages/demo_home_page.dart';
522
+
523
+ void main() {
524
+ runApp(const DemoApp());
525
+ }
526
+
527
+ /// DemoApp - {LibraryName} Flutter Demo 应用
528
+ class DemoApp extends StatelessWidget {
529
+ const DemoApp({super.key});
530
+
531
+ @override
532
+ Widget build(BuildContext context) {
533
+ return MaterialApp(
534
+ title: '{LibraryName} Demo',
535
+ debugShowCheckedModeBanner: false,
536
+ theme: ThemeData(
537
+ colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
538
+ useMaterial3: true,
539
+ ),
540
+ home: const DemoHomePage(),
541
+ );
542
+ }
543
+ }
544
+ ```