boost-skill-cli 1.0.178__tar.gz → 1.0.180__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.180/.stylelintrc.json +20 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/core/output.py +15 -4
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_skill_cli.egg-info/PKG-INFO +1 -1
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_skill_cli.egg-info/SOURCES.txt +2 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/design-roadmap.html +2 -2
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/BOOST-D08.md +4 -4
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +3 -3
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap.html +1 -1
- boost_skill_cli-1.0.180/eslint.config.mjs +24 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/style/boost.css +31 -31
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/style/boost.js +5 -5
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_output.py +40 -1
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/.gitattributes +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/.gitignore +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/LICENSE +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/Makefile +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/README.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/commands.html +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/index.html +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/examples/README.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/index.html +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/noxfile.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/setup.cfg +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/style/README.md +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/style/demo.html +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.178 → boost_skill_cli-1.0.180}/tests/unit/test_workflows.py +0 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "stylelint-config-standard",
|
|
3
|
+
"rules": {
|
|
4
|
+
"declaration-block-single-line-max-declarations": null,
|
|
5
|
+
"rule-empty-line-before": null,
|
|
6
|
+
"at-rule-empty-line-before": null,
|
|
7
|
+
"comment-empty-line-before": null,
|
|
8
|
+
"custom-property-empty-line-before": null,
|
|
9
|
+
"declaration-empty-line-before": null,
|
|
10
|
+
"no-duplicate-selectors": null,
|
|
11
|
+
"no-descending-specificity": null,
|
|
12
|
+
"property-no-vendor-prefix": null,
|
|
13
|
+
"value-no-vendor-prefix": null,
|
|
14
|
+
"selector-class-pattern": null,
|
|
15
|
+
"custom-property-pattern": null,
|
|
16
|
+
"keyframes-name-pattern": null,
|
|
17
|
+
"media-feature-range-notation": "prefix",
|
|
18
|
+
"value-keyword-case": null
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -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.180'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 180)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -419,6 +419,11 @@ def table(rows, headers=None) -> None:
|
|
|
419
419
|
numeric columns are right-aligned, and when a row would overflow the
|
|
420
420
|
terminal the widest text column is shrunk (its cells clipped with an
|
|
421
421
|
ellipsis) so wide catalogs stay on one line instead of wrapping.
|
|
422
|
+
|
|
423
|
+
On a color terminal, columns are joined by a dim ``│`` separator — the
|
|
424
|
+
terminal cousin of the web stat blocks' hairline borders. Non-color output
|
|
425
|
+
(pipes, NO_COLOR, tests) keeps the plain two-space gutter byte-for-byte,
|
|
426
|
+
so scripts that parse table output never see the ornament.
|
|
422
427
|
"""
|
|
423
428
|
rows = [[str(x) for x in r] for r in rows]
|
|
424
429
|
all_rows = ([list(map(str, headers))] if headers else []) + rows
|
|
@@ -429,17 +434,23 @@ def table(rows, headers=None) -> None:
|
|
|
429
434
|
for i in range(ncols)]
|
|
430
435
|
numeric = [_numeric_col([r[i] for r in rows if i < len(r)])
|
|
431
436
|
for i in range(ncols)]
|
|
432
|
-
|
|
437
|
+
if use_color():
|
|
438
|
+
sep, sep_w = " " + DIM + "│" + RESET + " ", 3
|
|
439
|
+
else:
|
|
440
|
+
sep, sep_w = " ", 2
|
|
441
|
+
widths = _fit_widths(widths, numeric, term_width(), sep=sep_w)
|
|
433
442
|
|
|
434
443
|
def fmt(cell: str, i: int) -> str:
|
|
435
444
|
cell = _clip_visible(cell, widths[i])
|
|
436
445
|
return _rpad(cell, widths[i]) if numeric[i] else _pad(cell, widths[i])
|
|
437
446
|
|
|
438
447
|
if headers:
|
|
439
|
-
|
|
440
|
-
|
|
448
|
+
# Bold each header cell individually: a whole-line wrap would be
|
|
449
|
+
# cancelled at the first separator's RESET on color terminals.
|
|
450
|
+
cells = [c(fmt(str(h), i), BOLD) for i, h in enumerate(headers)]
|
|
451
|
+
print(sep.join(cells).rstrip())
|
|
441
452
|
for r in rows:
|
|
442
|
-
print(
|
|
453
|
+
print(sep.join(fmt(cell, i) for i, cell in enumerate(r)).rstrip())
|
|
443
454
|
|
|
444
455
|
|
|
445
456
|
def confirm(prompt: str, default: bool = False) -> bool:
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
.htmlvalidate.json
|
|
5
5
|
.markdownlint-cli2.jsonc
|
|
6
6
|
.pre-commit-config.yaml
|
|
7
|
+
.stylelintrc.json
|
|
7
8
|
CLAUDE.md
|
|
8
9
|
CONTRIBUTING.md
|
|
9
10
|
LICENSE
|
|
@@ -12,6 +13,7 @@ Makefile
|
|
|
12
13
|
README.md
|
|
13
14
|
SECURITY.md
|
|
14
15
|
boost
|
|
16
|
+
eslint.config.mjs
|
|
15
17
|
index.html
|
|
16
18
|
noxfile.py
|
|
17
19
|
pyproject.toml
|
|
@@ -305,11 +305,11 @@
|
|
|
305
305
|
</article>
|
|
306
306
|
|
|
307
307
|
<article class="ritem" data-track="layout" data-impact="med">
|
|
308
|
-
<div class="ritem-top"><span class="rid">BOOST-D08</span><span class="rstatus
|
|
308
|
+
<div class="ritem-top"><span class="rid">BOOST-D08</span><span class="rstatus done">Shipped</span></div>
|
|
309
309
|
<h4>Width-aware, right-aligned tables</h4>
|
|
310
310
|
<p><code>table()</code> is a naive <code>ljust</code> that ignores terminal width and left-aligns numeric columns. Make it width-aware (shrink the widest text column to fit), right-align counts with tabular figures, and add dim column separators — matching the web's <code>font-variant-numeric: tabular-nums</code> stat blocks.</p>
|
|
311
311
|
<div class="rmeta"><span class="m-cat">layout</span><span>Complexity M</span><span class="m-imp med">Impact Med</span><span class="m-wow">★★★☆☆</span></div>
|
|
312
|
-
<div class="rref"><code>core/output.py
|
|
312
|
+
<div class="rref"><code>core/output.py · table()</code></div>
|
|
313
313
|
</article>
|
|
314
314
|
|
|
315
315
|
<article class="ritem" data-track="layout" data-impact="med">
|
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
id: BOOST-D08
|
|
3
3
|
board: design
|
|
4
4
|
track: layout
|
|
5
|
-
status:
|
|
5
|
+
status: done
|
|
6
6
|
impact: med
|
|
7
7
|
complexity: M
|
|
8
8
|
wow: 3
|
|
9
9
|
category: layout
|
|
10
|
-
ref: "core/output.py
|
|
10
|
+
ref: "core/output.py · table()"
|
|
11
11
|
order: 4
|
|
12
|
-
owner:
|
|
13
|
-
pr:
|
|
12
|
+
owner: loop/d08-tables
|
|
13
|
+
pr: 202
|
|
14
14
|
title: Width-aware, right-aligned tables
|
|
15
15
|
---
|
|
16
16
|
<code>table()</code> is a naive <code>ljust</code> that ignores terminal width and left-aligns numeric columns. Make it width-aware (shrink the widest text column to fit), right-align counts with tabular figures, and add dim column separators — matching the web's <code>font-variant-numeric: tabular-nums</code> stat blocks.
|
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
id: theme-asset-linting-stylelint-eslint
|
|
3
3
|
board: code
|
|
4
4
|
section: docsite
|
|
5
|
-
status:
|
|
5
|
+
status: shipped
|
|
6
6
|
category: Quality · Style
|
|
7
7
|
complexity: S
|
|
8
8
|
impact: Med
|
|
9
9
|
wow: 2
|
|
10
10
|
note: shared blast radius
|
|
11
11
|
order: 8
|
|
12
|
-
owner:
|
|
13
|
-
pr:
|
|
12
|
+
owner: loop/themelint
|
|
13
|
+
pr: 203
|
|
14
14
|
title: Theme-asset linting — <code>stylelint</code> + <code>eslint</code>
|
|
15
15
|
---
|
|
16
16
|
The shared <code>style/boost.css</code> and <code>boost.js</code> theme
|
|
@@ -1621,7 +1621,7 @@ and the work stays visible.</p>
|
|
|
1621
1621
|
</article>
|
|
1622
1622
|
|
|
1623
1623
|
<article class="cap rcard">
|
|
1624
|
-
<div class="head"><span class="pill
|
|
1624
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Quality · Style</span></div>
|
|
1625
1625
|
<h3>Theme-asset linting — <code>stylelint</code> + <code>eslint</code></h3>
|
|
1626
1626
|
<p>The shared <code>style/boost.css</code> and <code>boost.js</code> theme
|
|
1627
1627
|
the guide, roadmap and demo together, so a bug there recolours or breaks
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// ESLint for the theme's one JS asset (style/boost.js — cursor glow + scroll
|
|
2
|
+
// reveal). Correctness rules only: undefined globals, unused vars, loose
|
|
3
|
+
// equality, legacy `var`. The file is plain-script browser JS, no build step.
|
|
4
|
+
export default [
|
|
5
|
+
{
|
|
6
|
+
files: ["style/**/*.js"],
|
|
7
|
+
languageOptions: {
|
|
8
|
+
ecmaVersion: 2021,
|
|
9
|
+
sourceType: "script",
|
|
10
|
+
globals: {
|
|
11
|
+
window: "readonly",
|
|
12
|
+
document: "readonly",
|
|
13
|
+
IntersectionObserver: "readonly",
|
|
14
|
+
requestAnimationFrame: "readonly",
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
rules: {
|
|
18
|
+
"no-undef": "error",
|
|
19
|
+
"no-unused-vars": "error",
|
|
20
|
+
"eqeqeq": "error",
|
|
21
|
+
"no-var": "error",
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
];
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
Usage:
|
|
12
12
|
<link rel="stylesheet" href="boost.css">
|
|
13
|
-
<script src="boost.js" defer></script>
|
|
13
|
+
<script src="boost.js" defer></script> (cursor glow + scroll reveal)
|
|
14
14
|
|
|
15
15
|
The interactions (cursor-follow spotlight, reveal-on-scroll) are progressive
|
|
16
16
|
enhancement — the page is fully styled and legible with JS disabled.
|
|
@@ -19,11 +19,11 @@
|
|
|
19
19
|
:root {
|
|
20
20
|
/* --- ground & ink --- */
|
|
21
21
|
--bg: #07080f; /* near-black page ground */
|
|
22
|
-
--panel:
|
|
22
|
+
--panel: rgb(255 255 255 / 3.5%);
|
|
23
23
|
--panel-solid: #0f1120;
|
|
24
|
-
--line:
|
|
25
|
-
--line-soft:
|
|
26
|
-
--line-hi:
|
|
24
|
+
--line: rgb(255 255 255 / 9%);
|
|
25
|
+
--line-soft: rgb(255 255 255 / 5%);
|
|
26
|
+
--line-hi: rgb(255 255 255 / 22%);
|
|
27
27
|
--text: #e9ebf5;
|
|
28
28
|
--text-2: #9298b0;
|
|
29
29
|
--text-3: #676d86;
|
|
@@ -88,9 +88,9 @@ body::before {
|
|
|
88
88
|
content: "";
|
|
89
89
|
position: fixed; inset: -25vmax; z-index: 0; pointer-events: none;
|
|
90
90
|
background:
|
|
91
|
-
radial-gradient(38vmax 38vmax at 12% 6%,
|
|
92
|
-
radial-gradient(34vmax 34vmax at 90% 16%,
|
|
93
|
-
radial-gradient(30vmax 30vmax at 62% 104%,
|
|
91
|
+
radial-gradient(38vmax 38vmax at 12% 6%, rgb(34 211 238 / 20%), transparent 60%),
|
|
92
|
+
radial-gradient(34vmax 34vmax at 90% 16%, rgb(168 85 247 / 18%), transparent 60%),
|
|
93
|
+
radial-gradient(30vmax 30vmax at 62% 104%, rgb(244 114 208 / 14%), transparent 62%);
|
|
94
94
|
filter: blur(34px) saturate(135%);
|
|
95
95
|
animation: aurora-drift 42s ease-in-out infinite;
|
|
96
96
|
will-change: transform;
|
|
@@ -99,11 +99,11 @@ body::after {
|
|
|
99
99
|
content: "";
|
|
100
100
|
position: fixed; inset: 0; z-index: 0; pointer-events: none;
|
|
101
101
|
background-image:
|
|
102
|
-
linear-gradient(
|
|
103
|
-
linear-gradient(90deg,
|
|
102
|
+
linear-gradient(rgb(255 255 255 / 2.8%) 1px, transparent 1px),
|
|
103
|
+
linear-gradient(90deg, rgb(255 255 255 / 2.8%) 1px, transparent 1px);
|
|
104
104
|
background-size: 46px 46px;
|
|
105
|
-
-webkit-mask-image: radial-gradient(1200px 800px at 30% 0%, #000 0%,
|
|
106
|
-
mask-image: radial-gradient(1200px 800px at 30% 0%, #000 0%,
|
|
105
|
+
-webkit-mask-image: radial-gradient(1200px 800px at 30% 0%, #000 0%, rgb(0 0 0 / 30%) 60%, rgb(0 0 0 / 10%) 100%);
|
|
106
|
+
mask-image: radial-gradient(1200px 800px at 30% 0%, #000 0%, rgb(0 0 0 / 30%) 60%, rgb(0 0 0 / 10%) 100%);
|
|
107
107
|
}
|
|
108
108
|
@keyframes aurora-drift {
|
|
109
109
|
0%, 100% { transform: translate3d(0, 0, 0) scale(1); }
|
|
@@ -139,7 +139,7 @@ body::after {
|
|
|
139
139
|
color: var(--text-2); font-size: 17.5px; text-wrap: balance;
|
|
140
140
|
}
|
|
141
141
|
.sec-sub code {
|
|
142
|
-
color: var(--cyan); background:
|
|
142
|
+
color: var(--cyan); background: rgb(34 211 238 / 10%);
|
|
143
143
|
padding: 1px 7px; border-radius: 6px; font-size: .88em;
|
|
144
144
|
}
|
|
145
145
|
|
|
@@ -155,9 +155,9 @@ body::after {
|
|
|
155
155
|
.badge {
|
|
156
156
|
display: inline-flex; align-items: center; gap: 8px;
|
|
157
157
|
font-family: var(--mono); font-size: 12.5px; color: #c9e9f5;
|
|
158
|
-
border: 1px solid
|
|
158
|
+
border: 1px solid rgb(34 211 238 / 40%); border-radius: 999px;
|
|
159
159
|
padding: 7px 16px;
|
|
160
|
-
background:
|
|
160
|
+
background: rgb(34 211 238 / 7%);
|
|
161
161
|
backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px);
|
|
162
162
|
}
|
|
163
163
|
.badge::before {
|
|
@@ -184,11 +184,11 @@ body::after {
|
|
|
184
184
|
.btn-grad {
|
|
185
185
|
color: #05141a;
|
|
186
186
|
background: linear-gradient(96deg, var(--cyan), var(--violet));
|
|
187
|
-
box-shadow: 0 8px 30px
|
|
187
|
+
box-shadow: 0 8px 30px rgb(34 211 238 / 32%);
|
|
188
188
|
}
|
|
189
|
-
.btn-grad:hover { box-shadow: 0 12px 40px
|
|
189
|
+
.btn-grad:hover { box-shadow: 0 12px 40px rgb(168 85 247 / 50%); }
|
|
190
190
|
.btn-ghost { color: var(--text); border-color: var(--line); background: var(--panel); }
|
|
191
|
-
.btn-ghost:hover { border-color:
|
|
191
|
+
.btn-ghost:hover { border-color: rgb(255 255 255 / 20%); }
|
|
192
192
|
|
|
193
193
|
/* ============================================================================
|
|
194
194
|
Stat cards
|
|
@@ -228,14 +228,14 @@ a.cap, a.glass { text-decoration: none; }
|
|
|
228
228
|
width: 46px; height: 46px; border-radius: 13px;
|
|
229
229
|
display: flex; align-items: center; justify-content: center;
|
|
230
230
|
font-size: 21px; margin-bottom: 20px;
|
|
231
|
-
background: var(--ic-bg,
|
|
231
|
+
background: var(--ic-bg, rgb(255 255 255 / 6%)); color: var(--ic-fg, var(--text));
|
|
232
232
|
border: 1px solid var(--line-soft);
|
|
233
233
|
}
|
|
234
234
|
.cap h3 { font-size: 19.5px; font-weight: 750; letter-spacing: -.01em; }
|
|
235
235
|
.cap p { font-size: 14.5px; color: var(--text-2); margin-top: 10px; }
|
|
236
236
|
.cap .tags { display: flex; flex-wrap: wrap; gap: 7px; margin-top: 18px; }
|
|
237
237
|
.cap .tags code, .chip {
|
|
238
|
-
font-size: 12px; color: #d5d5e2; background:
|
|
238
|
+
font-size: 12px; color: #d5d5e2; background: rgb(255 255 255 / 6%);
|
|
239
239
|
border: 1px solid var(--line-soft); border-radius: 7px; padding: 3px 9px;
|
|
240
240
|
}
|
|
241
241
|
.cap .more { margin-top: auto; padding-top: 16px; font-size: 13.5px; font-weight: 650; color: var(--cyan); }
|
|
@@ -244,12 +244,12 @@ a.cap, a.glass { text-decoration: none; }
|
|
|
244
244
|
Terminal window — for showing off commands / code
|
|
245
245
|
========================================================================== */
|
|
246
246
|
.window {
|
|
247
|
-
background: var(--term-bg); border: 1px solid
|
|
248
|
-
border-radius: 12px; box-shadow: 0 24px 70px
|
|
247
|
+
background: var(--term-bg); border: 1px solid rgb(255 255 255 / 12%);
|
|
248
|
+
border-radius: 12px; box-shadow: 0 24px 70px rgb(0 0 0 / 50%); overflow: hidden;
|
|
249
249
|
}
|
|
250
250
|
.window .bar {
|
|
251
251
|
display: flex; align-items: center; height: 38px; padding: 0 14px;
|
|
252
|
-
background: var(--term-bar); border-bottom: 1px solid
|
|
252
|
+
background: var(--term-bar); border-bottom: 1px solid rgb(0 0 0 / 25%);
|
|
253
253
|
}
|
|
254
254
|
.window .dots { display: flex; gap: 7px; }
|
|
255
255
|
.window .dots i { width: 12px; height: 12px; border-radius: 50%; }
|
|
@@ -265,7 +265,7 @@ a.cap, a.glass { text-decoration: none; }
|
|
|
265
265
|
font-family: var(--mono); font-size: 13.5px; line-height: 1.75; color: #dcdcf0;
|
|
266
266
|
}
|
|
267
267
|
/* syntax token colors for use inside .window pre */
|
|
268
|
-
.tp { color: #
|
|
268
|
+
.tp { color: #88a; } /* prompt $ */
|
|
269
269
|
.tv { color: #7ee787; font-weight: 700; } /* command name */
|
|
270
270
|
.tc { color: var(--yellow); font-weight: 700; } /* subcommand */
|
|
271
271
|
.tok { color: var(--green); } /* success check */
|
|
@@ -290,14 +290,14 @@ a.cap, a.glass { text-decoration: none; }
|
|
|
290
290
|
content: ""; position: absolute; inset: 0; z-index: 0; border-radius: inherit;
|
|
291
291
|
pointer-events: none; opacity: 0; transition: opacity .35s ease;
|
|
292
292
|
background: radial-gradient(340px circle at var(--mx, 50%) var(--my, 50%),
|
|
293
|
-
|
|
293
|
+
rgb(34 211 238 / 16%), rgb(168 85 247 / 10%) 42%, transparent 70%);
|
|
294
294
|
}
|
|
295
295
|
.glass:hover, .cap:hover, .stat:hover {
|
|
296
296
|
transform: translateY(-4px);
|
|
297
297
|
border-color: var(--line-hi);
|
|
298
|
-
background:
|
|
299
|
-
box-shadow: 0 22px 60px -22px
|
|
300
|
-
inset 0 0 0 1px
|
|
298
|
+
background: rgb(255 255 255 / 6%);
|
|
299
|
+
box-shadow: 0 22px 60px -22px rgb(168 85 247 / 50%),
|
|
300
|
+
inset 0 0 0 1px rgb(34 211 238 / 12%);
|
|
301
301
|
}
|
|
302
302
|
.glass:hover::before, .cap:hover::before, .stat:hover::before { opacity: 1; }
|
|
303
303
|
|
|
@@ -305,7 +305,7 @@ a.cap, a.glass { text-decoration: none; }
|
|
|
305
305
|
.window { transition: box-shadow .35s ease, transform .3s ease; }
|
|
306
306
|
.window:hover {
|
|
307
307
|
transform: translateY(-3px);
|
|
308
|
-
box-shadow: 0 30px 80px -24px
|
|
308
|
+
box-shadow: 0 30px 80px -24px rgb(34 211 238 / 40%), 0 24px 70px rgb(0 0 0 / 50%);
|
|
309
309
|
}
|
|
310
310
|
|
|
311
311
|
/* ============================================================================
|
|
@@ -333,11 +333,11 @@ a.cap, a.glass { text-decoration: none; }
|
|
|
333
333
|
the Design Roadmap declared none at all, so its nav rendered unstyled.
|
|
334
334
|
|
|
335
335
|
These are a shared *floor*, not an override: every page links this sheet
|
|
336
|
-
BEFORE its own
|
|
336
|
+
BEFORE its own style block, so a page still carrying inline chrome keeps
|
|
337
337
|
winning at equal specificity. Markup this expects:
|
|
338
338
|
|
|
339
339
|
<header>
|
|
340
|
-
<div class="wrap site-nav">
|
|
340
|
+
<div class="wrap site-nav"> (or: class="wrap nav")
|
|
341
341
|
<a class="logo" href="."><b>boost</b><span>Section</span></a>
|
|
342
342
|
<ul><li><a href="#x">X</a></li><li><a class="cta" href=".">Go</a></li></ul>
|
|
343
343
|
</div>
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
// no-JS visitors with permanently-invisible content).
|
|
16
16
|
document.documentElement.classList.add("js");
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
const reduce = window.matchMedia &&
|
|
19
19
|
window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
20
20
|
|
|
21
21
|
function ready(fn) {
|
|
@@ -25,11 +25,11 @@
|
|
|
25
25
|
|
|
26
26
|
ready(function () {
|
|
27
27
|
// ---- reveal on scroll ----
|
|
28
|
-
|
|
28
|
+
const revealables = document.querySelectorAll(".reveal");
|
|
29
29
|
if (reduce || !("IntersectionObserver" in window)) {
|
|
30
30
|
revealables.forEach(function (el) { el.classList.add("in"); });
|
|
31
31
|
} else {
|
|
32
|
-
|
|
32
|
+
const io = new IntersectionObserver(function (entries) {
|
|
33
33
|
entries.forEach(function (en) {
|
|
34
34
|
if (en.isIntersecting) {
|
|
35
35
|
en.target.classList.add("in");
|
|
@@ -43,10 +43,10 @@
|
|
|
43
43
|
// ---- cursor-following spotlight ----
|
|
44
44
|
// Pointer position is written as element-local pixels into --mx / --my,
|
|
45
45
|
// which the radial-gradient in boost.css reads.
|
|
46
|
-
|
|
46
|
+
const glassy = document.querySelectorAll(".glass, .cap, .stat, .window");
|
|
47
47
|
glassy.forEach(function (el) {
|
|
48
48
|
el.addEventListener("pointermove", function (e) {
|
|
49
|
-
|
|
49
|
+
const r = el.getBoundingClientRect();
|
|
50
50
|
el.style.setProperty("--mx", (e.clientX - r.left) + "px");
|
|
51
51
|
el.style.setProperty("--my", (e.clientY - r.top) + "px");
|
|
52
52
|
});
|
|
@@ -602,16 +602,55 @@ class TestTableColor:
|
|
|
602
602
|
import re
|
|
603
603
|
monkeypatch.setenv("CLICOLOR_FORCE", "1")
|
|
604
604
|
# a colored cell must not push the next column out of alignment
|
|
605
|
+
# (color mode joins columns with the dim │ separator)
|
|
605
606
|
output.table([[output.aurora("ab", "cyan"), "x"], ["cd", "y"]])
|
|
606
607
|
vis = [re.sub(r"\x1b\[[0-9;]*m", "", ln)
|
|
607
608
|
for ln in capsys.readouterr().out.splitlines()]
|
|
608
|
-
assert vis == ["ab
|
|
609
|
+
assert vis == ["ab │ x", "cd │ y"]
|
|
609
610
|
|
|
610
611
|
def test_header_row_is_bold_when_forced(self, capsys, monkeypatch):
|
|
611
612
|
monkeypatch.setenv("CLICOLOR_FORCE", "1")
|
|
612
613
|
output.table([["x", "1"]], headers=["NAME", "N"])
|
|
613
614
|
assert capsys.readouterr().out.startswith("\033[1mNAME")
|
|
614
615
|
|
|
616
|
+
def test_every_header_cell_is_bold(self, capsys, monkeypatch):
|
|
617
|
+
# A whole-line BOLD wrap would be cancelled by the separator's RESET;
|
|
618
|
+
# each header cell must carry its own bold instead.
|
|
619
|
+
monkeypatch.setenv("CLICOLOR_FORCE", "1")
|
|
620
|
+
output.table([["x", "y"]], headers=["AA", "BB"])
|
|
621
|
+
header = capsys.readouterr().out.splitlines()[0]
|
|
622
|
+
assert header.count(output.BOLD) == 2
|
|
623
|
+
assert "\033[1mAA" in header and "\033[1mBB" in header
|
|
624
|
+
|
|
625
|
+
def test_separator_is_dim_pipe_in_color_mode(self, capsys, monkeypatch):
|
|
626
|
+
monkeypatch.setenv("CLICOLOR_FORCE", "1")
|
|
627
|
+
output.table([("a", "b")])
|
|
628
|
+
out = capsys.readouterr().out
|
|
629
|
+
assert " " + output.DIM + "│" + output.RESET + " " in out
|
|
630
|
+
|
|
631
|
+
def test_no_separator_glyph_when_color_off(self, capsys, monkeypatch):
|
|
632
|
+
monkeypatch.setenv("NO_COLOR", "1")
|
|
633
|
+
monkeypatch.delenv("CLICOLOR_FORCE", raising=False)
|
|
634
|
+
output.table([("a", "b"), ("cc", "d")], headers=["X", "Y"])
|
|
635
|
+
out = capsys.readouterr().out
|
|
636
|
+
assert "│" not in out # plain two-space gutter,
|
|
637
|
+
assert out == "X Y\na b\ncc d\n" # byte-identical to before
|
|
638
|
+
|
|
639
|
+
def test_separator_width_counts_in_fit_budget(self, capsys, monkeypatch):
|
|
640
|
+
import os as _os
|
|
641
|
+
import re
|
|
642
|
+
# 3 columns of visible width 4 + two 3-wide separators = 18 > 17,
|
|
643
|
+
# so exactly one text column must shrink; with the old 2-wide gutter
|
|
644
|
+
# (total 16) nothing would shrink. Proves sep=3 reaches _fit_widths.
|
|
645
|
+
monkeypatch.setenv("CLICOLOR_FORCE", "1")
|
|
646
|
+
monkeypatch.setattr(output.shutil, "get_terminal_size",
|
|
647
|
+
lambda fb: _os.terminal_size((17, 24)))
|
|
648
|
+
output.table([("aaaa", "bbbb", "cccc")])
|
|
649
|
+
vis = re.sub(r"\x1b\[[0-9;]*m", "",
|
|
650
|
+
capsys.readouterr().out.splitlines()[0])
|
|
651
|
+
assert len(vis.rstrip()) <= 17
|
|
652
|
+
assert "…" in vis # a cell was clipped
|
|
653
|
+
|
|
615
654
|
|
|
616
655
|
class TestTable:
|
|
617
656
|
@pytest.fixture(autouse=True)
|
|
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
|
|
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
|