boost-skill-cli 1.0.73__tar.gz → 1.0.75__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.
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/commands/configuration.py +1 -9
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/commands/discovery.py +1 -7
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/commands/info.py +1 -8
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/commands/intelligence.py +1 -6
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/commands/quality.py +1 -3
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/commands/taps.py +1 -10
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/commands/team.py +1 -10
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/core/paths.py +17 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_skill_cli.egg-info/PKG-INFO +1 -1
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_skill_cli.egg-info/SOURCES.txt +1 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/design-roadmap.html +10 -11
- boost_skill_cli-1.0.75/docs/roadmap/items/BOOST-D26.md +16 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +3 -3
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap.html +1 -1
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/unit/test_paths.py +35 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/.gitattributes +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/.gitignore +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/LICENSE +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/Makefile +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/README.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/index.html +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/index.html +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/setup.cfg +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/style/README.md +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/style/boost.css +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/style/boost.js +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/style/demo.html +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/tests/unit/test_version.py +0 -0
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '1.0.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 0,
|
|
21
|
+
__version__ = version = '1.0.75'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 75)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -25,15 +25,7 @@ from ..core import output as out
|
|
|
25
25
|
from ..errors import BoostError
|
|
26
26
|
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
"""Contract $HOME to ~ in a path-ish string for display."""
|
|
30
|
-
s = str(p)
|
|
31
|
-
for h in {str(paths.home()), str(paths.home().resolve())}:
|
|
32
|
-
if s == h:
|
|
33
|
-
return "~"
|
|
34
|
-
if s.startswith(h + os.sep):
|
|
35
|
-
return "~" + s[len(h):]
|
|
36
|
-
return s
|
|
28
|
+
_tilde = paths.tilde
|
|
37
29
|
|
|
38
30
|
|
|
39
31
|
def _user() -> str:
|
|
@@ -41,13 +41,7 @@ def _positive_int(s: str) -> int:
|
|
|
41
41
|
return v
|
|
42
42
|
|
|
43
43
|
|
|
44
|
-
|
|
45
|
-
"""Show a path with $HOME contracted to ~."""
|
|
46
|
-
s = str(p)
|
|
47
|
-
for h in (str(paths.home()), str(paths.home().resolve())):
|
|
48
|
-
if s == h or s.startswith(h + os.sep):
|
|
49
|
-
return "~" + s[len(h):]
|
|
50
|
-
return s
|
|
44
|
+
_tilde = paths.tilde
|
|
51
45
|
|
|
52
46
|
|
|
53
47
|
def _read_text(p: Path) -> str:
|
|
@@ -23,14 +23,7 @@ from ..errors import BoostError
|
|
|
23
23
|
|
|
24
24
|
# ---------------------------------------------------------------- helpers
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
"""Show a path with $HOME contracted to ~."""
|
|
28
|
-
s, h = str(p), str(paths.home())
|
|
29
|
-
if s == h:
|
|
30
|
-
return "~"
|
|
31
|
-
if s.startswith(h + os.sep):
|
|
32
|
-
return "~" + s[len(h):]
|
|
33
|
-
return s
|
|
26
|
+
_tilde = paths.tilde
|
|
34
27
|
|
|
35
28
|
|
|
36
29
|
def _read(p: Path) -> str:
|
|
@@ -35,12 +35,7 @@ def _note_fallback() -> None:
|
|
|
35
35
|
_warned_fallback = True
|
|
36
36
|
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
s = str(p)
|
|
40
|
-
for h in {str(paths.home()), str(paths.home().resolve())}:
|
|
41
|
-
if s.startswith(h):
|
|
42
|
-
return "~" + s[len(h):]
|
|
43
|
-
return s
|
|
38
|
+
_tilde = paths.tilde
|
|
44
39
|
|
|
45
40
|
|
|
46
41
|
def _skill_text(name: str) -> Tuple[str, str]:
|
|
@@ -73,9 +73,7 @@ _STACK_MARKERS = [
|
|
|
73
73
|
|
|
74
74
|
# --- shared helpers ---------------------------------------------------------
|
|
75
75
|
|
|
76
|
-
|
|
77
|
-
s, h = str(p), str(paths.home())
|
|
78
|
-
return "~" + s[len(h):] if s.startswith(h) else s
|
|
76
|
+
_tilde = paths.tilde
|
|
79
77
|
|
|
80
78
|
|
|
81
79
|
def _s(n: int) -> str:
|
|
@@ -3,7 +3,6 @@ from __future__ import annotations
|
|
|
3
3
|
|
|
4
4
|
import argparse
|
|
5
5
|
import json
|
|
6
|
-
import os
|
|
7
6
|
|
|
8
7
|
from .. import cliparse, spin
|
|
9
8
|
from ..core import catalog, config, gitutil, journal, lockfile, paths, registry, store, util
|
|
@@ -11,15 +10,7 @@ from ..core import output as out
|
|
|
11
10
|
from ..errors import BoostError
|
|
12
11
|
|
|
13
12
|
|
|
14
|
-
|
|
15
|
-
"""Contract $HOME to ~ in a path-ish string for display."""
|
|
16
|
-
s = str(p)
|
|
17
|
-
for h in {str(paths.home()), str(paths.home().resolve())}:
|
|
18
|
-
if s == h:
|
|
19
|
-
return "~"
|
|
20
|
-
if s.startswith(h + os.sep):
|
|
21
|
-
return "~" + s[len(h):]
|
|
22
|
-
return s
|
|
13
|
+
_tilde = paths.tilde
|
|
23
14
|
|
|
24
15
|
|
|
25
16
|
def _tap_catalog(args) -> int:
|
|
@@ -4,7 +4,6 @@ from __future__ import annotations
|
|
|
4
4
|
import getpass
|
|
5
5
|
import hashlib
|
|
6
6
|
import json
|
|
7
|
-
import os
|
|
8
7
|
import platform
|
|
9
8
|
import shutil
|
|
10
9
|
import stat
|
|
@@ -16,15 +15,7 @@ from ..core import output as out
|
|
|
16
15
|
from ..errors import BoostError
|
|
17
16
|
|
|
18
17
|
|
|
19
|
-
|
|
20
|
-
"""Contract $HOME to ~ in a path-ish string for display."""
|
|
21
|
-
s = str(p)
|
|
22
|
-
for h in {str(paths.home()), str(paths.home().resolve())}:
|
|
23
|
-
if s == h:
|
|
24
|
-
return "~"
|
|
25
|
-
if s.startswith(h + os.sep):
|
|
26
|
-
return "~" + s[len(h):]
|
|
27
|
-
return s
|
|
18
|
+
_tilde = paths.tilde
|
|
28
19
|
|
|
29
20
|
|
|
30
21
|
def _user() -> str:
|
|
@@ -32,6 +32,23 @@ def expand(p: str) -> Path:
|
|
|
32
32
|
return Path(p)
|
|
33
33
|
|
|
34
34
|
|
|
35
|
+
def tilde(p) -> str:
|
|
36
|
+
"""Contract $HOME to ``~`` in a path-ish string for display.
|
|
37
|
+
|
|
38
|
+
Only contracts a real path boundary: the string must equal home() or sit
|
|
39
|
+
directly beneath it (``home + os.sep``). A bare ``startswith(home)`` would
|
|
40
|
+
wrongly turn a sibling like ``/Users/bob-backup`` into ``~-backup``. Both
|
|
41
|
+
the raw and resolved forms of home() are tried so symlinked homes contract.
|
|
42
|
+
"""
|
|
43
|
+
s = str(p)
|
|
44
|
+
for h in (str(home()), str(home().resolve())):
|
|
45
|
+
if s == h:
|
|
46
|
+
return "~"
|
|
47
|
+
if s.startswith(h + os.sep):
|
|
48
|
+
return "~" + s[len(h):]
|
|
49
|
+
return s
|
|
50
|
+
|
|
51
|
+
|
|
35
52
|
def boost_home() -> Path:
|
|
36
53
|
override = os.environ.get("BOOST_HOME")
|
|
37
54
|
return Path(override) if override else home() / ".boost"
|
|
@@ -91,6 +91,7 @@ docs/roadmap/items/BOOST-D22.md
|
|
|
91
91
|
docs/roadmap/items/BOOST-D23.md
|
|
92
92
|
docs/roadmap/items/BOOST-D24.md
|
|
93
93
|
docs/roadmap/items/BOOST-D25.md
|
|
94
|
+
docs/roadmap/items/BOOST-D26.md
|
|
94
95
|
docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md
|
|
95
96
|
docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md
|
|
96
97
|
docs/roadmap/items/atomic-skill-install-temp-dir-swap.md
|
|
@@ -213,7 +213,7 @@
|
|
|
213
213
|
<button class="pill" data-filter="impact" data-val="med">Med</button>
|
|
214
214
|
<button class="pill" data-filter="impact" data-val="low">Low</button>
|
|
215
215
|
</div>
|
|
216
|
-
<p class="roadmap-count"><b id="shown"><!-- ROADMAP:count shown -->
|
|
216
|
+
<p class="roadmap-count"><b id="shown"><!-- ROADMAP:count shown -->26<!-- /ROADMAP:count --></b> of <b><!-- ROADMAP:count total -->26<!-- /ROADMAP:count --></b> opportunities shown</p>
|
|
217
217
|
</div>
|
|
218
218
|
|
|
219
219
|
<div class="wrap" id="board">
|
|
@@ -397,7 +397,7 @@
|
|
|
397
397
|
<h3>Command-by-command Polish</h3>
|
|
398
398
|
<p>The screens users actually stare at — front door, doctor, list, info, browse.</p>
|
|
399
399
|
</div>
|
|
400
|
-
<span class="n"><!-- ROADMAP:count track=commands -->
|
|
400
|
+
<span class="n"><!-- ROADMAP:count track=commands -->7 items<!-- /ROADMAP:count --></span>
|
|
401
401
|
</div>
|
|
402
402
|
<div class="rcards">
|
|
403
403
|
|
|
@@ -449,16 +449,15 @@
|
|
|
449
449
|
<div class="rmeta"><span class="m-cat">ux</span><span>Complexity L</span><span class="m-imp med">Impact Med</span><span class="m-wow">★★★☆☆</span></div>
|
|
450
450
|
<div class="rref"><code>cliparse.py (BoostArgumentParser) · all 10 command files</code></div>
|
|
451
451
|
</article>
|
|
452
|
-
<!-- /ROADMAP:cards -->
|
|
453
|
-
|
|
454
|
-
<article class="ritem" data-track="commands" data-impact="high">
|
|
455
|
-
<div class="ritem-top"><span class="rid">BOOST-D26</span><span class="rstatus done">Shipped</span></div>
|
|
456
|
-
<h4><code>browse</code> — Aurora the full-screen TUI</h4>
|
|
457
|
-
<p>The interactive <code>browse</code> pane was the <b>last off-theme surface</b>: a curses screen drawn in raw <code>A_BOLD</code>/<code>A_DIM</code>/<code>A_REVERSE</code> — zero brand color while every other command spoke Aurora. Rebuilt it as a first-class TUI: a macOS <b>titlebar</b> (traffic-light dots + <code>boost browse</code> wordmark under a cyan→violet→pink gradient rule), an <code>❯</code> chevron prompt with a live cursor, <b>fuzzy-match highlighting</b> (matched chars glow pink as you type), a cyan selection bar, yellow curated <code>★</code>, violet tap labels, a right-edge scrollbar, and a gradient-topped detail pane. Colors come from the single-source <code>out.TOKENS</code> via <code>init_color</code> — parity-locked to <code>style/boost.css</code> — and degrade truecolor → 8-color → monochrome. Stdlib only.</p>
|
|
458
|
-
<div class="rmeta"><span class="m-cat">commands</span><span>Complexity L</span><span class="m-imp high">Impact High</span><span class="m-wow">★★★★★</span></div>
|
|
459
|
-
<div class="rref"><code>commands/discovery.py · _browse_tui / _aurora_theme</code></div>
|
|
460
|
-
</article>
|
|
461
452
|
|
|
453
|
+
<article class="ritem" data-track="commands" data-impact="high">
|
|
454
|
+
<div class="ritem-top"><span class="rid">BOOST-D26</span><span class="rstatus done">Shipped</span></div>
|
|
455
|
+
<h4><code>browse</code> — Aurora the full-screen TUI</h4>
|
|
456
|
+
<p>The interactive <code>browse</code> pane was the <b>last off-theme surface</b>: a curses screen drawn in raw <code>A_BOLD</code>/<code>A_DIM</code>/<code>A_REVERSE</code> — zero brand color while every other command spoke Aurora. Rebuilt it as a first-class TUI: a macOS <b>titlebar</b> (traffic-light dots + <code>boost browse</code> wordmark under a cyan→violet→pink gradient rule), an <code>❯</code> chevron prompt with a live <code>▏</code> caret, <b>fuzzy-match highlighting</b> (matched chars glow pink as you type), a cyan selection bar, yellow curated <code>★</code>, violet tap labels, a right-edge scrollbar, and a gradient-topped detail pane with <code>#tag</code> chips. Colors come from the single-source <code>out.TOKENS</code> via <code>init_color</code> — parity-locked to <code>style/boost.css</code> — and degrade truecolor → 8-color → monochrome. Stdlib only. With this, <b>every boost command is on-theme</b>.</p>
|
|
457
|
+
<div class="rmeta"><span class="m-cat">commands</span><span>Complexity L</span><span class="m-imp high">Impact High</span><span class="m-wow">★★★★★</span></div>
|
|
458
|
+
<div class="rref"><code>commands/discovery.py · _browse_tui / _aurora_theme</code></div>
|
|
459
|
+
</article>
|
|
460
|
+
<!-- /ROADMAP:cards -->
|
|
462
461
|
</div>
|
|
463
462
|
</section>
|
|
464
463
|
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: BOOST-D26
|
|
3
|
+
board: design
|
|
4
|
+
track: commands
|
|
5
|
+
status: done
|
|
6
|
+
impact: high
|
|
7
|
+
complexity: L
|
|
8
|
+
wow: 5
|
|
9
|
+
category: commands
|
|
10
|
+
ref: commands/discovery.py · _browse_tui / _aurora_theme
|
|
11
|
+
order: 7
|
|
12
|
+
owner: loop/browse-aurora
|
|
13
|
+
pr: 80
|
|
14
|
+
title: <code>browse</code> — Aurora the full-screen TUI
|
|
15
|
+
---
|
|
16
|
+
The interactive <code>browse</code> pane was the <b>last off-theme surface</b>: a curses screen drawn in raw <code>A_BOLD</code>/<code>A_DIM</code>/<code>A_REVERSE</code> — zero brand color while every other command spoke Aurora. Rebuilt it as a first-class TUI: a macOS <b>titlebar</b> (traffic-light dots + <code>boost browse</code> wordmark under a cyan→violet→pink gradient rule), an <code>❯</code> chevron prompt with a live <code>▏</code> caret, <b>fuzzy-match highlighting</b> (matched chars glow pink as you type), a cyan selection bar, yellow curated <code>★</code>, violet tap labels, a right-edge scrollbar, and a gradient-topped detail pane with <code>#tag</code> chips. Colors come from the single-source <code>out.TOKENS</code> via <code>init_color</code> — parity-locked to <code>style/boost.css</code> — and degrade truecolor → 8-color → monochrome. Stdlib only. With this, <b>every boost command is on-theme</b>.
|
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
id: unify-tilde-two-copies-have-a-boundary-bug
|
|
3
3
|
board: code
|
|
4
4
|
section: internals
|
|
5
|
-
status:
|
|
5
|
+
status: shipped
|
|
6
6
|
category: Correctness
|
|
7
7
|
complexity: S
|
|
8
8
|
impact: Med
|
|
9
9
|
wow: 2
|
|
10
10
|
note:
|
|
11
11
|
order: 9
|
|
12
|
-
owner:
|
|
13
|
-
pr:
|
|
12
|
+
owner: loop/unify-tilde
|
|
13
|
+
pr: 86
|
|
14
14
|
title: Unify <code>_tilde()</code> — two copies have a boundary bug
|
|
15
15
|
---
|
|
16
16
|
Eight command modules each define <code>_tilde</code>; the <code>quality</code> and <code>intelligence</code> versions use <code>startswith(home)</code> with no separator check (<code>quality.py:78</code>), so <code>/Users/bob-backup</code> wrongly contracts to <code>~-backup</code>. Collapse to one helper in <code>core/paths</code>.
|
|
@@ -476,7 +476,7 @@
|
|
|
476
476
|
</article>
|
|
477
477
|
|
|
478
478
|
<article class="cap rcard">
|
|
479
|
-
<div class="head"><span class="pill
|
|
479
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Correctness</span></div>
|
|
480
480
|
<h3>Unify <code>_tilde()</code> — two copies have a boundary bug</h3>
|
|
481
481
|
<p>Eight command modules each define <code>_tilde</code>; the <code>quality</code> and <code>intelligence</code> versions use <code>startswith(home)</code> with no separator check (<code>quality.py:78</code>), so <code>/Users/bob-backup</code> wrongly contracts to <code>~-backup</code>. Collapse to one helper in <code>core/paths</code>.</p>
|
|
482
482
|
<div class="meta">
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"""Unit tests: boost_cli/core/paths.py — all locations derive from $HOME."""
|
|
2
2
|
from __future__ import annotations
|
|
3
3
|
|
|
4
|
+
import os
|
|
4
5
|
from pathlib import Path
|
|
5
6
|
|
|
6
7
|
from boost_cli.core import paths
|
|
@@ -81,6 +82,40 @@ class TestExpand:
|
|
|
81
82
|
assert paths.expand("~other") == Path("~other")
|
|
82
83
|
|
|
83
84
|
|
|
85
|
+
class TestTilde:
|
|
86
|
+
def test_exact_home_is_tilde(self, sandbox):
|
|
87
|
+
assert paths.tilde(str(sandbox)) == "~"
|
|
88
|
+
|
|
89
|
+
def test_path_under_home_contracts(self, sandbox):
|
|
90
|
+
p = sandbox / "x" / "y"
|
|
91
|
+
assert paths.tilde(str(p)) == "~" + os.sep + "x" + os.sep + "y"
|
|
92
|
+
|
|
93
|
+
def test_sibling_prefix_not_contracted(self, sandbox):
|
|
94
|
+
# regression: /Users/bob-backup must NOT contract to ~-backup when
|
|
95
|
+
# home is /Users/bob. A separator boundary is required, not a bare
|
|
96
|
+
# startswith(home).
|
|
97
|
+
sibling = str(sandbox) + "-backup"
|
|
98
|
+
assert paths.tilde(sibling) == sibling
|
|
99
|
+
|
|
100
|
+
def test_path_outside_home_unchanged(self, sandbox):
|
|
101
|
+
assert paths.tilde("/etc/hosts") == "/etc/hosts"
|
|
102
|
+
|
|
103
|
+
def test_accepts_path_object(self, sandbox):
|
|
104
|
+
assert paths.tilde(sandbox / "cache") == "~" + os.sep + "cache"
|
|
105
|
+
|
|
106
|
+
def test_resolved_home_contracts_through_symlink(self, tmp_path, monkeypatch):
|
|
107
|
+
# HOME is a symlink; a path expressed against the *resolved* home must
|
|
108
|
+
# still contract (the helper tries both raw and resolved home).
|
|
109
|
+
real = tmp_path / "real_home"
|
|
110
|
+
real.mkdir()
|
|
111
|
+
link = tmp_path / "link_home"
|
|
112
|
+
link.symlink_to(real)
|
|
113
|
+
monkeypatch.setenv("HOME", str(link))
|
|
114
|
+
monkeypatch.delenv("BOOST_HOME", raising=False)
|
|
115
|
+
resolved = str(paths.home().resolve())
|
|
116
|
+
assert paths.tilde(resolved + os.sep + "sub") == "~" + os.sep + "sub"
|
|
117
|
+
|
|
118
|
+
|
|
84
119
|
class TestEnsureDirs:
|
|
85
120
|
EXPECTED = ("repos", "cache", "logs", "state", "state/snapshots",
|
|
86
121
|
"state/lock-history", "state/profiles")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/boost_skill_cli.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{boost_skill_cli-1.0.73 → boost_skill_cli-1.0.75}/docs/roadmap/items/command-reference-docs-site.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|