specy-road 0.1.0__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.
- specy_road-0.1.0/LICENSE +21 -0
- specy_road-0.1.0/PKG-INFO +141 -0
- specy_road-0.1.0/README.md +109 -0
- specy_road-0.1.0/pyproject.toml +64 -0
- specy_road-0.1.0/setup.cfg +4 -0
- specy_road-0.1.0/specy_road/__init__.py +47 -0
- specy_road-0.1.0/specy_road/bundled_scripts/abort_task_pickup.py +295 -0
- specy_road-0.1.0/specy_road/bundled_scripts/brief_dependency_context.py +257 -0
- specy_road-0.1.0/specy_road/bundled_scripts/do_next_available.py +324 -0
- specy_road-0.1.0/specy_road/bundled_scripts/do_next_prompt.py +271 -0
- specy_road-0.1.0/specy_road/bundled_scripts/do_next_task.py +399 -0
- specy_road-0.1.0/specy_road/bundled_scripts/do_next_task_args.py +85 -0
- specy_road-0.1.0/specy_road/bundled_scripts/do_next_task_interactive.py +135 -0
- specy_road-0.1.0/specy_road/bundled_scripts/do_next_task_leaf_guards.py +78 -0
- specy_road-0.1.0/specy_road/bundled_scripts/do_next_task_pickup_helpers.py +126 -0
- specy_road-0.1.0/specy_road/bundled_scripts/do_next_task_self_heal.py +121 -0
- specy_road-0.1.0/specy_road/bundled_scripts/do_next_task_virtual_complete.py +48 -0
- specy_road-0.1.0/specy_road/bundled_scripts/export_roadmap_md.py +193 -0
- specy_road-0.1.0/specy_road/bundled_scripts/finish_task.py +381 -0
- specy_road-0.1.0/specy_road/bundled_scripts/generate_brief.py +310 -0
- specy_road-0.1.0/specy_road/bundled_scripts/llm_throughput.py +180 -0
- specy_road-0.1.0/specy_road/bundled_scripts/mark_implementation_reviewed.py +323 -0
- specy_road-0.1.0/specy_road/bundled_scripts/migrate_stable_node_keys.py +115 -0
- specy_road-0.1.0/specy_road/bundled_scripts/open_milestone_pr.py +93 -0
- specy_road-0.1.0/specy_road/bundled_scripts/planning_artifacts.py +294 -0
- specy_road-0.1.0/specy_road/bundled_scripts/planning_rename.py +32 -0
- specy_road-0.1.0/specy_road/bundled_scripts/planning_sheet_bootstrap.py +177 -0
- specy_road-0.1.0/specy_road/bundled_scripts/pm_gui_git_remote_verify.py +69 -0
- specy_road-0.1.0/specy_road/bundled_scripts/pm_sync.py +122 -0
- specy_road-0.1.0/specy_road/bundled_scripts/reconcile_milestone_status.py +227 -0
- specy_road-0.1.0/specy_road/bundled_scripts/registration_pickup_commit.py +14 -0
- specy_road-0.1.0/specy_road/bundled_scripts/review_node.py +860 -0
- specy_road-0.1.0/specy_road/bundled_scripts/roadmap_chunk_utils.py +201 -0
- specy_road-0.1.0/specy_road/bundled_scripts/roadmap_crud.py +17 -0
- specy_road-0.1.0/specy_road/bundled_scripts/roadmap_crud_argparse.py +194 -0
- specy_road-0.1.0/specy_road/bundled_scripts/roadmap_crud_dependency_ops.py +114 -0
- specy_road-0.1.0/specy_road/bundled_scripts/roadmap_crud_ops.py +380 -0
- specy_road-0.1.0/specy_road/bundled_scripts/roadmap_edit_fields.py +281 -0
- specy_road-0.1.0/specy_road/bundled_scripts/roadmap_gui_lib.py +202 -0
- specy_road-0.1.0/specy_road/bundled_scripts/roadmap_gui_pr_pickers.py +27 -0
- specy_road-0.1.0/specy_road/bundled_scripts/roadmap_gui_remote.py +399 -0
- specy_road-0.1.0/specy_road/bundled_scripts/roadmap_gui_settings.py +397 -0
- specy_road-0.1.0/specy_road/bundled_scripts/roadmap_gui_settings_scope.py +71 -0
- specy_road-0.1.0/specy_road/bundled_scripts/roadmap_gui_tree.py +62 -0
- specy_road-0.1.0/specy_road/bundled_scripts/roadmap_layout.py +258 -0
- specy_road-0.1.0/specy_road/bundled_scripts/roadmap_load.py +261 -0
- specy_road-0.1.0/specy_road/bundled_scripts/roadmap_load_at_ref.py +74 -0
- specy_road-0.1.0/specy_road/bundled_scripts/roadmap_node_keys.py +25 -0
- specy_road-0.1.0/specy_road/bundled_scripts/roadmap_outline_ops.py +239 -0
- specy_road-0.1.0/specy_road/bundled_scripts/roadmap_outline_renumber.py +113 -0
- specy_road-0.1.0/specy_road/bundled_scripts/scaffold_planning.py +138 -0
- specy_road-0.1.0/specy_road/bundled_scripts/start_milestone_session.py +229 -0
- specy_road-0.1.0/specy_road/bundled_scripts/sync_planning_artifacts.py +76 -0
- specy_road-0.1.0/specy_road/bundled_scripts/update_specy_road.py +398 -0
- specy_road-0.1.0/specy_road/bundled_scripts/validate_file_limits.py +52 -0
- specy_road-0.1.0/specy_road/bundled_scripts/validate_roadmap.py +146 -0
- specy_road-0.1.0/specy_road/bundled_scripts/validate_roadmap_checks.py +367 -0
- specy_road-0.1.0/specy_road/bundled_scripts/validate_roadmap_gates.py +42 -0
- specy_road-0.1.0/specy_road/bundled_scripts/validate_self_heal.py +150 -0
- specy_road-0.1.0/specy_road/bundled_scripts/work_dir_stash.py +50 -0
- specy_road-0.1.0/specy_road/cli.py +313 -0
- specy_road-0.1.0/specy_road/cli_init.py +187 -0
- specy_road-0.1.0/specy_road/cli_init_argparse.py +67 -0
- specy_road-0.1.0/specy_road/constitution_scaffold.py +79 -0
- specy_road-0.1.0/specy_road/do_next_milestone_pickup.py +63 -0
- specy_road-0.1.0/specy_road/feature_rm_registry.py +72 -0
- specy_road-0.1.0/specy_road/file_limits_engine.py +289 -0
- specy_road-0.1.0/specy_road/finish_land_integration.py +112 -0
- specy_road-0.1.0/specy_road/finish_milestone_rollout.py +124 -0
- specy_road-0.1.0/specy_road/finish_modes.py +139 -0
- specy_road-0.1.0/specy_road/finish_pr_body.py +110 -0
- specy_road-0.1.0/specy_road/git_milestone_delivery.py +45 -0
- specy_road-0.1.0/specy_road/git_subprocess.py +24 -0
- specy_road-0.1.0/specy_road/git_sync_status.py +64 -0
- specy_road-0.1.0/specy_road/git_workflow_config.py +380 -0
- specy_road-0.1.0/specy_road/governance_completion.py +61 -0
- specy_road-0.1.0/specy_road/gui_app.py +98 -0
- specy_road-0.1.0/specy_road/gui_app_api.py +29 -0
- specy_road-0.1.0/specy_road/gui_app_helpers.py +109 -0
- specy_road-0.1.0/specy_road/gui_app_models.py +95 -0
- specy_road-0.1.0/specy_road/gui_app_routes_core.py +212 -0
- specy_road-0.1.0/specy_road/gui_app_routes_nodes.py +284 -0
- specy_road-0.1.0/specy_road/gui_app_routes_planning.py +153 -0
- specy_road-0.1.0/specy_road/gui_app_routes_publish.py +31 -0
- specy_road-0.1.0/specy_road/gui_app_routes_workspace.py +133 -0
- specy_road-0.1.0/specy_road/init_project.py +70 -0
- specy_road-0.1.0/specy_road/milestone_chunk_io.py +125 -0
- specy_road-0.1.0/specy_road/milestone_lock.py +46 -0
- specy_road-0.1.0/specy_road/milestone_rollup_git.py +137 -0
- specy_road-0.1.0/specy_road/milestone_session.py +89 -0
- specy_road-0.1.0/specy_road/milestone_subtree.py +69 -0
- specy_road-0.1.0/specy_road/on_complete_pickup.py +86 -0
- specy_road-0.1.0/specy_road/on_complete_session.py +73 -0
- specy_road-0.1.0/specy_road/pm_gantt_static/assets/ConstitutionDrawer-DgiRkhrs.js +1 -0
- specy_road-0.1.0/specy_road/pm_gantt_static/assets/EditModal-D8Pg4vpG.js +9 -0
- specy_road-0.1.0/specy_road/pm_gantt_static/assets/MarkdownWorkspace-6T8YVW1A.js +3 -0
- specy_road-0.1.0/specy_road/pm_gantt_static/assets/ModalPersistStatusFooter-COyGYvH1.js +1 -0
- specy_road-0.1.0/specy_road/pm_gantt_static/assets/SettingsDrawer-D05lcnA5.js +1 -0
- specy_road-0.1.0/specy_road/pm_gantt_static/assets/SharedDocsDrawer-DhgtIH_F.js +1 -0
- specy_road-0.1.0/specy_road/pm_gantt_static/assets/VisionDrawer-DWV6VYHV.js +4 -0
- specy_road-0.1.0/specy_road/pm_gantt_static/assets/WorkNotesDrawer-BCZRFeuT.js +5 -0
- specy_road-0.1.0/specy_road/pm_gantt_static/assets/dnd-stack-ChA4-iz4.js +5 -0
- specy_road-0.1.0/specy_road/pm_gantt_static/assets/index-BB0qR2RD.js +5 -0
- specy_road-0.1.0/specy_road/pm_gantt_static/assets/index-Bdk2uuZB.css +1 -0
- specy_road-0.1.0/specy_road/pm_gantt_static/assets/markdown-stack-BzdnVZOK.js +234 -0
- specy_road-0.1.0/specy_road/pm_gantt_static/assets/react-vendor-zEG5fcam.js +9 -0
- specy_road-0.1.0/specy_road/pm_gantt_static/assets/rolldown-runtime-S-ySWqyJ.js +1 -0
- specy_road-0.1.0/specy_road/pm_gantt_static/assets/usePmGuiHandlers-vI5Q_zm0.js +1 -0
- specy_road-0.1.0/specy_road/pm_gantt_static/assets/vendor-C0tHfJtQ.js +6 -0
- specy_road-0.1.0/specy_road/pm_gantt_static/favicon.svg +1 -0
- specy_road-0.1.0/specy_road/pm_gantt_static/icons.svg +24 -0
- specy_road-0.1.0/specy_road/pm_gantt_static/index.html +18 -0
- specy_road-0.1.0/specy_road/pm_gui_concurrency.py +121 -0
- specy_road-0.1.0/specy_road/pm_gui_fingerprint.py +71 -0
- specy_road-0.1.0/specy_road/pm_integration_registry.py +136 -0
- specy_road-0.1.0/specy_road/pm_publish.py +322 -0
- specy_road-0.1.0/specy_road/registry_remote_overlay.py +336 -0
- specy_road-0.1.0/specy_road/registry_remote_overlay_merge.py +185 -0
- specy_road-0.1.0/specy_road/runtime_paths.py +32 -0
- specy_road-0.1.0/specy_road/specyrd_cli.py +211 -0
- specy_road-0.1.0/specy_road/specyrd_init.py +369 -0
- specy_road-0.1.0/specy_road/templates/adoption/004-specy-road-consumer.mdc +10 -0
- specy_road-0.1.0/specy_road/templates/adoption/005-do-next-registry-publish.mdc +10 -0
- specy_road-0.1.0/specy_road/templates/adoption/README.md +9 -0
- specy_road-0.1.0/specy_road/templates/adoption/specy-road-consumer-claude-snippet.md +7 -0
- specy_road-0.1.0/specy_road/templates/constitution/principles.md.template +8 -0
- specy_road-0.1.0/specy_road/templates/constitution/purpose.md.template +5 -0
- specy_road-0.1.0/specy_road/templates/planning-node/feature-sheet.md.template +16 -0
- specy_road-0.1.0/specy_road/templates/planning-node/gate-sheet.md.template +23 -0
- specy_road-0.1.0/specy_road/templates/planning-node/milestone-stub.md.template +65 -0
- specy_road-0.1.0/specy_road/templates/project/AGENTS.md +19 -0
- specy_road-0.1.0/specy_road/templates/project/constitution/principles.md +7 -0
- specy_road-0.1.0/specy_road/templates/project/constitution/purpose.md +5 -0
- specy_road-0.1.0/specy_road/templates/project/constraints/README.md +14 -0
- specy_road-0.1.0/specy_road/templates/project/constraints/file-limits.yaml +31 -0
- specy_road-0.1.0/specy_road/templates/project/docs/supply-chain-security.md +49 -0
- specy_road-0.1.0/specy_road/templates/project/planning/M1.1_first-milestone_b2c3d4e5-f6a7-4890-b123-456789abcdef.md +16 -0
- specy_road-0.1.0/specy_road/templates/project/planning/M1_unnamed_a1b2c3d4-e5f6-4789-a012-3456789abcde.md +16 -0
- specy_road-0.1.0/specy_road/templates/project/planning/README.md +9 -0
- specy_road-0.1.0/specy_road/templates/project/roadmap/git-workflow.yaml +14 -0
- specy_road-0.1.0/specy_road/templates/project/roadmap/manifest.json +6 -0
- specy_road-0.1.0/specy_road/templates/project/roadmap/phases/M1.json +36 -0
- specy_road-0.1.0/specy_road/templates/project/roadmap/registry.yaml +5 -0
- specy_road-0.1.0/specy_road/templates/project/schemas/git-workflow.schema.json +40 -0
- specy_road-0.1.0/specy_road/templates/project/schemas/manifest.schema.json +16 -0
- specy_road-0.1.0/specy_road/templates/project/schemas/registry.schema.json +54 -0
- specy_road-0.1.0/specy_road/templates/project/schemas/roadmap.schema.json +135 -0
- specy_road-0.1.0/specy_road/templates/project/shared/README.md +5 -0
- specy_road-0.1.0/specy_road/templates/project/vision.md +3 -0
- specy_road-0.1.0/specy_road/templates/project/work/README.md +13 -0
- specy_road-0.1.0/specy_road/templates/project/work/implementation-summary.template.md +22 -0
- specy_road-0.1.0/specy_road/templates/specyrd/CLAUDE.md.template +50 -0
- specy_road-0.1.0/specy_road/templates/specyrd/commands/specyrd-abort-task-pickup.md +21 -0
- specy_road-0.1.0/specy_road/templates/specyrd/commands/specyrd-add-node.md +12 -0
- specy_road-0.1.0/specy_road/templates/specyrd/commands/specyrd-author.md +41 -0
- specy_road-0.1.0/specy_road/templates/specyrd/commands/specyrd-brief.md +23 -0
- specy_road-0.1.0/specy_road/templates/specyrd/commands/specyrd-claim.md +47 -0
- specy_road-0.1.0/specy_road/templates/specyrd/commands/specyrd-constitution.md +30 -0
- specy_road-0.1.0/specy_road/templates/specyrd/commands/specyrd-do-next-task.md +42 -0
- specy_road-0.1.0/specy_road/templates/specyrd/commands/specyrd-export.md +27 -0
- specy_road-0.1.0/specy_road/templates/specyrd/commands/specyrd-file-limits.md +19 -0
- specy_road-0.1.0/specy_road/templates/specyrd/commands/specyrd-finish.md +37 -0
- specy_road-0.1.0/specy_road/templates/specyrd/commands/specyrd-list-nodes.md +12 -0
- specy_road-0.1.0/specy_road/templates/specyrd/commands/specyrd-mark-reviewed.md +25 -0
- specy_road-0.1.0/specy_road/templates/specyrd/commands/specyrd-review-node.md +12 -0
- specy_road-0.1.0/specy_road/templates/specyrd/commands/specyrd-show-node.md +12 -0
- specy_road-0.1.0/specy_road/templates/specyrd/commands/specyrd-sync.md +14 -0
- specy_road-0.1.0/specy_road/templates/specyrd/commands/specyrd-validate.md +23 -0
- specy_road-0.1.0/specy_road/templates/specyrd/dot-specyrd/README.md +14 -0
- specy_road-0.1.0/specy_road.egg-info/PKG-INFO +141 -0
- specy_road-0.1.0/specy_road.egg-info/SOURCES.txt +249 -0
- specy_road-0.1.0/specy_road.egg-info/dependency_links.txt +1 -0
- specy_road-0.1.0/specy_road.egg-info/entry_points.txt +3 -0
- specy_road-0.1.0/specy_road.egg-info/requires.txt +26 -0
- specy_road-0.1.0/specy_road.egg-info/top_level.txt +1 -0
- specy_road-0.1.0/tests/test_abort_task_pickup.py +170 -0
- specy_road-0.1.0/tests/test_brief_dependency_context.py +236 -0
- specy_road-0.1.0/tests/test_check_release_version.py +80 -0
- specy_road-0.1.0/tests/test_cli.py +394 -0
- specy_road-0.1.0/tests/test_cli_init.py +60 -0
- specy_road-0.1.0/tests/test_constitution_scaffold.py +92 -0
- specy_road-0.1.0/tests/test_do_next_gate.py +168 -0
- specy_road-0.1.0/tests/test_do_next_pr_gating.py +40 -0
- specy_road-0.1.0/tests/test_do_next_prompt.py +48 -0
- specy_road-0.1.0/tests/test_do_next_queue.py +317 -0
- specy_road-0.1.0/tests/test_do_next_task_git_helpers.py +66 -0
- specy_road-0.1.0/tests/test_do_next_task_pickup.py +315 -0
- specy_road-0.1.0/tests/test_do_next_task_self_heal.py +115 -0
- specy_road-0.1.0/tests/test_do_next_virtual_pickup.py +384 -0
- specy_road-0.1.0/tests/test_export_roadmap_md.py +76 -0
- specy_road-0.1.0/tests/test_file_limits_engine.py +151 -0
- specy_road-0.1.0/tests/test_finish_merge_mode.py +74 -0
- specy_road-0.1.0/tests/test_finish_modes_pr_body.py +61 -0
- specy_road-0.1.0/tests/test_finish_pr_body.py +99 -0
- specy_road-0.1.0/tests/test_finish_task_commands.py +183 -0
- specy_road-0.1.0/tests/test_finish_work_cleanup.py +122 -0
- specy_road-0.1.0/tests/test_generate_brief.py +117 -0
- specy_road-0.1.0/tests/test_git_milestone_delivery.py +67 -0
- specy_road-0.1.0/tests/test_git_subprocess.py +61 -0
- specy_road-0.1.0/tests/test_git_workflow_remote_tip.py +203 -0
- specy_road-0.1.0/tests/test_governance_completion.py +79 -0
- specy_road-0.1.0/tests/test_gui_app.py +348 -0
- specy_road-0.1.0/tests/test_gui_app_milestone_lock.py +153 -0
- specy_road-0.1.0/tests/test_gui_app_mutations.py +239 -0
- specy_road-0.1.0/tests/test_gui_app_routes_nodes_errors.py +156 -0
- specy_road-0.1.0/tests/test_init_project.py +62 -0
- specy_road-0.1.0/tests/test_init_project_gitignore.py +27 -0
- specy_road-0.1.0/tests/test_llm_throughput.py +189 -0
- specy_road-0.1.0/tests/test_milestone_lock.py +61 -0
- specy_road-0.1.0/tests/test_milestone_session.py +47 -0
- specy_road-0.1.0/tests/test_milestone_subtree.py +75 -0
- specy_road-0.1.0/tests/test_on_complete.py +104 -0
- specy_road-0.1.0/tests/test_outline_renumber.py +107 -0
- specy_road-0.1.0/tests/test_planning_artifacts.py +167 -0
- specy_road-0.1.0/tests/test_planning_sheet_bootstrap.py +130 -0
- specy_road-0.1.0/tests/test_pm_gui_concurrency_autoff.py +327 -0
- specy_road-0.1.0/tests/test_pm_gui_field_repros.py +108 -0
- specy_road-0.1.0/tests/test_pm_gui_fingerprint.py +112 -0
- specy_road-0.1.0/tests/test_pm_gui_git_remote_verify.py +157 -0
- specy_road-0.1.0/tests/test_pm_integration_registry.py +172 -0
- specy_road-0.1.0/tests/test_pm_publish.py +172 -0
- specy_road-0.1.0/tests/test_post_release_readme_cleanup.py +106 -0
- specy_road-0.1.0/tests/test_reconcile_milestone_status.py +28 -0
- specy_road-0.1.0/tests/test_reconcile_milestone_status_errors.py +125 -0
- specy_road-0.1.0/tests/test_registry_remote_overlay.py +215 -0
- specy_road-0.1.0/tests/test_registry_remote_overlay_sync.py +312 -0
- specy_road-0.1.0/tests/test_review_node.py +362 -0
- specy_road-0.1.0/tests/test_roadmap_crud.py +363 -0
- specy_road-0.1.0/tests/test_roadmap_crud_dependencies.py +132 -0
- specy_road-0.1.0/tests/test_roadmap_crud_ops.py +155 -0
- specy_road-0.1.0/tests/test_roadmap_edit_fields.py +70 -0
- specy_road-0.1.0/tests/test_roadmap_gui_lib.py +215 -0
- specy_road-0.1.0/tests/test_roadmap_gui_pr_pickers.py +53 -0
- specy_road-0.1.0/tests/test_roadmap_gui_remote.py +280 -0
- specy_road-0.1.0/tests/test_roadmap_gui_tree.py +83 -0
- specy_road-0.1.0/tests/test_roadmap_layout.py +183 -0
- specy_road-0.1.0/tests/test_roadmap_load.py +166 -0
- specy_road-0.1.0/tests/test_roadmap_outline_registry.py +29 -0
- specy_road-0.1.0/tests/test_scaffold_planning.py +22 -0
- specy_road-0.1.0/tests/test_set_gate_status.py +142 -0
- specy_road-0.1.0/tests/test_specyrd_init.py +279 -0
- specy_road-0.1.0/tests/test_start_milestone_session_reentry.py +119 -0
- specy_road-0.1.0/tests/test_sync_planning_outline.py +115 -0
- specy_road-0.1.0/tests/test_update_specy_road.py +302 -0
- specy_road-0.1.0/tests/test_validate_file_limits.py +16 -0
- specy_road-0.1.0/tests/test_validate_gates.py +63 -0
- specy_road-0.1.0/tests/test_validate_roadmap.py +307 -0
- specy_road-0.1.0/tests/test_validate_self_heal.py +145 -0
- specy_road-0.1.0/tests/test_verify_wheel_contents.py +67 -0
- specy_road-0.1.0/tests/test_version_resolution.py +113 -0
- specy_road-0.1.0/tests/test_work_dir_stash.py +61 -0
specy_road-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 specy-road 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,141 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: specy-road
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Roadmap-first coordination kit for humans and AI agents
|
|
5
|
+
License: MIT
|
|
6
|
+
Requires-Python: >=3.11
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
License-File: LICENSE
|
|
9
|
+
Requires-Dist: PyYAML>=6.0
|
|
10
|
+
Requires-Dist: jsonschema>=4.20
|
|
11
|
+
Provides-Extra: dev
|
|
12
|
+
Requires-Dist: pytest>=7.0; extra == "dev"
|
|
13
|
+
Requires-Dist: fastapi>=0.115; extra == "dev"
|
|
14
|
+
Requires-Dist: httpx>=0.27; extra == "dev"
|
|
15
|
+
Requires-Dist: requests>=2.31; extra == "dev"
|
|
16
|
+
Provides-Extra: review
|
|
17
|
+
Requires-Dist: openai>=1.40; extra == "review"
|
|
18
|
+
Requires-Dist: anthropic>=0.40; extra == "review"
|
|
19
|
+
Provides-Extra: gui
|
|
20
|
+
Requires-Dist: fastapi>=0.115; extra == "gui"
|
|
21
|
+
Requires-Dist: uvicorn[standard]>=0.30; extra == "gui"
|
|
22
|
+
Requires-Dist: requests>=2.31; extra == "gui"
|
|
23
|
+
Requires-Dist: openai>=1.40; extra == "gui"
|
|
24
|
+
Requires-Dist: anthropic>=0.40; extra == "gui"
|
|
25
|
+
Provides-Extra: gui-next
|
|
26
|
+
Requires-Dist: fastapi>=0.115; extra == "gui-next"
|
|
27
|
+
Requires-Dist: uvicorn[standard]>=0.30; extra == "gui-next"
|
|
28
|
+
Requires-Dist: requests>=2.31; extra == "gui-next"
|
|
29
|
+
Requires-Dist: openai>=1.40; extra == "gui-next"
|
|
30
|
+
Requires-Dist: anthropic>=0.40; extra == "gui-next"
|
|
31
|
+
Dynamic: license-file
|
|
32
|
+
|
|
33
|
+
<!--
|
|
34
|
+
TODO(post-release): wire automated PyPI build-and-publish on every tagged
|
|
35
|
+
release (v*.*.*), then replace the install-from-source block below with a
|
|
36
|
+
single `pip install specy-road` line.
|
|
37
|
+
-->
|
|
38
|
+
|
|
39
|
+
# specy-road
|
|
40
|
+
|
|
41
|
+
> ## ⚠️ Pre-release notice
|
|
42
|
+
> **Stable PyPI** does not list `specy-road` yet (`pip install specy-road` from
|
|
43
|
+
> pypi.org). **Prerelease** tags (for example `v0.1.0-rc1`) publish to
|
|
44
|
+
> **TestPyPI** for smoke installs — see
|
|
45
|
+
> [`docs/contributor-guide.md`](docs/contributor-guide.md). For day-to-day work
|
|
46
|
+
> on **this** repository, keep using an **editable install from `dev`** as in
|
|
47
|
+
> [Install](#install). The TODO comment above is removed after **v0.1.0**
|
|
48
|
+
> ships to PyPI and the install block switches to `pip install`.
|
|
49
|
+
|
|
50
|
+
**One roadmap for the whole team**—so product, engineering, and coding agents share the same plan.
|
|
51
|
+
|
|
52
|
+
## What it is
|
|
53
|
+
|
|
54
|
+
**specy-road** is a toolkit for keeping priorities, written specs, and implementation work aligned. It fits teams that use AI-assisted editors (for example Claude or Cursor) together with product-led planning. Your team maintains a **roadmap** in the repository: what matters, in what order, and what depends on what. A small command-line tool checks that the roadmap is consistent, publishes a readable index, and can build **briefs**—focused packets of context for a single task—so nobody has to reread the entire project to know what to do next.
|
|
55
|
+
|
|
56
|
+
### Who it’s for
|
|
57
|
+
|
|
58
|
+
- **Product managers and delivery leads** — A single place for direction, sequencing, and visibility into what is active or blocked.
|
|
59
|
+
- **Developers and coding agents** — Task-sized context, shared contracts, and clear ownership areas so work stays parallel without stepping on the same files.
|
|
60
|
+
|
|
61
|
+
## Why teams use it
|
|
62
|
+
|
|
63
|
+
- **Single source of truth** — Less drift between tickets, docs, and “what we agreed.” The roadmap and planning sheets stay tied together; cross-cutting rules live in `shared/` where they belong.
|
|
64
|
+
- **Right-sized context** — `specy-road brief` pulls the relevant planning sheets and contracts for one roadmap item instead of the whole repository story.
|
|
65
|
+
- **Safer parallel work** — Stable IDs, **touch zones**, and `roadmap/registry.yaml` show who is working on what before files collide.
|
|
66
|
+
- **Your tools, your workflow** — The kit is about roadmaps and specs, not a particular IDE or agent ritual. See [docs/philosophy-and-scope.md](docs/philosophy-and-scope.md).
|
|
67
|
+
|
|
68
|
+
## Getting started
|
|
69
|
+
|
|
70
|
+
Install the CLI (**Python 3.11+**) and **git**, then follow **[Install](#install)** and **[docs/install-and-usage.md](docs/install-and-usage.md)** for cloning, editable install, and **`specy-road init project`** in an application repo. After that, everyday use boils down to:
|
|
71
|
+
|
|
72
|
+
### For PMs
|
|
73
|
+
|
|
74
|
+
1. Prefer **`specy-road gui`** for the dashboard, or edit `roadmap/` and `planning/` directly ([docs/pm-gui.md](docs/pm-gui.md)).
|
|
75
|
+
2. Run **`specy-road export`** and **`specy-road validate`** before you commit.
|
|
76
|
+
|
|
77
|
+
More detail: [docs/pm-workflow.md](docs/pm-workflow.md). Optional **LLM Review** in the Gantt UI: [docs/pm-llm-review.md](docs/pm-llm-review.md).
|
|
78
|
+
|
|
79
|
+
### For developers
|
|
80
|
+
|
|
81
|
+
1. Pick up work with **`specy-road do-next-available-task`**, or **`specy-road brief <NODE_ID>`** for a specific node ([docs/dev-workflow.md](docs/dev-workflow.md)).
|
|
82
|
+
2. Finish with **`specy-road finish-this-task`**, then land changes with your team’s PR process ([docs/git-workflow.md](docs/git-workflow.md)).
|
|
83
|
+
|
|
84
|
+
## Install
|
|
85
|
+
|
|
86
|
+
Requires **Python 3.11+** and **git** (with a configured remote — `origin` by default).
|
|
87
|
+
|
|
88
|
+
> **Stable PyPI pending.** Install from source on the `dev` branch (below). The
|
|
89
|
+
> end-user guide is **[docs/install-and-usage.md](docs/install-and-usage.md)**;
|
|
90
|
+
> prerelease/TestPyPI details live in **[docs/contributor-guide.md](docs/contributor-guide.md)**.
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
git clone https://github.com/shanevigil/specy-road.git
|
|
94
|
+
cd specy-road
|
|
95
|
+
git switch dev # main is reserved for tagged releases
|
|
96
|
+
python3 -m venv .venv
|
|
97
|
+
source .venv/bin/activate # Windows: .venv\Scripts\activate
|
|
98
|
+
pip install -e ".[dev,gui-next]" # add ',review' for optional review-node
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Consumer **`init project`**, `roadmap/git-workflow.yaml`, optional **`specyrd`** stubs, and bootstrap prompts are covered in **[docs/install-and-usage.md](docs/install-and-usage.md)**. Toolkit contributors (tests, pre-commit, releases): **[docs/contributor-guide.md](docs/contributor-guide.md)**.
|
|
102
|
+
|
|
103
|
+
## More on how to work with it
|
|
104
|
+
|
|
105
|
+
Typical path in an **application** repository after `specy-road init project`: roadmap and planning for direction and detail; validation, export, and briefs for engineering and agents; registry and branches for safe parallel work. Maintainers working on **this** toolkit follow [AGENTS.md](AGENTS.md), [docs/toolkit-development.md](docs/toolkit-development.md), and [docs/contributor-guide.md](docs/contributor-guide.md).
|
|
106
|
+
|
|
107
|
+
1. **Bootstrap** — `specy-road init project` (once per repo) creates `constitution/`, `roadmap/`, `shared/`, `constraints/`, `schemas/`, `planning/`, `work/`, and `AGENTS.md`.
|
|
108
|
+
2. **Author** — Edit JSON chunks under `roadmap/` (listed in `manifest.json`). See [docs/roadmap-authoring.md](docs/roadmap-authoring.md).
|
|
109
|
+
3. **Validate** — `specy-road validate` (use `--repo-root` if not in the project root).
|
|
110
|
+
4. **Publish views** — `specy-road export` regenerates `roadmap.md` from the merged graph.
|
|
111
|
+
5. **Focus a task** — `specy-road brief <NODE_ID> -o work/brief-<NODE_ID>.md`, then implement against `shared/` contracts cited for that node.
|
|
112
|
+
6. **Branches** — Follow [docs/git-workflow.md](docs/git-workflow.md): register in `roadmap/registry.yaml` on the **integration branch** from `roadmap/git-workflow.yaml`, then `feature/rm-<codename>` (or use `specy-road do-next-available-task`).
|
|
113
|
+
7. **Optional IDE commands** — `specyrd` installs stubs that invoke the CLI; see [docs/contributor-guide.md#ide-command-stubs-specyrd](docs/contributor-guide.md#ide-command-stubs-specyrd).
|
|
114
|
+
|
|
115
|
+
## Where to read next
|
|
116
|
+
|
|
117
|
+
| Document | Purpose |
|
|
118
|
+
| -------- | ------- |
|
|
119
|
+
| [docs/install-and-usage.md](docs/install-and-usage.md) | Install from source, `init project`, everyday PM/dev/GUI flows |
|
|
120
|
+
| [docs/contributor-guide.md](docs/contributor-guide.md) | Toolkit contributors: CI parity, pre-commit, releases, `specyrd` |
|
|
121
|
+
| [docs/philosophy-and-scope.md](docs/philosophy-and-scope.md) | What the kit promises and what it leaves to you |
|
|
122
|
+
| [docs/architecture.md](docs/architecture.md) | End-to-end flow: manifest, chunks, validation, briefs |
|
|
123
|
+
| [docs/roadmap-authoring.md](docs/roadmap-authoring.md) | JSON chunks, manifest order, generated `roadmap.md` |
|
|
124
|
+
| [docs/git-workflow.md](docs/git-workflow.md) | Consumer workflow contract (`git-workflow.yaml`), branches, registry, merge-back |
|
|
125
|
+
| [docs/toolkit-development.md](docs/toolkit-development.md) | Short maintainer notes (this repo vs consumer contract) |
|
|
126
|
+
| [docs/optional-ai-tooling-patterns.md](docs/optional-ai-tooling-patterns.md) | Optional patterns (CLAUDE.md, Cursor rules, MCP) for app repos |
|
|
127
|
+
| [suggested_prompts/](suggested_prompts/) | Adoption prompts (clone this repo; not shipped on PyPI) |
|
|
128
|
+
| [AGENTS.md](AGENTS.md) | Short entry for coding agents |
|
|
129
|
+
|
|
130
|
+
## Related material
|
|
131
|
+
|
|
132
|
+
- [Spec-Kit](https://github.com/github/spec-kit) — inspiration only
|
|
133
|
+
- [docs/optional-ai-tooling-patterns.md](docs/optional-ai-tooling-patterns.md) — optional AI tooling ideas for application repositories
|
|
134
|
+
|
|
135
|
+
## Contributing to this repository
|
|
136
|
+
|
|
137
|
+
To participate in development of the **specy-road** toolkit itself, contact the repository owner. Technical setup: [docs/contributor-guide.md](docs/contributor-guide.md).
|
|
138
|
+
|
|
139
|
+
## License
|
|
140
|
+
|
|
141
|
+
MIT — see [LICENSE](LICENSE).
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
TODO(post-release): wire automated PyPI build-and-publish on every tagged
|
|
3
|
+
release (v*.*.*), then replace the install-from-source block below with a
|
|
4
|
+
single `pip install specy-road` line.
|
|
5
|
+
-->
|
|
6
|
+
|
|
7
|
+
# specy-road
|
|
8
|
+
|
|
9
|
+
> ## ⚠️ Pre-release notice
|
|
10
|
+
> **Stable PyPI** does not list `specy-road` yet (`pip install specy-road` from
|
|
11
|
+
> pypi.org). **Prerelease** tags (for example `v0.1.0-rc1`) publish to
|
|
12
|
+
> **TestPyPI** for smoke installs — see
|
|
13
|
+
> [`docs/contributor-guide.md`](docs/contributor-guide.md). For day-to-day work
|
|
14
|
+
> on **this** repository, keep using an **editable install from `dev`** as in
|
|
15
|
+
> [Install](#install). The TODO comment above is removed after **v0.1.0**
|
|
16
|
+
> ships to PyPI and the install block switches to `pip install`.
|
|
17
|
+
|
|
18
|
+
**One roadmap for the whole team**—so product, engineering, and coding agents share the same plan.
|
|
19
|
+
|
|
20
|
+
## What it is
|
|
21
|
+
|
|
22
|
+
**specy-road** is a toolkit for keeping priorities, written specs, and implementation work aligned. It fits teams that use AI-assisted editors (for example Claude or Cursor) together with product-led planning. Your team maintains a **roadmap** in the repository: what matters, in what order, and what depends on what. A small command-line tool checks that the roadmap is consistent, publishes a readable index, and can build **briefs**—focused packets of context for a single task—so nobody has to reread the entire project to know what to do next.
|
|
23
|
+
|
|
24
|
+
### Who it’s for
|
|
25
|
+
|
|
26
|
+
- **Product managers and delivery leads** — A single place for direction, sequencing, and visibility into what is active or blocked.
|
|
27
|
+
- **Developers and coding agents** — Task-sized context, shared contracts, and clear ownership areas so work stays parallel without stepping on the same files.
|
|
28
|
+
|
|
29
|
+
## Why teams use it
|
|
30
|
+
|
|
31
|
+
- **Single source of truth** — Less drift between tickets, docs, and “what we agreed.” The roadmap and planning sheets stay tied together; cross-cutting rules live in `shared/` where they belong.
|
|
32
|
+
- **Right-sized context** — `specy-road brief` pulls the relevant planning sheets and contracts for one roadmap item instead of the whole repository story.
|
|
33
|
+
- **Safer parallel work** — Stable IDs, **touch zones**, and `roadmap/registry.yaml` show who is working on what before files collide.
|
|
34
|
+
- **Your tools, your workflow** — The kit is about roadmaps and specs, not a particular IDE or agent ritual. See [docs/philosophy-and-scope.md](docs/philosophy-and-scope.md).
|
|
35
|
+
|
|
36
|
+
## Getting started
|
|
37
|
+
|
|
38
|
+
Install the CLI (**Python 3.11+**) and **git**, then follow **[Install](#install)** and **[docs/install-and-usage.md](docs/install-and-usage.md)** for cloning, editable install, and **`specy-road init project`** in an application repo. After that, everyday use boils down to:
|
|
39
|
+
|
|
40
|
+
### For PMs
|
|
41
|
+
|
|
42
|
+
1. Prefer **`specy-road gui`** for the dashboard, or edit `roadmap/` and `planning/` directly ([docs/pm-gui.md](docs/pm-gui.md)).
|
|
43
|
+
2. Run **`specy-road export`** and **`specy-road validate`** before you commit.
|
|
44
|
+
|
|
45
|
+
More detail: [docs/pm-workflow.md](docs/pm-workflow.md). Optional **LLM Review** in the Gantt UI: [docs/pm-llm-review.md](docs/pm-llm-review.md).
|
|
46
|
+
|
|
47
|
+
### For developers
|
|
48
|
+
|
|
49
|
+
1. Pick up work with **`specy-road do-next-available-task`**, or **`specy-road brief <NODE_ID>`** for a specific node ([docs/dev-workflow.md](docs/dev-workflow.md)).
|
|
50
|
+
2. Finish with **`specy-road finish-this-task`**, then land changes with your team’s PR process ([docs/git-workflow.md](docs/git-workflow.md)).
|
|
51
|
+
|
|
52
|
+
## Install
|
|
53
|
+
|
|
54
|
+
Requires **Python 3.11+** and **git** (with a configured remote — `origin` by default).
|
|
55
|
+
|
|
56
|
+
> **Stable PyPI pending.** Install from source on the `dev` branch (below). The
|
|
57
|
+
> end-user guide is **[docs/install-and-usage.md](docs/install-and-usage.md)**;
|
|
58
|
+
> prerelease/TestPyPI details live in **[docs/contributor-guide.md](docs/contributor-guide.md)**.
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
git clone https://github.com/shanevigil/specy-road.git
|
|
62
|
+
cd specy-road
|
|
63
|
+
git switch dev # main is reserved for tagged releases
|
|
64
|
+
python3 -m venv .venv
|
|
65
|
+
source .venv/bin/activate # Windows: .venv\Scripts\activate
|
|
66
|
+
pip install -e ".[dev,gui-next]" # add ',review' for optional review-node
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Consumer **`init project`**, `roadmap/git-workflow.yaml`, optional **`specyrd`** stubs, and bootstrap prompts are covered in **[docs/install-and-usage.md](docs/install-and-usage.md)**. Toolkit contributors (tests, pre-commit, releases): **[docs/contributor-guide.md](docs/contributor-guide.md)**.
|
|
70
|
+
|
|
71
|
+
## More on how to work with it
|
|
72
|
+
|
|
73
|
+
Typical path in an **application** repository after `specy-road init project`: roadmap and planning for direction and detail; validation, export, and briefs for engineering and agents; registry and branches for safe parallel work. Maintainers working on **this** toolkit follow [AGENTS.md](AGENTS.md), [docs/toolkit-development.md](docs/toolkit-development.md), and [docs/contributor-guide.md](docs/contributor-guide.md).
|
|
74
|
+
|
|
75
|
+
1. **Bootstrap** — `specy-road init project` (once per repo) creates `constitution/`, `roadmap/`, `shared/`, `constraints/`, `schemas/`, `planning/`, `work/`, and `AGENTS.md`.
|
|
76
|
+
2. **Author** — Edit JSON chunks under `roadmap/` (listed in `manifest.json`). See [docs/roadmap-authoring.md](docs/roadmap-authoring.md).
|
|
77
|
+
3. **Validate** — `specy-road validate` (use `--repo-root` if not in the project root).
|
|
78
|
+
4. **Publish views** — `specy-road export` regenerates `roadmap.md` from the merged graph.
|
|
79
|
+
5. **Focus a task** — `specy-road brief <NODE_ID> -o work/brief-<NODE_ID>.md`, then implement against `shared/` contracts cited for that node.
|
|
80
|
+
6. **Branches** — Follow [docs/git-workflow.md](docs/git-workflow.md): register in `roadmap/registry.yaml` on the **integration branch** from `roadmap/git-workflow.yaml`, then `feature/rm-<codename>` (or use `specy-road do-next-available-task`).
|
|
81
|
+
7. **Optional IDE commands** — `specyrd` installs stubs that invoke the CLI; see [docs/contributor-guide.md#ide-command-stubs-specyrd](docs/contributor-guide.md#ide-command-stubs-specyrd).
|
|
82
|
+
|
|
83
|
+
## Where to read next
|
|
84
|
+
|
|
85
|
+
| Document | Purpose |
|
|
86
|
+
| -------- | ------- |
|
|
87
|
+
| [docs/install-and-usage.md](docs/install-and-usage.md) | Install from source, `init project`, everyday PM/dev/GUI flows |
|
|
88
|
+
| [docs/contributor-guide.md](docs/contributor-guide.md) | Toolkit contributors: CI parity, pre-commit, releases, `specyrd` |
|
|
89
|
+
| [docs/philosophy-and-scope.md](docs/philosophy-and-scope.md) | What the kit promises and what it leaves to you |
|
|
90
|
+
| [docs/architecture.md](docs/architecture.md) | End-to-end flow: manifest, chunks, validation, briefs |
|
|
91
|
+
| [docs/roadmap-authoring.md](docs/roadmap-authoring.md) | JSON chunks, manifest order, generated `roadmap.md` |
|
|
92
|
+
| [docs/git-workflow.md](docs/git-workflow.md) | Consumer workflow contract (`git-workflow.yaml`), branches, registry, merge-back |
|
|
93
|
+
| [docs/toolkit-development.md](docs/toolkit-development.md) | Short maintainer notes (this repo vs consumer contract) |
|
|
94
|
+
| [docs/optional-ai-tooling-patterns.md](docs/optional-ai-tooling-patterns.md) | Optional patterns (CLAUDE.md, Cursor rules, MCP) for app repos |
|
|
95
|
+
| [suggested_prompts/](suggested_prompts/) | Adoption prompts (clone this repo; not shipped on PyPI) |
|
|
96
|
+
| [AGENTS.md](AGENTS.md) | Short entry for coding agents |
|
|
97
|
+
|
|
98
|
+
## Related material
|
|
99
|
+
|
|
100
|
+
- [Spec-Kit](https://github.com/github/spec-kit) — inspiration only
|
|
101
|
+
- [docs/optional-ai-tooling-patterns.md](docs/optional-ai-tooling-patterns.md) — optional AI tooling ideas for application repositories
|
|
102
|
+
|
|
103
|
+
## Contributing to this repository
|
|
104
|
+
|
|
105
|
+
To participate in development of the **specy-road** toolkit itself, contact the repository owner. Technical setup: [docs/contributor-guide.md](docs/contributor-guide.md).
|
|
106
|
+
|
|
107
|
+
## License
|
|
108
|
+
|
|
109
|
+
MIT — see [LICENSE](LICENSE).
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=61.2"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "specy-road"
|
|
7
|
+
# Canonical version: `specy_road.__version__` prefers this file when the
|
|
8
|
+
# package lives under this repo; else importlib.metadata; else `0.0.0+unknown`.
|
|
9
|
+
version = "0.1.0"
|
|
10
|
+
description = "Roadmap-first coordination kit for humans and AI agents"
|
|
11
|
+
readme = "README.md"
|
|
12
|
+
requires-python = ">=3.11"
|
|
13
|
+
license = { text = "MIT" }
|
|
14
|
+
dependencies = [
|
|
15
|
+
"PyYAML>=6.0",
|
|
16
|
+
"jsonschema>=4.20",
|
|
17
|
+
]
|
|
18
|
+
|
|
19
|
+
[project.optional-dependencies]
|
|
20
|
+
dev = [
|
|
21
|
+
"pytest>=7.0",
|
|
22
|
+
"fastapi>=0.115",
|
|
23
|
+
# Required by starlette.testclient.TestClient (tests/test_gui_app.py); not a transitive install.
|
|
24
|
+
"httpx>=0.27",
|
|
25
|
+
"requests>=2.31",
|
|
26
|
+
]
|
|
27
|
+
review = [
|
|
28
|
+
"openai>=1.40",
|
|
29
|
+
"anthropic>=0.40",
|
|
30
|
+
]
|
|
31
|
+
gui = [
|
|
32
|
+
"fastapi>=0.115",
|
|
33
|
+
"uvicorn[standard]>=0.30",
|
|
34
|
+
"requests>=2.31",
|
|
35
|
+
"openai>=1.40",
|
|
36
|
+
"anthropic>=0.40",
|
|
37
|
+
]
|
|
38
|
+
gui-next = [
|
|
39
|
+
"fastapi>=0.115",
|
|
40
|
+
"uvicorn[standard]>=0.30",
|
|
41
|
+
"requests>=2.31",
|
|
42
|
+
"openai>=1.40",
|
|
43
|
+
"anthropic>=0.40",
|
|
44
|
+
]
|
|
45
|
+
|
|
46
|
+
[project.scripts]
|
|
47
|
+
specy-road = "specy_road.cli:main"
|
|
48
|
+
specyrd = "specy_road.specyrd_cli:main"
|
|
49
|
+
|
|
50
|
+
[tool.setuptools.packages.find]
|
|
51
|
+
where = ["."]
|
|
52
|
+
include = ["specy_road*"]
|
|
53
|
+
|
|
54
|
+
[tool.setuptools.package-data]
|
|
55
|
+
specy_road = [
|
|
56
|
+
"templates/**/*",
|
|
57
|
+
"templates/project/**/*",
|
|
58
|
+
"pm_gantt_static/**/*",
|
|
59
|
+
"bundled_scripts/*.py",
|
|
60
|
+
]
|
|
61
|
+
|
|
62
|
+
[tool.pytest.ini_options]
|
|
63
|
+
testpaths = ["tests"]
|
|
64
|
+
pythonpath = [".", "specy_road/bundled_scripts"]
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"""specy-road package (CLI and shared helpers)."""
|
|
2
|
+
|
|
3
|
+
import tomllib
|
|
4
|
+
from importlib.metadata import PackageNotFoundError, version
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
_UNKNOWN_VERSION = "0.0.0+unknown"
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def _version_from_adjacent_pyproject() -> str | None:
|
|
11
|
+
"""If this ``specy_road`` package lives under a repo root, read declared version there.
|
|
12
|
+
|
|
13
|
+
Prefer this over ``importlib.metadata`` when both exist so editable checkouts
|
|
14
|
+
stay aligned with ``pyproject.toml`` even if install metadata was not refreshed.
|
|
15
|
+
|
|
16
|
+
Hardened against malformed input: any I/O error (``OSError``) **or** TOML
|
|
17
|
+
parse error (``tomllib.TOMLDecodeError``, which subclasses ``ValueError``)
|
|
18
|
+
falls through to the next resolution step rather than crashing
|
|
19
|
+
``import specy_road``.
|
|
20
|
+
"""
|
|
21
|
+
repo_root = Path(__file__).resolve().parent.parent
|
|
22
|
+
path = repo_root / "pyproject.toml"
|
|
23
|
+
if not path.is_file():
|
|
24
|
+
return None
|
|
25
|
+
try:
|
|
26
|
+
with path.open("rb") as f:
|
|
27
|
+
data = tomllib.load(f)
|
|
28
|
+
except (OSError, ValueError):
|
|
29
|
+
# ValueError covers tomllib.TOMLDecodeError (PEP 8 / stdlib hierarchy).
|
|
30
|
+
return None
|
|
31
|
+
if not isinstance(data, dict):
|
|
32
|
+
return None
|
|
33
|
+
project = data.get("project")
|
|
34
|
+
if not isinstance(project, dict) or project.get("name") != "specy-road":
|
|
35
|
+
return None
|
|
36
|
+
raw = project.get("version")
|
|
37
|
+
return raw.strip() if isinstance(raw, str) and raw.strip() else None
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
_pyproject_version = _version_from_adjacent_pyproject()
|
|
41
|
+
if _pyproject_version is not None:
|
|
42
|
+
__version__ = _pyproject_version
|
|
43
|
+
else:
|
|
44
|
+
try:
|
|
45
|
+
__version__ = version("specy-road")
|
|
46
|
+
except PackageNotFoundError:
|
|
47
|
+
__version__ = _UNKNOWN_VERSION
|