loop-agent-cli 0.1.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 (84) hide show
  1. app/__init__.py +0 -0
  2. app/agents/__init__.py +0 -0
  3. app/agents/graph.py +40 -0
  4. app/agents/nodes.py +245 -0
  5. app/agents/state.py +19 -0
  6. app/api/__init__.py +0 -0
  7. app/api/candidates.py +49 -0
  8. app/api/dashboard.py +7 -0
  9. app/api/outreach.py +7 -0
  10. app/api/pipelines.py +58 -0
  11. app/api/positions.py +76 -0
  12. app/api/router.py +14 -0
  13. app/api/scheduler.py +7 -0
  14. app/api/skills.py +7 -0
  15. app/api/system.py +7 -0
  16. app/core/__init__.py +0 -0
  17. app/core/config.py +18 -0
  18. app/core/exception_handler.py +91 -0
  19. app/core/exceptions.py +33 -0
  20. app/core/logging.py +19 -0
  21. app/database/__init__.py +0 -0
  22. app/database/base.py +4 -0
  23. app/database/session.py +20 -0
  24. app/main.py +72 -0
  25. app/models/__init__.py +0 -0
  26. app/models/agent_run.py +18 -0
  27. app/models/candidate.py +28 -0
  28. app/models/node_log.py +18 -0
  29. app/models/outreach_log.py +16 -0
  30. app/models/pipeline.py +21 -0
  31. app/models/position.py +22 -0
  32. app/models/scheduler_job.py +16 -0
  33. app/models/skill.py +13 -0
  34. app/models/system_config.py +12 -0
  35. app/repositories/__init__.py +0 -0
  36. app/repositories/agent_run.py +74 -0
  37. app/repositories/candidate.py +84 -0
  38. app/repositories/node_log.py +57 -0
  39. app/repositories/outreach_log.py +60 -0
  40. app/repositories/pipeline.py +80 -0
  41. app/repositories/position.py +67 -0
  42. app/repositories/scheduler_job.py +74 -0
  43. app/schemas/__init__.py +0 -0
  44. app/schemas/agent_run.py +32 -0
  45. app/schemas/candidate.py +58 -0
  46. app/schemas/node_log.py +31 -0
  47. app/schemas/outreach_log.py +28 -0
  48. app/schemas/pipeline.py +34 -0
  49. app/schemas/position.py +49 -0
  50. app/schemas/scheduler_job.py +29 -0
  51. app/services/__init__.py +0 -0
  52. app/services/candidate.py +58 -0
  53. app/services/dashboard.py +230 -0
  54. app/services/email.py +116 -0
  55. app/services/health.py +105 -0
  56. app/services/pipeline.py +75 -0
  57. app/services/position.py +36 -0
  58. app/services/runner.py +292 -0
  59. app/services/scheduler.py +174 -0
  60. app/services/score.py +155 -0
  61. app/services/search.py +92 -0
  62. app/skills/base.py +30 -0
  63. app/skills/github.py +106 -0
  64. app/skills/registry.py +51 -0
  65. app/tests/__init__.py +3 -0
  66. app/tests/conftest.py +96 -0
  67. app/tests/generate_report.py +144 -0
  68. app/tests/test_candidates.py +158 -0
  69. app/tests/test_dashboard.py +27 -0
  70. app/tests/test_outreach.py +15 -0
  71. app/tests/test_pipelines.py +249 -0
  72. app/tests/test_positions.py +183 -0
  73. app/tests/test_scheduler.py +15 -0
  74. app/tests/test_skills.py +15 -0
  75. app/tests/test_system.py +35 -0
  76. app/utils/__init__.py +0 -0
  77. loop_agent_cli/__init__.py +5 -0
  78. loop_agent_cli/cli.py +728 -0
  79. loop_agent_cli/container.py +191 -0
  80. loop_agent_cli-0.1.0.dist-info/METADATA +202 -0
  81. loop_agent_cli-0.1.0.dist-info/RECORD +84 -0
  82. loop_agent_cli-0.1.0.dist-info/WHEEL +5 -0
  83. loop_agent_cli-0.1.0.dist-info/entry_points.txt +2 -0
  84. loop_agent_cli-0.1.0.dist-info/top_level.txt +2 -0
@@ -0,0 +1,191 @@
1
+ """
2
+ DI Container — builds and owns all Repository / Service instances.
3
+
4
+ Usage::
5
+
6
+ async with Container(db_url) as c:
7
+ positions = await c.position_repo.get_all()
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import sys
13
+ import os
14
+ from pathlib import Path
15
+ from typing import Optional, Any
16
+
17
+ # ---------------------------------------------------------------------------
18
+ # Ensure the project root (parent of *this* package's parent) is on sys.path
19
+ # so that ``import app.…`` works even when the CLI is installed via pip
20
+ # without the project root being the cwd.
21
+ # ---------------------------------------------------------------------------
22
+ _PROJECT_ROOT = str(Path(__file__).resolve().parent.parent)
23
+ if _PROJECT_ROOT not in sys.path:
24
+ sys.path.insert(0, _PROJECT_ROOT)
25
+
26
+ from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession # noqa: E402
27
+ from sqlalchemy.orm import sessionmaker # noqa: E402
28
+
29
+ from app.core.config import settings # noqa: E402
30
+ from app.database.base import Base # noqa: E402
31
+
32
+ # Repositories # noqa: E402
33
+ from app.repositories.position import PositionRepository # noqa: E402
34
+ from app.repositories.candidate import CandidateRepository # noqa: E402
35
+ from app.repositories.pipeline import PipelineRepository # noqa: E402
36
+ from app.repositories.outreach_log import OutreachLogRepository # noqa: E402
37
+ from app.repositories.agent_run import AgentRunRepository # noqa: E402
38
+ from app.repositories.node_log import NodeLogRepository # noqa: E402
39
+ from app.repositories.scheduler_job import SchedulerJobRepository # noqa: E402
40
+
41
+ # Services # noqa: E402
42
+ from app.services.candidate import CandidateService # noqa: E402
43
+ from app.services.search import SearchService # noqa: E402
44
+ from app.services.score import ScoreService # noqa: E402
45
+ from app.services.pipeline import PipelineService # noqa: E402
46
+ from app.services.email import EmailService # noqa: E402
47
+ from app.services.position import PositionService # noqa: E402
48
+ from app.services.dashboard import DashboardService # noqa: E402
49
+ from app.services.runner import RunnerService # noqa: E402
50
+ from app.services.scheduler import SchedulerService # noqa: E402
51
+
52
+
53
+ class Container:
54
+ """Async context-manager that provides repositories and services."""
55
+
56
+ def __init__(self, db_url: Optional[str] = None) -> None:
57
+ self._db_url: str = db_url or settings.database_url
58
+ self._engine: Any = None
59
+ self._session_factory: Any = None
60
+ self._db: Optional[AsyncSession] = None
61
+
62
+ # ------------------------------------------------------------------
63
+ # Lifecycle
64
+ # ------------------------------------------------------------------
65
+
66
+ async def __aenter__(self) -> "Container":
67
+ self._engine = create_async_engine(
68
+ self._db_url,
69
+ echo=False,
70
+ pool_pre_ping=True,
71
+ pool_recycle=300,
72
+ )
73
+ self._session_factory = sessionmaker(
74
+ self._engine, class_=AsyncSession, expire_on_commit=False,
75
+ )
76
+ # Ensure tables exist
77
+ async with self._engine.begin() as conn:
78
+ await conn.run_sync(Base.metadata.create_all)
79
+ self._db = self._session_factory()
80
+ return self
81
+
82
+ async def __aexit__(
83
+ self,
84
+ exc_type: Optional[type],
85
+ exc_val: Optional[BaseException],
86
+ exc_tb: Any,
87
+ ) -> None:
88
+ if self._db is not None:
89
+ await self._db.close()
90
+ if self._engine is not None:
91
+ await self._engine.dispose()
92
+
93
+ # ------------------------------------------------------------------
94
+ # Repositories (7)
95
+ # ------------------------------------------------------------------
96
+
97
+ @property
98
+ def position_repo(self) -> PositionRepository:
99
+ assert self._db is not None
100
+ return PositionRepository(self._db)
101
+
102
+ @property
103
+ def candidate_repo(self) -> CandidateRepository:
104
+ assert self._db is not None
105
+ return CandidateRepository(self._db)
106
+
107
+ @property
108
+ def pipeline_repo(self) -> PipelineRepository:
109
+ assert self._db is not None
110
+ return PipelineRepository(self._db)
111
+
112
+ @property
113
+ def outreach_log_repo(self) -> OutreachLogRepository:
114
+ assert self._db is not None
115
+ return OutreachLogRepository(self._db)
116
+
117
+ @property
118
+ def agent_run_repo(self) -> AgentRunRepository:
119
+ assert self._db is not None
120
+ return AgentRunRepository(self._db)
121
+
122
+ @property
123
+ def node_log_repo(self) -> NodeLogRepository:
124
+ assert self._db is not None
125
+ return NodeLogRepository(self._db)
126
+
127
+ @property
128
+ def scheduler_job_repo(self) -> SchedulerJobRepository:
129
+ assert self._db is not None
130
+ return SchedulerJobRepository(self._db)
131
+
132
+ # ------------------------------------------------------------------
133
+ # Services (7 + 2 composite)
134
+ # ------------------------------------------------------------------
135
+
136
+ @property
137
+ def candidate_service(self) -> CandidateService:
138
+ return CandidateService(self.candidate_repo)
139
+
140
+ @property
141
+ def search_service(self) -> SearchService:
142
+ return SearchService(self.candidate_service)
143
+
144
+ @property
145
+ def score_service(self) -> ScoreService:
146
+ return ScoreService()
147
+
148
+ @property
149
+ def pipeline_service(self) -> PipelineService:
150
+ return PipelineService(self.pipeline_repo)
151
+
152
+ @property
153
+ def email_service(self) -> EmailService:
154
+ return EmailService(self.outreach_log_repo)
155
+
156
+ @property
157
+ def position_service(self) -> PositionService:
158
+ return PositionService(self.position_repo)
159
+
160
+ @property
161
+ def dashboard_service(self) -> DashboardService:
162
+ return DashboardService(
163
+ position_repo=self.position_repo,
164
+ agent_run_repo=self.agent_run_repo,
165
+ pipeline_repo=self.pipeline_repo,
166
+ candidate_repo=self.candidate_repo,
167
+ node_log_repo=self.node_log_repo,
168
+ )
169
+
170
+ @property
171
+ def runner(self) -> RunnerService:
172
+ return RunnerService(
173
+ search_service=self.search_service,
174
+ score_service=self.score_service,
175
+ pipeline_service=self.pipeline_service,
176
+ email_service=self.email_service,
177
+ candidate_repo=self.candidate_repo,
178
+ position_repo=self.position_repo,
179
+ pipeline_repo=self.pipeline_repo,
180
+ outreach_log_repo=self.outreach_log_repo,
181
+ agent_run_repo=self.agent_run_repo,
182
+ node_log_repo=self.node_log_repo,
183
+ )
184
+
185
+ @property
186
+ def scheduler(self) -> SchedulerService:
187
+ return SchedulerService(
188
+ position_repo=self.position_repo,
189
+ job_repo=self.scheduler_job_repo,
190
+ runner_service=self.runner,
191
+ )
@@ -0,0 +1,202 @@
1
+ Metadata-Version: 2.4
2
+ Name: loop-agent-cli
3
+ Version: 0.1.0
4
+ Summary: Typer + Rich CLI for recruit-loop-agent — run recruiting loops from the terminal
5
+ Author-email: Chandler Song <275737875@qq.com>
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/Chandler-Song/recruit-loop-agent
8
+ Project-URL: Repository, https://github.com/Chandler-Song/recruit-loop-agent
9
+ Project-URL: Issues, https://github.com/Chandler-Song/recruit-loop-agent/issues
10
+ Keywords: recruiting,agent,cli,typer,langgraph
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.9
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
21
+ Requires-Python: >=3.9
22
+ Description-Content-Type: text/markdown
23
+ Requires-Dist: typer>=0.9.0
24
+ Requires-Dist: rich>=13.0.0
25
+ Requires-Dist: fastapi>=0.104.0
26
+ Requires-Dist: sqlalchemy[asyncio]>=2.0.23
27
+ Requires-Dist: aiosqlite>=0.19.0
28
+ Requires-Dist: pydantic>=2.5.0
29
+ Requires-Dist: pydantic-settings>=2.1.0
30
+ Requires-Dist: httpx>=0.25.0
31
+ Requires-Dist: langgraph>=0.0.40
32
+ Requires-Dist: apscheduler>=3.10.0
33
+ Requires-Dist: python-dotenv>=1.0.0
34
+ Requires-Dist: cryptography>=41.0.0
35
+
36
+ # loop-agent-cli
37
+
38
+ > Typer + Rich CLI for [recruit-loop-agent](https://github.com/Chandler-Song/recruit-loop-agent) — 在终端中完成招聘循环的全部操作,无需启动 FastAPI Web 服务。
39
+
40
+ ## 功能特性
41
+
42
+ - **零服务依赖**:不启动 uvicorn,直接在进程内调用核心引擎
43
+ - **完整功能覆盖**:职位管理、候选人查看、管道操作、循环执行、调度控制、仪表盘
44
+ - **终端友好**:Rich 彩色表格/面板,结构化输出
45
+
46
+ ## 安装
47
+
48
+ ```bash
49
+ # 从 PyPI 安装(正式发布后)
50
+ pip install loop-agent-cli
51
+
52
+ # 开发模式安装(从项目根目录)
53
+ cd recruit-loop-agent
54
+ pip install -e .
55
+ ```
56
+
57
+ ## 前置条件
58
+
59
+ - Python >= 3.11
60
+ - `.env` 文件需存在于项目根目录(配置 `GITHUB_TOKEN`、`SMTP_*` 等)
61
+ - 项目根目录需包含 `app/` 核心引擎包
62
+
63
+ ## 使用示例
64
+
65
+ ### 查看帮助
66
+
67
+ ```bash
68
+ loop-agent --help
69
+ ```
70
+
71
+ ### 职位管理
72
+
73
+ ```bash
74
+ # 列出所有职位
75
+ loop-agent position list
76
+
77
+ # 创建新职位
78
+ loop-agent position create -t "Senior Backend Engineer" -c "Tech Corp" \
79
+ -s "Python,FastAPI,PostgreSQL" -k "backend,python,remote"
80
+
81
+ # 查看职位详情
82
+ loop-agent position show <position_id>
83
+
84
+ # 关闭职位
85
+ loop-agent position close <position_id>
86
+ ```
87
+
88
+ ### 执行招聘循环
89
+
90
+ ```bash
91
+ # 对已有职位执行一次循环
92
+ loop-agent run position <position_id>
93
+
94
+ # 创建职位并立即执行循环
95
+ loop-agent run create-and-run -t "Python Developer" -c "Startup Inc" \
96
+ -s "Python,Django" -i 30
97
+ ```
98
+
99
+ ### 候选人管理
100
+
101
+ ```bash
102
+ # 列出候选人(默认 20 条)
103
+ loop-agent candidate list -n 10
104
+
105
+ # 查看候选人详情
106
+ loop-agent candidate show <candidate_id>
107
+ ```
108
+
109
+ ### 管道管理
110
+
111
+ ```bash
112
+ # 列出所有管道
113
+ loop-agent pipeline list
114
+
115
+ # 按职位过滤
116
+ loop-agent pipeline list -p <position_id>
117
+
118
+ # 更新管道状态
119
+ loop-agent pipeline update-status <pipeline_id> contacted
120
+ ```
121
+
122
+ ### 调度管理
123
+
124
+ ```bash
125
+ # 启动后台调度器(Ctrl+C 退出)
126
+ loop-agent schedule start
127
+
128
+ # 列出调度任务
129
+ loop-agent schedule list
130
+ ```
131
+
132
+ ### 仪表盘
133
+
134
+ ```bash
135
+ # 查看仪表盘摘要
136
+ loop-agent dashboard
137
+ ```
138
+
139
+ ### 其他
140
+
141
+ ```bash
142
+ # 显示 LangGraph 图结构
143
+ loop-agent graph
144
+
145
+ # 显示版本信息
146
+ loop-agent version
147
+ ```
148
+
149
+ ### 全局选项
150
+
151
+ ```bash
152
+ # 覆盖数据库路径
153
+ loop-agent --db sqlite+aiosqlite:///./custom.db position list
154
+ ```
155
+
156
+ ## 命令树
157
+
158
+ ```
159
+ loop-agent
160
+ ├── run 执行招聘循环
161
+ │ ├── position <position_id> 对已有职位执行一次循环
162
+ │ └── create-and-run 创建职位并立即执行循环
163
+ ├── position 职位管理
164
+ │ ├── list 列出所有职位
165
+ │ ├── create 创建新职位
166
+ │ ├── show <position_id> 查看职位详情
167
+ │ └── close <position_id> 关闭职位
168
+ ├── candidate 候选人管理
169
+ │ ├── list 列出候选人
170
+ │ └── show <candidate_id> 查看候选人详情
171
+ ├── pipeline 招聘管道管理
172
+ │ ├── list 列出管道
173
+ │ └── update-status 更新管道状态
174
+ ├── schedule 调度管理
175
+ │ ├── start 启动后台调度器
176
+ │ └── list 列出调度任务
177
+ ├── dashboard 查看仪表盘摘要
178
+ ├── graph 显示 LangGraph 图结构
179
+ └── version 显示版本信息
180
+ ```
181
+
182
+ ## 开发
183
+
184
+ ```bash
185
+ # 克隆项目
186
+ git clone git@github.com:Chandler-Song/recruit-loop-agent.git
187
+ cd recruit-loop-agent
188
+
189
+ # 创建虚拟环境
190
+ python -m venv venv
191
+ source venv/bin/activate
192
+
193
+ # 安装依赖
194
+ pip install -e .
195
+
196
+ # 运行测试
197
+ pytest app/tests/ -v
198
+ ```
199
+
200
+ ## 许可证
201
+
202
+ MIT License
@@ -0,0 +1,84 @@
1
+ app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ app/main.py,sha256=CdxBr0zFatyfFwOEGbTb1qTIXVlRfLg6uugMFb99q14,2380
3
+ app/agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
+ app/agents/graph.py,sha256=ZtAct2zCGWCwtxT0XUj6SyjCDWCbxVO9u6lnWxOKfnM,1425
5
+ app/agents/nodes.py,sha256=TXFkuhc2VAhGxlV6DNcigFwdgv1yStVWOfldvnHr9EI,8180
6
+ app/agents/state.py,sha256=VeqYvikCyichr0wP1FqfuLtaWMgvYh55gKJ4lTDYse0,515
7
+ app/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
+ app/api/candidates.py,sha256=-JZClE2oOq78sA47-JjmNm5b-NKG4xPmxbXB5i4Jjw4,2228
9
+ app/api/dashboard.py,sha256=LEY5AVDBrKoJGGB9VK3n02qONpiX4NWfWSJKhejpZ8Q,246
10
+ app/api/outreach.py,sha256=K68ubU2T3gAmRHuCtcH9Cba8oFboLW4r703IFB_NEbQ,118
11
+ app/api/pipelines.py,sha256=tYe2I6cg4m7WvDVi6oqTGr5Cs78edNK0C3SKcA-cAoc,2571
12
+ app/api/positions.py,sha256=EilTUSGxcYsgSqhtc2T4a001-ftc-098C421I9DbcaE,3348
13
+ app/api/router.py,sha256=k8-I98aBPOk6kzVrSQ1aPpYb1ES7Es_CrQWad9byx_4,809
14
+ app/api/scheduler.py,sha256=SGzGQMX1NH4bYW2-cnlUaSur9JpRNJcFxEbjUPYLsyo,119
15
+ app/api/skills.py,sha256=U1CRBsXF7oVscBkDi29fjDG-w8R0C-4ugBAcWt-9gQU,106
16
+ app/api/system.py,sha256=FQTM0haTEL1Ri2Oc3tkK_vygYN9nHN7CXCjQ0R32mT8,120
17
+ app/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
+ app/core/config.py,sha256=KHmA84cH1aGfzckIgqoLspuuoZ6ZOsH2oVTIj05SVbk,484
19
+ app/core/exception_handler.py,sha256=I5AhP7nKGyGH_ZMo-yHsoDUmrwDUyobcjNeqsZAD-QQ,2655
20
+ app/core/exceptions.py,sha256=hcIIDU1gY-EiwE7wxN7mx-qhP9MuHt7j695dYGDEy8o,775
21
+ app/core/logging.py,sha256=-Jw8sM35hbNHpMn5A1rwmBroz_b4T0xNW11vsAGrZdY,442
22
+ app/database/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
+ app/database/base.py,sha256=gqCYPI0VeLxY1XXi1SaejOAaGvchYTuYz7mbvAK6ON8,142
24
+ app/database/session.py,sha256=sRe9i6lt0FUns2XKz2GELXGmX03JIeik2H39hsGfWh0,605
25
+ app/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
+ app/models/agent_run.py,sha256=119csqBVoG2N-aIVWOVCeiyHP_On54mni9h0VcU8E40,768
27
+ app/models/candidate.py,sha256=ErMg7WtKRsGfSwndjs4swKGmMebRRnEf3cs2taJQVEw,1186
28
+ app/models/node_log.py,sha256=-rdvUeAtHnsV9q_AeqpyBKeJTCjOb1DwRbK7zSxcveo,774
29
+ app/models/outreach_log.py,sha256=dJTbb0Fuu7upBsvljmQMpt3WWS8Tnb7EbLYnbXwCkkQ,613
30
+ app/models/pipeline.py,sha256=efspi7pb3Jqef2L3YnZja8UOPlErnmnyH5VgjYx3Je8,1019
31
+ app/models/position.py,sha256=2Z7GyxDSU6Mth07sd4Es-CbGjV99V0v5RZ2CF3VsFLw,946
32
+ app/models/scheduler_job.py,sha256=Au-_V0g9Euv3gT8Guv5GSH_UkHEFkSCcXkxCX0EN0g0,635
33
+ app/models/skill.py,sha256=X93eaMCkf4bIo8qzLQGHnoDJ9L6hg7fXS_g-ZoatFU0,481
34
+ app/models/system_config.py,sha256=VhShfAK4GOPyxz7JH1kG_c7FyVqEVFZ4j4hmo4z2Eh4,478
35
+ app/repositories/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
+ app/repositories/agent_run.py,sha256=iw2ip0p4M-z6H3pX5l6hPjP8ctt20WktUXr6VYGO-qY,3068
37
+ app/repositories/candidate.py,sha256=IJwlvruFvMVAPddv8nN-LrA_nC2NA0XVszMvSk7GLDQ,3663
38
+ app/repositories/node_log.py,sha256=18Hm-VY9fdBCi4KaxYPS37dKoKtmgH7-ZR3mPgBpuc4,2479
39
+ app/repositories/outreach_log.py,sha256=BXNQ87N5W_SlAFgSDRDewNTTeBhtJIdII7re-myfTyk,2752
40
+ app/repositories/pipeline.py,sha256=0idCsV50oTGZZAuoGs9e_SSFqifgEnAYFkX2bRTAMCM,3506
41
+ app/repositories/position.py,sha256=Eotb57Ynq0xeZiTrL4qIO64Rj8QLktsCbVixt9N7Uag,2793
42
+ app/repositories/scheduler_job.py,sha256=ic7kvOZQGW84dqDb5huvixqs8I7rCaYPvmbhILzEe1g,3015
43
+ app/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
+ app/schemas/agent_run.py,sha256=BQChNh33QEgXAeHv-4kim2XiKVx9P6Q1m5IG8vnBcyE,889
45
+ app/schemas/candidate.py,sha256=jqbHzsENyTqox1jd3Hr59PJkEREfetTWlRK5hDlCUTk,1650
46
+ app/schemas/node_log.py,sha256=Xaz4Q19mo1qU1OU-fw5wC_Zs2a2h5Gb4DwsEQ1tF84s,866
47
+ app/schemas/outreach_log.py,sha256=bOBnjCeLFSD2zraEBzD0NbaCVw1f5ybkyxdSso8q8QU,694
48
+ app/schemas/pipeline.py,sha256=KiBf0MWUaIaSKSPdPPYGlpDd1LbWEejyiOIJt5ZqjR4,924
49
+ app/schemas/position.py,sha256=uKwfhFNuh5ELY-VB86Y7HF-OkWgSHwMaVmRa5nDYhNw,1409
50
+ app/schemas/scheduler_job.py,sha256=FFbjZ5O6uy8y--1BGEnAodFQqkAUSkwRw-G6TxB8IhU,794
51
+ app/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
+ app/services/candidate.py,sha256=4mDwzJ9gq0tm_aTdfF8f9ed_cexA_zqxaKAObh-Pg2E,2714
53
+ app/services/dashboard.py,sha256=93FI8uzEJn4p3ErN7gi3catDa-Z1uDuMnT4aZ1nXF1o,8950
54
+ app/services/email.py,sha256=YRZ4H9w-pK0vlluVMrou6uOW7whu-ZPJwuCRYun0dvE,4280
55
+ app/services/health.py,sha256=yNEAZtYxueCD9oGvlvMyio7eA00UJn90b05M3IE3CZI,4346
56
+ app/services/pipeline.py,sha256=zd5oo-MipFWgwJjV0G4euRG0Mt_cV9dKO8WAMYCtBy4,3504
57
+ app/services/position.py,sha256=Kk9KRw8HAYrf-7B4npzVpGw0RSWrV9YhiJXpD50H3h8,1776
58
+ app/services/runner.py,sha256=Gx8gSYICDPJL-z2O2_yMGtal9w2icquvjDQ2_GHxlVg,12148
59
+ app/services/scheduler.py,sha256=xCFkxvAeHBQP5EzB5HuSSSiAKe4dh3X-ApEmlfgiNvY,6447
60
+ app/services/score.py,sha256=3pl3z51Dn3dx5-aKVZDV_q7nY6ToRJ-bMAdUcNEKacs,5545
61
+ app/services/search.py,sha256=5HiOs2VdBZjwjpyHm9s1wCuB_6U3RLY-0SCCCwIrhOY,3900
62
+ app/skills/base.py,sha256=qqDPcD8EGHbsZvc8J0KO30dBgwtEz2xYGhSREFkHQMA,660
63
+ app/skills/github.py,sha256=hsmcRu1BRjf43Bw1JmRPbuOuxB0steOpOyJvd6_ENhs,4729
64
+ app/skills/registry.py,sha256=2pEVYKwVyeYFigRIG1qEUgAadCE6y40sBr5b0VlcIfg,1590
65
+ app/tests/__init__.py,sha256=XZdDcRoijUtjI4P5D_LNh7BHknDTqlCxRVCmmhd3TGY,37
66
+ app/tests/conftest.py,sha256=PqTuWqNNq4tnZA17KibPTDCE009xJ3JtJGa0XqbMbyA,2867
67
+ app/tests/generate_report.py,sha256=JOWpJ4d4tbnA9qI6LODO9qmjzkR4V6gwSh_HcrEXpto,4878
68
+ app/tests/test_candidates.py,sha256=QODuOgkNjX9TKNyGuVdMVKJTCddTt37ldw5U5hCJ3kI,5337
69
+ app/tests/test_dashboard.py,sha256=fV0mDRu4bp57z5Ay8ITjnxcjLPttJu2nn3YR68B1foQ,810
70
+ app/tests/test_outreach.py,sha256=zVUoUKRA9UruThVkzavHd5MDyCCDaBPn7U0t0XvMrh8,310
71
+ app/tests/test_pipelines.py,sha256=uNZ2dWcZX9HWPhx2cKCR4ktnvh0nrqyPEREo__JOS8c,8572
72
+ app/tests/test_positions.py,sha256=LiWKqxZCtsAelubjvWQSK8R89i6v1r5j5Wrcmb3CFlU,6006
73
+ app/tests/test_scheduler.py,sha256=aH8jaGIGlOBYzlAGD2ojEhw949f2yD1gPwSyQXvgnj0,314
74
+ app/tests/test_skills.py,sha256=XC162fbUoU_azb3KGXoGJtPFX6-zL8xb1GpumdagyrY,287
75
+ app/tests/test_system.py,sha256=LtQ0--3A0zkVH4tT0dkgXDvyGO9SrKEUeLgaVIHea3s,824
76
+ app/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
+ loop_agent_cli/__init__.py,sha256=8FgOwsyL0WCZZgFiy88I4PiBK0rLCTRZSNbAQoehoZI,91
78
+ loop_agent_cli/cli.py,sha256=zN_dwp6mjMJiC0W5nlU_bEXWFs7r28fAX5Yj9MOoO6I,25880
79
+ loop_agent_cli/container.py,sha256=LQo_o8LGj_RrTrfPTHKpBj0VIf4cXPFQ6UpZlh5hMrk,6711
80
+ loop_agent_cli-0.1.0.dist-info/METADATA,sha256=buHoKSflUKnoQasIput68AKvgS7udrDDOn-0jKBU9qE,5317
81
+ loop_agent_cli-0.1.0.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
82
+ loop_agent_cli-0.1.0.dist-info/entry_points.txt,sha256=HdcMes63KqnBLR1TNP59R_OOSA-jczSSMcQGfd_4UAc,54
83
+ loop_agent_cli-0.1.0.dist-info/top_level.txt,sha256=WWfM2gyq1LszIMW7_HbgceB5IBvdRy6EcAVWq8-GEUo,19
84
+ loop_agent_cli-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (82.0.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ loop-agent = loop_agent_cli.cli:app
@@ -0,0 +1,2 @@
1
+ app
2
+ loop_agent_cli