monoco-toolkit 0.3.11__py3-none-any.whl → 0.4.0__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 (132) hide show
  1. monoco/core/automation/__init__.py +40 -0
  2. monoco/core/automation/field_watcher.py +296 -0
  3. monoco/core/automation/handlers.py +805 -0
  4. monoco/core/config.py +29 -11
  5. monoco/core/daemon/__init__.py +5 -0
  6. monoco/core/daemon/pid.py +290 -0
  7. monoco/core/git.py +15 -0
  8. monoco/core/hooks/context.py +74 -13
  9. monoco/core/injection.py +86 -8
  10. monoco/core/integrations.py +0 -24
  11. monoco/core/router/__init__.py +17 -0
  12. monoco/core/router/action.py +202 -0
  13. monoco/core/scheduler/__init__.py +63 -0
  14. monoco/core/scheduler/base.py +152 -0
  15. monoco/core/scheduler/engines.py +175 -0
  16. monoco/core/scheduler/events.py +197 -0
  17. monoco/core/scheduler/local.py +377 -0
  18. monoco/core/setup.py +9 -0
  19. monoco/core/sync.py +199 -4
  20. monoco/core/watcher/__init__.py +63 -0
  21. monoco/core/watcher/base.py +382 -0
  22. monoco/core/watcher/dropzone.py +152 -0
  23. monoco/core/watcher/im.py +460 -0
  24. monoco/core/watcher/issue.py +303 -0
  25. monoco/core/watcher/memo.py +192 -0
  26. monoco/core/watcher/task.py +238 -0
  27. monoco/daemon/app.py +3 -60
  28. monoco/daemon/commands.py +459 -25
  29. monoco/daemon/events.py +34 -0
  30. monoco/daemon/scheduler.py +157 -201
  31. monoco/daemon/services.py +42 -243
  32. monoco/features/agent/__init__.py +25 -7
  33. monoco/features/agent/cli.py +91 -57
  34. monoco/features/agent/engines.py +31 -170
  35. monoco/features/agent/resources/en/AGENTS.md +14 -14
  36. monoco/features/agent/resources/en/skills/monoco_role_engineer/SKILL.md +101 -0
  37. monoco/features/agent/resources/en/skills/monoco_role_manager/SKILL.md +95 -0
  38. monoco/features/agent/resources/en/skills/monoco_role_planner/SKILL.md +177 -0
  39. monoco/features/agent/resources/en/skills/monoco_role_reviewer/SKILL.md +139 -0
  40. monoco/features/agent/resources/zh/skills/monoco_role_engineer/SKILL.md +101 -0
  41. monoco/features/agent/resources/zh/skills/monoco_role_manager/SKILL.md +95 -0
  42. monoco/features/agent/resources/zh/skills/monoco_role_planner/SKILL.md +177 -0
  43. monoco/features/agent/resources/zh/skills/monoco_role_reviewer/SKILL.md +139 -0
  44. monoco/features/agent/worker.py +1 -1
  45. monoco/features/hooks/__init__.py +61 -6
  46. monoco/features/hooks/commands.py +281 -271
  47. monoco/features/hooks/dispatchers/__init__.py +23 -0
  48. monoco/features/hooks/dispatchers/agent_dispatcher.py +486 -0
  49. monoco/features/hooks/dispatchers/git_dispatcher.py +478 -0
  50. monoco/features/hooks/manager.py +357 -0
  51. monoco/features/hooks/models.py +262 -0
  52. monoco/features/hooks/parser.py +322 -0
  53. monoco/features/hooks/universal_interceptor.py +503 -0
  54. monoco/features/im/__init__.py +67 -0
  55. monoco/features/im/core.py +782 -0
  56. monoco/features/im/models.py +311 -0
  57. monoco/features/issue/commands.py +133 -60
  58. monoco/features/issue/core.py +385 -40
  59. monoco/features/issue/domain_commands.py +0 -19
  60. monoco/features/issue/resources/en/AGENTS.md +17 -122
  61. monoco/features/issue/resources/hooks/agent/before-tool.sh +102 -0
  62. monoco/features/issue/resources/hooks/agent/session-start.sh +88 -0
  63. monoco/features/issue/resources/hooks/{post-checkout.sh → git/git-post-checkout.sh} +10 -9
  64. monoco/features/issue/resources/hooks/git/git-pre-commit.sh +31 -0
  65. monoco/features/issue/resources/hooks/{pre-push.sh → git/git-pre-push.sh} +7 -13
  66. monoco/features/issue/resources/zh/AGENTS.md +18 -123
  67. monoco/features/memo/cli.py +15 -64
  68. monoco/features/memo/core.py +6 -34
  69. monoco/features/memo/models.py +24 -15
  70. monoco/features/memo/resources/en/AGENTS.md +31 -0
  71. monoco/features/memo/resources/zh/AGENTS.md +28 -5
  72. monoco/features/spike/commands.py +5 -3
  73. monoco/main.py +5 -3
  74. {monoco_toolkit-0.3.11.dist-info → monoco_toolkit-0.4.0.dist-info}/METADATA +1 -1
  75. monoco_toolkit-0.4.0.dist-info/RECORD +170 -0
  76. monoco/core/execution.py +0 -67
  77. monoco/features/agent/apoptosis.py +0 -44
  78. monoco/features/agent/manager.py +0 -127
  79. monoco/features/agent/resources/atoms/atom-code-dev.yaml +0 -61
  80. monoco/features/agent/resources/atoms/atom-issue-lifecycle.yaml +0 -73
  81. monoco/features/agent/resources/atoms/atom-knowledge.yaml +0 -55
  82. monoco/features/agent/resources/atoms/atom-review.yaml +0 -60
  83. monoco/features/agent/resources/en/skills/monoco_atom_core/SKILL.md +0 -99
  84. monoco/features/agent/resources/en/skills/monoco_workflow_agent_engineer/SKILL.md +0 -94
  85. monoco/features/agent/resources/en/skills/monoco_workflow_agent_manager/SKILL.md +0 -93
  86. monoco/features/agent/resources/en/skills/monoco_workflow_agent_planner/SKILL.md +0 -85
  87. monoco/features/agent/resources/en/skills/monoco_workflow_agent_reviewer/SKILL.md +0 -114
  88. monoco/features/agent/resources/workflows/workflow-dev.yaml +0 -83
  89. monoco/features/agent/resources/workflows/workflow-issue-create.yaml +0 -72
  90. monoco/features/agent/resources/workflows/workflow-review.yaml +0 -94
  91. monoco/features/agent/resources/zh/roles/monoco_role_engineer.yaml +0 -49
  92. monoco/features/agent/resources/zh/roles/monoco_role_manager.yaml +0 -46
  93. monoco/features/agent/resources/zh/roles/monoco_role_planner.yaml +0 -46
  94. monoco/features/agent/resources/zh/roles/monoco_role_reviewer.yaml +0 -47
  95. monoco/features/agent/resources/zh/skills/monoco_atom_core/SKILL.md +0 -99
  96. monoco/features/agent/resources/zh/skills/monoco_workflow_agent_engineer/SKILL.md +0 -94
  97. monoco/features/agent/resources/zh/skills/monoco_workflow_agent_manager/SKILL.md +0 -88
  98. monoco/features/agent/resources/zh/skills/monoco_workflow_agent_planner/SKILL.md +0 -259
  99. monoco/features/agent/resources/zh/skills/monoco_workflow_agent_reviewer/SKILL.md +0 -137
  100. monoco/features/agent/session.py +0 -169
  101. monoco/features/artifact/resources/zh/skills/monoco_atom_artifact/SKILL.md +0 -278
  102. monoco/features/glossary/resources/en/skills/monoco_atom_glossary/SKILL.md +0 -35
  103. monoco/features/glossary/resources/zh/skills/monoco_atom_glossary/SKILL.md +0 -35
  104. monoco/features/hooks/adapter.py +0 -67
  105. monoco/features/hooks/core.py +0 -441
  106. monoco/features/i18n/resources/en/skills/monoco_atom_i18n/SKILL.md +0 -96
  107. monoco/features/i18n/resources/en/skills/monoco_workflow_i18n_scan/SKILL.md +0 -105
  108. monoco/features/i18n/resources/zh/skills/monoco_atom_i18n/SKILL.md +0 -96
  109. monoco/features/i18n/resources/zh/skills/monoco_workflow_i18n_scan/SKILL.md +0 -105
  110. monoco/features/issue/resources/en/skills/monoco_atom_issue/SKILL.md +0 -165
  111. monoco/features/issue/resources/en/skills/monoco_workflow_issue_creation/SKILL.md +0 -167
  112. monoco/features/issue/resources/en/skills/monoco_workflow_issue_development/SKILL.md +0 -224
  113. monoco/features/issue/resources/en/skills/monoco_workflow_issue_management/SKILL.md +0 -159
  114. monoco/features/issue/resources/en/skills/monoco_workflow_issue_refinement/SKILL.md +0 -203
  115. monoco/features/issue/resources/hooks/pre-commit.sh +0 -41
  116. monoco/features/issue/resources/zh/skills/monoco_atom_issue_lifecycle/SKILL.md +0 -190
  117. monoco/features/issue/resources/zh/skills/monoco_workflow_issue_creation/SKILL.md +0 -167
  118. monoco/features/issue/resources/zh/skills/monoco_workflow_issue_development/SKILL.md +0 -224
  119. monoco/features/issue/resources/zh/skills/monoco_workflow_issue_management/SKILL.md +0 -159
  120. monoco/features/issue/resources/zh/skills/monoco_workflow_issue_refinement/SKILL.md +0 -203
  121. monoco/features/memo/resources/en/skills/monoco_atom_memo/SKILL.md +0 -77
  122. monoco/features/memo/resources/en/skills/monoco_workflow_note_processing/SKILL.md +0 -140
  123. monoco/features/memo/resources/zh/skills/monoco_atom_memo/SKILL.md +0 -77
  124. monoco/features/memo/resources/zh/skills/monoco_workflow_note_processing/SKILL.md +0 -140
  125. monoco/features/spike/resources/en/skills/monoco_atom_spike/SKILL.md +0 -76
  126. monoco/features/spike/resources/en/skills/monoco_workflow_research/SKILL.md +0 -121
  127. monoco/features/spike/resources/zh/skills/monoco_atom_spike/SKILL.md +0 -76
  128. monoco/features/spike/resources/zh/skills/monoco_workflow_research/SKILL.md +0 -121
  129. monoco_toolkit-0.3.11.dist-info/RECORD +0 -181
  130. {monoco_toolkit-0.3.11.dist-info → monoco_toolkit-0.4.0.dist-info}/WHEEL +0 -0
  131. {monoco_toolkit-0.3.11.dist-info → monoco_toolkit-0.4.0.dist-info}/entry_points.txt +0 -0
  132. {monoco_toolkit-0.3.11.dist-info → monoco_toolkit-0.4.0.dist-info}/licenses/LICENSE +0 -0
@@ -4,7 +4,7 @@ from typing import Optional
4
4
  from rich.console import Console
5
5
  from rich.table import Table
6
6
  from monoco.core.config import get_config
7
- from .core import add_memo, load_memos, delete_memo, update_memo, get_inbox_path, validate_content_language
7
+ from .core import add_memo, load_memos, delete_memo, get_inbox_path, validate_content_language
8
8
 
9
9
  app = typer.Typer(help="Manage memos (fleeting notes).")
10
10
  console = Console()
@@ -70,38 +70,33 @@ def add_command(
70
70
 
71
71
  @app.command("list")
72
72
  def list_command(
73
- status: Optional[str] = typer.Option(None, "--status", help="Filter by status (pending, tracked, resolved)."),
74
73
  limit: int = typer.Option(None, "--limit", "-n", help="Limit number of memos shown.")
75
74
  ):
76
75
  """
77
76
  List all memos in the inbox.
77
+
78
+ Signal Queue Model: Shows current pending signals.
79
+ Once consumed (file cleared), memos are no longer listed here.
80
+ Use git history to see consumed memos.
78
81
  """
79
82
  issues_root = get_issues_root()
80
83
 
81
84
  memos = load_memos(issues_root)
82
-
83
- if status:
84
- memos = [m for m in memos if m.status == status]
85
85
 
86
86
  if not memos:
87
- console.print("No memos found.")
87
+ console.print("No memos in inbox. (Consumed memos are in git history)")
88
88
  return
89
89
 
90
- # Reverse sort by timestamp (newest first) usually?
91
- # But file is appended. Let's show newest at bottom (log style) or newest at top?
92
- # Usually list shows content. Newest at bottom is standard for logs, but for "Inbox" maybe newest top?
93
- # Let's keep file order (oldest first) unless user asks otherwise, or maybe reverse it for "Inbox" feel?
94
- # Let's reverse it to see latest first.
90
+ # Reverse to show newest first
95
91
  memos.reverse()
96
92
 
97
93
  if limit:
98
94
  memos = memos[:limit]
99
95
 
100
- table = Table(title="Memo Inbox")
96
+ table = Table(title="Memo Inbox (Pending Signals)")
101
97
  table.add_column("ID", style="cyan", no_wrap=True)
102
- table.add_column("Stat", style="yellow", width=4)
103
98
  table.add_column("Type", style="magenta", width=8)
104
- table.add_column("Ref", style="blue")
99
+ table.add_column("Source", style="blue", width=10)
105
100
  table.add_column("Content")
106
101
 
107
102
  for memo in memos:
@@ -109,21 +104,17 @@ def list_command(
109
104
  content_preview = memo.content.split("\n")[0]
110
105
  if len(content_preview) > 50:
111
106
  content_preview = content_preview[:47] + "..."
112
-
113
- status_icon = " "
114
- if memo.status == "pending": status_icon = "P"
115
- elif memo.status == "tracked": status_icon = "T"
116
- elif memo.status == "resolved": status_icon = "✔"
117
107
 
118
108
  table.add_row(
119
109
  memo.uid,
120
- status_icon,
121
110
  memo.type,
122
- memo.ref or "",
111
+ memo.source,
123
112
  content_preview
124
113
  )
125
114
 
126
115
  console.print(table)
116
+ console.print(f"\n[yellow]Note:[/yellow] Memos are consumed (deleted) when processed by Architect.")
117
+ console.print("[dim]Use `git log --follow Memos/inbox.md` to see consumed memos.[/dim]")
127
118
 
128
119
 
129
120
  @app.command("open")
@@ -147,6 +138,9 @@ def delete_command(
147
138
  ):
148
139
  """
149
140
  Delete a memo from the inbox by its ID.
141
+
142
+ Signal Queue Model: This is a manual delete operation.
143
+ Normally memos are consumed automatically by the MemoThresholdHandler.
150
144
  """
151
145
  issues_root = get_issues_root()
152
146
 
@@ -157,49 +151,6 @@ def delete_command(
157
151
  raise typer.Exit(code=1)
158
152
 
159
153
 
160
- @app.command("link")
161
- def link_command(
162
- memo_id: str = typer.Argument(..., help="Memo ID"),
163
- issue_id: str = typer.Argument(..., help="Issue ID to link to")
164
- ):
165
- """
166
- Link a memo to an issue (Traceability).
167
- Sets status to 'tracked'.
168
- """
169
- issues_root = get_issues_root()
170
-
171
- updates = {
172
- "status": "tracked",
173
- "ref": issue_id
174
- }
175
-
176
- if update_memo(issues_root, memo_id, updates):
177
- console.print(f"[green]✔ Memo {memo_id} linked to {issue_id}.[/green]")
178
- else:
179
- console.print(f"[red]Error: Memo {memo_id} not found.[/red]")
180
- raise typer.Exit(code=1)
181
-
182
-
183
- @app.command("resolve")
184
- def resolve_command(
185
- memo_id: str = typer.Argument(..., help="Memo ID")
186
- ):
187
- """
188
- Mark a memo as resolved.
189
- """
190
- issues_root = get_issues_root()
191
-
192
- updates = {
193
- "status": "resolved"
194
- }
195
-
196
- if update_memo(issues_root, memo_id, updates):
197
- console.print(f"[green]✔ Memo {memo_id} resolved.[/green]")
198
- else:
199
- console.print(f"[red]Error: Memo {memo_id} not found.[/red]")
200
- raise typer.Exit(code=1)
201
-
202
-
203
154
 
204
155
 
205
156
 
@@ -39,6 +39,11 @@ def generate_memo_id() -> str:
39
39
  def parse_memo_block(block: str) -> Optional[Memo]:
40
40
  """
41
41
  Parse a text block into a Memo object.
42
+
43
+ Signal Queue Model (FEAT-0165):
44
+ - No status field parsing (file existence is the state)
45
+ - No ref field parsing (traceability via git history)
46
+
42
47
  Block format:
43
48
  ## [uid] YYYY-MM-DD HH:MM:SS
44
49
  - **Key**: Value
@@ -90,17 +95,6 @@ def parse_memo_block(block: str) -> Optional[Memo]:
90
95
  content_lines.append(line)
91
96
 
92
97
  content = "\n".join(content_lines).strip()
93
-
94
- # Map metadata to model fields
95
- # Status map reverse
96
- status_raw = metadata.get("status", "[ ] Pending")
97
- status = "pending"
98
- if "[x] Tracked" in status_raw:
99
- status = "tracked"
100
- elif "[x] Resolved" in status_raw:
101
- status = "resolved"
102
- elif "[-] Dismissed" in status_raw:
103
- status = "dismissed"
104
98
 
105
99
  return Memo(
106
100
  uid=uid,
@@ -109,9 +103,7 @@ def parse_memo_block(block: str) -> Optional[Memo]:
109
103
  author=metadata.get("from", "User"),
110
104
  source=metadata.get("source", "cli"),
111
105
  type=metadata.get("type", "insight"),
112
- status=status,
113
- ref=metadata.get("ref"),
114
- context=metadata.get("context") # Note: context might need cleanup if it was wrapped in code blocks
106
+ context=metadata.get("context")
115
107
  )
116
108
 
117
109
  def load_memos(issues_root: Path) -> List[Memo]:
@@ -195,26 +187,6 @@ def add_memo(
195
187
 
196
188
  return uid
197
189
 
198
- def update_memo(issues_root: Path, memo_id: str, updates: dict) -> bool:
199
- """
200
- Update a memo's fields.
201
- """
202
- memos = load_memos(issues_root)
203
- found = False
204
- for i, m in enumerate(memos):
205
- if m.uid == memo_id:
206
- # Apply updates
207
- updated_data = m.model_dump()
208
- updated_data.update(updates)
209
- memos[i] = Memo(**updated_data) # Re-validate
210
- found = True
211
- break
212
-
213
- if found:
214
- save_memos(issues_root, memos)
215
-
216
- return found
217
-
218
190
  def delete_memo(issues_root: Path, memo_id: str) -> bool:
219
191
  """
220
192
  Delete a memo by its ID.
@@ -2,7 +2,26 @@ from datetime import datetime
2
2
  from typing import Optional, Literal
3
3
  from pydantic import BaseModel, Field
4
4
 
5
+
5
6
  class Memo(BaseModel):
7
+ """
8
+ Memo (Fleeting Note) - Signal Queue Model.
9
+
10
+ In the Signal Queue paradigm (FEAT-0165):
11
+ - Memo is a signal, not an asset
12
+ - File existence = signal pending
13
+ - File deletion = signal consumed
14
+ - No status tracking - Git is the archive
15
+
16
+ Attributes:
17
+ uid: Unique identifier (6-char hex)
18
+ content: The memo content
19
+ timestamp: When the memo was created
20
+ context: Optional context (file:line, etc.)
21
+ author: Who created the memo (User, Assistant, Agent name)
22
+ source: How the memo was created (cli, agent, mailroom)
23
+ type: Type of memo (insight, bug, feature, task)
24
+ """
6
25
  uid: str
7
26
  content: str
8
27
  timestamp: datetime = Field(default_factory=datetime.now)
@@ -10,16 +29,18 @@ class Memo(BaseModel):
10
29
  # Optional Context
11
30
  context: Optional[str] = None
12
31
 
13
- # New Metadata Fields
32
+ # Metadata Fields
14
33
  author: str = "User" # User, Assistant, or specific Agent Name
15
34
  source: str = "cli" # cli, agent, mailroom, etc.
16
- status: Literal["pending", "tracked", "resolved", "dismissed"] = "pending"
17
- ref: Optional[str] = None # Linked Issue ID or other reference
18
35
  type: Literal["insight", "bug", "feature", "task"] = "insight"
19
36
 
20
37
  def to_markdown(self) -> str:
21
38
  """
22
39
  Render the memo to Markdown format.
40
+
41
+ Signal Queue Model:
42
+ - No status field (existence is the state)
43
+ - No ref field (traceability via git history)
23
44
  """
24
45
  ts_str = self.timestamp.strftime("%Y-%m-%d %H:%M:%S")
25
46
  header = f"## [{self.uid}] {ts_str}"
@@ -33,18 +54,6 @@ class Memo(BaseModel):
33
54
  if self.type != "insight":
34
55
  meta.append(f"- **Type**: {self.type}")
35
56
 
36
- # Status line with checkbox simulation
37
- status_map = {
38
- "pending": "[ ] Pending",
39
- "tracked": "[x] Tracked",
40
- "resolved": "[x] Resolved",
41
- "dismissed": "[-] Dismissed"
42
- }
43
- meta.append(f"- **Status**: {status_map.get(self.status, '[ ] Pending')}")
44
-
45
- if self.ref:
46
- meta.append(f"- **Ref**: {self.ref}")
47
-
48
57
  if self.context:
49
58
  meta.append(f"- **Context**: `{self.context}`")
50
59
 
@@ -0,0 +1,31 @@
1
+ ### Memo (Fleeting Notes)
2
+
3
+ Lightweight note-taking for ideas and quick thoughts. **Signal Queue Model** (FEAT-0165).
4
+
5
+ #### Signal Queue Semantics
6
+
7
+ - **Memo is a signal, not an asset** - Its value is in triggering action
8
+ - **File existence = signal pending** - Inbox has unprocessed memos
9
+ - **File cleared = signal consumed** - Memos are deleted after processing
10
+ - **Git is the archive** - History is in git, not app state
11
+
12
+ #### Commands
13
+
14
+ - **Add**: `monoco memo add "Content" [-c context]` - Create a signal
15
+ - **List**: `monoco memo list` - Show pending signals (consumed memos are in git history)
16
+ - **Delete**: `monoco memo delete <id>` - Manual delete (normally auto-consumed)
17
+ - **Open**: `monoco memo open` - Edit inbox directly
18
+
19
+ #### Workflow
20
+
21
+ 1. Capture ideas as memos
22
+ 2. When threshold (5) is reached, Architect is auto-triggered
23
+ 3. Memos are consumed (deleted) and embedded in Architect's prompt
24
+ 4. Architect creates Issues from memos
25
+ 5. No need to "link" or "resolve" memos - they're gone after consumption
26
+
27
+ #### Guideline
28
+
29
+ - Use Memos for **fleeting ideas** - things that might become Issues
30
+ - Use Issues for **actionable work** - structured, tracked, with lifecycle
31
+ - Never manually link memos to Issues - if important, create an Issue
@@ -1,8 +1,31 @@
1
1
  ### Memo (Fleeting Notes)
2
2
 
3
- Lightweight note-taking for ideas and quick thoughts.
3
+ 轻量级笔记,用于快速记录想法。**信号队列模型** (FEAT-0165)。
4
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.
5
+ #### 信号队列语义
6
+
7
+ - **Memo 是信号,不是资产** - 其价值在于触发行动
8
+ - **文件存在 = 信号待处理** - Inbox 有未处理的 memo
9
+ - **文件清空 = 信号已消费** - Memo 在处理后被删除
10
+ - **Git 是档案** - 历史记录在 git 中,不在应用状态里
11
+
12
+ #### 命令
13
+
14
+ - **添加**: `monoco memo add "内容" [-c 上下文]` - 创建信号
15
+ - **列表**: `monoco memo list` - 显示待处理信号(已消费的 memo 在 git 历史中)
16
+ - **删除**: `monoco memo delete <id>` - 手动删除(通常自动消费)
17
+ - **打开**: `monoco memo open` - 直接编辑 inbox
18
+
19
+ #### 工作流
20
+
21
+ 1. 将想法捕获为 memo
22
+ 2. 当阈值(5个)达到时,自动触发 Architect
23
+ 3. Memo 被消费(删除)并嵌入 Architect 的 prompt
24
+ 4. Architect 从 memo 创建 Issue
25
+ 5. 不需要"链接"或"解决" memo - 消费后即消失
26
+
27
+ #### 指南
28
+
29
+ - 使用 Memo 记录** fleeting 想法** - 可能成为 Issue 的事情
30
+ - 使用 Issue 进行**可操作的工作** - 结构化、可跟踪、有生命周期
31
+ - 永远不要手动将 memo 链接到 Issue - 如果重要,创建一个 Issue
@@ -81,13 +81,15 @@ def remove_repo(
81
81
  target_path = spikes_dir / name
82
82
  deleted = False
83
83
  if target_path.exists():
84
- if force or typer.confirm(
85
- f"Do you want to delete the directory {target_path}?", default=False
86
- ):
84
+ if force:
87
85
  core.remove_repo_dir(spikes_dir, name)
88
86
  deleted = True
89
87
  else:
90
88
  deleted = False
89
+ if not OutputManager.is_agent_mode():
90
+ from rich.console import Console
91
+ console = Console()
92
+ console.print(f"[yellow]Skipping physical deletion of {target_path}. Use --force to delete.[/yellow]")
91
93
 
92
94
  OutputManager.print(
93
95
  {"status": "removed", "name": name, "directory_deleted": deleted}
monoco/main.py CHANGED
@@ -199,7 +199,7 @@ app.add_typer(issue_cmd.app, name="issue", help="Manage development issues")
199
199
  app.add_typer(spike_cmd.app, name="spike", help="Manage research spikes")
200
200
  app.add_typer(i18n_cmd.app, name="i18n", help="Manage documentation i18n")
201
201
  app.add_typer(config_cmd.app, name="config", help="Manage configuration")
202
- app.add_typer(hooks_cmd.app, name="hooks", help="Manage git hooks for development workflow")
202
+ app.add_typer(hooks_cmd.app, name="hook", help="Manage git hooks for development workflow")
203
203
  app.add_typer(project_cmd.app, name="project", help="Manage projects")
204
204
  app.add_typer(workspace_cmd.app, name="workspace", help="Manage workspace")
205
205
 
@@ -212,9 +212,11 @@ from monoco.features.memo import app as memo_app
212
212
  app.add_typer(memo_app, name="memo", help="Manage fleeting notes (memos)")
213
213
 
214
214
 
215
- from monoco.daemon.commands import serve
215
+ from monoco.daemon.commands import serve_app, serve
216
216
 
217
- app.command(name="serve")(serve)
217
+ app.add_typer(serve_app, name="serve", help="Manage Monoco Daemon server")
218
+ # Keep legacy 'serve' command for backward compatibility
219
+ app.command(name="serve", hidden=True)(serve)
218
220
 
219
221
  if __name__ == "__main__":
220
222
  app()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: monoco-toolkit
3
- Version: 0.3.11
3
+ Version: 0.4.0
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
@@ -0,0 +1,170 @@
1
+ monoco/__main__.py,sha256=BNYhtz7ZAQRllC-B9oggvQJW-IFlJWhAA_D7EsktJj8,111
2
+ monoco/main.py,sha256=m7kKRzdYZU7sB9-vj132-luRjI0NjDFyxE5weCuXL8o,7323
3
+ monoco/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
+ monoco/cli/project.py,sha256=FqLaDD3hiWxa0_TKzxEF7PYH9RPsvmLyjO3NYVckgGs,2737
5
+ monoco/cli/workspace.py,sha256=vcUHjSarRZk8k3SNjtLSVD2VUPhBIUyx5J1OPtGa7-Q,1541
6
+ monoco/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ monoco/core/config.py,sha256=Mhe8WGXIy0i7Si2tY8OAaouiuTQiMqDeOaKWV54h-VU,17529
8
+ monoco/core/feature.py,sha256=bcK0C1CaQgNLcdMF0RuniaaQRCYSA-0JdOpQz9W_1xM,1968
9
+ monoco/core/git.py,sha256=yKrkF8i9RPHlidu6lgTDnao9C99uHJyO0Xo2ADaLWqg,9696
10
+ monoco/core/githooks.py,sha256=QY4c74LIYDtcjtWYax1PrK5CtVNKYTfVVVBOj-SCulo,1826
11
+ monoco/core/injection.py,sha256=xzxuUaRyMJbKjUZ-Sbo1PyBRXmPXdjCWrxp4uZ-bQ54,11611
12
+ monoco/core/integrations.py,sha256=o07-e1vI8KJvNP8nb-cJJO1OqNPE8EF1SzG74pAxNhY,7248
13
+ monoco/core/loader.py,sha256=olEXbG6VRLjHddKOMby68QuQOVyIP8hPVxQBPEXkUPQ,20410
14
+ monoco/core/lsp.py,sha256=GOrHzubkMWS3iBpP4H2fTFW-0JXa6D2YlU0ZEhp5zmY,2018
15
+ monoco/core/output.py,sha256=21KoFtAiPm_8hwZlNNvuxDUMRNGfoS2_H-rpwTnjxLY,3972
16
+ monoco/core/registry.py,sha256=a2qQpZQgbmkvLOcrp-UWWQ0nlh8lkWAk7X6Hnm-bzz4,1874
17
+ monoco/core/setup.py,sha256=Tg8X4fY6AeswOFpGc3NngnrMGfe0RNrtEbTZrwfK9lc,11928
18
+ monoco/core/skill_framework.py,sha256=0EaFDigPNpY9ZO-8tqLTjp9MjsPc1CPum9ir5M862BU,13295
19
+ monoco/core/skills.py,sha256=tDZXoDmGcXzICdcIIXYpC-kolajVx_QTQ1o1dpXjhoc,30369
20
+ monoco/core/state.py,sha256=dfoTH1Sj_TSjtTEXuv4w0ZOp_Fd30XNymVSZo30Xshg,1820
21
+ monoco/core/sync.py,sha256=RWzvhdHD0RFHaMkl-2vOAH5i2DtBmlFfOsn4X99NngI,19475
22
+ monoco/core/telemetry.py,sha256=GQDbtgrZwAL1ZpjgbJZuawbTyH6J0NjMXMi4ogq-Ang,2915
23
+ monoco/core/workflow_converter.py,sha256=djAJJKi9iDHscluN7DTMDc6SDEz9YvJSYQW3XLFIbgo,13777
24
+ monoco/core/workspace.py,sha256=H_PHD5A0HZFq841u1JtLoFjkXdQg9D6x6I7QcFtJge4,3000
25
+ monoco/core/artifacts/__init__.py,sha256=emmW_RHKZbJ4ED-oPx6Eoci34f4NKCXTuBohQmQ5gcU,406
26
+ monoco/core/artifacts/manager.py,sha256=WinaVMrXWVm56CRYtSEz6O2JWZZ1A7xWiEnR8O7ppHc,19543
27
+ monoco/core/artifacts/models.py,sha256=fk_iS3kkUFEwf7O8YKO2sVVHaNS8JaGQRoHsJceSBLw,5241
28
+ monoco/core/automation/__init__.py,sha256=uqHWf6s42igKrEpadhQvTorqVo_o0C7YtIkX8llqBug,968
29
+ monoco/core/automation/field_watcher.py,sha256=HCy8w9VXiA-UQZzBULet3d52z4APIEqGhICO26WOvk0,9459
30
+ monoco/core/automation/handlers.py,sha256=tM45PMEdxdvgkUtiRgTe73oUGm7s8QRB63vLR3X15ZU,27554
31
+ monoco/core/daemon/__init__.py,sha256=AG85bSG8K7oin_gBzyQHCYKFaJVhuo4DVztCNcnqeUg,168
32
+ monoco/core/daemon/pid.py,sha256=z2R3uGczewA55kn5quzvVi_Y1TVrOVBlsnCohTIxcKE,8112
33
+ monoco/core/hooks/__init__.py,sha256=8dWjDSwJG9JdghWBxgk7zH1U1FlJCiRo66mfbWcDK3M,437
34
+ monoco/core/hooks/base.py,sha256=GQ59E_VX8RmtWezyg5sMFqmKRDsD7PJflcAb2TTy8S8,3276
35
+ monoco/core/hooks/context.py,sha256=i6G4zjiDdvPlRzJTDQgV56Mo14zQGKDL5Cibv_3p3vE,6011
36
+ monoco/core/hooks/registry.py,sha256=O_IO1c7R9NbHk3F-xtLowQQkzPBs6qM1Xii398ZfbNU,7100
37
+ monoco/core/hooks/builtin/__init__.py,sha256=R_e04bOLnBKy7pX5QVBkDjgUNeQ82o1IHq--CKgIX_I,177
38
+ monoco/core/hooks/builtin/git_cleanup.py,sha256=crtUv2RJoeo1qOAgLulr6Q0_M-oFTLDNq3Uku1pl3QU,9701
39
+ monoco/core/hooks/builtin/logging_hook.py,sha256=F5iN3zeczEeoumK0nUXf6ZVrO4_5gcA9dne8y4KSiXo,2796
40
+ monoco/core/ingestion/__init__.py,sha256=JbGL2DiYK9uvp2v7ZLWC-H2F_Z_XWoBy9Z0WbuVRqwM,547
41
+ monoco/core/ingestion/discovery.py,sha256=qu_adDf9pwoQHkJTDbzjqq7yIwIJxcYcFcQoH6YGuek,7966
42
+ monoco/core/ingestion/watcher.py,sha256=y6kkpqhCXI3FIVPmb8JGJbtm7eaeHq6LM5v91JbXVQc,11996
43
+ monoco/core/ingestion/worker.py,sha256=ndMsbb8PZLzRkwmuWObA8RRUOwGs_kAXuq2c2FVK3L8,14735
44
+ monoco/core/resource/__init__.py,sha256=CZvZHdtyfgrAehCjoAUuVAJ-XGaLqN7DcGE2SEKHIiU,200
45
+ monoco/core/resource/finder.py,sha256=izX-jTw0juajXbcAuk7MtCXD7Os0pzLXBgTxL-nxwe0,4329
46
+ monoco/core/resource/manager.py,sha256=ZRDyvZFvcFPhD9jzmE3jYbZHCIRkheqcR6INxTke6_Y,3484
47
+ monoco/core/resource/models.py,sha256=mJffVMZ8PpWety-yHhierfmgPst_e1mRqgLWfrUrk4g,934
48
+ monoco/core/router/__init__.py,sha256=RdaBAoJKye9Zy40L2d19iXfV7fQ2p7FhDHRMxhoIzJM,273
49
+ monoco/core/router/action.py,sha256=IPk3pizHULLiYSxlvKTJbftb0diAoe29tXEZoooFkmg,5845
50
+ monoco/core/scheduler/__init__.py,sha256=J7qv72y0FK4HFXAS50oAO0j71FHfHp6D_1JuFXS-TA0,1533
51
+ monoco/core/scheduler/base.py,sha256=7ywbKRK6o5OtEWKk4y3Q4-SI85ZMyVId4JsCJ0ohWGQ,4265
52
+ monoco/core/scheduler/engines.py,sha256=d4D50kN-n31eiCpUdNfTAFfwI2SIT0YaZ6xg_s0YJfQ,4643
53
+ monoco/core/scheduler/events.py,sha256=HLEEjjz-TyUDjIWi3fEtiNJWyuT-bHUzL1mbs517ZvQ,6646
54
+ monoco/core/scheduler/local.py,sha256=fjAKGOm0MawJFfBuCsl_oAUbpbR0idIOWf56Pee-Gk0,12633
55
+ monoco/core/watcher/__init__.py,sha256=JTzJqorERptCP0XgddeF2fLEOQMsXFWw_9JcSs7j-RQ,1597
56
+ monoco/core/watcher/base.py,sha256=oZWCUmKIuZvIAT95wCnywClKkB4U3A11zyDryz2g97s,12564
57
+ monoco/core/watcher/dropzone.py,sha256=CGI21wozuxA7-b_qj_PpiYwXgkH-UXPSjClZcxrURmo,4903
58
+ monoco/core/watcher/im.py,sha256=gBuSn4s36LCRh0OMntZyg35inLBZkgiXaOf3GPTiJEU,15229
59
+ monoco/core/watcher/issue.py,sha256=eAKSznb-ihU4Ij6X6QU2uLhPUcHfr3E6C4CjZarMXaU,10229
60
+ monoco/core/watcher/memo.py,sha256=Fv7YdaLwKTkUCwELGrNh2Xsi1WqUWA5SbllAYiFfJNs,6192
61
+ monoco/core/watcher/task.py,sha256=0bwPfZn7WSbjqhPQshEdRjIMc7UuBkMN6Vku-n5jea8,7254
62
+ monoco/daemon/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
63
+ monoco/daemon/app.py,sha256=RQqhF5MZI3R5cV65iOL-74W5KIr3kxS9Vd_GvBUZIDo,15992
64
+ monoco/daemon/commands.py,sha256=iHwVb08-ZBcE8bWbJwJbGaPR9o-wm-4H9mAwDPf15Ug,16659
65
+ monoco/daemon/events.py,sha256=5TgCfHAoN8uE8LpKbJfbe5Am55Zfz1cwDlw6drcC0dY,750
66
+ monoco/daemon/mailroom_service.py,sha256=w5hFnT1fJODAs_HZN8A8Bu65bUZic2pEyr-hYdSM14k,6811
67
+ monoco/daemon/models.py,sha256=O4NEsjrO22yOJCYFz9LH2SR9CFS57CA1SGNbjiHlxXQ,1053
68
+ monoco/daemon/reproduce_stats.py,sha256=LghJ8o1jTeDpA1zVPI2vF0okGU3h4esEI1thNa6shKI,1196
69
+ monoco/daemon/scheduler.py,sha256=KGdUNyVhQgV4Jt5KYn5FERGABoK4K4wOx86fYGjCnCc,6673
70
+ monoco/daemon/services.py,sha256=Gd27ccGzk73jDua9K_RPeMrouuaJr_OHwucKe1HAgxw,4883
71
+ monoco/daemon/stats.py,sha256=XTtuFWx68O1OA44SmN0BGVa6sswts2ExmkiavUzCYiA,4800
72
+ monoco/daemon/triggers.py,sha256=sBsXLfvI7_d3bUPzaDit1YQBypLBFJFv3l-DEIoKpbA,1815
73
+ monoco/features/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
74
+ monoco/features/agent/__init__.py,sha256=CybgqfTSOuO2QUP_JXyIeY2nbxm-9-Cc5OIAX01q78o,1025
75
+ monoco/features/agent/adapter.py,sha256=T3lS2UjR5KFWwnCurUhsvM4_Xu5sdp3MJvuRkExecTU,1476
76
+ monoco/features/agent/cli.py,sha256=fbVwbem1Ymfw6T--Kz2ATxYGutnQECUemFDlQtnzXwc,10624
77
+ monoco/features/agent/config.py,sha256=nBjwZsod8DI5O4MdD_N9TED87V8dxpK8m-KJAzAsc8c,3296
78
+ monoco/features/agent/defaults.py,sha256=lw3-UIE6ZA8yR5iqczBKYtwu06pHRuuDOy4GPnmDWwU,390
79
+ monoco/features/agent/engines.py,sha256=ETZ2k6dYnprjtCA4ZiSW2099emRDx-GESbtdLoAMcxA,820
80
+ monoco/features/agent/flow_skills.py,sha256=9YQZvhebS_J2oERsGMfWd6WjDKkAWGzlJ0guIrYgsMw,9079
81
+ monoco/features/agent/models.py,sha256=WP1i0slVdJxQfGmmxabKOLGU5qc75QXJFvkin-5sxw0,856
82
+ monoco/features/agent/worker.py,sha256=ILX6EhA_NeV3QUbuhBo8AVli0rpMYJTWwlFAjG6M_QU,5755
83
+ monoco/features/agent/resources/en/AGENTS.md,sha256=uDikTbhfywjUe8bdaRchzC6BRjXhp6MYSjwSs5_7wMs,1231
84
+ monoco/features/agent/resources/en/skills/monoco_role_engineer/SKILL.md,sha256=kePza7vUdiaf-oAm-xWiMEmeDQM5FDkJ-JzO5S-5QSs,3333
85
+ monoco/features/agent/resources/en/skills/monoco_role_manager/SKILL.md,sha256=vF_lMNptO81sW3GAW2Set-JdYUnND6F6la4en8lB_uw,3237
86
+ monoco/features/agent/resources/en/skills/monoco_role_planner/SKILL.md,sha256=l6MMLXCMV-pZk7K42phadIomPb8bMOnoVO6g-Lga0ok,6783
87
+ monoco/features/agent/resources/en/skills/monoco_role_reviewer/SKILL.md,sha256=bCfdugTTFaXPcw6BGwFsMmxjm5u89nQWzcHgRGtGuNk,4536
88
+ monoco/features/agent/resources/zh/AGENTS.md,sha256=KBNZSCPBIals6jDdvG5wJgjZuswi_1nKljggJSMtfy8,1156
89
+ monoco/features/agent/resources/zh/skills/monoco_role_engineer/SKILL.md,sha256=kePza7vUdiaf-oAm-xWiMEmeDQM5FDkJ-JzO5S-5QSs,3333
90
+ monoco/features/agent/resources/zh/skills/monoco_role_manager/SKILL.md,sha256=vF_lMNptO81sW3GAW2Set-JdYUnND6F6la4en8lB_uw,3237
91
+ monoco/features/agent/resources/zh/skills/monoco_role_planner/SKILL.md,sha256=l6MMLXCMV-pZk7K42phadIomPb8bMOnoVO6g-Lga0ok,6783
92
+ monoco/features/agent/resources/zh/skills/monoco_role_reviewer/SKILL.md,sha256=bCfdugTTFaXPcw6BGwFsMmxjm5u89nQWzcHgRGtGuNk,4536
93
+ monoco/features/artifact/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
94
+ monoco/features/artifact/adapter.py,sha256=xk9dwrqYYuVvfgp1BAn7ANMINAsbJpbpGFA3sAvdcSc,1140
95
+ monoco/features/artifact/resources/zh/AGENTS.md,sha256=RvMxEF1KgezwOZzEPiKEdWtf7AqTdsUpSXV0v_jBKjo,959
96
+ monoco/features/config/commands.py,sha256=i6_fKhSGLeO8RCbWrYKxelFgaHWcPiQERS2uxUdq7H0,4894
97
+ monoco/features/glossary/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
98
+ monoco/features/glossary/adapter.py,sha256=8CHApyIM34Z6jn6s_dHWpuUzNG6WwDz-44O0uIckffw,1564
99
+ monoco/features/glossary/config.py,sha256=ghzIPhTFmRcrSyVrZKdmpFRMFrtfL4hJ4dNkKMXT0ys,93
100
+ monoco/features/glossary/resources/en/AGENTS.md,sha256=PfeX2JFbyuqwQySCgXV8HSTsyV-0z7E_oyBLUszkI6U,2096
101
+ monoco/features/glossary/resources/zh/AGENTS.md,sha256=Y5zAOZRRCbGYAZitdR7gHJAjJdkXuCQvP5bH_zl8L04,1505
102
+ monoco/features/hooks/__init__.py,sha256=zxC4oe-EzoM_dAr8ySoOI_tGBrWQHK74pKw0WI_sQFY,1409
103
+ monoco/features/hooks/commands.py,sha256=yv_cWIffysLDdQ1wKfaKD_dOnXh4cFTP90lkEvFxmaM,9914
104
+ monoco/features/hooks/manager.py,sha256=H3NjC377CN8ew610uI0-9X61qhlBTETv4r2MHamDFgI,10588
105
+ monoco/features/hooks/models.py,sha256=hEDFSiMJHfWxe7v02Qd6ygNp62gVBAN3iT6G9T5Bkfc,7351
106
+ monoco/features/hooks/parser.py,sha256=R0vh97Tb-zrPeGgns8YFQPip6djzt5jWrU8AbuOKhEQ,10021
107
+ monoco/features/hooks/universal_interceptor.py,sha256=qG_AbqxMbkT_hT-bjjAi4gE2zBdeH-EbL_bTGpv0IDs,15653
108
+ monoco/features/hooks/dispatchers/__init__.py,sha256=xYCVaH0patTrDq8-dW9dhyo9THEcjie-N64ICp6_HEE,523
109
+ monoco/features/hooks/dispatchers/agent_dispatcher.py,sha256=QxUHfmmfopq931eshN1BWkLxlzMJf9SWX54X4QbuCj4,15247
110
+ monoco/features/hooks/dispatchers/git_dispatcher.py,sha256=vaRIeqpduWisGtBuMHivH7kkhmSan6Mc1-dgp-sgN_Q,14386
111
+ monoco/features/hooks/resources/ADDING_HOOKS.md,sha256=JodrGecypO4F8Bz0C-lRsaQXzp-B9IRbzxFZt9Xk7Dg,5363
112
+ monoco/features/i18n/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
113
+ monoco/features/i18n/adapter.py,sha256=Ag0QxkDC86KClu0eTeRxiaTcYdCCkPZBgS8ZLr4UdrI,1518
114
+ monoco/features/i18n/commands.py,sha256=NJ2lZRRjiTW-3UbqxhEKURdWSDxQPkfnBAUgnwoVCL8,8416
115
+ monoco/features/i18n/core.py,sha256=EAFWZgbRHls5xVTpqCAWKhC2d-sbAS6ZiMKhB03aNd8,28711
116
+ monoco/features/i18n/resources/en/AGENTS.md,sha256=zzuF7BW6x8Mj6LZZmeM6wTbG5CSCDMShf4rwtN7XITg,197
117
+ monoco/features/i18n/resources/zh/AGENTS.md,sha256=lKkwLLCADRH7UDq9no4eQY2sRfJrb64JoZ_HNved8vA,175
118
+ monoco/features/im/__init__.py,sha256=MXcnSowRrXY3eUfF_OXqyzamTNHRxl0Lx0JkE8WDUxg,1414
119
+ monoco/features/im/core.py,sha256=FasyzeaweUyoxFLp58i0ZnJOFTK5v9Y7gU_ZxOF5wm0,25917
120
+ monoco/features/im/models.py,sha256=zrzqX6wzZut94bbBkXou8m3-CKGWIa9gpEEiaPRgdR0,9733
121
+ monoco/features/issue/adapter.py,sha256=puCyGKI-S5o2wcJy8fNinIqh2pCyO2auK2pATT67B8k,1769
122
+ monoco/features/issue/commands.py,sha256=jjAT7NmQl5xDSMikrBvb27qiZcJWLWamZaVRzy-s2Qo,64475
123
+ monoco/features/issue/core.py,sha256=ic_VY63JrcxZCQ5G_aJ9I0etl5z2A4EuqU1w8RSWCfo,77082
124
+ monoco/features/issue/criticality.py,sha256=Bw0xH0vpx8z59bL-WQjfy4a5zmjXNM0f-aWBzQ5JZCA,18931
125
+ monoco/features/issue/domain_commands.py,sha256=snaVlkv6iSmbjI6Tcu7M4oydidLc6OidMWwltnSU5Vc,793
126
+ monoco/features/issue/domain_service.py,sha256=bEs_WXOWmotgIR-lGwyWekF4nonvjsgrK1YG3pyVfwk,2564
127
+ monoco/features/issue/git_service.py,sha256=57FSWiY9qHzOWw_e-IOKinOsiqVJz-ycE1zRtRWuBw8,5956
128
+ monoco/features/issue/linter.py,sha256=jFzYr9022xPd7iPe9gHKSPHTDNCv9a8iLdHQ-vZB0Pg,41589
129
+ monoco/features/issue/migration.py,sha256=i0xlxZjrpmuHGHOAIN4iu31EwwVIvZn7yjveS-kU22c,4896
130
+ monoco/features/issue/models.py,sha256=1WfQBq97uJnpzFoAOXHafo2yFtZ49IM9wsFfnEhQjXg,8939
131
+ monoco/features/issue/monitor.py,sha256=vZN0TbR3V5fHKHRGkIhimO6UwWcwYjDHQs2qzjEG174,3549
132
+ monoco/features/issue/resolver.py,sha256=mAU9s7TNNHY9A2278JTwJvxU-jalGKTDJfJdjONev3E,5655
133
+ monoco/features/issue/test_priority_integration.py,sha256=pTBg3Wjv6lLYxWL6vjbo2NGVE-X0MRB3Ha8bqObZrU4,2791
134
+ monoco/features/issue/test_resolver.py,sha256=luFhK37DUvh4a3TTcFYVO-oOIJljQVCSYicwSWyDleQ,2530
135
+ monoco/features/issue/validator.py,sha256=Ij-n9TxU2yFlFmJSxauh6z8Ru_5WmHPkyYqSkFyL0j0,37613
136
+ monoco/features/issue/domain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
137
+ monoco/features/issue/domain/lifecycle.py,sha256=oIuLYTVy1RRHGngAzbNU4kTWOHMBhjuw_TuYCwNqMJw,4991
138
+ monoco/features/issue/domain/models.py,sha256=s4gezUIlSlKxwJ3Byfxtsemj2-qsu4wRiXTNfaesSYQ,6830
139
+ monoco/features/issue/domain/parser.py,sha256=axfB9BjY-m4DQqYwTQBm_38plOidZaDqFtsIejW_kYI,9095
140
+ monoco/features/issue/domain/workspace.py,sha256=nyTEFNmpLPuX7nssMCBiFI1XBhY9zbqG877Ppp_s0Fg,3658
141
+ monoco/features/issue/engine/__init__.py,sha256=-SBvzjlZJz0O-IB1c95d9pbhr3lydJNLq2vhnfkZ8PQ,747
142
+ monoco/features/issue/engine/config.py,sha256=7enjPW4J_fpuK08ov6LpfQ-9h2T1D4Hc5yIXOPuQvLs,5761
143
+ monoco/features/issue/engine/machine.py,sha256=PK7tRaYOdTw9eZp3Fxot3JqtEIDaKfuBb9Dv2IJHosI,12946
144
+ monoco/features/issue/engine/models.py,sha256=595Sx3ncrpg_PhnbBLthohAvuhnjA-_9oXcrsT6Lv0k,574
145
+ monoco/features/issue/lsp/__init__.py,sha256=8bl8-WzSj3C4SkPKgVGnCeyemmvHVWBsuMZsJuJggG8,77
146
+ monoco/features/issue/lsp/definition.py,sha256=cF6Quw1OztuKMJ1zLvgA_ek7lTAdzHF0m4LVznpbAPw,3203
147
+ monoco/features/issue/resources/en/AGENTS.md,sha256=6XulRPtTbTTNgP3WfaodlHDgfsGtcnSxv-Vnfh1ny50,1257
148
+ monoco/features/issue/resources/hooks/agent/before-tool.sh,sha256=qYGR1PMcKfo6qi-1x_8_RtqlZ_O9wfBvUJwK2nXaRPk,2848
149
+ monoco/features/issue/resources/hooks/agent/session-start.sh,sha256=ndSSDT6bvOmeklW8PYrs6iHhrEgXINo_tsTBbr8f2jU,2608
150
+ monoco/features/issue/resources/hooks/git/git-post-checkout.sh,sha256=dHlVqeu9xl1-ddh7ftijcvE8QALFEwVQgcTnn-_4WZM,1156
151
+ monoco/features/issue/resources/hooks/git/git-pre-commit.sh,sha256=4GHPr-GvIb_0c0WpwB9ko82Lt_hlzW7lslu4RxMKSQw,637
152
+ monoco/features/issue/resources/hooks/git/git-pre-push.sh,sha256=yhURWdivxeQCVDBRvMOAD63GNDIfnvvTkzExyg4e7rw,793
153
+ monoco/features/issue/resources/zh/AGENTS.md,sha256=JrE_v57ZIpmVJg_339JbaPTTjAAzM9T5MIH63RQckuQ,1250
154
+ monoco/features/memo/__init__.py,sha256=LC5vwsJw-kwzd5O5oeRo-FNSbnZnuFynanec-hA72nw,88
155
+ monoco/features/memo/adapter.py,sha256=YWcQwN-xOyz0Zt94kHZ3BUWG7SV9J_nYhP3lupDx6SI,1596
156
+ monoco/features/memo/cli.py,sha256=uQshG2CNdvuj4c8V4mQDjDu0eF9r-LSa0CU3_kIGX-Y,4594
157
+ monoco/features/memo/core.py,sha256=CNsR8cHNNFJJpImc0t9yB65I7gQd0I8IqiLPVsl6S3Y,5702
158
+ monoco/features/memo/models.py,sha256=Mv9LJOawIsNvwIv1CYMdFnLWcl29uf92dtt3N4sA9dQ,2055
159
+ monoco/features/memo/resources/en/AGENTS.md,sha256=Eee3BqgKfF7g5y29Lvo1W8AP6rPbJDoKFxnjYwhF5eI,1246
160
+ monoco/features/memo/resources/zh/AGENTS.md,sha256=WpTOxNIs6vY9lSa2zDx6uYLyMISOmJ__mH6AKGiW5JE,1227
161
+ monoco/features/spike/adapter.py,sha256=DqwhFuHdBCy_gpgOuMJ7faccMJKJGVdjxTDecIZPsI8,1571
162
+ monoco/features/spike/commands.py,sha256=r5gvqVp6oSjYq5HOA7a99_cVjjzn9GWeZ3hBaT2j7_c,4016
163
+ monoco/features/spike/core.py,sha256=OuNWXQ-cBttP2oIF0B5iy0aEUH2MUMyGANG8ayEmjPo,4120
164
+ monoco/features/spike/resources/en/AGENTS.md,sha256=NG3CMnlDk_0J8hnRUcueAM9lgIQr_dZ42R_31-LC48E,306
165
+ monoco/features/spike/resources/zh/AGENTS.md,sha256=5RHNl7fc3RdYYTFH483ojJl_arGPKkyYziOuGgFbqqg,290
166
+ monoco_toolkit-0.4.0.dist-info/METADATA,sha256=4B7gWzTXdFFB21TIeJZdknhryFzM-QHxYxD6Nntegtw,4908
167
+ monoco_toolkit-0.4.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
168
+ monoco_toolkit-0.4.0.dist-info/entry_points.txt,sha256=iYj7FWYBdtClU15-Du1skqD0s6SFSIhJvxJ29VWp8ng,43
169
+ monoco_toolkit-0.4.0.dist-info/licenses/LICENSE,sha256=ACAGGjV6aod4eIlVUTx1q9PZbnZGN5bBwkSs9RHj83s,1071
170
+ monoco_toolkit-0.4.0.dist-info/RECORD,,
monoco/core/execution.py DELETED
@@ -1,67 +0,0 @@
1
- from pathlib import Path
2
- from typing import List, Optional
3
- from pydantic import BaseModel
4
-
5
-
6
- class ExecutionProfile(BaseModel):
7
- name: str
8
- source: str # "Global" or "Project"
9
- path: str
10
- content: Optional[str] = None
11
-
12
-
13
- def scan_execution_profiles(
14
- project_root: Optional[Path] = None,
15
- ) -> List[ExecutionProfile]:
16
- """
17
- Scan for execution profiles (SOPs) in global and project scopes.
18
- """
19
- profiles = []
20
-
21
- # 1. Global Scope
22
- global_path = Path.home() / ".monoco" / "execution"
23
- if global_path.exists():
24
- profiles.extend(_scan_dir(global_path, "Global"))
25
-
26
- # 2. Project Scope
27
- if project_root:
28
- project_path = project_root / ".monoco" / "execution"
29
- if project_path.exists():
30
- profiles.extend(_scan_dir(project_path, "Project"))
31
-
32
- return profiles
33
-
34
-
35
- def _scan_dir(base_path: Path, source: str) -> List[ExecutionProfile]:
36
- profiles = []
37
- if not base_path.is_dir():
38
- return profiles
39
-
40
- for item in base_path.iterdir():
41
- if item.is_dir():
42
- sop_path = item / "SOP.md"
43
- if sop_path.exists():
44
- profiles.append(
45
- ExecutionProfile(
46
- name=item.name, source=source, path=str(sop_path.absolute())
47
- )
48
- )
49
- return profiles
50
-
51
-
52
- def get_profile_detail(profile_path: str) -> Optional[ExecutionProfile]:
53
- path = Path(profile_path)
54
- if not path.exists():
55
- return None
56
-
57
- # Determine source (rough heuristic)
58
- source = "Project"
59
- if str(path).startswith(str(Path.home() / ".monoco")):
60
- source = "Global"
61
-
62
- return ExecutionProfile(
63
- name=path.parent.name,
64
- source=source,
65
- path=str(path.absolute()),
66
- content=path.read_text(encoding="utf-8"),
67
- )