monoco-toolkit 0.3.6__py3-none-any.whl → 0.3.10__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/cli/workspace.py +1 -1
- monoco/core/config.py +58 -0
- monoco/core/hooks/__init__.py +19 -0
- monoco/core/hooks/base.py +104 -0
- monoco/core/hooks/builtin/__init__.py +11 -0
- monoco/core/hooks/builtin/git_cleanup.py +266 -0
- monoco/core/hooks/builtin/logging_hook.py +78 -0
- monoco/core/hooks/context.py +131 -0
- monoco/core/hooks/registry.py +222 -0
- monoco/core/injection.py +63 -29
- monoco/core/integrations.py +8 -2
- monoco/core/output.py +5 -5
- monoco/core/registry.py +9 -1
- monoco/core/resource/__init__.py +5 -0
- monoco/core/resource/finder.py +98 -0
- monoco/core/resource/manager.py +91 -0
- monoco/core/resource/models.py +35 -0
- monoco/core/resources/en/{SKILL.md → skills/monoco_core/SKILL.md} +2 -0
- monoco/core/resources/zh/{SKILL.md → skills/monoco_core/SKILL.md} +2 -0
- monoco/core/setup.py +1 -1
- monoco/core/skill_framework.py +292 -0
- monoco/core/skills.py +538 -254
- monoco/core/sync.py +73 -1
- monoco/core/workflow_converter.py +420 -0
- monoco/features/{scheduler → agent}/__init__.py +5 -3
- monoco/features/agent/adapter.py +31 -0
- monoco/features/agent/apoptosis.py +44 -0
- monoco/features/agent/cli.py +296 -0
- monoco/features/agent/config.py +96 -0
- monoco/features/agent/defaults.py +12 -0
- monoco/features/{scheduler → agent}/engines.py +32 -6
- monoco/features/agent/flow_skills.py +281 -0
- monoco/features/agent/manager.py +91 -0
- monoco/features/{scheduler → agent}/models.py +6 -3
- monoco/features/agent/resources/atoms/atom-code-dev.yaml +61 -0
- monoco/features/agent/resources/atoms/atom-issue-lifecycle.yaml +73 -0
- monoco/features/agent/resources/atoms/atom-knowledge.yaml +55 -0
- monoco/features/agent/resources/atoms/atom-review.yaml +60 -0
- monoco/features/agent/resources/en/skills/flow_engineer/SKILL.md +94 -0
- monoco/features/agent/resources/en/skills/flow_manager/SKILL.md +93 -0
- monoco/features/agent/resources/en/skills/flow_planner/SKILL.md +85 -0
- monoco/features/agent/resources/en/skills/flow_reviewer/SKILL.md +114 -0
- monoco/features/agent/resources/roles/role-engineer.yaml +49 -0
- monoco/features/agent/resources/roles/role-manager.yaml +46 -0
- monoco/features/agent/resources/roles/role-planner.yaml +46 -0
- monoco/features/agent/resources/roles/role-reviewer.yaml +47 -0
- monoco/features/agent/resources/workflows/workflow-dev.yaml +83 -0
- monoco/features/agent/resources/workflows/workflow-issue-create.yaml +72 -0
- monoco/features/agent/resources/workflows/workflow-review.yaml +94 -0
- monoco/features/agent/resources/zh/skills/flow_engineer/SKILL.md +94 -0
- monoco/features/agent/resources/zh/skills/flow_manager/SKILL.md +88 -0
- monoco/features/agent/resources/zh/skills/flow_planner/SKILL.md +259 -0
- monoco/features/agent/resources/zh/skills/flow_reviewer/SKILL.md +137 -0
- monoco/features/{scheduler → agent}/session.py +36 -1
- monoco/features/{scheduler → agent}/worker.py +40 -4
- monoco/features/glossary/adapter.py +31 -0
- monoco/features/glossary/config.py +5 -0
- monoco/features/glossary/resources/en/AGENTS.md +29 -0
- monoco/features/glossary/resources/en/skills/monoco_glossary/SKILL.md +35 -0
- monoco/features/glossary/resources/zh/AGENTS.md +29 -0
- monoco/features/glossary/resources/zh/skills/monoco_glossary/SKILL.md +35 -0
- monoco/features/i18n/resources/en/skills/i18n_scan_workflow/SKILL.md +105 -0
- monoco/features/i18n/resources/en/{SKILL.md → skills/monoco_i18n/SKILL.md} +2 -0
- monoco/features/i18n/resources/zh/skills/i18n_scan_workflow/SKILL.md +105 -0
- monoco/features/i18n/resources/zh/{SKILL.md → skills/monoco_i18n/SKILL.md} +2 -0
- monoco/features/issue/commands.py +427 -21
- monoco/features/issue/core.py +140 -1
- monoco/features/issue/criticality.py +553 -0
- monoco/features/issue/domain/models.py +28 -2
- monoco/features/issue/engine/machine.py +75 -15
- monoco/features/issue/git_service.py +185 -0
- monoco/features/issue/linter.py +291 -62
- monoco/features/issue/models.py +50 -2
- monoco/features/issue/resources/en/skills/issue_create_workflow/SKILL.md +167 -0
- monoco/features/issue/resources/en/skills/issue_develop_workflow/SKILL.md +224 -0
- monoco/features/issue/resources/en/skills/issue_lifecycle_workflow/SKILL.md +159 -0
- monoco/features/issue/resources/en/skills/issue_refine_workflow/SKILL.md +203 -0
- monoco/features/issue/resources/en/{SKILL.md → skills/monoco_issue/SKILL.md} +50 -0
- monoco/features/issue/resources/zh/skills/issue_create_workflow/SKILL.md +167 -0
- monoco/features/issue/resources/zh/skills/issue_develop_workflow/SKILL.md +224 -0
- monoco/features/issue/resources/zh/skills/issue_lifecycle_workflow/SKILL.md +159 -0
- monoco/features/issue/resources/zh/skills/issue_refine_workflow/SKILL.md +203 -0
- monoco/features/issue/resources/zh/{SKILL.md → skills/monoco_issue/SKILL.md} +52 -0
- monoco/features/issue/validator.py +185 -65
- monoco/features/memo/__init__.py +2 -1
- monoco/features/memo/adapter.py +32 -0
- monoco/features/memo/cli.py +36 -14
- monoco/features/memo/core.py +59 -0
- monoco/features/memo/resources/en/skills/monoco_memo/SKILL.md +77 -0
- monoco/features/memo/resources/en/skills/note_processing_workflow/SKILL.md +140 -0
- monoco/features/memo/resources/zh/AGENTS.md +8 -0
- monoco/features/memo/resources/zh/skills/monoco_memo/SKILL.md +77 -0
- monoco/features/memo/resources/zh/skills/note_processing_workflow/SKILL.md +140 -0
- monoco/features/spike/resources/en/{SKILL.md → skills/monoco_spike/SKILL.md} +2 -0
- monoco/features/spike/resources/en/skills/research_workflow/SKILL.md +121 -0
- monoco/features/spike/resources/zh/{SKILL.md → skills/monoco_spike/SKILL.md} +2 -0
- monoco/features/spike/resources/zh/skills/research_workflow/SKILL.md +121 -0
- monoco/main.py +2 -3
- monoco_toolkit-0.3.10.dist-info/METADATA +124 -0
- monoco_toolkit-0.3.10.dist-info/RECORD +156 -0
- monoco/features/scheduler/cli.py +0 -285
- monoco/features/scheduler/config.py +0 -68
- monoco/features/scheduler/defaults.py +0 -54
- monoco/features/scheduler/manager.py +0 -49
- monoco/features/scheduler/reliability.py +0 -106
- monoco/features/skills/core.py +0 -102
- monoco_toolkit-0.3.6.dist-info/METADATA +0 -127
- monoco_toolkit-0.3.6.dist-info/RECORD +0 -97
- /monoco/core/{hooks.py → githooks.py} +0 -0
- /monoco/features/{skills → glossary}/__init__.py +0 -0
- {monoco_toolkit-0.3.6.dist-info → monoco_toolkit-0.3.10.dist-info}/WHEEL +0 -0
- {monoco_toolkit-0.3.6.dist-info → monoco_toolkit-0.3.10.dist-info}/entry_points.txt +0 -0
- {monoco_toolkit-0.3.6.dist-info → monoco_toolkit-0.3.10.dist-info}/licenses/LICENSE +0 -0
|
@@ -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
|
-
]
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
from typing import Dict, List, Optional
|
|
2
|
-
import uuid
|
|
3
|
-
from .models import RoleTemplate
|
|
4
|
-
from .worker import Worker
|
|
5
|
-
from .session import Session, RuntimeSession
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class SessionManager:
|
|
9
|
-
"""
|
|
10
|
-
Manages the lifecycle of sessions.
|
|
11
|
-
Responsible for creating, tracking, and retrieving sessions.
|
|
12
|
-
"""
|
|
13
|
-
|
|
14
|
-
def __init__(self):
|
|
15
|
-
# In-memory storage for now. In prod, this might be a DB or file-backed.
|
|
16
|
-
self._sessions: Dict[str, RuntimeSession] = {}
|
|
17
|
-
|
|
18
|
-
def create_session(self, issue_id: str, role: RoleTemplate) -> RuntimeSession:
|
|
19
|
-
session_id = str(uuid.uuid4())
|
|
20
|
-
branch_name = (
|
|
21
|
-
f"agent/{issue_id}/{session_id[:8]}" # Simple branch naming strategy
|
|
22
|
-
)
|
|
23
|
-
|
|
24
|
-
session_model = Session(
|
|
25
|
-
id=session_id,
|
|
26
|
-
issue_id=issue_id,
|
|
27
|
-
role_name=role.name,
|
|
28
|
-
branch_name=branch_name,
|
|
29
|
-
)
|
|
30
|
-
|
|
31
|
-
worker = Worker(role, issue_id)
|
|
32
|
-
runtime = RuntimeSession(session_model, worker)
|
|
33
|
-
self._sessions[session_id] = runtime
|
|
34
|
-
return runtime
|
|
35
|
-
|
|
36
|
-
def get_session(self, session_id: str) -> Optional[RuntimeSession]:
|
|
37
|
-
return self._sessions.get(session_id)
|
|
38
|
-
|
|
39
|
-
def list_sessions(self, issue_id: Optional[str] = None) -> List[RuntimeSession]:
|
|
40
|
-
if issue_id:
|
|
41
|
-
return [s for s in self._sessions.values() if s.model.issue_id == issue_id]
|
|
42
|
-
return list(self._sessions.values())
|
|
43
|
-
|
|
44
|
-
def terminate_session(self, session_id: str):
|
|
45
|
-
session = self.get_session(session_id)
|
|
46
|
-
if session:
|
|
47
|
-
session.terminate()
|
|
48
|
-
# We might want to keep the record for a while, so don't delete immediately
|
|
49
|
-
# del self._sessions[session_id]
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
from pathlib import Path
|
|
2
|
-
from monoco.core.config import get_config
|
|
3
|
-
from .manager import SessionManager
|
|
4
|
-
from .session import RuntimeSession
|
|
5
|
-
from .config import load_scheduler_config
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class ApoptosisManager:
|
|
9
|
-
"""
|
|
10
|
-
Handles the 'Apoptosis' (Programmed Cell Death) lifecycle for agents.
|
|
11
|
-
Ensures that failing agents are killed, analyzed, and the environment is reset.
|
|
12
|
-
"""
|
|
13
|
-
|
|
14
|
-
def __init__(self, session_manager: SessionManager):
|
|
15
|
-
self.session_manager = session_manager
|
|
16
|
-
|
|
17
|
-
# Load roles dynamically based on current project context
|
|
18
|
-
settings = get_config()
|
|
19
|
-
project_root = Path(settings.paths.root).resolve()
|
|
20
|
-
roles = load_scheduler_config(project_root)
|
|
21
|
-
|
|
22
|
-
# Find coroner role
|
|
23
|
-
self.coroner_role = roles.get("coroner")
|
|
24
|
-
|
|
25
|
-
if not self.coroner_role:
|
|
26
|
-
raise ValueError("Coroner role not defined!")
|
|
27
|
-
|
|
28
|
-
def check_health(self, session: RuntimeSession) -> bool:
|
|
29
|
-
"""
|
|
30
|
-
Check if a session is healthy.
|
|
31
|
-
In a real implementation, this would check heartbeat, CPU usage, or token limits.
|
|
32
|
-
"""
|
|
33
|
-
# Placeholder logic: Random failure or external flag?
|
|
34
|
-
# For now, always healthy unless explicitly marked 'crashed' (which we can simulate)
|
|
35
|
-
if hasattr(session, "simulate_crash") and session.simulate_crash:
|
|
36
|
-
return False
|
|
37
|
-
return True
|
|
38
|
-
|
|
39
|
-
def trigger_apoptosis(self, session_id: str):
|
|
40
|
-
"""
|
|
41
|
-
Execute the full death and rebirth cycle.
|
|
42
|
-
"""
|
|
43
|
-
session = self.session_manager.get_session(session_id)
|
|
44
|
-
if not session:
|
|
45
|
-
print(f"Session {session_id} not found for apoptosis.")
|
|
46
|
-
return
|
|
47
|
-
|
|
48
|
-
print(f"💀 [Apoptosis] Starting lifecycle for Session {session_id}")
|
|
49
|
-
|
|
50
|
-
# 1. Kill
|
|
51
|
-
self._kill(session)
|
|
52
|
-
|
|
53
|
-
# 2. Autopsy
|
|
54
|
-
try:
|
|
55
|
-
self._perform_autopsy(session)
|
|
56
|
-
except Exception as e:
|
|
57
|
-
print(f"⚠️ Autopsy failed: {e}")
|
|
58
|
-
|
|
59
|
-
# 3. Reset
|
|
60
|
-
self._reset_environment(session)
|
|
61
|
-
|
|
62
|
-
print(
|
|
63
|
-
f"✅ [Apoptosis] Task {session.model.issue_id} has been reset and analyzed."
|
|
64
|
-
)
|
|
65
|
-
|
|
66
|
-
def _kill(self, session: RuntimeSession):
|
|
67
|
-
print(f"🔪 Killing worker process for {session.model.id}...")
|
|
68
|
-
session.terminate()
|
|
69
|
-
session.model.status = "crashed"
|
|
70
|
-
|
|
71
|
-
def _perform_autopsy(self, victim_session: RuntimeSession):
|
|
72
|
-
print(
|
|
73
|
-
f"🔍 Performing autopsy on {victim_session.model.id} via Coroner agent..."
|
|
74
|
-
)
|
|
75
|
-
|
|
76
|
-
# Start a Coroner session
|
|
77
|
-
coroner_session = self.session_manager.create_session(
|
|
78
|
-
victim_session.model.issue_id, self.coroner_role
|
|
79
|
-
)
|
|
80
|
-
|
|
81
|
-
# Context for the coroner
|
|
82
|
-
context = {
|
|
83
|
-
"description": f"The previous agent session ({victim_session.model.id}) for role '{victim_session.model.role_name}' crashed. Please analyze the environment and the Issue {victim_session.model.issue_id}, then write a ## Post-mortem section in the issue file."
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
coroner_session.start(context=context)
|
|
87
|
-
print("📄 Coroner agent finished analysis.")
|
|
88
|
-
|
|
89
|
-
def _reset_environment(self, session: RuntimeSession):
|
|
90
|
-
print("🧹 Resetting environment (simulated git reset --hard)...")
|
|
91
|
-
# In real impl:
|
|
92
|
-
# import subprocess
|
|
93
|
-
# subprocess.run(["git", "reset", "--hard"], check=True)
|
|
94
|
-
pass
|
|
95
|
-
|
|
96
|
-
def _retry(self, session: RuntimeSession):
|
|
97
|
-
print("🔄 Reincarnating session...")
|
|
98
|
-
# Create a new session with the same role and issue
|
|
99
|
-
new_session = self.session_manager.create_session(
|
|
100
|
-
session.model.issue_id,
|
|
101
|
-
# We need to find the original role object.
|
|
102
|
-
# Simplified: assuming we can find it by name or pass it.
|
|
103
|
-
# For now, just placeholder.
|
|
104
|
-
session.worker.role,
|
|
105
|
-
)
|
|
106
|
-
new_session.start()
|
monoco/features/skills/core.py
DELETED
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
import re
|
|
2
|
-
from pathlib import Path
|
|
3
|
-
from typing import Dict, List, Any
|
|
4
|
-
from rich.console import Console
|
|
5
|
-
|
|
6
|
-
console = Console()
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
def init(root: Path, resources: List[Dict[str, Any]]):
|
|
10
|
-
"""
|
|
11
|
-
Initialize the Skills module.
|
|
12
|
-
|
|
13
|
-
Args:
|
|
14
|
-
root: Project root directory.
|
|
15
|
-
resources: List of resource dicts from modules.
|
|
16
|
-
Expected format:
|
|
17
|
-
{
|
|
18
|
-
"skills": { "name": "content" },
|
|
19
|
-
"prompts": { "name": "content" }
|
|
20
|
-
}
|
|
21
|
-
"""
|
|
22
|
-
skills_root = root / "Toolkit" / "skills"
|
|
23
|
-
skills_root.mkdir(parents=True, exist_ok=True)
|
|
24
|
-
|
|
25
|
-
# 1. Write Skills
|
|
26
|
-
for res in resources:
|
|
27
|
-
if "skills" in res:
|
|
28
|
-
for name, content in res["skills"].items():
|
|
29
|
-
target_dir = skills_root / name
|
|
30
|
-
target_dir.mkdir(exist_ok=True)
|
|
31
|
-
target_file = target_dir / "SKILL.md"
|
|
32
|
-
# Idempotency: Overwrite if content is different? Or just always overwrite?
|
|
33
|
-
# User asked for "scaffold", implies creation.
|
|
34
|
-
# Let's overwrite to ensure extensive "Repair" capability.
|
|
35
|
-
target_file.write_text(content, encoding="utf-8")
|
|
36
|
-
console.print(f"[dim] - Scaffolding skill:[/dim] {name}")
|
|
37
|
-
|
|
38
|
-
# 2. Update Agent Docs
|
|
39
|
-
update_agent_docs(root, resources)
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
def update_agent_docs(root: Path, resources: List[Dict[str, Any]]):
|
|
43
|
-
"""
|
|
44
|
-
Inject prompts into AGENTS.md, GEMINI.md, CLAUDE.md.
|
|
45
|
-
"""
|
|
46
|
-
target_files = ["AGENTS.md", "GEMINI.md", "CLAUDE.md"]
|
|
47
|
-
|
|
48
|
-
# Aggregate Prompts
|
|
49
|
-
aggregated_prompt = "\n\n".join(
|
|
50
|
-
[
|
|
51
|
-
res["prompts"][name]
|
|
52
|
-
for res in resources
|
|
53
|
-
if "prompts" in res
|
|
54
|
-
for name in res["prompts"]
|
|
55
|
-
]
|
|
56
|
-
)
|
|
57
|
-
|
|
58
|
-
injection_content = f"""
|
|
59
|
-
## Monoco Toolkit
|
|
60
|
-
|
|
61
|
-
The following tools and skills are available in this environment.
|
|
62
|
-
|
|
63
|
-
{aggregated_prompt}
|
|
64
|
-
"""
|
|
65
|
-
|
|
66
|
-
for filename in target_files:
|
|
67
|
-
_inject_section(root / filename, injection_content)
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
def _inject_section(file_path: Path, content: str):
|
|
71
|
-
if not file_path.exists():
|
|
72
|
-
# Create if not exists? User said "Edit AGENTS.md...", implies existence.
|
|
73
|
-
# But if we init in a fresh repo, maybe we should create them?
|
|
74
|
-
# Let's create if missing.
|
|
75
|
-
file_path.write_text(f"# Project Guidelines\n{content}", encoding="utf-8")
|
|
76
|
-
console.print(f"[green]✔[/green] Created {file_path.name}")
|
|
77
|
-
return
|
|
78
|
-
|
|
79
|
-
original_content = file_path.read_text(encoding="utf-8")
|
|
80
|
-
|
|
81
|
-
# Regex to find existing section
|
|
82
|
-
# Matches ## Monoco Toolkit ... until next ## or End of String
|
|
83
|
-
pattern = r"(## Monoco Toolkit.*?)(\n## |\Z)"
|
|
84
|
-
|
|
85
|
-
# Check if section exists
|
|
86
|
-
if re.search(pattern, original_content, re.DOTALL):
|
|
87
|
-
# Replace
|
|
88
|
-
new_content = re.sub(
|
|
89
|
-
pattern, f"{content.strip()}\n\n\\2", original_content, flags=re.DOTALL
|
|
90
|
-
)
|
|
91
|
-
if new_content != original_content:
|
|
92
|
-
file_path.write_text(new_content, encoding="utf-8")
|
|
93
|
-
console.print(f"[green]✔[/green] Updated {file_path.name}")
|
|
94
|
-
else:
|
|
95
|
-
console.print(f"[dim] - {file_path.name} is up to date.[/dim]")
|
|
96
|
-
else:
|
|
97
|
-
# Append
|
|
98
|
-
with open(file_path, "a", encoding="utf-8") as f:
|
|
99
|
-
if not original_content.endswith("\n"):
|
|
100
|
-
f.write("\n")
|
|
101
|
-
f.write(content)
|
|
102
|
-
console.print(f"[green]✔[/green] Appended to {file_path.name}")
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: monoco-toolkit
|
|
3
|
-
Version: 0.3.6
|
|
4
|
-
Summary: Agent Native Toolkit for Monoco - Task Management & Kanban for AI Agents
|
|
5
|
-
Project-URL: Homepage, https://monoco.io
|
|
6
|
-
Project-URL: Repository, https://github.com/IndenScale/Monoco
|
|
7
|
-
Project-URL: Documentation, https://monoco.io/docs
|
|
8
|
-
Project-URL: Issues, https://github.com/IndenScale/Monoco/issues
|
|
9
|
-
Author-email: Monoco Team <dev@monoco.io>
|
|
10
|
-
License-Expression: MIT
|
|
11
|
-
License-File: LICENSE
|
|
12
|
-
Keywords: agent-native,ai-agents,cli,kanban,monoco,task-management,workflow
|
|
13
|
-
Classifier: Development Status :: 3 - Alpha
|
|
14
|
-
Classifier: Intended Audience :: Developers
|
|
15
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
-
Classifier: Programming Language :: Python :: 3
|
|
17
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
18
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
-
Classifier: Topic :: Office/Business :: Groupware
|
|
21
|
-
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
22
|
-
Classifier: Topic :: Software Development :: Quality Assurance
|
|
23
|
-
Requires-Python: >=3.10
|
|
24
|
-
Requires-Dist: fastapi>=0.100.0
|
|
25
|
-
Requires-Dist: httpx>=0.28.1
|
|
26
|
-
Requires-Dist: prompt-toolkit>=3.0.0
|
|
27
|
-
Requires-Dist: pydantic>=2.0.0
|
|
28
|
-
Requires-Dist: pyyaml>=6.0
|
|
29
|
-
Requires-Dist: rich>=13.0.0
|
|
30
|
-
Requires-Dist: sse-starlette>=1.6.0
|
|
31
|
-
Requires-Dist: typer[all]>=0.9.0
|
|
32
|
-
Requires-Dist: uvicorn[standard]>=0.20.0
|
|
33
|
-
Requires-Dist: watchdog>=6.0.0
|
|
34
|
-
Description-Content-Type: text/markdown
|
|
35
|
-
|
|
36
|
-
# Monoco Toolkit
|
|
37
|
-
|
|
38
|
-
[](https://pypi.org/project/monoco-toolkit/)
|
|
39
|
-
[](LICENSE)
|
|
40
|
-
|
|
41
|
-
> **The Operating System for Agentic Engineering.**
|
|
42
|
-
>
|
|
43
|
-
> Stop chatting. Start building.
|
|
44
|
-
> Monoco grounds your AI Agents into deterministic, validatable, and shippable engineering workflows.
|
|
45
|
-
|
|
46
|
-
---
|
|
47
|
-
|
|
48
|
-
## ⚡️ The Gap: "Chat" is not Engineering.
|
|
49
|
-
|
|
50
|
-
Generating code is easy. **Engineering**—managing dependencies, maintaining state, validation, and version control—is hard.
|
|
51
|
-
|
|
52
|
-
Most Agent workflows today are fragile "chats". Monoco turns them into **Software Engineering Processes**. It acts as the "BizOps" layer for your Agents, ensuring that every line of code generated is tracked, reviewed, and aligned with the project roadmap.
|
|
53
|
-
|
|
54
|
-
## 🌟 Core Philosophy
|
|
55
|
-
|
|
56
|
-
### 1. Co-pilot by Design
|
|
57
|
-
|
|
58
|
-
**Just-enough Automation.**
|
|
59
|
-
Monoco abstracts away the tedious details (Git ops, state tracking) while keeping you securely in the driver's seat. Agents can suggest and build, but **you** always have the final say on what gets merged.
|
|
60
|
-
|
|
61
|
-
### 2. Battle-Tested Best Practices
|
|
62
|
-
|
|
63
|
-
**Senior Engineer Intuition.**
|
|
64
|
-
Monoco enforces **Issue Driven Development (IDD)** and standard **Git Workflows**. We bake the rigorous habits of effective software teams into the Agent's core loop, ensuring every line of code is traceable and reviewed.
|
|
65
|
-
|
|
66
|
-
### 3. Radical Transparency (Dogfooding)
|
|
67
|
-
|
|
68
|
-
**Process as Product.**
|
|
69
|
-
Monoco is built by Monoco. We believe in open-sourcing not just the code, but the engineering process itself. Every design decision, interaction log, and failure is public—providing a live blueprint for Agentic Engineering.
|
|
70
|
-
|
|
71
|
-
## 🚀 Quick Start
|
|
72
|
-
|
|
73
|
-
### 1. Installation
|
|
74
|
-
|
|
75
|
-
Monoco is available as a Python CLI tool.
|
|
76
|
-
|
|
77
|
-
```bash
|
|
78
|
-
pip install monoco-toolkit
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
### 2. Workspace Initialization
|
|
82
|
-
|
|
83
|
-
Turn any directory into a Monoco Workspace. This creates the `.monoco` config and the `Issues/` directory.
|
|
84
|
-
|
|
85
|
-
```bash
|
|
86
|
-
monoco init
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
### 3. Agent Synchronization
|
|
90
|
-
|
|
91
|
-
**Crucial Step**: This injects the "Monoco System Neural Network" (System Prompts & Skills) into your agent configuration files (e.g., `GEMINI.md`, `CLAUDE.md`).
|
|
92
|
-
|
|
93
|
-
```bash
|
|
94
|
-
monoco sync
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
### 4. The Engineering Loop (Agent-First)
|
|
98
|
-
|
|
99
|
-
In Monoco, you don't need to memorize CLI commands. **The Agent is your DevOps Engineer.**
|
|
100
|
-
|
|
101
|
-
1. **Chat**: Tell your Agent in the chatbox (e.g., _"Implement Dark Mode"_).
|
|
102
|
-
2. **Plan**: The Agent investigates and proposes an **Issue Ticket** for your review.
|
|
103
|
-
3. **Build**: Once approved, the Agent creates a branch, writes code, and submits changes.
|
|
104
|
-
4. **Ship**: You accept the results. The Agent handles the merge and closure.
|
|
105
|
-
|
|
106
|
-
---
|
|
107
|
-
|
|
108
|
-
## 📦 Extension for VS Code
|
|
109
|
-
|
|
110
|
-
The **Monoco VS Code Extension** is the primary visual interface for the toolkit.
|
|
111
|
-
|
|
112
|
-
- **Install from Marketplace**: Search for `Monoco`.
|
|
113
|
-
- **Keybinding**: `Cmd+Shift+P` -> `Monoco: Open Kanban Board`.
|
|
114
|
-
|
|
115
|
-
## 🛠️ Tech Stack & Architecture
|
|
116
|
-
|
|
117
|
-
- **Core**: Python (CLI & Logic Layer)
|
|
118
|
-
- **Extension**: TypeScript (VS Code Client & LSP)
|
|
119
|
-
- **Data**: Local Filesystem (Markdown/YAML)
|
|
120
|
-
|
|
121
|
-
## 🤝 Contributing
|
|
122
|
-
|
|
123
|
-
Monoco is designed for the community. We welcome contributions to both the core CLI and the VS Code extension.
|
|
124
|
-
|
|
125
|
-
## 📄 License
|
|
126
|
-
|
|
127
|
-
MIT © [IndenScale](https://github.com/IndenScale)
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
monoco/main.py,sha256=IF8pN71fFL0AwxtnRxXQaoi9NgBf0YAhppWlc8SuiTM,5688
|
|
2
|
-
monoco/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
|
-
monoco/cli/project.py,sha256=FqLaDD3hiWxa0_TKzxEF7PYH9RPsvmLyjO3NYVckgGs,2737
|
|
4
|
-
monoco/cli/workspace.py,sha256=1TVVS835XyirLDvBGQXSblIaYVhe2Pk9EpORDvcktyk,1538
|
|
5
|
-
monoco/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
|
-
monoco/core/config.py,sha256=M9F5De2FUgaIxFwqZBoJUXsMsph31rNh-4U-k_9rUHA,13543
|
|
7
|
-
monoco/core/execution.py,sha256=7522s7uVWiNdMKtWlIb8JHzbAcJgLVuxUFp_6VmhWNQ,1801
|
|
8
|
-
monoco/core/feature.py,sha256=bcK0C1CaQgNLcdMF0RuniaaQRCYSA-0JdOpQz9W_1xM,1968
|
|
9
|
-
monoco/core/git.py,sha256=d3A8L30nlEj0F1pwSHk_cOoRYi1dMCiZc7KD70ViMyw,8335
|
|
10
|
-
monoco/core/hooks.py,sha256=QY4c74LIYDtcjtWYax1PrK5CtVNKYTfVVVBOj-SCulo,1826
|
|
11
|
-
monoco/core/injection.py,sha256=zs9RpXaBfwP-fbwOU_X2nm-AH94tQN9tVWXNtV4tCYM,6887
|
|
12
|
-
monoco/core/integrations.py,sha256=ifSz7I87DXHF-eHLyXRN3pY1-Kh8IjvMyIrG9iogGpw,7744
|
|
13
|
-
monoco/core/lsp.py,sha256=GOrHzubkMWS3iBpP4H2fTFW-0JXa6D2YlU0ZEhp5zmY,2018
|
|
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
|
|
18
|
-
monoco/core/state.py,sha256=dfoTH1Sj_TSjtTEXuv4w0ZOp_Fd30XNymVSZo30Xshg,1820
|
|
19
|
-
monoco/core/sync.py,sha256=1p37pTfGBanogzcLhdTfMTxDqq79B5iiwiPS4fiuQaA,8378
|
|
20
|
-
monoco/core/telemetry.py,sha256=GQDbtgrZwAL1ZpjgbJZuawbTyH6J0NjMXMi4ogq-Ang,2915
|
|
21
|
-
monoco/core/workspace.py,sha256=H_PHD5A0HZFq841u1JtLoFjkXdQg9D6x6I7QcFtJge4,3000
|
|
22
|
-
monoco/core/resources/en/AGENTS.md,sha256=vf9z43UU-LPwYKPWCrtw8TpWrmkeZ6zfMyHP4Q9JqdQ,1178
|
|
23
|
-
monoco/core/resources/en/SKILL.md,sha256=wBXNpPqATOxO8TGiOM8S091gMNZ8du_WhQubO6TfNyg,3504
|
|
24
|
-
monoco/core/resources/zh/AGENTS.md,sha256=KBNZSCPBIals6jDdvG5wJgjZuswi_1nKljggJSMtfy8,1156
|
|
25
|
-
monoco/core/resources/zh/SKILL.md,sha256=1D8_FqzDVqowZWk4Qkyx4me53NTd8qihP20gaCH6gJY,3153
|
|
26
|
-
monoco/daemon/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
27
|
-
monoco/daemon/app.py,sha256=tAtLxzw_aRzU0r6Bk9lhshaCyqZRkQKUJmg5FDi7-1c,15431
|
|
28
|
-
monoco/daemon/commands.py,sha256=2AGsqDZ0edg34KuAGZrTvKlJZ1fhxNXgus7vGn2km4c,1115
|
|
29
|
-
monoco/daemon/models.py,sha256=E-qwebvD-Z-VixFEl067ZDENGmAVOjrin9XV6HLSI5k,988
|
|
30
|
-
monoco/daemon/reproduce_stats.py,sha256=LghJ8o1jTeDpA1zVPI2vF0okGU3h4esEI1thNa6shKI,1196
|
|
31
|
-
monoco/daemon/services.py,sha256=jkkDwX5mBRiy4DZPNxWmHNe_EE-hiX53FoIlWGiCBoM,5070
|
|
32
|
-
monoco/daemon/stats.py,sha256=XTtuFWx68O1OA44SmN0BGVa6sswts2ExmkiavUzCYiA,4800
|
|
33
|
-
monoco/features/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
34
|
-
monoco/features/config/commands.py,sha256=i6_fKhSGLeO8RCbWrYKxelFgaHWcPiQERS2uxUdq7H0,4894
|
|
35
|
-
monoco/features/i18n/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
36
|
-
monoco/features/i18n/adapter.py,sha256=-ifDKQ7UH8tDoOdB_fSKoIrNRJROIPNuzZor2FPJVfo,932
|
|
37
|
-
monoco/features/i18n/commands.py,sha256=NJ2lZRRjiTW-3UbqxhEKURdWSDxQPkfnBAUgnwoVCL8,8416
|
|
38
|
-
monoco/features/i18n/core.py,sha256=bnEV9D7KgxbC5I3l-1RN1-H8hek1loDL6KFXzmdq0pQ,9658
|
|
39
|
-
monoco/features/i18n/resources/en/AGENTS.md,sha256=zzuF7BW6x8Mj6LZZmeM6wTbG5CSCDMShf4rwtN7XITg,197
|
|
40
|
-
monoco/features/i18n/resources/en/SKILL.md,sha256=Z8fAAqeMvpLDw1D_9AzZIykS5-HLVM9nnlRZLWBTPqM,2203
|
|
41
|
-
monoco/features/i18n/resources/zh/AGENTS.md,sha256=lKkwLLCADRH7UDq9no4eQY2sRfJrb64JoZ_HNved8vA,175
|
|
42
|
-
monoco/features/i18n/resources/zh/SKILL.md,sha256=Wynk7zVBW7CO0_6AEQNUvlD_3eMW_7EPnzEn9QUaiDs,1884
|
|
43
|
-
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
|
|
46
|
-
monoco/features/issue/domain_commands.py,sha256=eatSF_uZp4nGpVr2PIgb00MWfEBm0OnyAd4JvUJEAAA,1535
|
|
47
|
-
monoco/features/issue/domain_service.py,sha256=bEs_WXOWmotgIR-lGwyWekF4nonvjsgrK1YG3pyVfwk,2564
|
|
48
|
-
monoco/features/issue/linter.py,sha256=LLtJEVIzoGTNm1liZARJHM3-V-EODkGRuw3ExCZtEjY,26115
|
|
49
|
-
monoco/features/issue/migration.py,sha256=i0xlxZjrpmuHGHOAIN4iu31EwwVIvZn7yjveS-kU22c,4896
|
|
50
|
-
monoco/features/issue/models.py,sha256=pIgun9dDTelDJa6RqhLJb2OR201cimOoNEB78qUsvG0,7286
|
|
51
|
-
monoco/features/issue/monitor.py,sha256=vZN0TbR3V5fHKHRGkIhimO6UwWcwYjDHQs2qzjEG174,3549
|
|
52
|
-
monoco/features/issue/resolver.py,sha256=mAU9s7TNNHY9A2278JTwJvxU-jalGKTDJfJdjONev3E,5655
|
|
53
|
-
monoco/features/issue/test_priority_integration.py,sha256=pTBg3Wjv6lLYxWL6vjbo2NGVE-X0MRB3Ha8bqObZrU4,2791
|
|
54
|
-
monoco/features/issue/test_resolver.py,sha256=luFhK37DUvh4a3TTcFYVO-oOIJljQVCSYicwSWyDleQ,2530
|
|
55
|
-
monoco/features/issue/validator.py,sha256=GYqbx2-ZxXfk1HicgBXkpL__v83KK-jcOyo7eW-VRUs,27793
|
|
56
|
-
monoco/features/issue/domain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
57
|
-
monoco/features/issue/domain/lifecycle.py,sha256=oIuLYTVy1RRHGngAzbNU4kTWOHMBhjuw_TuYCwNqMJw,4991
|
|
58
|
-
monoco/features/issue/domain/models.py,sha256=2vuSAGaFrbAEkQapwkGG_T8cHlsmARN71fTA44PIVSM,5850
|
|
59
|
-
monoco/features/issue/domain/parser.py,sha256=axfB9BjY-m4DQqYwTQBm_38plOidZaDqFtsIejW_kYI,9095
|
|
60
|
-
monoco/features/issue/domain/workspace.py,sha256=nyTEFNmpLPuX7nssMCBiFI1XBhY9zbqG877Ppp_s0Fg,3658
|
|
61
|
-
monoco/features/issue/engine/__init__.py,sha256=-SBvzjlZJz0O-IB1c95d9pbhr3lydJNLq2vhnfkZ8PQ,747
|
|
62
|
-
monoco/features/issue/engine/config.py,sha256=7enjPW4J_fpuK08ov6LpfQ-9h2T1D4Hc5yIXOPuQvLs,5761
|
|
63
|
-
monoco/features/issue/engine/machine.py,sha256=BTYjp8NQAzu8JVP95bQdkOLrJjFsRNR7uC8tjsUTqCk,6393
|
|
64
|
-
monoco/features/issue/engine/models.py,sha256=595Sx3ncrpg_PhnbBLthohAvuhnjA-_9oXcrsT6Lv0k,574
|
|
65
|
-
monoco/features/issue/lsp/__init__.py,sha256=8bl8-WzSj3C4SkPKgVGnCeyemmvHVWBsuMZsJuJggG8,77
|
|
66
|
-
monoco/features/issue/lsp/definition.py,sha256=cF6Quw1OztuKMJ1zLvgA_ek7lTAdzHF0m4LVznpbAPw,3203
|
|
67
|
-
monoco/features/issue/resources/en/AGENTS.md,sha256=eHHXjLRDAV7IKrYPQSilxu0X5D0SBCAFBXmlSoc9r48,1278
|
|
68
|
-
monoco/features/issue/resources/en/SKILL.md,sha256=M5khTJdraQenX0tf7RHOVcqyKHC285qwDzWdsCJ7XPI,4032
|
|
69
|
-
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
|
|
86
|
-
monoco/features/spike/adapter.py,sha256=ZIpw-xNVoA2IIP18dbR-dmQGbQmK5ua_P-uGXuDjCeI,1021
|
|
87
|
-
monoco/features/spike/commands.py,sha256=EuJ7trDaobIe7ae7pJ-ftpo_cO8-19R_fAZZCh2JcMg,3871
|
|
88
|
-
monoco/features/spike/core.py,sha256=OuNWXQ-cBttP2oIF0B5iy0aEUH2MUMyGANG8ayEmjPo,4120
|
|
89
|
-
monoco/features/spike/resources/en/AGENTS.md,sha256=NG3CMnlDk_0J8hnRUcueAM9lgIQr_dZ42R_31-LC48E,306
|
|
90
|
-
monoco/features/spike/resources/en/SKILL.md,sha256=qKDcVh0D3pDRvfNLh1Bzo4oQU3obpl4tqdlzxeiWYMk,1911
|
|
91
|
-
monoco/features/spike/resources/zh/AGENTS.md,sha256=5RHNl7fc3RdYYTFH483ojJl_arGPKkyYziOuGgFbqqg,290
|
|
92
|
-
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|