monoco-toolkit 0.3.6__py3-none-any.whl → 0.3.9__py3-none-any.whl

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 (58) hide show
  1. monoco/cli/workspace.py +1 -1
  2. monoco/core/config.py +51 -0
  3. monoco/core/hooks/__init__.py +19 -0
  4. monoco/core/hooks/base.py +104 -0
  5. monoco/core/hooks/builtin/__init__.py +11 -0
  6. monoco/core/hooks/builtin/git_cleanup.py +266 -0
  7. monoco/core/hooks/builtin/logging_hook.py +78 -0
  8. monoco/core/hooks/context.py +131 -0
  9. monoco/core/hooks/registry.py +222 -0
  10. monoco/core/integrations.py +6 -0
  11. monoco/core/registry.py +2 -0
  12. monoco/core/setup.py +1 -1
  13. monoco/core/skills.py +226 -42
  14. monoco/features/{scheduler → agent}/__init__.py +4 -2
  15. monoco/features/{scheduler → agent}/cli.py +134 -80
  16. monoco/features/{scheduler → agent}/config.py +17 -3
  17. monoco/features/agent/defaults.py +55 -0
  18. monoco/features/agent/flow_skills.py +281 -0
  19. monoco/features/{scheduler → agent}/manager.py +39 -2
  20. monoco/features/{scheduler → agent}/models.py +6 -3
  21. monoco/features/{scheduler → agent}/reliability.py +1 -1
  22. monoco/features/agent/resources/skills/flow_engineer/SKILL.md +94 -0
  23. monoco/features/agent/resources/skills/flow_manager/SKILL.md +88 -0
  24. monoco/features/agent/resources/skills/flow_reviewer/SKILL.md +114 -0
  25. monoco/features/{scheduler → agent}/session.py +36 -1
  26. monoco/features/{scheduler → agent}/worker.py +2 -2
  27. monoco/features/i18n/resources/skills/i18n_scan_workflow/SKILL.md +105 -0
  28. monoco/features/issue/commands.py +427 -21
  29. monoco/features/issue/core.py +100 -0
  30. monoco/features/issue/criticality.py +553 -0
  31. monoco/features/issue/domain/models.py +28 -2
  32. monoco/features/issue/engine/machine.py +70 -13
  33. monoco/features/issue/git_service.py +185 -0
  34. monoco/features/issue/linter.py +291 -62
  35. monoco/features/issue/models.py +49 -2
  36. monoco/features/issue/resources/en/SKILL.md +48 -0
  37. monoco/features/issue/resources/skills/issue_lifecycle_workflow/SKILL.md +159 -0
  38. monoco/features/issue/resources/zh/SKILL.md +50 -0
  39. monoco/features/issue/validator.py +185 -65
  40. monoco/features/memo/__init__.py +2 -1
  41. monoco/features/memo/adapter.py +32 -0
  42. monoco/features/memo/cli.py +36 -14
  43. monoco/features/memo/core.py +59 -0
  44. monoco/features/memo/resources/skills/note_processing_workflow/SKILL.md +140 -0
  45. monoco/features/memo/resources/zh/AGENTS.md +8 -0
  46. monoco/features/memo/resources/zh/SKILL.md +75 -0
  47. monoco/features/spike/resources/skills/research_workflow/SKILL.md +121 -0
  48. monoco/main.py +2 -3
  49. {monoco_toolkit-0.3.6.dist-info → monoco_toolkit-0.3.9.dist-info}/METADATA +1 -1
  50. {monoco_toolkit-0.3.6.dist-info → monoco_toolkit-0.3.9.dist-info}/RECORD +55 -37
  51. monoco/features/scheduler/defaults.py +0 -54
  52. monoco/features/skills/__init__.py +0 -0
  53. monoco/features/skills/core.py +0 -102
  54. /monoco/core/{hooks.py → githooks.py} +0 -0
  55. /monoco/features/{scheduler → agent}/engines.py +0 -0
  56. {monoco_toolkit-0.3.6.dist-info → monoco_toolkit-0.3.9.dist-info}/WHEEL +0 -0
  57. {monoco_toolkit-0.3.6.dist-info → monoco_toolkit-0.3.9.dist-info}/entry_points.txt +0 -0
  58. {monoco_toolkit-0.3.6.dist-info → monoco_toolkit-0.3.9.dist-info}/licenses/LICENSE +0 -0
@@ -5,6 +5,23 @@ from typing import List, Dict, Optional
5
5
  import secrets
6
6
 
7
7
 
8
+ def is_chinese(text: str) -> bool:
9
+ """Check if the text contains at least one Chinese character."""
10
+ return any("\u4e00" <= char <= "\u9fff" for char in text)
11
+
12
+
13
+ def validate_content_language(content: str, source_lang: str) -> bool:
14
+ """
15
+ Check if content matches source language using simple heuristics.
16
+ Returns True if matched or if detection is not supported for the lang.
17
+ """
18
+ if source_lang == "zh":
19
+ return is_chinese(content)
20
+ # For 'en', we generally allow everything but could be more strict.
21
+ # Requirement is mainly about enforcing 'zh' when configured.
22
+ return True
23
+
24
+
8
25
  def get_memos_dir(issues_root: Path) -> Path:
9
26
  """
10
27
  Get the directory for memos.
@@ -85,3 +102,45 @@ def list_memos(issues_root: Path) -> List[Dict[str, str]]:
85
102
  memos.append({"id": uid, "timestamp": timestamp, "content": body})
86
103
 
87
104
  return memos
105
+
106
+
107
+ def delete_memo(issues_root: Path, memo_id: str) -> bool:
108
+ """
109
+ Delete a memo by its ID.
110
+ Returns True if deleted, False if not found.
111
+ """
112
+ inbox_path = get_inbox_path(issues_root)
113
+ if not inbox_path.exists():
114
+ return False
115
+
116
+ content = inbox_path.read_text(encoding="utf-8")
117
+ pattern = re.compile(r"^## \[([a-f0-9]+)\] (.*?)$", re.MULTILINE)
118
+
119
+ matches = list(pattern.finditer(content))
120
+ target_idx = -1
121
+ for i, m in enumerate(matches):
122
+ if m.group(1) == memo_id:
123
+ target_idx = i
124
+ break
125
+
126
+ if target_idx == -1:
127
+ return False
128
+
129
+ # Find boundaries
130
+ start = matches[target_idx].start()
131
+ # Include the potential newline before the header if it exists
132
+ if start > 0 and content[start - 1] == "\n":
133
+ start -= 1
134
+
135
+ if target_idx + 1 < len(matches):
136
+ end = matches[target_idx + 1].start()
137
+ # Back up if there's a newline before the next header that we should keep?
138
+ # Actually, if we delete a memo, we should probably remove one "entry block".
139
+ # Entry blocks are format_memo: \n## header\nbody\n
140
+ # So we want to remove the leading \n and the trailing parts.
141
+ else:
142
+ end = len(content)
143
+
144
+ new_content = content[:start] + content[end:]
145
+ inbox_path.write_text(new_content, encoding="utf-8")
146
+ return True
@@ -0,0 +1,140 @@
1
+ ---
2
+ name: note-processing-workflow
3
+ description: Memo 笔记处理工作流 (Flow Skill)。定义从捕获 fleeting notes 到组织归档的标准操作流程,确保想法有效管理。
4
+ type: flow
5
+ domain: memo
6
+ version: 1.0.0
7
+ ---
8
+
9
+ # Note Processing Workflow
10
+
11
+ Memo 笔记处理的标准化工作流,确保 "Capture → Process → Organize → Archive/Convert" 流程。
12
+
13
+ ## 工作流状态机
14
+
15
+ ```mermaid
16
+ stateDiagram-v2
17
+ [*] --> Capture: 想法闪现
18
+
19
+ Capture --> Process: 定期整理
20
+ Capture --> Capture: 继续记录
21
+
22
+ Process --> Organize: 分类完成
23
+ Process --> Archive: 无价值<br/>(直接归档)
24
+
25
+ Organize --> Convert: 可执行
26
+ Organize --> Organize: 需补充<br/>(完善信息)
27
+ Organize --> Archive: 纯参考<br/>(归档保存)
28
+
29
+ Convert --> [*]: 转为 Issue
30
+
31
+ Archive --> [*]: 归档完成
32
+ ```
33
+
34
+ ## 执行步骤
35
+
36
+ ### 1. Capture (捕获)
37
+
38
+ - **目标**: 快速记录 fleeting ideas,不中断当前工作
39
+ - **输入**: 想法、灵感、代码片段、链接
40
+ - **输出**: Memo 记录
41
+ - **检查点**:
42
+ - [ ] 使用 `monoco memo add "内容"`
43
+ - [ ] 保持简洁,无需详细描述
44
+ - [ ] 添加上下文(`-c file:line` 如适用)
45
+ - [ ] 不中断当前任务流
46
+
47
+ ### 2. Process (处理)
48
+
49
+ - **目标**: 定期回顾和分类 Memo
50
+ - **策略**: 定期整理(每日/每周)
51
+ - **检查点**:
52
+ - [ ] 运行 `monoco memo list` 查看所有 Memo
53
+ - [ ] 评估每个 Memo 的价值
54
+ - [ ] 分类:可执行 / 纯参考 / 无价值
55
+ - [ ] 补充缺失信息
56
+
57
+ ### 3. Organize (组织)
58
+
59
+ - **目标**: 对有价值的 Memo 进行结构化整理
60
+ - **策略**: 根据类型选择处理方式
61
+ - **检查点**:
62
+ - [ ] 为相关 Memo 添加标签或分类
63
+ - [ ] 合并相似的 Memo
64
+ - [ ] 完善模糊的记录
65
+ - [ ] 设置优先级(如适用)
66
+
67
+ ### 4. Archive/Convert (归档或转化)
68
+
69
+ - **目标**: 处理完毕的 Memo 归档或转化为 Issue
70
+ - **检查点**:
71
+ - [ ] **Convert**: 可执行的想法转为 Issue
72
+ - 使用 `monoco issue create feature/chore/fix -t "标题"`
73
+ - 在 Issue 中引用原始 Memo
74
+ - [ ] **Archive**: 纯参考内容归档保存
75
+ - 移动到知识库或文档
76
+ - 从 Memo 列表中移除
77
+ - [ ] **Delete**: 无价值的 Memo 直接删除
78
+
79
+ ## 决策分支
80
+
81
+ | 条件 | 动作 |
82
+ |------|------|
83
+ | 想法可执行 | Convert,创建 Issue |
84
+ | 纯参考资料 | Archive,保存到知识库 |
85
+ | 无价值/过时 | Delete,直接删除 |
86
+ | 信息不完整 | 返回 Organize,补充信息 |
87
+
88
+ ## 合规要求
89
+
90
+ - **必须**: Memo 是临时的,不应无限堆积
91
+ - **必须**: 可执行的想法必须转为 Issue 追踪
92
+ - **建议**: 定期处理(建议每周)
93
+ - **建议**: 保持 Memo 简洁,避免长篇大论
94
+
95
+ ## 相关命令
96
+
97
+ ```bash
98
+ # 添加 Memo
99
+ monoco memo add "考虑使用 Redis 缓存用户会话"
100
+
101
+ # 带上下文的 Memo
102
+ monoco memo add "递归可能导致栈溢出" -c "src/utils.py:42"
103
+
104
+ # 查看所有 Memo
105
+ monoco memo list
106
+
107
+ # 编辑 Memo
108
+ monoco memo open
109
+
110
+ # 创建 Issue(转化 Memo)
111
+ monoco issue create feature -t "实现 Redis 缓存"
112
+ ```
113
+
114
+ ## 使用场景
115
+
116
+ | 场景 | 使用 Memo | 后续处理 |
117
+ |------|-----------|----------|
118
+ | 代码审查时的改进建议 | `memo add "重构建议: ..."` | Process → Convert to Issue |
119
+ | 会议中的临时想法 | `memo add "想法: ..."` | Process → Organize → Convert |
120
+ | 有用的代码片段 | `memo add "Snippet: ..."` | Process → Archive to 知识库 |
121
+ | 技术文章链接 | `memo add "Read: https://..."` | Process → Archive |
122
+ | Bug 线索 | `memo add "可能的 Bug: ..."` | Process → Convert to Fix Issue |
123
+
124
+ ## 与 Issue 的区别
125
+
126
+ | 维度 | Memo | Issue |
127
+ |------|------|-------|
128
+ | 目的 | 记录想法 | 追踪任务 |
129
+ | 生命周期 | 临时,需定期清理 | 正式,完整生命周期 |
130
+ | 完成标准 | 归档或转化 | 验收标准通过 |
131
+ | 复杂度 | 简单,一句话 | 详细,有 AC 和 Tasks |
132
+ | 追踪 | 无 | 完整追踪 |
133
+
134
+ ## 最佳实践
135
+
136
+ 1. **及时记录**: 想法闪现时立即记录,避免遗忘
137
+ 2. **定期整理**: 每周至少处理一次 Memo 列表
138
+ 3. **快速转化**: 有价值的想法尽快转为 Issue
139
+ 4. **果断删除**: 过时或无价值的 Memo 果断删除
140
+ 5. **保持简洁**: Memo 是速记,不需要详细描述
@@ -0,0 +1,8 @@
1
+ ### Memo (Fleeting Notes)
2
+
3
+ Lightweight note-taking for ideas and quick thoughts.
4
+
5
+ - **Add**: `monoco memo add "Content" [-c context]`
6
+ - **List**: `monoco memo list`
7
+ - **Open**: `monoco memo open` (Edit in default editor)
8
+ - **Guideline**: Use Memos for ideas; use Issues for actionable tasks.
@@ -0,0 +1,75 @@
1
+ ---
2
+ name: monoco-memo
3
+ description: 轻量级备忘录系统,用于快速记录想法、灵感和临时笔记。与正式的 Issue 系统区分开来。
4
+ ---
5
+
6
+ # Monoco Memo (备忘录)
7
+
8
+ 使用此技能快速捕捉 fleeting notes( fleeting 想法),无需创建正式的 Issue。
9
+
10
+ ## 何时使用 Memo vs Issue
11
+
12
+ | 场景 | 使用 | 原因 |
13
+ |------|------|------|
14
+ | 临时想法、灵感 | **Memo** | 不需要追踪、不需要完成状态 |
15
+ | 代码片段、链接收藏 | **Memo** | 快速记录,后续整理 |
16
+ | 会议速记 | **Memo** | 先记录,再提炼成任务 |
17
+ | 可执行的工作单元 | **Issue** | 需要追踪、验收标准、生命周期 |
18
+ | Bug 修复 | **Issue** | 需要记录复现步骤、验证结果 |
19
+ | 功能开发 | **Issue** | 需要设计、分解、交付 |
20
+
21
+ > **核心原则**: Memos 记录**想法**;Issues 处理**可执行任务**。
22
+
23
+ ## 命令
24
+
25
+ ### 添加备忘录
26
+
27
+ ```bash
28
+ monoco memo add "你的备忘录内容"
29
+ ```
30
+
31
+ 可选参数:
32
+ - `-c, --context`: 添加上下文引用(如 `file:line`)
33
+
34
+ 示例:
35
+ ```bash
36
+ # 简单记录
37
+ monoco memo add "考虑使用 Redis 缓存用户会话"
38
+
39
+ # 带上下文的记录
40
+ monoco memo add "这里的递归可能导致栈溢出" -c "src/utils.py:42"
41
+ ```
42
+
43
+ ### 查看备忘录列表
44
+
45
+ ```bash
46
+ monoco memo list
47
+ ```
48
+
49
+ 显示所有未归档的备忘录。
50
+
51
+ ### 打开备忘录文件
52
+
53
+ ```bash
54
+ monoco memo open
55
+ ```
56
+
57
+ 在默认编辑器中打开备忘录文件,用于整理或批量编辑。
58
+
59
+ ## 工作流程
60
+
61
+ ```
62
+ 想法闪现 → monoco memo add "..." → 定期整理 → 提炼成 Issue 或归档
63
+ ```
64
+
65
+ 1. **捕捉**: 有想法时立即使用 `monoco memo add` 记录
66
+ 2. **整理**: 定期(如每日/每周)运行 `monoco memo list` 回顾
67
+ 3. **转化**: 将有价值的备忘录转化为正式的 Issue
68
+ 4. **归档**: 处理完毕后从备忘录中移除
69
+
70
+ ## 最佳实践
71
+
72
+ 1. **保持简洁**: Memo 是速记,不需要详细描述
73
+ 2. **及时转化**: 有价值的想法应尽快转为 Issue,避免遗忘
74
+ 3. **定期清理**: Memos 是临时的,不要让它们无限堆积
75
+ 4. **使用上下文**: 记录代码相关想法时,使用 `-c` 参数标注位置
@@ -0,0 +1,121 @@
1
+ ---
2
+ name: research-workflow
3
+ description: Spike 研究工作流 (Flow Skill)。定义从添加外部仓库到知识提取和归档的标准操作流程,确保外部知识有效管理。
4
+ type: flow
5
+ domain: spike
6
+ version: 1.0.0
7
+ ---
8
+
9
+ # Research Workflow
10
+
11
+ Spike 研究的标准化工作流,确保 "Add → Sync → Analyze → Extract → Archive" 流程。
12
+
13
+ ## 工作流状态机
14
+
15
+ ```mermaid
16
+ stateDiagram-v2
17
+ [*] --> Add: 发现参考仓库
18
+
19
+ Add --> Sync: 添加配置
20
+ Add --> Add: URL 无效<br/>(重新输入)
21
+
22
+ Sync --> Analyze: 同步完成
23
+ Sync --> Sync: 同步失败<br/>(网络/权限)
24
+
25
+ Analyze --> Extract: 分析完成
26
+ Analyze --> Analyze: 内容不符<br/>(重新评估)
27
+
28
+ Extract --> Archive: 知识提取完成
29
+
30
+ Archive --> [*]: 归档完成
31
+ ```
32
+
33
+ ## 执行步骤
34
+
35
+ ### 1. Add (添加仓库)
36
+
37
+ - **目标**: 将外部仓库添加为参考
38
+ - **输入**: 仓库 URL、参考目的
39
+ - **输出**: 配置更新
40
+ - **检查点**:
41
+ - [ ] 验证仓库 URL 可访问
42
+ - [ ] 确认仓库与当前项目相关
43
+ - [ ] 运行 `monoco spike add <url>`
44
+ - [ ] 检查 `.monoco/config.yaml` 已更新
45
+
46
+ ### 2. Sync (同步)
47
+
48
+ - **目标**: 下载或更新参考仓库内容
49
+ - **检查点**:
50
+ - [ ] 运行 `monoco spike sync`
51
+ - [ ] 验证仓库克隆到 `.references/<name>/`
52
+ - [ ] 检查同步日志,确认无错误
53
+ - [ ] 验证文件权限正确(只读)
54
+
55
+ ### 3. Analyze (分析)
56
+
57
+ - **目标**: 研究参考仓库的结构和内容
58
+ - **策略**: 系统性浏览和标记
59
+ - **检查点**:
60
+ - [ ] 浏览仓库整体结构
61
+ - [ ] 识别与当前项目相关的模块
62
+ - [ ] 标记有价值的代码模式
63
+ - [ ] 记录架构设计亮点
64
+
65
+ ### 4. Extract (提取知识)
66
+
67
+ - **目标**: 从参考仓库提取可用知识
68
+ - **策略**: 文档化有价值的发现
69
+ - **检查点**:
70
+ - [ ] 提取关键代码片段(不修改原文件)
71
+ - [ ] 记录设计模式和最佳实践
72
+ - [ ] 创建学习笔记(使用 Memo 或 Issue)
73
+ - [ ] 标注知识来源(仓库 URL + Commit)
74
+
75
+ ### 5. Archive (归档)
76
+
77
+ - **目标**: 整理和归档研究成果
78
+ - **检查点**:
79
+ - [ ] 更新项目文档,引用参考仓库
80
+ - [ ] 创建知识索引(如需要)
81
+ - [ ] 运行 `monoco spike list` 验证状态
82
+ - [ ] 定期清理不再需要的参考
83
+
84
+ ## 决策分支
85
+
86
+ | 条件 | 动作 |
87
+ |------|------|
88
+ | URL 无效 | 返回 Add,检查 URL 格式 |
89
+ | 同步失败 | 检查网络、权限,重试或跳过 |
90
+ | 内容不相关 | 从配置中移除,重新选择 |
91
+ | 发现重要模式 | 创建 Issue,计划引入项目 |
92
+
93
+ ## 合规要求
94
+
95
+ - **禁止**: 编辑 `.references/` 中的任何文件
96
+ - **必须**: 所有外部知识必须标注来源
97
+ - **必须**: 定期同步以获取更新
98
+ - **建议**: 只添加高质量、相关的仓库
99
+
100
+ ## 相关命令
101
+
102
+ ```bash
103
+ # 添加参考仓库
104
+ monoco spike add <url>
105
+
106
+ # 同步所有仓库
107
+ monoco spike sync
108
+
109
+ # 列出已配置的仓库
110
+ monoco spike list
111
+
112
+ # 记录研究发现
113
+ monoco memo add "发现: {insight}" -c "spike:{repo_name}"
114
+ ```
115
+
116
+ ## 最佳实践
117
+
118
+ 1. **精选选择**: 只添加与项目高度相关的仓库
119
+ 2. **只读访问**: 将 `.references/` 视为外部知识库,永不修改
120
+ 3. **定期同步**: 每月运行 `monoco spike sync` 获取更新
121
+ 4. **知识转化**: 将学到的模式转化为项目的实际改进
monoco/main.py CHANGED
@@ -166,10 +166,9 @@ app.add_typer(config_cmd.app, name="config", help="Manage configuration")
166
166
  app.add_typer(project_cmd.app, name="project", help="Manage projects")
167
167
  app.add_typer(workspace_cmd.app, name="workspace", help="Manage workspace")
168
168
 
169
- from monoco.features.scheduler import cli as scheduler_cmd
169
+ from monoco.features.agent import cli as scheduler_cmd
170
170
 
171
- app.add_typer(scheduler_cmd.app, name="agent", help="Manage agent sessions")
172
- app.add_typer(scheduler_cmd.role_app, name="role", help="Manage agent roles")
171
+ app.add_typer(scheduler_cmd.app, name="agent", help="Manage agent sessions and roles")
173
172
 
174
173
  from monoco.features.memo import app as memo_app
175
174
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: monoco-toolkit
3
- Version: 0.3.6
3
+ Version: 0.3.9
4
4
  Summary: Agent Native Toolkit for Monoco - Task Management & Kanban for AI Agents
5
5
  Project-URL: Homepage, https://monoco.io
6
6
  Project-URL: Repository, https://github.com/IndenScale/Monoco
@@ -1,24 +1,31 @@
1
- monoco/main.py,sha256=IF8pN71fFL0AwxtnRxXQaoi9NgBf0YAhppWlc8SuiTM,5688
1
+ monoco/main.py,sha256=JVrKvrd2U6lOJBu9O6bSvgsUXCPU6_8AFV_vgjiB8Iw,5616
2
2
  monoco/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  monoco/cli/project.py,sha256=FqLaDD3hiWxa0_TKzxEF7PYH9RPsvmLyjO3NYVckgGs,2737
4
- monoco/cli/workspace.py,sha256=1TVVS835XyirLDvBGQXSblIaYVhe2Pk9EpORDvcktyk,1538
4
+ monoco/cli/workspace.py,sha256=vcUHjSarRZk8k3SNjtLSVD2VUPhBIUyx5J1OPtGa7-Q,1541
5
5
  monoco/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- monoco/core/config.py,sha256=M9F5De2FUgaIxFwqZBoJUXsMsph31rNh-4U-k_9rUHA,13543
6
+ monoco/core/config.py,sha256=ftO_hKCpBnGXerEVVl6I2KQxLjz-qcB6GQbuZK9VSv8,15282
7
7
  monoco/core/execution.py,sha256=7522s7uVWiNdMKtWlIb8JHzbAcJgLVuxUFp_6VmhWNQ,1801
8
8
  monoco/core/feature.py,sha256=bcK0C1CaQgNLcdMF0RuniaaQRCYSA-0JdOpQz9W_1xM,1968
9
9
  monoco/core/git.py,sha256=d3A8L30nlEj0F1pwSHk_cOoRYi1dMCiZc7KD70ViMyw,8335
10
- monoco/core/hooks.py,sha256=QY4c74LIYDtcjtWYax1PrK5CtVNKYTfVVVBOj-SCulo,1826
10
+ monoco/core/githooks.py,sha256=QY4c74LIYDtcjtWYax1PrK5CtVNKYTfVVVBOj-SCulo,1826
11
11
  monoco/core/injection.py,sha256=zs9RpXaBfwP-fbwOU_X2nm-AH94tQN9tVWXNtV4tCYM,6887
12
- monoco/core/integrations.py,sha256=ifSz7I87DXHF-eHLyXRN3pY1-Kh8IjvMyIrG9iogGpw,7744
12
+ monoco/core/integrations.py,sha256=3RAx4OYgbKHWXR9AAFgXuk-Z_HlztK6kNDFWBJ6tlaA,7914
13
13
  monoco/core/lsp.py,sha256=GOrHzubkMWS3iBpP4H2fTFW-0JXa6D2YlU0ZEhp5zmY,2018
14
14
  monoco/core/output.py,sha256=ZlUydZ65FIP5a32_eESIIvMrhcSwghIqZ3N23OSx6Ss,3878
15
- monoco/core/registry.py,sha256=1m9wvkcqWqrTcARt-jUGHH1BEYMvp0NJGRkq-uduJeg,1167
16
- monoco/core/setup.py,sha256=YUIhzqZwjEeH7zGZm9SPA-OhgTISJtA6ByNFCGBznUU,11487
17
- monoco/core/skills.py,sha256=KeVN09KIcRiksjJ91AggJbN_EvjRQfMGqd_hUQfUjes,16168
15
+ monoco/core/registry.py,sha256=WF02zg_3StPTYupi5FxEndZyq-6rcKxajZOv1Ob4D1Y,1264
16
+ monoco/core/setup.py,sha256=CYADZjUF1tNu6OQ5oVZ_3X_HN7TxnyrvOWbQwluIA_E,11490
17
+ monoco/core/skills.py,sha256=OvvKViDw2GiuYHEANSNX_ry6VIdDvd4QPmExDUQv9iU,22546
18
18
  monoco/core/state.py,sha256=dfoTH1Sj_TSjtTEXuv4w0ZOp_Fd30XNymVSZo30Xshg,1820
19
19
  monoco/core/sync.py,sha256=1p37pTfGBanogzcLhdTfMTxDqq79B5iiwiPS4fiuQaA,8378
20
20
  monoco/core/telemetry.py,sha256=GQDbtgrZwAL1ZpjgbJZuawbTyH6J0NjMXMi4ogq-Ang,2915
21
21
  monoco/core/workspace.py,sha256=H_PHD5A0HZFq841u1JtLoFjkXdQg9D6x6I7QcFtJge4,3000
22
+ monoco/core/hooks/__init__.py,sha256=8dWjDSwJG9JdghWBxgk7zH1U1FlJCiRo66mfbWcDK3M,437
23
+ monoco/core/hooks/base.py,sha256=GQ59E_VX8RmtWezyg5sMFqmKRDsD7PJflcAb2TTy8S8,3276
24
+ monoco/core/hooks/context.py,sha256=A0xwwU6JcsBH3t4h9jlodAdEMuajU8QeW_3bSMTWfPY,4005
25
+ monoco/core/hooks/registry.py,sha256=O_IO1c7R9NbHk3F-xtLowQQkzPBs6qM1Xii398ZfbNU,7100
26
+ monoco/core/hooks/builtin/__init__.py,sha256=R_e04bOLnBKy7pX5QVBkDjgUNeQ82o1IHq--CKgIX_I,177
27
+ monoco/core/hooks/builtin/git_cleanup.py,sha256=PTrc9Ud1P4MCY-zpptBWqlv7e618uPuaODIFgJi4eIw,9700
28
+ monoco/core/hooks/builtin/logging_hook.py,sha256=F5iN3zeczEeoumK0nUXf6ZVrO4_5gcA9dne8y4KSiXo,2796
22
29
  monoco/core/resources/en/AGENTS.md,sha256=vf9z43UU-LPwYKPWCrtw8TpWrmkeZ6zfMyHP4Q9JqdQ,1178
23
30
  monoco/core/resources/en/SKILL.md,sha256=wBXNpPqATOxO8TGiOM8S091gMNZ8du_WhQubO6TfNyg,3504
24
31
  monoco/core/resources/zh/AGENTS.md,sha256=KBNZSCPBIals6jDdvG5wJgjZuswi_1nKljggJSMtfy8,1156
@@ -31,6 +38,20 @@ monoco/daemon/reproduce_stats.py,sha256=LghJ8o1jTeDpA1zVPI2vF0okGU3h4esEI1thNa6s
31
38
  monoco/daemon/services.py,sha256=jkkDwX5mBRiy4DZPNxWmHNe_EE-hiX53FoIlWGiCBoM,5070
32
39
  monoco/daemon/stats.py,sha256=XTtuFWx68O1OA44SmN0BGVa6sswts2ExmkiavUzCYiA,4800
33
40
  monoco/features/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
+ monoco/features/agent/__init__.py,sha256=DccKv_HfN51eHO5d03Irzy2lNlnxmohoE8BEEvceX1o,559
42
+ monoco/features/agent/cli.py,sha256=L4dyjz8q6dZcQCPLF0e-AmshTRCUU3VhWmN6E3jk7rU,10339
43
+ monoco/features/agent/config.py,sha256=fPClrGeBriQm4oD5HCpg0ePQ3eBIOOLkAaORPi_fS8U,2685
44
+ monoco/features/agent/defaults.py,sha256=sxUm3AHLCi_x0iq7pzWpctSPNA12cX6P4s7LcCBmOUQ,2519
45
+ monoco/features/agent/engines.py,sha256=ICKw4Kfme6UNl_JLJvT7hADKHo76Yr8wpFFEvtEV6z4,3799
46
+ monoco/features/agent/flow_skills.py,sha256=9YQZvhebS_J2oERsGMfWd6WjDKkAWGzlJ0guIrYgsMw,9079
47
+ monoco/features/agent/manager.py,sha256=0pm0t95uYTOqcMhQmwHhAM3GlHWsUYMa5sMMxnWDcyE,3009
48
+ monoco/features/agent/models.py,sha256=og2ptQvM2gNqattaPMyhaGKaO30wd9h6V3kB6X3xpgA,848
49
+ monoco/features/agent/reliability.py,sha256=zXC-WKYCo46a5w_i1RAsAb1rbcOEPuj7Cqpv4c9pDks,3846
50
+ monoco/features/agent/session.py,sha256=ILW0JGY6Nsi_-PqS25z63LqhuczEyZyleAbXfqEtZRo,4388
51
+ monoco/features/agent/worker.py,sha256=63Lllm01pNZncZRDEr2bYh8u8qEb3iNKP1oxIVhoEOI,4538
52
+ monoco/features/agent/resources/skills/flow_engineer/SKILL.md,sha256=wPIh9Tl6jCau2yKUeMZ4ZcvuVZ3XfToooNH7GyHtkUk,2643
53
+ monoco/features/agent/resources/skills/flow_manager/SKILL.md,sha256=GGx1OkhbaN6YIwxXERo_J91-SqIrSAtp96w-cdEm1sI,2582
54
+ monoco/features/agent/resources/skills/flow_reviewer/SKILL.md,sha256=waV-sXpPyO3ZKWvfsuQP8AA9ClzMtac-NZEVggQcuXc,2746
34
55
  monoco/features/config/commands.py,sha256=i6_fKhSGLeO8RCbWrYKxelFgaHWcPiQERS2uxUdq7H0,4894
35
56
  monoco/features/i18n/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
57
  monoco/features/i18n/adapter.py,sha256=-ifDKQ7UH8tDoOdB_fSKoIrNRJROIPNuzZor2FPJVfo,932
@@ -38,60 +59,57 @@ monoco/features/i18n/commands.py,sha256=NJ2lZRRjiTW-3UbqxhEKURdWSDxQPkfnBAUgnwoV
38
59
  monoco/features/i18n/core.py,sha256=bnEV9D7KgxbC5I3l-1RN1-H8hek1loDL6KFXzmdq0pQ,9658
39
60
  monoco/features/i18n/resources/en/AGENTS.md,sha256=zzuF7BW6x8Mj6LZZmeM6wTbG5CSCDMShf4rwtN7XITg,197
40
61
  monoco/features/i18n/resources/en/SKILL.md,sha256=Z8fAAqeMvpLDw1D_9AzZIykS5-HLVM9nnlRZLWBTPqM,2203
62
+ monoco/features/i18n/resources/skills/i18n_scan_workflow/SKILL.md,sha256=d7mS9i_xOHCaD-qugqnIoVer1Ei5h4VgE4NQGSGtJEE,2748
41
63
  monoco/features/i18n/resources/zh/AGENTS.md,sha256=lKkwLLCADRH7UDq9no4eQY2sRfJrb64JoZ_HNved8vA,175
42
64
  monoco/features/i18n/resources/zh/SKILL.md,sha256=Wynk7zVBW7CO0_6AEQNUvlD_3eMW_7EPnzEn9QUaiDs,1884
43
65
  monoco/features/issue/adapter.py,sha256=4dzKg4-0XH63uORoh8qcolvKxJR6McBDIYxYEcZJJkA,1204
44
- monoco/features/issue/commands.py,sha256=vaScb2J4qjUvO8DSlKhTrGDSfIyJ4zIUr14jhBlG6tE,37581
45
- monoco/features/issue/core.py,sha256=9b5BVJJz5Ek3QNKqOhn6GSgvkmpAN45zmb8CQJVsPjc,51452
66
+ monoco/features/issue/commands.py,sha256=2iyjzRdtRiWcc6GeZHa-tDZHOHcsJqJhYnQKZ8tv54o,50578
67
+ monoco/features/issue/core.py,sha256=4RY4AKhc2vpP94JHk9WtnaVFdQt1E_spUmqviK_JnLQ,55522
68
+ monoco/features/issue/criticality.py,sha256=Bw0xH0vpx8z59bL-WQjfy4a5zmjXNM0f-aWBzQ5JZCA,18931
46
69
  monoco/features/issue/domain_commands.py,sha256=eatSF_uZp4nGpVr2PIgb00MWfEBm0OnyAd4JvUJEAAA,1535
47
70
  monoco/features/issue/domain_service.py,sha256=bEs_WXOWmotgIR-lGwyWekF4nonvjsgrK1YG3pyVfwk,2564
48
- monoco/features/issue/linter.py,sha256=LLtJEVIzoGTNm1liZARJHM3-V-EODkGRuw3ExCZtEjY,26115
71
+ monoco/features/issue/git_service.py,sha256=57FSWiY9qHzOWw_e-IOKinOsiqVJz-ycE1zRtRWuBw8,5956
72
+ monoco/features/issue/linter.py,sha256=EUVsnucLIo32adu2TNP6vFwlUvWrwj18cNN9viRr-7U,38697
49
73
  monoco/features/issue/migration.py,sha256=i0xlxZjrpmuHGHOAIN4iu31EwwVIvZn7yjveS-kU22c,4896
50
- monoco/features/issue/models.py,sha256=pIgun9dDTelDJa6RqhLJb2OR201cimOoNEB78qUsvG0,7286
74
+ monoco/features/issue/models.py,sha256=xkM4Bnot2iv8NnWNdfFopIlyWtR1bZK52IseUk_BsEo,8976
51
75
  monoco/features/issue/monitor.py,sha256=vZN0TbR3V5fHKHRGkIhimO6UwWcwYjDHQs2qzjEG174,3549
52
76
  monoco/features/issue/resolver.py,sha256=mAU9s7TNNHY9A2278JTwJvxU-jalGKTDJfJdjONev3E,5655
53
77
  monoco/features/issue/test_priority_integration.py,sha256=pTBg3Wjv6lLYxWL6vjbo2NGVE-X0MRB3Ha8bqObZrU4,2791
54
78
  monoco/features/issue/test_resolver.py,sha256=luFhK37DUvh4a3TTcFYVO-oOIJljQVCSYicwSWyDleQ,2530
55
- monoco/features/issue/validator.py,sha256=GYqbx2-ZxXfk1HicgBXkpL__v83KK-jcOyo7eW-VRUs,27793
79
+ monoco/features/issue/validator.py,sha256=TgXg9MolCI8kPzjaqGVfXMIekaubOc_vTybfakGjteE,33127
56
80
  monoco/features/issue/domain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
81
  monoco/features/issue/domain/lifecycle.py,sha256=oIuLYTVy1RRHGngAzbNU4kTWOHMBhjuw_TuYCwNqMJw,4991
58
- monoco/features/issue/domain/models.py,sha256=2vuSAGaFrbAEkQapwkGG_T8cHlsmARN71fTA44PIVSM,5850
82
+ monoco/features/issue/domain/models.py,sha256=s4gezUIlSlKxwJ3Byfxtsemj2-qsu4wRiXTNfaesSYQ,6830
59
83
  monoco/features/issue/domain/parser.py,sha256=axfB9BjY-m4DQqYwTQBm_38plOidZaDqFtsIejW_kYI,9095
60
84
  monoco/features/issue/domain/workspace.py,sha256=nyTEFNmpLPuX7nssMCBiFI1XBhY9zbqG877Ppp_s0Fg,3658
61
85
  monoco/features/issue/engine/__init__.py,sha256=-SBvzjlZJz0O-IB1c95d9pbhr3lydJNLq2vhnfkZ8PQ,747
62
86
  monoco/features/issue/engine/config.py,sha256=7enjPW4J_fpuK08ov6LpfQ-9h2T1D4Hc5yIXOPuQvLs,5761
63
- monoco/features/issue/engine/machine.py,sha256=BTYjp8NQAzu8JVP95bQdkOLrJjFsRNR7uC8tjsUTqCk,6393
87
+ monoco/features/issue/engine/machine.py,sha256=iFZMZyD0rDAg3AMd9JtXZ0CuuQ6dPuv9wXLgvtudlTQ,8668
64
88
  monoco/features/issue/engine/models.py,sha256=595Sx3ncrpg_PhnbBLthohAvuhnjA-_9oXcrsT6Lv0k,574
65
89
  monoco/features/issue/lsp/__init__.py,sha256=8bl8-WzSj3C4SkPKgVGnCeyemmvHVWBsuMZsJuJggG8,77
66
90
  monoco/features/issue/lsp/definition.py,sha256=cF6Quw1OztuKMJ1zLvgA_ek7lTAdzHF0m4LVznpbAPw,3203
67
91
  monoco/features/issue/resources/en/AGENTS.md,sha256=eHHXjLRDAV7IKrYPQSilxu0X5D0SBCAFBXmlSoc9r48,1278
68
- monoco/features/issue/resources/en/SKILL.md,sha256=M5khTJdraQenX0tf7RHOVcqyKHC285qwDzWdsCJ7XPI,4032
92
+ monoco/features/issue/resources/en/SKILL.md,sha256=_soSTGcoHjwdv5N-X31uVsmdmvS4CUSfTqWNOHTZt_0,5556
93
+ monoco/features/issue/resources/skills/issue_lifecycle_workflow/SKILL.md,sha256=efaneBOYrEGlsk4egyf_KupLGf_meRDmIFLx3b9VYYk,4476
69
94
  monoco/features/issue/resources/zh/AGENTS.md,sha256=oRHHqeDYx6aEc5FfdL7a-zqT7uh4SYIYt8QBRKEKrYM,1351
70
- monoco/features/issue/resources/zh/SKILL.md,sha256=XFE33cCCos0U1IVNkMhU7fGuqVqfxo_FNKdp1aScaoM,5055
71
- monoco/features/memo/__init__.py,sha256=ledMrs-h5k_4wssXWv4MBYTDi-HHo3Fv8QAMpqlQI_M,40
72
- monoco/features/memo/cli.py,sha256=nw5Kg7Qu33ucwrBaJS5CIkPRA_6TlJQQz2TvDWL2Nqc,2685
73
- monoco/features/memo/core.py,sha256=HUQLohVZ6KCU2chi18tEQYtohzl1-bOR5F12W40QkIc,2226
74
- monoco/features/scheduler/__init__.py,sha256=hvE9A14qFTeTYbWlK9iMRdXIFLMBuG8724GEZzFTHB8,483
75
- monoco/features/scheduler/cli.py,sha256=NgsGwCf615YA4VGd-mqMpGp5VCjdMUqoZqiHZFnDdLU,8325
76
- monoco/features/scheduler/config.py,sha256=69PTvKGHJ33fA2yhFJAq0WVq70Zbmdd5X8Wl0vIYAak,2336
77
- monoco/features/scheduler/defaults.py,sha256=4Ne3RpF7gZ46BmHtF0hC8wYkuCIkDSuKB7hGnHhGXms,2208
78
- monoco/features/scheduler/engines.py,sha256=ICKw4Kfme6UNl_JLJvT7hADKHo76Yr8wpFFEvtEV6z4,3799
79
- monoco/features/scheduler/manager.py,sha256=PmNKqfktgrdpUwE-jPE_WX3IvzZat0JKdEcmzse08-0,1680
80
- monoco/features/scheduler/models.py,sha256=rb8rx8t_TD5ilUC6xU3jvK0sud7YUZE_iEdes9Np8R0,877
81
- monoco/features/scheduler/reliability.py,sha256=zVwtnksug5wr0_tigC2Qjl_C8VNyrheN_34ItUceGoo,3846
82
- monoco/features/scheduler/session.py,sha256=5xga191nWXqJOLgl3MTTJ3zDrVZcj8SxZcxYM6-CtLU,2969
83
- monoco/features/scheduler/worker.py,sha256=4OU2Y7nG5EKadNIKDF5GWl5V7vgVl3OPlYHShfiEeBI,4538
84
- monoco/features/skills/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
85
- monoco/features/skills/core.py,sha256=BXVvMot8E457-pj9U19lPHypBVhdLQRsx0zEAXJxpGY,3436
95
+ monoco/features/issue/resources/zh/SKILL.md,sha256=Gx6nuGciNh63QiyZ8kXU8PhaNidM2oiKYAr5GulEmes,6866
96
+ monoco/features/memo/__init__.py,sha256=LC5vwsJw-kwzd5O5oeRo-FNSbnZnuFynanec-hA72nw,88
97
+ monoco/features/memo/adapter.py,sha256=XBOGkP66AMD6Pelz-heH_EhxkYoMRLaH8qsYnX9NSLk,1117
98
+ monoco/features/memo/cli.py,sha256=rw2nEJ3P0eJvjuv4WLOwV6aNM8Dt2J_2R2py_FgHlDg,3329
99
+ monoco/features/memo/core.py,sha256=wq4bf2uS3axoZ5Xsm-YhJZGL8bu1EjcrQuwXgQbPqOk,4193
100
+ monoco/features/memo/resources/skills/note_processing_workflow/SKILL.md,sha256=JE3LEhQYRuvU_GAQ_C6Oob4t-BEY7OWxGpBM6mkgato,4286
101
+ monoco/features/memo/resources/zh/AGENTS.md,sha256=AFlzvhGxAk77np-E8XLb-tkWJCo0bLGItCrV0IiXdHQ,292
102
+ monoco/features/memo/resources/zh/SKILL.md,sha256=9J_tAM-HuMEgOtZ7sVMp-Qjg2heVJvS2ovLro4Msh1M,2143
86
103
  monoco/features/spike/adapter.py,sha256=ZIpw-xNVoA2IIP18dbR-dmQGbQmK5ua_P-uGXuDjCeI,1021
87
104
  monoco/features/spike/commands.py,sha256=EuJ7trDaobIe7ae7pJ-ftpo_cO8-19R_fAZZCh2JcMg,3871
88
105
  monoco/features/spike/core.py,sha256=OuNWXQ-cBttP2oIF0B5iy0aEUH2MUMyGANG8ayEmjPo,4120
89
106
  monoco/features/spike/resources/en/AGENTS.md,sha256=NG3CMnlDk_0J8hnRUcueAM9lgIQr_dZ42R_31-LC48E,306
90
107
  monoco/features/spike/resources/en/SKILL.md,sha256=qKDcVh0D3pDRvfNLh1Bzo4oQU3obpl4tqdlzxeiWYMk,1911
108
+ monoco/features/spike/resources/skills/research_workflow/SKILL.md,sha256=tv9dIEfRNKrfxa3dI657QZDkMO-4-X_ZZRm6V3WS3VM,3333
91
109
  monoco/features/spike/resources/zh/AGENTS.md,sha256=5RHNl7fc3RdYYTFH483ojJl_arGPKkyYziOuGgFbqqg,290
92
110
  monoco/features/spike/resources/zh/SKILL.md,sha256=Q82e9lCQOAYIwBs5rGnvlVUDq7bp0pz8yvO10KTWFYQ,1710
93
- monoco_toolkit-0.3.6.dist-info/METADATA,sha256=UZH_Na2LgWBEQ8KWU084wgO8l9AK_HlTRc2YD58DT8o,4732
94
- monoco_toolkit-0.3.6.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
95
- monoco_toolkit-0.3.6.dist-info/entry_points.txt,sha256=iYj7FWYBdtClU15-Du1skqD0s6SFSIhJvxJ29VWp8ng,43
96
- monoco_toolkit-0.3.6.dist-info/licenses/LICENSE,sha256=ACAGGjV6aod4eIlVUTx1q9PZbnZGN5bBwkSs9RHj83s,1071
97
- monoco_toolkit-0.3.6.dist-info/RECORD,,
111
+ monoco_toolkit-0.3.9.dist-info/METADATA,sha256=OgCaiDGMobCNpQTm5lksMX4VxxZmBmuuQUht5LBY4sc,4732
112
+ monoco_toolkit-0.3.9.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
113
+ monoco_toolkit-0.3.9.dist-info/entry_points.txt,sha256=iYj7FWYBdtClU15-Du1skqD0s6SFSIhJvxJ29VWp8ng,43
114
+ monoco_toolkit-0.3.9.dist-info/licenses/LICENSE,sha256=ACAGGjV6aod4eIlVUTx1q9PZbnZGN5bBwkSs9RHj83s,1071
115
+ monoco_toolkit-0.3.9.dist-info/RECORD,,
@@ -1,54 +0,0 @@
1
- from .models import RoleTemplate
2
-
3
- DEFAULT_ROLES = [
4
- RoleTemplate(
5
- name="crafter",
6
- description="Responsible for initial design, research, and drafting issues from descriptions.",
7
- trigger="task.received",
8
- goal="Produce a structured Issue file and/or detailed design document.",
9
- tools=[
10
- "create_issue_file",
11
- "read_file",
12
- "search_web",
13
- "view_file_outline",
14
- "write_to_file",
15
- ],
16
- system_prompt=(
17
- "You are a Crafter agent. Your goal is to turn vague ideas into structured engineering plans.\n"
18
- "If the user provides a description, use 'monoco issue create' and 'monoco issue update' to build the task.\n"
19
- "If the user provides an existing Issue, analyze the context and provide a detailed design or implementation plan."
20
- ),
21
- engine="gemini",
22
- ),
23
- RoleTemplate(
24
- name="builder",
25
- description="Responsible for implementation.",
26
- trigger="design.approved",
27
- goal="Implement code and tests",
28
- tools=["read_file", "write_to_file", "run_command", "git"],
29
- system_prompt="You are a Builder agent. Your job is to implement the code based on the design.",
30
- engine="gemini",
31
- ),
32
- RoleTemplate(
33
- name="auditor",
34
- description="Responsible for code review.",
35
- trigger="implementation.submitted",
36
- goal="Review code and provide feedback",
37
- tools=[
38
- "read_file",
39
- "read_terminal",
40
- "run_command",
41
- ], # Assumed read_diff and lint are via run_command
42
- system_prompt="You are an Auditor agent. Your job is to review the code for quality and correctness.",
43
- engine="gemini",
44
- ),
45
- RoleTemplate(
46
- name="coroner",
47
- description="Responsible for analyzing failure root causes (Autopsy).",
48
- trigger="session.crashed",
49
- goal="Produce a post-mortem report",
50
- tools=["read_file", "read_terminal", "git_log"],
51
- system_prompt="You are a Coroner agent. Your job is to analyze why the previous session failed and write a post-mortem report.",
52
- engine="gemini",
53
- ),
54
- ]
File without changes