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.
- monoco/core/automation/__init__.py +40 -0
- monoco/core/automation/field_watcher.py +296 -0
- monoco/core/automation/handlers.py +805 -0
- monoco/core/config.py +29 -11
- monoco/core/daemon/__init__.py +5 -0
- monoco/core/daemon/pid.py +290 -0
- monoco/core/git.py +15 -0
- monoco/core/hooks/context.py +74 -13
- monoco/core/injection.py +86 -8
- monoco/core/integrations.py +0 -24
- monoco/core/router/__init__.py +17 -0
- monoco/core/router/action.py +202 -0
- monoco/core/scheduler/__init__.py +63 -0
- monoco/core/scheduler/base.py +152 -0
- monoco/core/scheduler/engines.py +175 -0
- monoco/core/scheduler/events.py +197 -0
- monoco/core/scheduler/local.py +377 -0
- monoco/core/setup.py +9 -0
- monoco/core/sync.py +199 -4
- monoco/core/watcher/__init__.py +63 -0
- monoco/core/watcher/base.py +382 -0
- monoco/core/watcher/dropzone.py +152 -0
- monoco/core/watcher/im.py +460 -0
- monoco/core/watcher/issue.py +303 -0
- monoco/core/watcher/memo.py +192 -0
- monoco/core/watcher/task.py +238 -0
- monoco/daemon/app.py +3 -60
- monoco/daemon/commands.py +459 -25
- monoco/daemon/events.py +34 -0
- monoco/daemon/scheduler.py +157 -201
- monoco/daemon/services.py +42 -243
- monoco/features/agent/__init__.py +25 -7
- monoco/features/agent/cli.py +91 -57
- monoco/features/agent/engines.py +31 -170
- monoco/features/agent/resources/en/AGENTS.md +14 -14
- monoco/features/agent/resources/en/skills/monoco_role_engineer/SKILL.md +101 -0
- monoco/features/agent/resources/en/skills/monoco_role_manager/SKILL.md +95 -0
- monoco/features/agent/resources/en/skills/monoco_role_planner/SKILL.md +177 -0
- monoco/features/agent/resources/en/skills/monoco_role_reviewer/SKILL.md +139 -0
- monoco/features/agent/resources/zh/skills/monoco_role_engineer/SKILL.md +101 -0
- monoco/features/agent/resources/zh/skills/monoco_role_manager/SKILL.md +95 -0
- monoco/features/agent/resources/zh/skills/monoco_role_planner/SKILL.md +177 -0
- monoco/features/agent/resources/zh/skills/monoco_role_reviewer/SKILL.md +139 -0
- monoco/features/agent/worker.py +1 -1
- monoco/features/hooks/__init__.py +61 -6
- monoco/features/hooks/commands.py +281 -271
- monoco/features/hooks/dispatchers/__init__.py +23 -0
- monoco/features/hooks/dispatchers/agent_dispatcher.py +486 -0
- monoco/features/hooks/dispatchers/git_dispatcher.py +478 -0
- monoco/features/hooks/manager.py +357 -0
- monoco/features/hooks/models.py +262 -0
- monoco/features/hooks/parser.py +322 -0
- monoco/features/hooks/universal_interceptor.py +503 -0
- monoco/features/im/__init__.py +67 -0
- monoco/features/im/core.py +782 -0
- monoco/features/im/models.py +311 -0
- monoco/features/issue/commands.py +133 -60
- monoco/features/issue/core.py +385 -40
- monoco/features/issue/domain_commands.py +0 -19
- monoco/features/issue/resources/en/AGENTS.md +17 -122
- monoco/features/issue/resources/hooks/agent/before-tool.sh +102 -0
- monoco/features/issue/resources/hooks/agent/session-start.sh +88 -0
- monoco/features/issue/resources/hooks/{post-checkout.sh → git/git-post-checkout.sh} +10 -9
- monoco/features/issue/resources/hooks/git/git-pre-commit.sh +31 -0
- monoco/features/issue/resources/hooks/{pre-push.sh → git/git-pre-push.sh} +7 -13
- monoco/features/issue/resources/zh/AGENTS.md +18 -123
- monoco/features/memo/cli.py +15 -64
- monoco/features/memo/core.py +6 -34
- monoco/features/memo/models.py +24 -15
- monoco/features/memo/resources/en/AGENTS.md +31 -0
- monoco/features/memo/resources/zh/AGENTS.md +28 -5
- monoco/features/spike/commands.py +5 -3
- monoco/main.py +5 -3
- {monoco_toolkit-0.3.11.dist-info → monoco_toolkit-0.4.0.dist-info}/METADATA +1 -1
- monoco_toolkit-0.4.0.dist-info/RECORD +170 -0
- monoco/core/execution.py +0 -67
- monoco/features/agent/apoptosis.py +0 -44
- monoco/features/agent/manager.py +0 -127
- monoco/features/agent/resources/atoms/atom-code-dev.yaml +0 -61
- monoco/features/agent/resources/atoms/atom-issue-lifecycle.yaml +0 -73
- monoco/features/agent/resources/atoms/atom-knowledge.yaml +0 -55
- monoco/features/agent/resources/atoms/atom-review.yaml +0 -60
- monoco/features/agent/resources/en/skills/monoco_atom_core/SKILL.md +0 -99
- monoco/features/agent/resources/en/skills/monoco_workflow_agent_engineer/SKILL.md +0 -94
- monoco/features/agent/resources/en/skills/monoco_workflow_agent_manager/SKILL.md +0 -93
- monoco/features/agent/resources/en/skills/monoco_workflow_agent_planner/SKILL.md +0 -85
- monoco/features/agent/resources/en/skills/monoco_workflow_agent_reviewer/SKILL.md +0 -114
- monoco/features/agent/resources/workflows/workflow-dev.yaml +0 -83
- monoco/features/agent/resources/workflows/workflow-issue-create.yaml +0 -72
- monoco/features/agent/resources/workflows/workflow-review.yaml +0 -94
- monoco/features/agent/resources/zh/roles/monoco_role_engineer.yaml +0 -49
- monoco/features/agent/resources/zh/roles/monoco_role_manager.yaml +0 -46
- monoco/features/agent/resources/zh/roles/monoco_role_planner.yaml +0 -46
- monoco/features/agent/resources/zh/roles/monoco_role_reviewer.yaml +0 -47
- monoco/features/agent/resources/zh/skills/monoco_atom_core/SKILL.md +0 -99
- monoco/features/agent/resources/zh/skills/monoco_workflow_agent_engineer/SKILL.md +0 -94
- monoco/features/agent/resources/zh/skills/monoco_workflow_agent_manager/SKILL.md +0 -88
- monoco/features/agent/resources/zh/skills/monoco_workflow_agent_planner/SKILL.md +0 -259
- monoco/features/agent/resources/zh/skills/monoco_workflow_agent_reviewer/SKILL.md +0 -137
- monoco/features/agent/session.py +0 -169
- monoco/features/artifact/resources/zh/skills/monoco_atom_artifact/SKILL.md +0 -278
- monoco/features/glossary/resources/en/skills/monoco_atom_glossary/SKILL.md +0 -35
- monoco/features/glossary/resources/zh/skills/monoco_atom_glossary/SKILL.md +0 -35
- monoco/features/hooks/adapter.py +0 -67
- monoco/features/hooks/core.py +0 -441
- monoco/features/i18n/resources/en/skills/monoco_atom_i18n/SKILL.md +0 -96
- monoco/features/i18n/resources/en/skills/monoco_workflow_i18n_scan/SKILL.md +0 -105
- monoco/features/i18n/resources/zh/skills/monoco_atom_i18n/SKILL.md +0 -96
- monoco/features/i18n/resources/zh/skills/monoco_workflow_i18n_scan/SKILL.md +0 -105
- monoco/features/issue/resources/en/skills/monoco_atom_issue/SKILL.md +0 -165
- monoco/features/issue/resources/en/skills/monoco_workflow_issue_creation/SKILL.md +0 -167
- monoco/features/issue/resources/en/skills/monoco_workflow_issue_development/SKILL.md +0 -224
- monoco/features/issue/resources/en/skills/monoco_workflow_issue_management/SKILL.md +0 -159
- monoco/features/issue/resources/en/skills/monoco_workflow_issue_refinement/SKILL.md +0 -203
- monoco/features/issue/resources/hooks/pre-commit.sh +0 -41
- monoco/features/issue/resources/zh/skills/monoco_atom_issue_lifecycle/SKILL.md +0 -190
- monoco/features/issue/resources/zh/skills/monoco_workflow_issue_creation/SKILL.md +0 -167
- monoco/features/issue/resources/zh/skills/monoco_workflow_issue_development/SKILL.md +0 -224
- monoco/features/issue/resources/zh/skills/monoco_workflow_issue_management/SKILL.md +0 -159
- monoco/features/issue/resources/zh/skills/monoco_workflow_issue_refinement/SKILL.md +0 -203
- monoco/features/memo/resources/en/skills/monoco_atom_memo/SKILL.md +0 -77
- monoco/features/memo/resources/en/skills/monoco_workflow_note_processing/SKILL.md +0 -140
- monoco/features/memo/resources/zh/skills/monoco_atom_memo/SKILL.md +0 -77
- monoco/features/memo/resources/zh/skills/monoco_workflow_note_processing/SKILL.md +0 -140
- monoco/features/spike/resources/en/skills/monoco_atom_spike/SKILL.md +0 -76
- monoco/features/spike/resources/en/skills/monoco_workflow_research/SKILL.md +0 -121
- monoco/features/spike/resources/zh/skills/monoco_atom_spike/SKILL.md +0 -76
- monoco/features/spike/resources/zh/skills/monoco_workflow_research/SKILL.md +0 -121
- monoco_toolkit-0.3.11.dist-info/RECORD +0 -181
- {monoco_toolkit-0.3.11.dist-info → monoco_toolkit-0.4.0.dist-info}/WHEEL +0 -0
- {monoco_toolkit-0.3.11.dist-info → monoco_toolkit-0.4.0.dist-info}/entry_points.txt +0 -0
- {monoco_toolkit-0.3.11.dist-info → monoco_toolkit-0.4.0.dist-info}/licenses/LICENSE +0 -0
monoco/features/memo/cli.py
CHANGED
|
@@ -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,
|
|
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
|
|
87
|
+
console.print("No memos in inbox. (Consumed memos are in git history)")
|
|
88
88
|
return
|
|
89
89
|
|
|
90
|
-
# Reverse
|
|
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("
|
|
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.
|
|
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
|
|
monoco/features/memo/core.py
CHANGED
|
@@ -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
|
-
|
|
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.
|
monoco/features/memo/models.py
CHANGED
|
@@ -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
|
-
#
|
|
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
|
-
|
|
3
|
+
轻量级笔记,用于快速记录想法。**信号队列模型** (FEAT-0165)。
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
- **
|
|
8
|
-
-
|
|
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
|
|
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="
|
|
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.
|
|
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
|
+
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
|
-
)
|