atlas-pm 0.2.3__tar.gz

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 (218) hide show
  1. atlas_pm-0.2.3/.github/workflows/publish.yml +28 -0
  2. atlas_pm-0.2.3/.gitignore +94 -0
  3. atlas_pm-0.2.3/LICENSE +21 -0
  4. atlas_pm-0.2.3/PKG-INFO +171 -0
  5. atlas_pm-0.2.3/README.md +138 -0
  6. atlas_pm-0.2.3/alembic.ini +149 -0
  7. atlas_pm-0.2.3/migrations/README +1 -0
  8. atlas_pm-0.2.3/migrations/env.py +97 -0
  9. atlas_pm-0.2.3/migrations/script.py.mako +28 -0
  10. atlas_pm-0.2.3/migrations/versions/0a6b3db9f107_initial_mvp_schema.py +184 -0
  11. atlas_pm-0.2.3/migrations/versions/0b8a8a1bb61b_f3b_backend_id_outbox_cursor.py +68 -0
  12. atlas_pm-0.2.3/migrations/versions/0d172deaa09b_add_project_prefix_and_task_number_slug.py +44 -0
  13. atlas_pm-0.2.3/migrations/versions/13f6db0144ed_sprints_table_tasks_sprint_id.py +61 -0
  14. atlas_pm-0.2.3/migrations/versions/237c08c450f6_add_git_fields_to_projects.py +89 -0
  15. atlas_pm-0.2.3/migrations/versions/52cc9ef055b0_f3b_epic_checklist_taskmember.py +107 -0
  16. atlas_pm-0.2.3/migrations/versions/575396edfd76_create_backlog_items_table.py +59 -0
  17. atlas_pm-0.2.3/migrations/versions/5b893ab8883c_review_workflow_tasks_reviewer_id_.py +50 -0
  18. atlas_pm-0.2.3/migrations/versions/a2950921f1c4_add_inbox_project_type_and_allow_.py +119 -0
  19. atlas_pm-0.2.3/migrations/versions/a7b8c9d0e1f2_task_lease_optimistic_lock.py +68 -0
  20. atlas_pm-0.2.3/migrations/versions/ad1bb3559baf_drop_backlog_task_status_to_todo.py +40 -0
  21. atlas_pm-0.2.3/migrations/versions/b1d0100413fc_add_hypotheses_ledger.py +91 -0
  22. atlas_pm-0.2.3/migrations/versions/b8c9d0e1f2a3_epics_lease_optimistic_lock.py +69 -0
  23. atlas_pm-0.2.3/migrations/versions/c1d2e3f4a5b6_add_provenance_to_tasks_epics.py +115 -0
  24. atlas_pm-0.2.3/migrations/versions/c55f75e76e5b_add_tasks_archived_at_for_soft_delete.py +36 -0
  25. atlas_pm-0.2.3/migrations/versions/ca84c1d9b54e_add_entity_kind_to_projects_simplify_.py +209 -0
  26. atlas_pm-0.2.3/migrations/versions/d4e5f6a7b8c9_canon_storage_group_parent_id.py +97 -0
  27. atlas_pm-0.2.3/migrations/versions/d88bf4f8a629_tags_and_archive_engine.py +235 -0
  28. atlas_pm-0.2.3/migrations/versions/e05f29093f6e_create_issues_table.py +54 -0
  29. atlas_pm-0.2.3/migrations/versions/e34eb4327643_f3b_sync_policy_counterparty.py +132 -0
  30. atlas_pm-0.2.3/migrations/versions/e5f6a7b8c9d0_collapse_sprint_into_epic.py +77 -0
  31. atlas_pm-0.2.3/migrations/versions/f3f1a2b3c4d5_add_checklist_items_due_date.py +36 -0
  32. atlas_pm-0.2.3/pyproject.toml +60 -0
  33. atlas_pm-0.2.3/scripts/publish_public_github.sh +77 -0
  34. atlas_pm-0.2.3/skills/atlas/SKILL.md +216 -0
  35. atlas_pm-0.2.3/skills/atlas/_skill_meta.toml +20 -0
  36. atlas_pm-0.2.3/skills/atlas/agents/project-initializer.md +366 -0
  37. atlas_pm-0.2.3/skills/atlas/references/agent-playbook.md +65 -0
  38. atlas_pm-0.2.3/skills/atlas/references/commands.md +147 -0
  39. atlas_pm-0.2.3/skills/atlas/references/projects-and-layout.md +110 -0
  40. atlas_pm-0.2.3/src/atlas/__init__.py +3 -0
  41. atlas_pm-0.2.3/src/atlas/_time.py +99 -0
  42. atlas_pm-0.2.3/src/atlas/appconfig.py +141 -0
  43. atlas_pm-0.2.3/src/atlas/backup.py +259 -0
  44. atlas_pm-0.2.3/src/atlas/cli.py +139 -0
  45. atlas_pm-0.2.3/src/atlas/commands/__init__.py +1 -0
  46. atlas_pm-0.2.3/src/atlas/commands/_provision.py +55 -0
  47. atlas_pm-0.2.3/src/atlas/commands/action_log.py +203 -0
  48. atlas_pm-0.2.3/src/atlas/commands/backlog.py +399 -0
  49. atlas_pm-0.2.3/src/atlas/commands/backup.py +513 -0
  50. atlas_pm-0.2.3/src/atlas/commands/checklist.py +142 -0
  51. atlas_pm-0.2.3/src/atlas/commands/config.py +182 -0
  52. atlas_pm-0.2.3/src/atlas/commands/connect.py +149 -0
  53. atlas_pm-0.2.3/src/atlas/commands/dashboard.py +204 -0
  54. atlas_pm-0.2.3/src/atlas/commands/epic.py +281 -0
  55. atlas_pm-0.2.3/src/atlas/commands/epic_worktree.py +232 -0
  56. atlas_pm-0.2.3/src/atlas/commands/hypothesis.py +924 -0
  57. atlas_pm-0.2.3/src/atlas/commands/ideas.py +821 -0
  58. atlas_pm-0.2.3/src/atlas/commands/inbox.py +414 -0
  59. atlas_pm-0.2.3/src/atlas/commands/init.py +104 -0
  60. atlas_pm-0.2.3/src/atlas/commands/issue.py +290 -0
  61. atlas_pm-0.2.3/src/atlas/commands/logs.py +100 -0
  62. atlas_pm-0.2.3/src/atlas/commands/member.py +115 -0
  63. atlas_pm-0.2.3/src/atlas/commands/participants.py +623 -0
  64. atlas_pm-0.2.3/src/atlas/commands/profile.py +124 -0
  65. atlas_pm-0.2.3/src/atlas/commands/projects.py +3539 -0
  66. atlas_pm-0.2.3/src/atlas/commands/projects_git.py +862 -0
  67. atlas_pm-0.2.3/src/atlas/commands/projects_layout.py +1108 -0
  68. atlas_pm-0.2.3/src/atlas/commands/sprint.py +333 -0
  69. atlas_pm-0.2.3/src/atlas/commands/stats.py +214 -0
  70. atlas_pm-0.2.3/src/atlas/commands/statuses.py +176 -0
  71. atlas_pm-0.2.3/src/atlas/commands/sync.py +130 -0
  72. atlas_pm-0.2.3/src/atlas/commands/tags.py +548 -0
  73. atlas_pm-0.2.3/src/atlas/commands/task.py +1292 -0
  74. atlas_pm-0.2.3/src/atlas/commands/task_lease.py +950 -0
  75. atlas_pm-0.2.3/src/atlas/commands/types.py +300 -0
  76. atlas_pm-0.2.3/src/atlas/commands/upgrade.py +101 -0
  77. atlas_pm-0.2.3/src/atlas/dashboard.py +204 -0
  78. atlas_pm-0.2.3/src/atlas/db.py +89 -0
  79. atlas_pm-0.2.3/src/atlas/discipline.py +50 -0
  80. atlas_pm-0.2.3/src/atlas/epic_worktree.py +207 -0
  81. atlas_pm-0.2.3/src/atlas/git_backend.py +570 -0
  82. atlas_pm-0.2.3/src/atlas/git_paths.py +157 -0
  83. atlas_pm-0.2.3/src/atlas/ideas.py +298 -0
  84. atlas_pm-0.2.3/src/atlas/junctions.py +302 -0
  85. atlas_pm-0.2.3/src/atlas/keystore.py +41 -0
  86. atlas_pm-0.2.3/src/atlas/layout.py +725 -0
  87. atlas_pm-0.2.3/src/atlas/lease.py +631 -0
  88. atlas_pm-0.2.3/src/atlas/logs.py +116 -0
  89. atlas_pm-0.2.3/src/atlas/models.py +876 -0
  90. atlas_pm-0.2.3/src/atlas/paths.py +225 -0
  91. atlas_pm-0.2.3/src/atlas/seeds.py +428 -0
  92. atlas_pm-0.2.3/src/atlas/slugs.py +323 -0
  93. atlas_pm-0.2.3/src/atlas/sprint.py +139 -0
  94. atlas_pm-0.2.3/src/atlas/stats.py +590 -0
  95. atlas_pm-0.2.3/src/atlas/sync/__init__.py +4 -0
  96. atlas_pm-0.2.3/src/atlas/sync/apply.py +197 -0
  97. atlas_pm-0.2.3/src/atlas/sync/backend_client.py +148 -0
  98. atlas_pm-0.2.3/src/atlas/sync/cursor.py +23 -0
  99. atlas_pm-0.2.3/src/atlas/sync/daemon.py +155 -0
  100. atlas_pm-0.2.3/src/atlas/sync/hub_service.py +45 -0
  101. atlas_pm-0.2.3/src/atlas/sync/mapper.py +177 -0
  102. atlas_pm-0.2.3/src/atlas/sync/outbox.py +75 -0
  103. atlas_pm-0.2.3/src/atlas/sync/policy.py +42 -0
  104. atlas_pm-0.2.3/src/atlas/sync/pull.py +65 -0
  105. atlas_pm-0.2.3/src/atlas/sync/push.py +27 -0
  106. atlas_pm-0.2.3/src/atlas/tags.py +297 -0
  107. atlas_pm-0.2.3/src/atlas/task_review.py +142 -0
  108. atlas_pm-0.2.3/src/atlas/task_status.py +259 -0
  109. atlas_pm-0.2.3/src/atlas/triage.py +121 -0
  110. atlas_pm-0.2.3/tests/conftest.py +56 -0
  111. atlas_pm-0.2.3/tests/test_action_log_cli.py +256 -0
  112. atlas_pm-0.2.3/tests/test_agent_discipline.py +131 -0
  113. atlas_pm-0.2.3/tests/test_appconfig.py +27 -0
  114. atlas_pm-0.2.3/tests/test_backend_client_provision.py +30 -0
  115. atlas_pm-0.2.3/tests/test_backlog_cli.py +210 -0
  116. atlas_pm-0.2.3/tests/test_backup.py +361 -0
  117. atlas_pm-0.2.3/tests/test_backup_cli.py +578 -0
  118. atlas_pm-0.2.3/tests/test_canon_models.py +84 -0
  119. atlas_pm-0.2.3/tests/test_canon_onboarding_prompt.py +374 -0
  120. atlas_pm-0.2.3/tests/test_checklist_cli.py +50 -0
  121. atlas_pm-0.2.3/tests/test_checklist_sync_cli.py +82 -0
  122. atlas_pm-0.2.3/tests/test_cli_output_hoist.py +110 -0
  123. atlas_pm-0.2.3/tests/test_cli_root.py +32 -0
  124. atlas_pm-0.2.3/tests/test_clikit_dep.py +15 -0
  125. atlas_pm-0.2.3/tests/test_config_cli.py +104 -0
  126. atlas_pm-0.2.3/tests/test_connect_cli.py +81 -0
  127. atlas_pm-0.2.3/tests/test_dashboard.py +127 -0
  128. atlas_pm-0.2.3/tests/test_db.py +123 -0
  129. atlas_pm-0.2.3/tests/test_db_profile.py +47 -0
  130. atlas_pm-0.2.3/tests/test_epic_cli.py +54 -0
  131. atlas_pm-0.2.3/tests/test_epic_provenance_cli.py +173 -0
  132. atlas_pm-0.2.3/tests/test_epic_worktree.py +234 -0
  133. atlas_pm-0.2.3/tests/test_f3b_hierarchy.py +54 -0
  134. atlas_pm-0.2.3/tests/test_f3b_models.py +55 -0
  135. atlas_pm-0.2.3/tests/test_f3b_sync_infra.py +47 -0
  136. atlas_pm-0.2.3/tests/test_git_backend.py +500 -0
  137. atlas_pm-0.2.3/tests/test_git_paths.py +238 -0
  138. atlas_pm-0.2.3/tests/test_grouplease.py +400 -0
  139. atlas_pm-0.2.3/tests/test_grouplease_cli.py +271 -0
  140. atlas_pm-0.2.3/tests/test_hub_service.py +36 -0
  141. atlas_pm-0.2.3/tests/test_hypothesis_cli.py +575 -0
  142. atlas_pm-0.2.3/tests/test_ideas.py +176 -0
  143. atlas_pm-0.2.3/tests/test_ideas_cli.py +326 -0
  144. atlas_pm-0.2.3/tests/test_issue_cli.py +160 -0
  145. atlas_pm-0.2.3/tests/test_junctions.py +351 -0
  146. atlas_pm-0.2.3/tests/test_keystore.py +83 -0
  147. atlas_pm-0.2.3/tests/test_layout.py +428 -0
  148. atlas_pm-0.2.3/tests/test_layout_modules.py +128 -0
  149. atlas_pm-0.2.3/tests/test_layout_modules_cli.py +185 -0
  150. atlas_pm-0.2.3/tests/test_lease.py +332 -0
  151. atlas_pm-0.2.3/tests/test_lease_cli.py +189 -0
  152. atlas_pm-0.2.3/tests/test_lease_sync_invariant.py +37 -0
  153. atlas_pm-0.2.3/tests/test_logs.py +118 -0
  154. atlas_pm-0.2.3/tests/test_member_cli.py +105 -0
  155. atlas_pm-0.2.3/tests/test_migration_004.py +113 -0
  156. atlas_pm-0.2.3/tests/test_migration_005.py +176 -0
  157. atlas_pm-0.2.3/tests/test_migration_006.py +222 -0
  158. atlas_pm-0.2.3/tests/test_migration_007.py +334 -0
  159. atlas_pm-0.2.3/tests/test_migration_canon.py +141 -0
  160. atlas_pm-0.2.3/tests/test_migration_collapse_sprint.py +207 -0
  161. atlas_pm-0.2.3/tests/test_migration_epics_lease.py +178 -0
  162. atlas_pm-0.2.3/tests/test_migration_f3b.py +35 -0
  163. atlas_pm-0.2.3/tests/test_modules_cli.py +224 -0
  164. atlas_pm-0.2.3/tests/test_modules_review_cli.py +519 -0
  165. atlas_pm-0.2.3/tests/test_participants_cli.py +494 -0
  166. atlas_pm-0.2.3/tests/test_paths.py +227 -0
  167. atlas_pm-0.2.3/tests/test_paths_db.py +65 -0
  168. atlas_pm-0.2.3/tests/test_profile_register_cli.py +186 -0
  169. atlas_pm-0.2.3/tests/test_projects_archive_cli.py +852 -0
  170. atlas_pm-0.2.3/tests/test_projects_cli.py +619 -0
  171. atlas_pm-0.2.3/tests/test_projects_git_cli.py +768 -0
  172. atlas_pm-0.2.3/tests/test_projects_layout_cli.py +667 -0
  173. atlas_pm-0.2.3/tests/test_projects_members_cli.py +409 -0
  174. atlas_pm-0.2.3/tests/test_projects_parent_cli.py +348 -0
  175. atlas_pm-0.2.3/tests/test_projects_tags_cli.py +459 -0
  176. atlas_pm-0.2.3/tests/test_provenance_models.py +132 -0
  177. atlas_pm-0.2.3/tests/test_provision_defaults.py +48 -0
  178. atlas_pm-0.2.3/tests/test_resolve_api_key.py +88 -0
  179. atlas_pm-0.2.3/tests/test_seeds.py +80 -0
  180. atlas_pm-0.2.3/tests/test_seeds_f3b.py +30 -0
  181. atlas_pm-0.2.3/tests/test_seeds_tags.py +219 -0
  182. atlas_pm-0.2.3/tests/test_slugs.py +374 -0
  183. atlas_pm-0.2.3/tests/test_sprint.py +164 -0
  184. atlas_pm-0.2.3/tests/test_stats.py +590 -0
  185. atlas_pm-0.2.3/tests/test_stats_cli.py +342 -0
  186. atlas_pm-0.2.3/tests/test_statuses_cli.py +140 -0
  187. atlas_pm-0.2.3/tests/test_sync_apply.py +133 -0
  188. atlas_pm-0.2.3/tests/test_sync_backend_client.py +68 -0
  189. atlas_pm-0.2.3/tests/test_sync_backend_client_errors.py +52 -0
  190. atlas_pm-0.2.3/tests/test_sync_checklist.py +225 -0
  191. atlas_pm-0.2.3/tests/test_sync_cursor.py +32 -0
  192. atlas_pm-0.2.3/tests/test_sync_daemon.py +86 -0
  193. atlas_pm-0.2.3/tests/test_sync_daemon_cli.py +21 -0
  194. atlas_pm-0.2.3/tests/test_sync_mapper.py +130 -0
  195. atlas_pm-0.2.3/tests/test_sync_mapper_assignees.py +162 -0
  196. atlas_pm-0.2.3/tests/test_sync_outbox.py +72 -0
  197. atlas_pm-0.2.3/tests/test_sync_policy.py +54 -0
  198. atlas_pm-0.2.3/tests/test_sync_pull.py +83 -0
  199. atlas_pm-0.2.3/tests/test_sync_push.py +66 -0
  200. atlas_pm-0.2.3/tests/test_sync_watch_loop.py +52 -0
  201. atlas_pm-0.2.3/tests/test_tags_cli.py +527 -0
  202. atlas_pm-0.2.3/tests/test_tags_models.py +269 -0
  203. atlas_pm-0.2.3/tests/test_tags_utils.py +434 -0
  204. atlas_pm-0.2.3/tests/test_task_batch.py +114 -0
  205. atlas_pm-0.2.3/tests/test_task_review.py +184 -0
  206. atlas_pm-0.2.3/tests/test_task_status.py +233 -0
  207. atlas_pm-0.2.3/tests/test_tasks_cli.py +852 -0
  208. atlas_pm-0.2.3/tests/test_tasks_enqueue.py +45 -0
  209. atlas_pm-0.2.3/tests/test_tasks_enqueue_assignee.py +69 -0
  210. atlas_pm-0.2.3/tests/test_tasks_enqueue_update.py +56 -0
  211. atlas_pm-0.2.3/tests/test_tasks_provenance_cli.py +306 -0
  212. atlas_pm-0.2.3/tests/test_time.py +43 -0
  213. atlas_pm-0.2.3/tests/test_time_config.py +59 -0
  214. atlas_pm-0.2.3/tests/test_triage.py +155 -0
  215. atlas_pm-0.2.3/tests/test_types_cli.py +242 -0
  216. atlas_pm-0.2.3/tests/test_types_config.py +187 -0
  217. atlas_pm-0.2.3/tests/test_upgrade_cli.py +53 -0
  218. atlas_pm-0.2.3/uv.lock +1369 -0
@@ -0,0 +1,28 @@
1
+ # Публикация atlas-cli на PyPI по семвер-тегу vX.Y.Z через Trusted Publishing (OIDC).
2
+ # Ничего не хранится: GitHub выдаёт короткоживущий OIDC-токен, PyPI доверяет связке
3
+ # owner/repo/workflow (настраивается на pypi.org → Trusted Publisher).
4
+ #
5
+ # Этот файл живёт в приватном GitLab-источнике и КУРИРУЕМО уезжает в публичный
6
+ # github (publish_public_github.sh не исключает .github/); на github-теге и срабатывает.
7
+ name: publish-pypi
8
+
9
+ on:
10
+ push:
11
+ tags:
12
+ - "v[0-9]+.[0-9]+.[0-9]+"
13
+
14
+ permissions:
15
+ id-token: write # обязательно для OIDC Trusted Publishing
16
+ contents: read
17
+
18
+ jobs:
19
+ publish:
20
+ runs-on: ubuntu-latest
21
+ steps:
22
+ - uses: actions/checkout@v4
23
+ - name: Install uv
24
+ uses: astral-sh/setup-uv@v6
25
+ - name: Build
26
+ run: uv build
27
+ - name: Publish to PyPI (Trusted Publishing)
28
+ run: uv publish --trusted-publishing always
@@ -0,0 +1,94 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ .Python
7
+ *.egg-info/
8
+ .pytest_cache/
9
+ .mypy_cache/
10
+ .ruff_cache/
11
+ .coverage
12
+ htmlcov/
13
+ dist/
14
+ build/
15
+
16
+ # Virtual environments
17
+ .venv/
18
+ venv/
19
+ env/
20
+
21
+ # uv
22
+ .uv-cache/
23
+
24
+ # IDE
25
+ .vscode/
26
+ .idea/
27
+ *.swp
28
+ *.swo
29
+
30
+ # OS
31
+ .DS_Store
32
+ Thumbs.db
33
+
34
+ # Secrets / local
35
+ .env
36
+ .env.local
37
+ AGENTS.local.md
38
+ CLAUDE.local.md
39
+ *.local
40
+
41
+ # Worktrees
42
+ .worktrees/
43
+
44
+ # PM database (local)
45
+ atlas.db
46
+ atlas.db-journal
47
+ atlas.db-wal
48
+ atlas.db-shm
49
+
50
+ # Logs
51
+ *.log
52
+ logs/
53
+
54
+ # === atlas universal extras (per project convention) ===
55
+ *.csv
56
+ *.flac
57
+ *.har
58
+ *.json
59
+ *.jsonl
60
+ *.mov
61
+ *.mp3
62
+ *.mp4
63
+ *.pdf
64
+ *.tsv
65
+ *.txt
66
+ *.wav
67
+ *.webm
68
+ *.xls
69
+ *.xlsm
70
+ *.xlsx
71
+ *.zip
72
+
73
+ !.claude.json
74
+ !.claude/**/*.json
75
+ !.eslintrc*.json
76
+ !.mcp.json
77
+ !.prettierrc*.json
78
+ !CHANGELOG.txt
79
+ !LICENSE.txt
80
+ !README.txt
81
+ !atlas.json
82
+ !biome.json
83
+ !claude.json
84
+ !components.json
85
+ !constraints*.txt
86
+ !manifest.json
87
+ !package-lock.json
88
+ !package.json
89
+ !playwright.config.json
90
+ !requirements*.txt
91
+ !tsconfig*.json
92
+
93
+ # autogen демоном (машинно-специфичные пути) — не в git
94
+ scripts/sync_watch_headless*.vbs
atlas_pm-0.2.3/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Atlas CLI contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,171 @@
1
+ Metadata-Version: 2.4
2
+ Name: atlas-pm
3
+ Version: 0.2.3
4
+ Summary: Atlas — local-first PM-система для портфеля проектов и задач
5
+ Project-URL: Homepage, https://github.com/zZZTeJleTTy3uKZZz/atlas
6
+ Project-URL: Repository, https://github.com/zZZTeJleTTy3uKZZz/atlas
7
+ Author: Atlas CLI contributors
8
+ License: MIT
9
+ License-File: LICENSE
10
+ Requires-Python: >=3.11
11
+ Requires-Dist: alembic>=1.13
12
+ Requires-Dist: httpx>=0.27
13
+ Requires-Dist: python-dateutil>=2.9
14
+ Requires-Dist: python-dotenv>=1.0
15
+ Requires-Dist: python-frontmatter>=1.1
16
+ Requires-Dist: python-slugify>=8.0.4
17
+ Requires-Dist: pytz>=2024.1
18
+ Requires-Dist: rich>=13.7
19
+ Requires-Dist: s-adapterkit>=0.1.2
20
+ Requires-Dist: s-agentskit>=0.1.0
21
+ Requires-Dist: s-clikit>=0.1.6
22
+ Requires-Dist: s-issuekit>=0.2.0
23
+ Requires-Dist: s-librarykit>=0.1.3
24
+ Requires-Dist: sqlalchemy>=2.0.30
25
+ Requires-Dist: typer>=0.12
26
+ Provides-Extra: dev
27
+ Requires-Dist: pytest-asyncio>=0.24; extra == 'dev'
28
+ Requires-Dist: pytest-cov>=5.0; extra == 'dev'
29
+ Requires-Dist: pytest-httpx>=0.32; extra == 'dev'
30
+ Requires-Dist: pytest>=8.3; extra == 'dev'
31
+ Requires-Dist: ruff>=0.5; extra == 'dev'
32
+ Description-Content-Type: text/markdown
33
+
34
+ # Atlas
35
+
36
+ **Local-first PM-система для портфеля проектов и задач.** Всё живёт в локальном
37
+ SQLite (`~/.atlas/atlas.db`) и работает без сети — самодостаточно, без внешних
38
+ сервисов.
39
+
40
+ ```
41
+ Atlas (SQLite, local-first) — проекты · задачи · идеи · гипотезы
42
+ ```
43
+
44
+ CLI `atlas` единообразен (единственное число команд), `--json` по умолчанию
45
+ (удобно для скриптов/AI-агентов), `--text`/`--plain` — человекочитаемый вывод.
46
+
47
+ ## Возможности
48
+
49
+ - **Портфель проектов**: типы, статусы, теги, владельцы, архив, git-раскладка.
50
+ - **Задачи** с ЦКП (ценный конечный продукт), чек-листами, участниками, эпиками,
51
+ lease/claim для мультиагентной координации.
52
+ - **Идеи и inbox** — инкубатор и свалка сырья на разбор.
53
+ - **Гипотезы** — фальсифицируемый ledger по продукту/маркетингу.
54
+ - **Бэкап**, аудит (append-only action-log), статистика портфеля.
55
+
56
+ ## Установка
57
+
58
+ Требуется Python ≥ 3.11.
59
+
60
+ **Рекомендуемый путь — через [skillery](https://skillery.ru)** (тогда заодно
61
+ ставится навык для Claude-агента — см. ниже):
62
+
63
+ ```bash
64
+ skillery install atlas # ставит CLI + навык
65
+ ```
66
+
67
+ Без skillery — напрямую из git ([uv](https://docs.astral.sh/uv/) или pipx):
68
+
69
+ ```bash
70
+ pipx install "git+https://github.com/zZZTeJleTTy3uKZZz/atlas.git"
71
+ # или для разработки: uv sync --extra dev
72
+ ```
73
+
74
+ Проверка: `atlas --version` и `atlas --help`.
75
+
76
+ ## Обновление
77
+
78
+ ```bash
79
+ atlas upgrade # pipx из git: pipx upgrade atlas
80
+ atlas upgrade --reinstall # принудительная переустановка из git (force)
81
+ atlas upgrade --check # только показать версию + метод установки
82
+ ```
83
+
84
+ - **skillery** — обновляй через skillery (re-install подтянет новые deps).
85
+ - **pipx из git** — `atlas upgrade` (= `pipx upgrade atlas`, тянет свежий коммит).
86
+ - **editable (dev)** — код живой, обнови `git pull` в репозитории.
87
+
88
+ ## Онбординг (первый запуск)
89
+
90
+ 1. **Задайте владельца стора** (ваш member-slug) — он станет дефолтным
91
+ участником-актором и владельцем новых проектов:
92
+
93
+ ```bash
94
+ atlas config set owner alice # ваш slug (kebab-case) → config.toml
95
+ atlas config show # посмотреть весь конфиг
96
+ ```
97
+
98
+ Опционально там же — `org_namespace` / `personal_namespace` / `personal_owner`
99
+ (git-раскладка), `base_url` (адрес backend для синка). Конфиг читается слоями
100
+ `config.toml < .atlas.toml в проекте < env ATLAS_*` (на сессию можно env
101
+ `ATLAS_OWNER=alice`). Секрет `api_key` — только через env / secret-store.
102
+
103
+ 2. **Инициализируйте БД** (миграции + базовые справочники):
104
+
105
+ ```bash
106
+ atlas project init
107
+ ```
108
+
109
+ Создаёт `~/.atlas/atlas.db`, применяет миграции и заселяет типы/статусы/теги +
110
+ участников (claude-code + ваш `owner`). Идемпотентно — повторный вызов безопасен.
111
+
112
+ 3. **Готово** — создавайте проекты и задачи (см. ниже). Если `owner` не задан,
113
+ Atlas всё равно работает, но участника-владельца придётся указывать явно
114
+ (`--owner` / `--assignee`).
115
+
116
+ ## Быстрый старт
117
+
118
+ ```bash
119
+ # проект (личный по умолчанию; --team — командный)
120
+ atlas project add --name "Мой лендинг" --slug my-landing --type personal-project
121
+
122
+ # задача с ЦКП
123
+ atlas task add --project my-landing --title "Собрать структуру" \
124
+ --cpp "Готов wireframe из 6 секций" --priority P1
125
+
126
+ # взять задачу в работу (lease-лок, атомарно)
127
+ atlas task claim <number|slug> --ttl 2h
128
+
129
+ # список (человекочитаемо)
130
+ atlas --text task list --project my-landing
131
+ ```
132
+
133
+ ## Конфигурация
134
+
135
+ Atlas читает слоистый конфиг (global `config.toml` < project `.atlas.toml` <
136
+ local < env `ATLAS_*`). Глобальный файл — в OS-config-каталоге (создаётся
137
+ командой `atlas config set …`). Ключевые поля (все опциональны, дефолты — generic):
138
+
139
+ | Поле / env | Назначение |
140
+ |---|---|
141
+ | `owner` / `ATLAS_OWNER` | member-slug владельца стора (дефолтный actor аудита, владелец новых проектов) |
142
+ | `org_namespace` / `ATLAS_ORG_NAMESPACE` | организационный git-namespace для раскладки проектов |
143
+ | `personal_namespace` / `ATLAS_PERSONAL_NAMESPACE` | личный git-namespace (для проектов с owner-тегом) |
144
+ | `personal_owner` / `ATLAS_PERSONAL_OWNER` | значение owner-тега, переключающее на личный namespace |
145
+ | `team_owner` / `ATLAS_TEAM_OWNER` | counterparty-владелец по умолчанию для `--team`-проектов |
146
+ | `timezone` / `ATLAS_TIMEZONE` | часовой пояс PM-БД (фиксированный offset, напр. `+03:00`) |
147
+
148
+ Без конфига Atlas полностью работает локально; владельца/namespaces задаёте под
149
+ себя.
150
+
151
+ ## Навык для Claude / skillery
152
+
153
+ Репозиторий несёт навык в `skills/atlas/` (`SKILL.md` + `agents/` + `references/`) — Atlas можно
154
+ поставить как **tooling-навык** через [skillery](https://skillery.ru): install
155
+ материализует навык и ставит сам CLI (`_skill_meta.toml`). Тогда AI-агент знает,
156
+ как и когда пользоваться `atlas`.
157
+
158
+ ## Разработка
159
+
160
+ ```bash
161
+ uv sync --extra dev
162
+ uv run pytest -q # тесты
163
+ uv run ruff check . # линт
164
+ ```
165
+
166
+ Миграции БД — через Alembic (`uv run alembic upgrade head`). Дисциплина:
167
+ TDD, миграции в git до деплоя, осмысленные коммиты.
168
+
169
+ ## Лицензия
170
+
171
+ [MIT](LICENSE).
@@ -0,0 +1,138 @@
1
+ # Atlas
2
+
3
+ **Local-first PM-система для портфеля проектов и задач.** Всё живёт в локальном
4
+ SQLite (`~/.atlas/atlas.db`) и работает без сети — самодостаточно, без внешних
5
+ сервисов.
6
+
7
+ ```
8
+ Atlas (SQLite, local-first) — проекты · задачи · идеи · гипотезы
9
+ ```
10
+
11
+ CLI `atlas` единообразен (единственное число команд), `--json` по умолчанию
12
+ (удобно для скриптов/AI-агентов), `--text`/`--plain` — человекочитаемый вывод.
13
+
14
+ ## Возможности
15
+
16
+ - **Портфель проектов**: типы, статусы, теги, владельцы, архив, git-раскладка.
17
+ - **Задачи** с ЦКП (ценный конечный продукт), чек-листами, участниками, эпиками,
18
+ lease/claim для мультиагентной координации.
19
+ - **Идеи и inbox** — инкубатор и свалка сырья на разбор.
20
+ - **Гипотезы** — фальсифицируемый ledger по продукту/маркетингу.
21
+ - **Бэкап**, аудит (append-only action-log), статистика портфеля.
22
+
23
+ ## Установка
24
+
25
+ Требуется Python ≥ 3.11.
26
+
27
+ **Рекомендуемый путь — через [skillery](https://skillery.ru)** (тогда заодно
28
+ ставится навык для Claude-агента — см. ниже):
29
+
30
+ ```bash
31
+ skillery install atlas # ставит CLI + навык
32
+ ```
33
+
34
+ Без skillery — напрямую из git ([uv](https://docs.astral.sh/uv/) или pipx):
35
+
36
+ ```bash
37
+ pipx install "git+https://github.com/zZZTeJleTTy3uKZZz/atlas.git"
38
+ # или для разработки: uv sync --extra dev
39
+ ```
40
+
41
+ Проверка: `atlas --version` и `atlas --help`.
42
+
43
+ ## Обновление
44
+
45
+ ```bash
46
+ atlas upgrade # pipx из git: pipx upgrade atlas
47
+ atlas upgrade --reinstall # принудительная переустановка из git (force)
48
+ atlas upgrade --check # только показать версию + метод установки
49
+ ```
50
+
51
+ - **skillery** — обновляй через skillery (re-install подтянет новые deps).
52
+ - **pipx из git** — `atlas upgrade` (= `pipx upgrade atlas`, тянет свежий коммит).
53
+ - **editable (dev)** — код живой, обнови `git pull` в репозитории.
54
+
55
+ ## Онбординг (первый запуск)
56
+
57
+ 1. **Задайте владельца стора** (ваш member-slug) — он станет дефолтным
58
+ участником-актором и владельцем новых проектов:
59
+
60
+ ```bash
61
+ atlas config set owner alice # ваш slug (kebab-case) → config.toml
62
+ atlas config show # посмотреть весь конфиг
63
+ ```
64
+
65
+ Опционально там же — `org_namespace` / `personal_namespace` / `personal_owner`
66
+ (git-раскладка), `base_url` (адрес backend для синка). Конфиг читается слоями
67
+ `config.toml < .atlas.toml в проекте < env ATLAS_*` (на сессию можно env
68
+ `ATLAS_OWNER=alice`). Секрет `api_key` — только через env / secret-store.
69
+
70
+ 2. **Инициализируйте БД** (миграции + базовые справочники):
71
+
72
+ ```bash
73
+ atlas project init
74
+ ```
75
+
76
+ Создаёт `~/.atlas/atlas.db`, применяет миграции и заселяет типы/статусы/теги +
77
+ участников (claude-code + ваш `owner`). Идемпотентно — повторный вызов безопасен.
78
+
79
+ 3. **Готово** — создавайте проекты и задачи (см. ниже). Если `owner` не задан,
80
+ Atlas всё равно работает, но участника-владельца придётся указывать явно
81
+ (`--owner` / `--assignee`).
82
+
83
+ ## Быстрый старт
84
+
85
+ ```bash
86
+ # проект (личный по умолчанию; --team — командный)
87
+ atlas project add --name "Мой лендинг" --slug my-landing --type personal-project
88
+
89
+ # задача с ЦКП
90
+ atlas task add --project my-landing --title "Собрать структуру" \
91
+ --cpp "Готов wireframe из 6 секций" --priority P1
92
+
93
+ # взять задачу в работу (lease-лок, атомарно)
94
+ atlas task claim <number|slug> --ttl 2h
95
+
96
+ # список (человекочитаемо)
97
+ atlas --text task list --project my-landing
98
+ ```
99
+
100
+ ## Конфигурация
101
+
102
+ Atlas читает слоистый конфиг (global `config.toml` < project `.atlas.toml` <
103
+ local < env `ATLAS_*`). Глобальный файл — в OS-config-каталоге (создаётся
104
+ командой `atlas config set …`). Ключевые поля (все опциональны, дефолты — generic):
105
+
106
+ | Поле / env | Назначение |
107
+ |---|---|
108
+ | `owner` / `ATLAS_OWNER` | member-slug владельца стора (дефолтный actor аудита, владелец новых проектов) |
109
+ | `org_namespace` / `ATLAS_ORG_NAMESPACE` | организационный git-namespace для раскладки проектов |
110
+ | `personal_namespace` / `ATLAS_PERSONAL_NAMESPACE` | личный git-namespace (для проектов с owner-тегом) |
111
+ | `personal_owner` / `ATLAS_PERSONAL_OWNER` | значение owner-тега, переключающее на личный namespace |
112
+ | `team_owner` / `ATLAS_TEAM_OWNER` | counterparty-владелец по умолчанию для `--team`-проектов |
113
+ | `timezone` / `ATLAS_TIMEZONE` | часовой пояс PM-БД (фиксированный offset, напр. `+03:00`) |
114
+
115
+ Без конфига Atlas полностью работает локально; владельца/namespaces задаёте под
116
+ себя.
117
+
118
+ ## Навык для Claude / skillery
119
+
120
+ Репозиторий несёт навык в `skills/atlas/` (`SKILL.md` + `agents/` + `references/`) — Atlas можно
121
+ поставить как **tooling-навык** через [skillery](https://skillery.ru): install
122
+ материализует навык и ставит сам CLI (`_skill_meta.toml`). Тогда AI-агент знает,
123
+ как и когда пользоваться `atlas`.
124
+
125
+ ## Разработка
126
+
127
+ ```bash
128
+ uv sync --extra dev
129
+ uv run pytest -q # тесты
130
+ uv run ruff check . # линт
131
+ ```
132
+
133
+ Миграции БД — через Alembic (`uv run alembic upgrade head`). Дисциплина:
134
+ TDD, миграции в git до деплоя, осмысленные коммиты.
135
+
136
+ ## Лицензия
137
+
138
+ [MIT](LICENSE).
@@ -0,0 +1,149 @@
1
+ # A generic, single database configuration.
2
+
3
+ [alembic]
4
+ # path to migration scripts.
5
+ # this is typically a path given in POSIX (e.g. forward slashes)
6
+ # format, relative to the token %(here)s which refers to the location of this
7
+ # ini file
8
+ script_location = %(here)s/migrations
9
+
10
+ # template used to generate migration file names; The default value is %%(rev)s_%%(slug)s
11
+ # Uncomment the line below if you want the files to be prepended with date and time
12
+ # see https://alembic.sqlalchemy.org/en/latest/tutorial.html#editing-the-ini-file
13
+ # for all available tokens
14
+ # file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d-%%(rev)s_%%(slug)s
15
+ # Or organize into date-based subdirectories (requires recursive_version_locations = true)
16
+ # file_template = %%(year)d/%%(month).2d/%%(day).2d_%%(hour).2d%%(minute).2d_%%(second).2d_%%(rev)s_%%(slug)s
17
+
18
+ # sys.path path, will be prepended to sys.path if present.
19
+ # defaults to the current working directory. for multiple paths, the path separator
20
+ # is defined by "path_separator" below.
21
+ prepend_sys_path = .
22
+
23
+
24
+ # timezone to use when rendering the date within the migration file
25
+ # as well as the filename.
26
+ # If specified, requires the tzdata library which can be installed by adding
27
+ # `alembic[tz]` to the pip requirements.
28
+ # string value is passed to ZoneInfo()
29
+ # leave blank for localtime
30
+ # timezone =
31
+
32
+ # max length of characters to apply to the "slug" field
33
+ # truncate_slug_length = 40
34
+
35
+ # set to 'true' to run the environment during
36
+ # the 'revision' command, regardless of autogenerate
37
+ # revision_environment = false
38
+
39
+ # set to 'true' to allow .pyc and .pyo files without
40
+ # a source .py file to be detected as revisions in the
41
+ # versions/ directory
42
+ # sourceless = false
43
+
44
+ # version location specification; This defaults
45
+ # to <script_location>/versions. When using multiple version
46
+ # directories, initial revisions must be specified with --version-path.
47
+ # The path separator used here should be the separator specified by "path_separator"
48
+ # below.
49
+ # version_locations = %(here)s/bar:%(here)s/bat:%(here)s/alembic/versions
50
+
51
+ # path_separator; This indicates what character is used to split lists of file
52
+ # paths, including version_locations and prepend_sys_path within configparser
53
+ # files such as alembic.ini.
54
+ # The default rendered in new alembic.ini files is "os", which uses os.pathsep
55
+ # to provide os-dependent path splitting.
56
+ #
57
+ # Note that in order to support legacy alembic.ini files, this default does NOT
58
+ # take place if path_separator is not present in alembic.ini. If this
59
+ # option is omitted entirely, fallback logic is as follows:
60
+ #
61
+ # 1. Parsing of the version_locations option falls back to using the legacy
62
+ # "version_path_separator" key, which if absent then falls back to the legacy
63
+ # behavior of splitting on spaces and/or commas.
64
+ # 2. Parsing of the prepend_sys_path option falls back to the legacy
65
+ # behavior of splitting on spaces, commas, or colons.
66
+ #
67
+ # Valid values for path_separator are:
68
+ #
69
+ # path_separator = :
70
+ # path_separator = ;
71
+ # path_separator = space
72
+ # path_separator = newline
73
+ #
74
+ # Use os.pathsep. Default configuration used for new projects.
75
+ path_separator = os
76
+
77
+ # set to 'true' to search source files recursively
78
+ # in each "version_locations" directory
79
+ # new in Alembic version 1.10
80
+ # recursive_version_locations = false
81
+
82
+ # the output encoding used when revision files
83
+ # are written from script.py.mako
84
+ # output_encoding = utf-8
85
+
86
+ # database URL. This is consumed by the user-maintained env.py script only.
87
+ # other means of configuring database URLs may be customized within the env.py
88
+ # file.
89
+ sqlalchemy.url = driver://user:pass@localhost/dbname
90
+
91
+
92
+ [post_write_hooks]
93
+ # post_write_hooks defines scripts or Python functions that are run
94
+ # on newly generated revision scripts. See the documentation for further
95
+ # detail and examples
96
+
97
+ # format using "black" - use the console_scripts runner, against the "black" entrypoint
98
+ # hooks = black
99
+ # black.type = console_scripts
100
+ # black.entrypoint = black
101
+ # black.options = -l 79 REVISION_SCRIPT_FILENAME
102
+
103
+ # lint with attempts to fix using "ruff" - use the module runner, against the "ruff" module
104
+ # hooks = ruff
105
+ # ruff.type = module
106
+ # ruff.module = ruff
107
+ # ruff.options = check --fix REVISION_SCRIPT_FILENAME
108
+
109
+ # Alternatively, use the exec runner to execute a binary found on your PATH
110
+ # hooks = ruff
111
+ # ruff.type = exec
112
+ # ruff.executable = ruff
113
+ # ruff.options = check --fix REVISION_SCRIPT_FILENAME
114
+
115
+ # Logging configuration. This is also consumed by the user-maintained
116
+ # env.py script only.
117
+ [loggers]
118
+ keys = root,sqlalchemy,alembic
119
+
120
+ [handlers]
121
+ keys = console
122
+
123
+ [formatters]
124
+ keys = generic
125
+
126
+ [logger_root]
127
+ level = WARNING
128
+ handlers = console
129
+ qualname =
130
+
131
+ [logger_sqlalchemy]
132
+ level = WARNING
133
+ handlers =
134
+ qualname = sqlalchemy.engine
135
+
136
+ [logger_alembic]
137
+ level = INFO
138
+ handlers =
139
+ qualname = alembic
140
+
141
+ [handler_console]
142
+ class = StreamHandler
143
+ args = (sys.stderr,)
144
+ level = NOTSET
145
+ formatter = generic
146
+
147
+ [formatter_generic]
148
+ format = %(levelname)-5.5s [%(name)s] %(message)s
149
+ datefmt = %H:%M:%S
@@ -0,0 +1 @@
1
+ Generic single-database configuration.