netbox-super-cli 1.3.1__tar.gz → 1.5.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- netbox_super_cli-1.5.0/.github/ISSUE_TEMPLATE/bug_report.yml +127 -0
- netbox_super_cli-1.5.0/.github/ISSUE_TEMPLATE/config.yml +11 -0
- netbox_super_cli-1.5.0/.github/ISSUE_TEMPLATE/docs.yml +35 -0
- netbox_super_cli-1.5.0/.github/ISSUE_TEMPLATE/feature_request.yml +68 -0
- netbox_super_cli-1.5.0/.github/pull_request_template.md +17 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/.github/workflows/test.yml +2 -3
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/CHANGELOG.md +50 -0
- netbox_super_cli-1.3.1/README.md → netbox_super_cli-1.5.0/PKG-INFO +96 -4
- netbox_super_cli-1.3.1/PKG-INFO → netbox_super_cli-1.5.0/README.md +61 -33
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/docs/guides/interactive-tui.md +16 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/docs/reference/config.md +3 -1
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/_version.py +1 -1
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/cli/app.py +16 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/cli/globals.py +13 -2
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/cli/handlers.py +3 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/cli/registration.py +63 -6
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/cli/runtime.py +19 -1
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/cli/tui_commands.py +11 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/config/models.py +14 -0
- netbox_super_cli-1.5.0/nsc/config/saved_searches.py +112 -0
- netbox_super_cli-1.5.0/nsc/output/colors.py +36 -0
- netbox_super_cli-1.5.0/nsc/output/flatten.py +72 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/output/render.py +2 -1
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/output/table.py +30 -1
- netbox_super_cli-1.5.0/nsc/savedfilters/__init__.py +4 -0
- netbox_super_cli-1.5.0/nsc/savedfilters/objecttypes.py +103 -0
- netbox_super_cli-1.5.0/nsc/savedfilters/params.py +55 -0
- netbox_super_cli-1.5.0/nsc/savedfilters/store.py +140 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/__init__.py +13 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/app.py +67 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/columns.py +23 -9
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/keymap.py +5 -1
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/screens/filter.py +92 -1
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/screens/list.py +13 -3
- netbox_super_cli-1.5.0/nsc/tui/screens/saved_search_picker.py +92 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/styles.tcss +24 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/view.py +27 -4
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/widgets/help.py +1 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/pyproject.toml +9 -3
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/skills/netbox-super-cli/SKILL.md +5 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cli/test_registration.py +88 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cli/test_runtime_color.py +26 -2
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cli/test_tui_command.py +53 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cli/writes/test_bulk.py +19 -14
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/config/test_models.py +36 -1
- netbox_super_cli-1.5.0/tests/config/test_saved_search_fallback.py +55 -0
- netbox_super_cli-1.5.0/tests/config/test_saved_searches.py +86 -0
- netbox_super_cli-1.5.0/tests/output/test_colors.py +28 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/output/test_flatten.py +97 -0
- netbox_super_cli-1.5.0/tests/output/test_table_color.py +277 -0
- netbox_super_cli-1.5.0/tests/savedfilters/test_objecttypes.py +123 -0
- netbox_super_cli-1.5.0/tests/savedfilters/test_params.py +64 -0
- netbox_super_cli-1.5.0/tests/savedfilters/test_store.py +190 -0
- netbox_super_cli-1.5.0/tests/tui/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/tui/test_app.py +47 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/tui/test_columns.py +49 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/tui/test_filter_screen.py +124 -2
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/tui/test_keymap.py +6 -4
- netbox_super_cli-1.5.0/tests/tui/test_saved_filter_integration.py +98 -0
- netbox_super_cli-1.5.0/tests/tui/test_view.py +87 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/uv.lock +1 -1
- netbox_super_cli-1.3.1/nsc/output/flatten.py +0 -53
- netbox_super_cli-1.3.1/tests/output/test_table_color.py +0 -138
- netbox_super_cli-1.3.1/tests/tui/test_view.py +0 -27
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/.github/dependabot.yml +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/.github/workflows/bench.yml +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/.github/workflows/claude.yml +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/.github/workflows/docs.yml +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/.github/workflows/e2e.yml +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/.github/workflows/lint.yml +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/.github/workflows/release.yml +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/.github/workflows/skill-convention-review.yml +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/.gitignore +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/.pre-commit-config.yaml +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/.python-version +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/AGENTS.md +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/CLAUDE.md +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/LICENSE +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/docs/architecture/caching.md +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/docs/architecture/command-generation.md +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/docs/architecture/http-client.md +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/docs/architecture/overview.md +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/docs/architecture/schema-loading.md +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/docs/assets/tui/detail.svg +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/docs/assets/tui/filter.svg +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/docs/assets/tui/list.svg +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/docs/assets/tui/picker.svg +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/docs/assets/tui/search.svg +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/docs/contributing/adding-bundled-schemas.md +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/docs/contributing/branching.md +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/docs/contributing/development.md +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/docs/contributing/release-process.md +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/docs/getting-started/concepts.md +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/docs/getting-started/first-run.md +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/docs/getting-started/install.md +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/docs/guides/audit-log.md +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/docs/guides/ci-and-automation.md +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/docs/guides/managing-profiles.md +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/docs/guides/output-formats.md +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/docs/guides/using-with-ai-agents.md +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/docs/guides/working-with-plugins.md +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/docs/guides/writes-and-safety.md +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/docs/index.md +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/docs/reference/cli.md +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/docs/reference/exit-codes.md +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/docs/reference/schemas.md +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/justfile +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/mkdocs.yml +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/__main__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/aliases/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/aliases/resolver.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/auth/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/auth/verify.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/builder/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/builder/build.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/cache/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/cache/store.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/cli/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/cli/aliases_commands.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/cli/cache_commands.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/cli/commands_dump.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/cli/config_commands.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/cli/init_commands.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/cli/login_commands.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/cli/profiles_commands.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/cli/skill_commands.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/cli/writes/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/cli/writes/apply.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/cli/writes/bulk.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/cli/writes/coercion.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/cli/writes/confirmation.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/cli/writes/input.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/cli/writes/preflight.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/completion/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/completion/cache_probe.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/completion/callbacks.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/completion/providers.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/config/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/config/loader.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/config/settings.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/config/writer.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/http/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/http/audit.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/http/client.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/http/errors.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/http/retry.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/model/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/model/command_model.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/output/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/output/_console.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/output/csv_.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/output/errors.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/output/explain.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/output/headers.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/output/json_.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/output/jsonl.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/output/yaml_.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/schema/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/schema/hashing.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/schema/loader.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/schema/models.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/schema/source.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/schemas/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/schemas/bundled/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/schemas/bundled/manifest.yaml +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/schemas/bundled/netbox-4.5.10.json.gz +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/schemas/bundled/netbox-4.6.0.json.gz +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/skill/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/_bindings.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/bulk.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/catalog.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/errors.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/filters.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/fk.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/forms.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/nav.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/relations.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/screens/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/screens/bulk_edit_form.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/screens/columns.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/screens/detail.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/screens/edit_form.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/screens/global_search.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/screens/picker.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/screens/record_picker.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/search.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/selection.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/widgets/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/widgets/_modal.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/widgets/bulk_diff.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/widgets/bulk_summary.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/widgets/confirm.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/widgets/diff.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/nsc/tui/widgets/nav_tree.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/scripts/gen_docs.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/scripts/sync_agents_md.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/aliases/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/aliases/test_resolver.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/audit/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/audit/test_redaction_full.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/auth/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/auth/test_verify.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/benchmarks/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/benchmarks/test_startup.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/builder/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/builder/test_build.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/builder/test_default_columns.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/builder/test_redaction_marking.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/builder/test_request_body_shape.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cache/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cache/test_prune.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cache/test_store.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cli/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cli/test_aliases_commands.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cli/test_app_smoke.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cli/test_cache_commands.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cli/test_commands_dump.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cli/test_completion_protocol_smoke.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cli/test_completion_smoke.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cli/test_config_commands.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cli/test_dynamic_completion.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cli/test_explain.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cli/test_globals_color.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cli/test_handlers.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cli/test_init_commands.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cli/test_lazy_textual_import.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cli/test_login_commands.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cli/test_meta_subcommands_under_broken_config.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cli/test_ndjson_input.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cli/test_profiles_commands.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cli/test_respx_integration.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cli/test_runtime.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cli/test_skill_commands.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cli/test_stdin_sniffer.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cli/test_writes_respx.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cli/writes/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cli/writes/test_apply.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cli/writes/test_confirmation.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cli/writes/test_handler_helpers.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cli/writes/test_handlers_audit.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cli/writes/test_input.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/cli/writes/test_preflight.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/config/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/config/test_loader.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/config/test_settings_private_dir.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/config/test_writer_atomicity.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/config/test_writer_dotted_paths.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/config/test_writer_roundtrip.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/conftest.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/e2e/README.md +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/e2e/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/e2e/conftest.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/e2e/docker-compose.yml +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/e2e/test_audit_redaction.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/e2e/test_auth_error_envelope.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/e2e/test_bulk_create_with_loop_fallback.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/e2e/test_full_cycle.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/e2e/test_login.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/e2e/test_ndjson.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/e2e/test_preflight_blocks_apply.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/e2e/test_validation_error_envelope_from_netbox.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/e2e/wait_for_netbox.sh +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/fixtures/profiles/single_profile.yaml +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/fixtures/responses/auth_401.json +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/fixtures/responses/circuits_providers_list.json +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/fixtures/responses/dcim_devices_get.json +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/fixtures/responses/dcim_devices_list_p1.json +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/fixtures/responses/dcim_devices_list_p2.json +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/http/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/http/test_audit.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/http/test_audit_permissions.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/http/test_audit_redaction.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/http/test_client.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/http/test_client_redaction_threading.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/http/test_errors.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/http/test_retry.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/model/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/model/test_command_model.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/model/test_request_body_shape.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/output/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/output/test_console.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/output/test_csv.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/output/test_errors.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/output/test_errors_aliases.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/output/test_errors_color.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/output/test_explain.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/output/test_explain_color.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/output/test_input_error_envelope.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/output/test_json.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/output/test_jsonl.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/output/test_render_dispatch.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/output/test_table.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/output/test_yaml.py +0 -0
- {netbox_super_cli-1.3.1/tests/schema → netbox_super_cli-1.5.0/tests/savedfilters}/__init__.py +0 -0
- {netbox_super_cli-1.3.1/tests/scripts → netbox_super_cli-1.5.0/tests/schema}/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/schema/test_hashing.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/schema/test_loader.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/schema/test_models.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/schema/test_source.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/schema/test_source_ttl.py +0 -0
- {netbox_super_cli-1.3.1/tests/skill → netbox_super_cli-1.5.0/tests/scripts}/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/scripts/test_gen_docs.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/scripts/test_sync_agents_md.py +0 -0
- {netbox_super_cli-1.3.1/tests/tui → netbox_super_cli-1.5.0/tests/skill}/__init__.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/skill/test_bundle.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/test_packaging.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/tui/test_bindings.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/tui/test_bulk_apply.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/tui/test_bulk_diff.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/tui/test_bulk_diff_modal.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/tui/test_bulk_edit_form.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/tui/test_bulk_import_isolation.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/tui/test_bulk_summary.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/tui/test_catalog.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/tui/test_column_chooser.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/tui/test_detail_screen.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/tui/test_diff.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/tui/test_diff_modal.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/tui/test_edit_form.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/tui/test_errors.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/tui/test_filters.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/tui/test_fk_resolve.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/tui/test_forms.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/tui/test_global_search.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/tui/test_help_overlay.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/tui/test_list_screen.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/tui/test_picker.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/tui/test_record_picker.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/tui/test_relations.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/tui/test_search.py +0 -0
- {netbox_super_cli-1.3.1 → netbox_super_cli-1.5.0}/tests/tui/test_selection.py +0 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
name: 🐞 Bug report
|
|
2
|
+
description: Something in nsc (the CLI or TUI) behaves incorrectly or crashes.
|
|
3
|
+
title: "[Bug]: "
|
|
4
|
+
labels: ["bug"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
Thanks for filing a bug! The version numbers and the **exact command** make
|
|
10
|
+
most issues reproducible — please fill in as much as you can.
|
|
11
|
+
|
|
12
|
+
> [!WARNING]
|
|
13
|
+
> **Redact secrets.** Never paste your `NSC_TOKEN`, API tokens, or any
|
|
14
|
+
> credential. Replace them with `***`.
|
|
15
|
+
|
|
16
|
+
- type: input
|
|
17
|
+
id: nsc-version
|
|
18
|
+
attributes:
|
|
19
|
+
label: nsc version
|
|
20
|
+
description: Output of `nsc --version`.
|
|
21
|
+
placeholder: "nsc 1.4.0"
|
|
22
|
+
validations:
|
|
23
|
+
required: true
|
|
24
|
+
|
|
25
|
+
- type: dropdown
|
|
26
|
+
id: install-method
|
|
27
|
+
attributes:
|
|
28
|
+
label: How did you install nsc?
|
|
29
|
+
options:
|
|
30
|
+
- uv tool install
|
|
31
|
+
- pipx
|
|
32
|
+
- pip
|
|
33
|
+
- uvx (ephemeral)
|
|
34
|
+
- from source / git checkout
|
|
35
|
+
- other
|
|
36
|
+
validations:
|
|
37
|
+
required: true
|
|
38
|
+
|
|
39
|
+
- type: input
|
|
40
|
+
id: python-version
|
|
41
|
+
attributes:
|
|
42
|
+
label: Python version
|
|
43
|
+
description: Output of `python --version` for the interpreter nsc runs under.
|
|
44
|
+
placeholder: "3.12.x"
|
|
45
|
+
validations:
|
|
46
|
+
required: true
|
|
47
|
+
|
|
48
|
+
- type: dropdown
|
|
49
|
+
id: os
|
|
50
|
+
attributes:
|
|
51
|
+
label: Operating system
|
|
52
|
+
options:
|
|
53
|
+
- Linux
|
|
54
|
+
- macOS
|
|
55
|
+
- Windows
|
|
56
|
+
- Other
|
|
57
|
+
validations:
|
|
58
|
+
required: true
|
|
59
|
+
|
|
60
|
+
- type: input
|
|
61
|
+
id: netbox-version
|
|
62
|
+
attributes:
|
|
63
|
+
label: NetBox version
|
|
64
|
+
description: The NetBox server version nsc talks to (NetBox UI footer, or `/api/status/`).
|
|
65
|
+
placeholder: "v4.6.3"
|
|
66
|
+
validations:
|
|
67
|
+
required: false
|
|
68
|
+
|
|
69
|
+
- type: dropdown
|
|
70
|
+
id: schema-source
|
|
71
|
+
attributes:
|
|
72
|
+
label: Which schema was nsc using?
|
|
73
|
+
description: nsc generates commands from the OpenAPI schema — a live fetch, the on-disk cache, or the bundled offline snapshot.
|
|
74
|
+
options:
|
|
75
|
+
- Live NetBox API
|
|
76
|
+
- Cached schema
|
|
77
|
+
- Bundled offline snapshot
|
|
78
|
+
- Not sure
|
|
79
|
+
validations:
|
|
80
|
+
required: false
|
|
81
|
+
|
|
82
|
+
- type: textarea
|
|
83
|
+
id: command
|
|
84
|
+
attributes:
|
|
85
|
+
label: Command you ran
|
|
86
|
+
description: The exact `nsc ...` invocation. Redact tokens.
|
|
87
|
+
render: shell
|
|
88
|
+
placeholder: nsc dcim devices list --site-id 42 --output json
|
|
89
|
+
validations:
|
|
90
|
+
required: true
|
|
91
|
+
|
|
92
|
+
- type: textarea
|
|
93
|
+
id: what-happened
|
|
94
|
+
attributes:
|
|
95
|
+
label: What happened?
|
|
96
|
+
description: The actual behavior, including any error message or traceback.
|
|
97
|
+
render: shell
|
|
98
|
+
validations:
|
|
99
|
+
required: true
|
|
100
|
+
|
|
101
|
+
- type: textarea
|
|
102
|
+
id: expected
|
|
103
|
+
attributes:
|
|
104
|
+
label: What did you expect to happen?
|
|
105
|
+
validations:
|
|
106
|
+
required: true
|
|
107
|
+
|
|
108
|
+
- type: textarea
|
|
109
|
+
id: logs
|
|
110
|
+
attributes:
|
|
111
|
+
label: Relevant logs / audit output
|
|
112
|
+
description: Optional. Anything else that helps — re-run with extra output if useful. Redact secrets first.
|
|
113
|
+
render: shell
|
|
114
|
+
validations:
|
|
115
|
+
required: false
|
|
116
|
+
|
|
117
|
+
- type: checkboxes
|
|
118
|
+
id: checks
|
|
119
|
+
attributes:
|
|
120
|
+
label: Before submitting
|
|
121
|
+
options:
|
|
122
|
+
- label: I searched existing issues and this isn't a duplicate.
|
|
123
|
+
required: true
|
|
124
|
+
- label: I'm on the latest release of nsc, or I noted my version above.
|
|
125
|
+
required: true
|
|
126
|
+
- label: I removed any tokens / credentials from the command and logs above.
|
|
127
|
+
required: true
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
blank_issues_enabled: false
|
|
2
|
+
contact_links:
|
|
3
|
+
- name: 📖 Documentation
|
|
4
|
+
url: https://thomaschristory.github.io/netbox-super-cli/
|
|
5
|
+
about: Guides, the CLI/TUI reference, and configuration docs — please check here first.
|
|
6
|
+
- name: 💬 Questions & usage help
|
|
7
|
+
url: https://github.com/thomaschristory/netbox-super-cli/discussions
|
|
8
|
+
about: Ask how-to questions, share setups, or propose ideas before filing a feature request.
|
|
9
|
+
- name: 🔐 Security vulnerability
|
|
10
|
+
url: https://github.com/thomaschristory/netbox-super-cli/security/advisories/new
|
|
11
|
+
about: Report a security issue privately. Please do NOT open a public issue for vulnerabilities.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
name: 📖 Documentation issue
|
|
2
|
+
description: A gap, error, or confusing part of the docs, README, or bundled SKILL.
|
|
3
|
+
title: "[Docs]: "
|
|
4
|
+
labels: ["documentation"]
|
|
5
|
+
body:
|
|
6
|
+
- type: textarea
|
|
7
|
+
id: where
|
|
8
|
+
attributes:
|
|
9
|
+
label: Where is the problem?
|
|
10
|
+
description: A page URL, a file path (e.g. `README.md`, `docs/...`), or a command's `--help` output.
|
|
11
|
+
validations:
|
|
12
|
+
required: true
|
|
13
|
+
|
|
14
|
+
- type: textarea
|
|
15
|
+
id: problem
|
|
16
|
+
attributes:
|
|
17
|
+
label: What's wrong or missing?
|
|
18
|
+
validations:
|
|
19
|
+
required: true
|
|
20
|
+
|
|
21
|
+
- type: textarea
|
|
22
|
+
id: suggestion
|
|
23
|
+
attributes:
|
|
24
|
+
label: Suggested fix
|
|
25
|
+
description: Optional — a sentence, a corrected snippet, or a link to the right info.
|
|
26
|
+
validations:
|
|
27
|
+
required: false
|
|
28
|
+
|
|
29
|
+
- type: checkboxes
|
|
30
|
+
id: checks
|
|
31
|
+
attributes:
|
|
32
|
+
label: Before submitting
|
|
33
|
+
options:
|
|
34
|
+
- label: I searched existing issues and this isn't a duplicate.
|
|
35
|
+
required: true
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
name: ✨ Feature request
|
|
2
|
+
description: Suggest a new capability or improvement for the CLI, TUI, or output.
|
|
3
|
+
title: "[Feature]: "
|
|
4
|
+
labels: ["enhancement"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
Thanks for the idea! Describing the **problem** first (not just the
|
|
10
|
+
solution) helps us find the best fit. nsc is generated from NetBox's
|
|
11
|
+
OpenAPI schema, so features usually apply across every resource.
|
|
12
|
+
|
|
13
|
+
- type: dropdown
|
|
14
|
+
id: area
|
|
15
|
+
attributes:
|
|
16
|
+
label: Which area?
|
|
17
|
+
options:
|
|
18
|
+
- CLI (commands, flags, output)
|
|
19
|
+
- TUI (interactive browser)
|
|
20
|
+
- Output / formatting (table, json, jsonl, yaml, csv)
|
|
21
|
+
- Config / auth / profiles
|
|
22
|
+
- Shell completion
|
|
23
|
+
- Schema / code generation
|
|
24
|
+
- Documentation
|
|
25
|
+
- Other / not sure
|
|
26
|
+
validations:
|
|
27
|
+
required: true
|
|
28
|
+
|
|
29
|
+
- type: textarea
|
|
30
|
+
id: problem
|
|
31
|
+
attributes:
|
|
32
|
+
label: What problem are you trying to solve?
|
|
33
|
+
description: What are you trying to do, and where does nsc get in the way today?
|
|
34
|
+
validations:
|
|
35
|
+
required: true
|
|
36
|
+
|
|
37
|
+
- type: textarea
|
|
38
|
+
id: proposal
|
|
39
|
+
attributes:
|
|
40
|
+
label: Proposed solution
|
|
41
|
+
description: What would you like nsc to do? A sketch of the command, flag, or UX is great.
|
|
42
|
+
validations:
|
|
43
|
+
required: false
|
|
44
|
+
|
|
45
|
+
- type: textarea
|
|
46
|
+
id: example
|
|
47
|
+
attributes:
|
|
48
|
+
label: Example usage
|
|
49
|
+
description: How would it look on the command line (or in the TUI)?
|
|
50
|
+
render: shell
|
|
51
|
+
placeholder: nsc dcim devices list --some-new-flag
|
|
52
|
+
validations:
|
|
53
|
+
required: false
|
|
54
|
+
|
|
55
|
+
- type: textarea
|
|
56
|
+
id: alternatives
|
|
57
|
+
attributes:
|
|
58
|
+
label: Alternatives considered
|
|
59
|
+
validations:
|
|
60
|
+
required: false
|
|
61
|
+
|
|
62
|
+
- type: checkboxes
|
|
63
|
+
id: checks
|
|
64
|
+
attributes:
|
|
65
|
+
label: Before submitting
|
|
66
|
+
options:
|
|
67
|
+
- label: I searched existing issues and this isn't a duplicate.
|
|
68
|
+
required: true
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Thanks for contributing to netbox-super-cli! Keep this short — a couple of
|
|
3
|
+
sentences plus the checklist is plenty. See CLAUDE.md / docs/contributing for
|
|
4
|
+
conventions.
|
|
5
|
+
-->
|
|
6
|
+
|
|
7
|
+
## What & why
|
|
8
|
+
|
|
9
|
+
<!-- What does this change, and why? Link the issue: Closes #123 -->
|
|
10
|
+
|
|
11
|
+
## Checklist
|
|
12
|
+
|
|
13
|
+
- [ ] PR title follows [Conventional Commits](https://www.conventionalcommits.org/) (`feat:`, `fix:`, `docs:`, `chore:`, `refactor:`, …)
|
|
14
|
+
- [ ] Tests added or updated, and `just test` passes
|
|
15
|
+
- [ ] `just lint` passes (ruff + `mypy --strict`)
|
|
16
|
+
- [ ] Docs / `CHANGELOG.md` updated if this is user-facing
|
|
17
|
+
- [ ] Linked the related issue (e.g. `Closes #…`)
|
|
@@ -10,12 +10,11 @@ permissions:
|
|
|
10
10
|
|
|
11
11
|
jobs:
|
|
12
12
|
test:
|
|
13
|
-
runs-on:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
14
|
strategy:
|
|
15
15
|
fail-fast: false
|
|
16
16
|
matrix:
|
|
17
|
-
|
|
18
|
-
python: ["3.12", "3.13"]
|
|
17
|
+
python: ["3.12", "3.13", "3.14"]
|
|
19
18
|
steps:
|
|
20
19
|
- uses: actions/checkout@v7
|
|
21
20
|
- name: Install uv
|
|
@@ -2,6 +2,56 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to netbox-super-cli are tracked here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) loosely. From v1.0.0 onward, releases follow [Semantic Versioning](https://semver.org/) and the version in `pyproject.toml` matches the git tag. Pre-1.0 milestones (Phase 1-5) were pinned by tag while `pyproject.toml` stayed at `0.0.1`.
|
|
4
4
|
|
|
5
|
+
## v1.5.0 — 2026-06-29
|
|
6
|
+
|
|
7
|
+
Minor release. Saved searches become interchangeable with the NetBox web UI.
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
|
|
11
|
+
- **Saved searches are now NetBox-native** ([#129]). Filter sets saved from the
|
|
12
|
+
TUI (`Ctrl+W`) and applied via `--saved` are stored as NetBox saved filters
|
|
13
|
+
(`extras.saved-filters`), scoped to the resource's object type, so they are
|
|
14
|
+
fully interchangeable with the web UI's filter dropdown — a search saved in
|
|
15
|
+
`nsc` appears in the web UI and vice versa. The object type is resolved from
|
|
16
|
+
NetBox's own object-type registry (`/api/core/object-types/`), so the mapping
|
|
17
|
+
is exact rather than guessed. When NetBox is unreachable or the user lacks
|
|
18
|
+
permission on `extras.savedfilter`, saves/loads transparently fall back to the
|
|
19
|
+
previous local `config.yaml` store and surface a notice instead of failing.
|
|
20
|
+
|
|
21
|
+
[#129]: https://github.com/thomaschristory/netbox-super-cli/issues/129
|
|
22
|
+
|
|
23
|
+
## v1.4.0 — 2026-06-26
|
|
24
|
+
|
|
25
|
+
Minor release. Three user-facing features for the interactive TUI and table
|
|
26
|
+
output: individually selectable custom-field columns, local saved searches, and
|
|
27
|
+
NetBox-native object colors.
|
|
28
|
+
|
|
29
|
+
### Added
|
|
30
|
+
|
|
31
|
+
- **Individually selectable custom fields** ([#121], closes [#118]). The TUI
|
|
32
|
+
column chooser (`f` — Fields) now expands `custom_fields` into one toggleable
|
|
33
|
+
column per custom field (`custom_fields.<name>`) instead of a single opaque
|
|
34
|
+
object. On the CLI, `--columns custom_fields.<name>` selects an individual
|
|
35
|
+
custom field (now documented).
|
|
36
|
+
- **Saved searches** ([#123], closes [#119]). Named filter sets persist per
|
|
37
|
+
resource. In the TUI filter builder, `Ctrl+W` saves the current filters under
|
|
38
|
+
a name and `Ctrl+O` opens a picker to apply one (`d` deletes an entry). On the
|
|
39
|
+
CLI, `--saved <name>` re-applies a saved filter set on `list`; explicit
|
|
40
|
+
`--filter` and typed options take precedence over saved values. Names
|
|
41
|
+
containing `.` (or whitespace) are rejected to keep the config file well-formed.
|
|
42
|
+
- **NetBox object colors** ([#122], closes [#120]). Role, tag, and other
|
|
43
|
+
color-bearing fields render in their NetBox-defined colors in table output. A
|
|
44
|
+
new `object_colors` setting (`auto`/`on`/`off`) and the
|
|
45
|
+
`--object-colors/--no-object-colors` flag toggle this independently of
|
|
46
|
+
`--color`; `off`, `NO_COLOR`, and non-TTY output are always respected.
|
|
47
|
+
|
|
48
|
+
[#118]: https://github.com/thomaschristory/netbox-super-cli/issues/118
|
|
49
|
+
[#119]: https://github.com/thomaschristory/netbox-super-cli/issues/119
|
|
50
|
+
[#120]: https://github.com/thomaschristory/netbox-super-cli/issues/120
|
|
51
|
+
[#121]: https://github.com/thomaschristory/netbox-super-cli/pull/121
|
|
52
|
+
[#122]: https://github.com/thomaschristory/netbox-super-cli/pull/122
|
|
53
|
+
[#123]: https://github.com/thomaschristory/netbox-super-cli/pull/123
|
|
54
|
+
|
|
5
55
|
## v1.3.1 — 2026-06-25
|
|
6
56
|
|
|
7
57
|
Patch release. CI maintenance only — no runtime or user-facing changes.
|
|
@@ -1,6 +1,61 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: netbox-super-cli
|
|
3
|
+
Version: 1.5.0
|
|
4
|
+
Summary: Dynamic NetBox CLI generated from the live OpenAPI schema.
|
|
5
|
+
Project-URL: Homepage, https://github.com/thomaschristory/netbox-super-cli
|
|
6
|
+
Project-URL: Documentation, https://thomaschristory.github.io/netbox-super-cli/
|
|
7
|
+
Project-URL: Source, https://github.com/thomaschristory/netbox-super-cli
|
|
8
|
+
Project-URL: Issues, https://github.com/thomaschristory/netbox-super-cli/issues
|
|
9
|
+
Project-URL: Changelog, https://github.com/thomaschristory/netbox-super-cli/blob/main/CHANGELOG.md
|
|
10
|
+
Author: Thomas Christory
|
|
11
|
+
License-Expression: Apache-2.0
|
|
12
|
+
License-File: LICENSE
|
|
13
|
+
Keywords: automation,cli,netbox,openapi
|
|
14
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
15
|
+
Classifier: Environment :: Console
|
|
16
|
+
Classifier: Intended Audience :: Information Technology
|
|
17
|
+
Classifier: Intended Audience :: System Administrators
|
|
18
|
+
Classifier: Intended Audience :: Telecommunications Industry
|
|
19
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
23
|
+
Classifier: Topic :: System :: Networking
|
|
24
|
+
Requires-Python: >=3.12
|
|
25
|
+
Requires-Dist: click>=8.1
|
|
26
|
+
Requires-Dist: httpx>=0.27
|
|
27
|
+
Requires-Dist: platformdirs>=4.2
|
|
28
|
+
Requires-Dist: pydantic>=2.7
|
|
29
|
+
Requires-Dist: rich>=13.7
|
|
30
|
+
Requires-Dist: ruamel-yaml>=0.18
|
|
31
|
+
Requires-Dist: structlog>=24.1
|
|
32
|
+
Requires-Dist: textual>=0.50
|
|
33
|
+
Requires-Dist: typer<0.27,>=0.26
|
|
34
|
+
Description-Content-Type: text/markdown
|
|
35
|
+
|
|
36
|
+
<div align="center">
|
|
37
|
+
|
|
38
|
+
# netbox-super-cli · `nsc`
|
|
39
|
+
|
|
40
|
+
**A Python CLI for [NetBox](https://netbox.dev/) that builds its entire command tree from your install's live OpenAPI schema.**
|
|
41
|
+
|
|
42
|
+
One binary, any NetBox version, every plugin endpoint — the schema, not hand-written code, defines the surface.
|
|
43
|
+
|
|
44
|
+
<br/>
|
|
45
|
+
|
|
46
|
+
[](https://pypi.org/project/netbox-super-cli/)
|
|
47
|
+
[](https://pypi.org/project/netbox-super-cli/)
|
|
48
|
+
[](https://pypi.org/project/netbox-super-cli/)
|
|
49
|
+
[](LICENSE)
|
|
50
|
+
[](https://github.com/thomaschristory/netbox-super-cli/actions/workflows/test.yml)
|
|
51
|
+
[](https://thomaschristory.github.io/netbox-super-cli/)
|
|
52
|
+
[](https://github.com/thomaschristory/netbox-super-cli/stargazers)
|
|
53
|
+
|
|
54
|
+
[**📚 Documentation**](https://thomaschristory.github.io/netbox-super-cli/) · [**🚀 Install**](#install) · [**🖥️ Interactive TUI**](#interactive-tui) · [**🤖 AI Skill**](#bundled-skill-for-ai-agents)
|
|
55
|
+
|
|
56
|
+
</div>
|
|
57
|
+
|
|
58
|
+
---
|
|
4
59
|
|
|
5
60
|
> **Docs:** [thomaschristory.github.io/netbox-super-cli](https://thomaschristory.github.io/netbox-super-cli/) — the full guide, including install, first-run, guides, and the auto-generated CLI/config/exit-code reference.
|
|
6
61
|
|
|
@@ -45,7 +100,9 @@ nsc tui devices # jump straight into the devices list
|
|
|
45
100
|
Highlights: a collapsible resource picker, a web-UI-style filter builder (`/`),
|
|
46
101
|
inline record editing with a confirm-diff save, schema-derived relationship
|
|
47
102
|
drill-down, bulk edit with a per-record preview, a persisted column chooser
|
|
48
|
-
(`f`), and global search (`Ctrl`+`F`).
|
|
103
|
+
(`f`) that lists each custom field individually, and global search (`Ctrl`+`F`).
|
|
104
|
+
The same dotted paths work on the CLI: `nsc ls devices --columns id,name,custom_fields.rack_role`.
|
|
105
|
+
Full walkthrough in the
|
|
49
106
|
[Interactive TUI guide](https://thomaschristory.github.io/netbox-super-cli/guides/interactive-tui/).
|
|
50
107
|
|
|
51
108
|
## Reading
|
|
@@ -61,6 +118,41 @@ uv run nsc circuits providers list --output csv
|
|
|
61
118
|
uv run nsc ipam prefixes list --filter created__gte=2026-01-01 --output yaml
|
|
62
119
|
```
|
|
63
120
|
|
|
121
|
+
### Saved searches
|
|
122
|
+
|
|
123
|
+
Filter sets you save from the TUI (Ctrl+W in the filter builder) are stored as
|
|
124
|
+
**NetBox native saved filters** (`extras.saved-filters`), scoped to the resource's
|
|
125
|
+
object type. A search you save in `nsc` shows up in the NetBox web UI's filter
|
|
126
|
+
dropdown for that object — and a filter saved in the web UI loads in the TUI
|
|
127
|
+
(Ctrl+O) — so the two are fully interchangeable. Re-apply one on the CLI with
|
|
128
|
+
`--saved`:
|
|
129
|
+
|
|
130
|
+
```sh
|
|
131
|
+
uv run nsc dcim devices list --saved active-switches
|
|
132
|
+
# explicit --filter / typed options override the saved values:
|
|
133
|
+
uv run nsc dcim devices list --saved active-switches --status offline
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
When NetBox is unreachable (offline, or missing permission on
|
|
137
|
+
`extras.savedfilter`), `nsc` transparently falls back to a local store under
|
|
138
|
+
`saved_searches` in `~/.nsc/config.yaml`, keyed by tag/resource, and tells you it
|
|
139
|
+
did so.
|
|
140
|
+
|
|
141
|
+
### Object colors
|
|
142
|
+
|
|
143
|
+
NetBox assigns colors to roles, tags, and similar fields. In table output `nsc`
|
|
144
|
+
renders those values in their NetBox-defined colors:
|
|
145
|
+
|
|
146
|
+
```sh
|
|
147
|
+
uv run nsc dcim devices list # colored when stdout is a TTY
|
|
148
|
+
uv run nsc dcim devices list --no-object-colors # plain text
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Toggle it independently of `--color` with the `object_colors` setting
|
|
152
|
+
(`auto`/`on`/`off`) or the `--object-colors/--no-object-colors` flag. `off`,
|
|
153
|
+
`NO_COLOR`, and non-TTY output are always respected, so piped or redirected
|
|
154
|
+
output stays uncolored.
|
|
155
|
+
|
|
64
156
|
## Writing
|
|
65
157
|
|
|
66
158
|
```sh
|
|
@@ -1,35 +1,26 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
Requires-Dist: ruamel-yaml>=0.18
|
|
25
|
-
Requires-Dist: structlog>=24.1
|
|
26
|
-
Requires-Dist: textual>=0.50
|
|
27
|
-
Requires-Dist: typer<0.27,>=0.26
|
|
28
|
-
Description-Content-Type: text/markdown
|
|
29
|
-
|
|
30
|
-
# netbox-super-cli (`nsc`)
|
|
31
|
-
|
|
32
|
-
A Python CLI for [NetBox](https://netbox.dev/) that builds its command tree dynamically from your install's live OpenAPI schema. The same binary works against any NetBox version and exposes plugin-provided endpoints automatically — the schema, not hand-written code, defines the surface.
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
# netbox-super-cli · `nsc`
|
|
4
|
+
|
|
5
|
+
**A Python CLI for [NetBox](https://netbox.dev/) that builds its entire command tree from your install's live OpenAPI schema.**
|
|
6
|
+
|
|
7
|
+
One binary, any NetBox version, every plugin endpoint — the schema, not hand-written code, defines the surface.
|
|
8
|
+
|
|
9
|
+
<br/>
|
|
10
|
+
|
|
11
|
+
[](https://pypi.org/project/netbox-super-cli/)
|
|
12
|
+
[](https://pypi.org/project/netbox-super-cli/)
|
|
13
|
+
[](https://pypi.org/project/netbox-super-cli/)
|
|
14
|
+
[](LICENSE)
|
|
15
|
+
[](https://github.com/thomaschristory/netbox-super-cli/actions/workflows/test.yml)
|
|
16
|
+
[](https://thomaschristory.github.io/netbox-super-cli/)
|
|
17
|
+
[](https://github.com/thomaschristory/netbox-super-cli/stargazers)
|
|
18
|
+
|
|
19
|
+
[**📚 Documentation**](https://thomaschristory.github.io/netbox-super-cli/) · [**🚀 Install**](#install) · [**🖥️ Interactive TUI**](#interactive-tui) · [**🤖 AI Skill**](#bundled-skill-for-ai-agents)
|
|
20
|
+
|
|
21
|
+
</div>
|
|
22
|
+
|
|
23
|
+
---
|
|
33
24
|
|
|
34
25
|
> **Docs:** [thomaschristory.github.io/netbox-super-cli](https://thomaschristory.github.io/netbox-super-cli/) — the full guide, including install, first-run, guides, and the auto-generated CLI/config/exit-code reference.
|
|
35
26
|
|
|
@@ -74,7 +65,9 @@ nsc tui devices # jump straight into the devices list
|
|
|
74
65
|
Highlights: a collapsible resource picker, a web-UI-style filter builder (`/`),
|
|
75
66
|
inline record editing with a confirm-diff save, schema-derived relationship
|
|
76
67
|
drill-down, bulk edit with a per-record preview, a persisted column chooser
|
|
77
|
-
(`f`), and global search (`Ctrl`+`F`).
|
|
68
|
+
(`f`) that lists each custom field individually, and global search (`Ctrl`+`F`).
|
|
69
|
+
The same dotted paths work on the CLI: `nsc ls devices --columns id,name,custom_fields.rack_role`.
|
|
70
|
+
Full walkthrough in the
|
|
78
71
|
[Interactive TUI guide](https://thomaschristory.github.io/netbox-super-cli/guides/interactive-tui/).
|
|
79
72
|
|
|
80
73
|
## Reading
|
|
@@ -90,6 +83,41 @@ uv run nsc circuits providers list --output csv
|
|
|
90
83
|
uv run nsc ipam prefixes list --filter created__gte=2026-01-01 --output yaml
|
|
91
84
|
```
|
|
92
85
|
|
|
86
|
+
### Saved searches
|
|
87
|
+
|
|
88
|
+
Filter sets you save from the TUI (Ctrl+W in the filter builder) are stored as
|
|
89
|
+
**NetBox native saved filters** (`extras.saved-filters`), scoped to the resource's
|
|
90
|
+
object type. A search you save in `nsc` shows up in the NetBox web UI's filter
|
|
91
|
+
dropdown for that object — and a filter saved in the web UI loads in the TUI
|
|
92
|
+
(Ctrl+O) — so the two are fully interchangeable. Re-apply one on the CLI with
|
|
93
|
+
`--saved`:
|
|
94
|
+
|
|
95
|
+
```sh
|
|
96
|
+
uv run nsc dcim devices list --saved active-switches
|
|
97
|
+
# explicit --filter / typed options override the saved values:
|
|
98
|
+
uv run nsc dcim devices list --saved active-switches --status offline
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
When NetBox is unreachable (offline, or missing permission on
|
|
102
|
+
`extras.savedfilter`), `nsc` transparently falls back to a local store under
|
|
103
|
+
`saved_searches` in `~/.nsc/config.yaml`, keyed by tag/resource, and tells you it
|
|
104
|
+
did so.
|
|
105
|
+
|
|
106
|
+
### Object colors
|
|
107
|
+
|
|
108
|
+
NetBox assigns colors to roles, tags, and similar fields. In table output `nsc`
|
|
109
|
+
renders those values in their NetBox-defined colors:
|
|
110
|
+
|
|
111
|
+
```sh
|
|
112
|
+
uv run nsc dcim devices list # colored when stdout is a TTY
|
|
113
|
+
uv run nsc dcim devices list --no-object-colors # plain text
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Toggle it independently of `--color` with the `object_colors` setting
|
|
117
|
+
(`auto`/`on`/`off`) or the `--object-colors/--no-object-colors` flag. `off`,
|
|
118
|
+
`NO_COLOR`, and non-TTY output are always respected, so piped or redirected
|
|
119
|
+
output stays uncolored.
|
|
120
|
+
|
|
93
121
|
## Writing
|
|
94
122
|
|
|
95
123
|
```sh
|
|
@@ -81,11 +81,27 @@ NetBox list endpoint exposes hundreds of query parameters.
|
|
|
81
81
|
| <kbd>↓</kbd> | Move to the next field (from a text field) |
|
|
82
82
|
| <kbd>Tab</kbd> / <kbd>Shift</kbd>+<kbd>Tab</kbd> | Move between fields |
|
|
83
83
|
| <kbd>Ctrl</kbd>+<kbd>S</kbd> | Apply |
|
|
84
|
+
| <kbd>Ctrl</kbd>+<kbd>W</kbd> | Save the current filters as a named search |
|
|
85
|
+
| <kbd>Ctrl</kbd>+<kbd>O</kbd> | Load (or delete) a saved search |
|
|
84
86
|
| <kbd>Esc</kbd> | Cancel |
|
|
85
87
|
|
|
86
88
|
Applying re-queries the list. Reopening the builder shows your current filters
|
|
87
89
|
so you can refine them.
|
|
88
90
|
|
|
91
|
+
### Saved searches
|
|
92
|
+
|
|
93
|
+
<kbd>Ctrl</kbd>+<kbd>W</kbd> stores the current filter set as a NetBox **native
|
|
94
|
+
saved filter** (`extras.saved-filters`), scoped to the current resource's object
|
|
95
|
+
type. It then appears in the NetBox web UI's filter dropdown for that object, and
|
|
96
|
+
filters created in the web UI load here with <kbd>Ctrl</kbd>+<kbd>O</kbd> — the two
|
|
97
|
+
surfaces are interchangeable. In the load picker, <kbd>Enter</kbd> applies the
|
|
98
|
+
highlighted search and <kbd>d</kbd> deletes it. Re-apply one non-interactively
|
|
99
|
+
with `nsc <app> <resource> list --saved <name>`.
|
|
100
|
+
|
|
101
|
+
If NetBox is unreachable (offline, or you lack permission on
|
|
102
|
+
`extras.savedfilter`), saves and loads transparently fall back to a local store in
|
|
103
|
+
`~/.nsc/config.yaml` and a toast tells you the fallback was used.
|
|
104
|
+
|
|
89
105
|
## Viewing and editing a record
|
|
90
106
|
|
|
91
107
|
The detail view **is** the edit surface — there is no separate "edit window".
|
|
@@ -11,8 +11,9 @@ All fields below describe `~/.nsc/config.yaml`.
|
|
|
11
11
|
|---|---|---|
|
|
12
12
|
| `default_profile` | `str | None` | `None` |
|
|
13
13
|
| `profiles` | `dict[str, Profile]` | `{}` |
|
|
14
|
-
| `defaults` | `<class 'Defaults'>` | `Defaults(output=<OutputFormat.TABLE: 'table'>, page_size=50, timeout=30.0, schema_refresh=<SchemaRefresh.DAILY: 'daily'>, color_mode=<ColorMode.AUTO: 'auto'>, audit_redaction=<AuditRedaction.SAFE: 'safe'>)` |
|
|
14
|
+
| `defaults` | `<class 'Defaults'>` | `Defaults(output=<OutputFormat.TABLE: 'table'>, page_size=50, timeout=30.0, schema_refresh=<SchemaRefresh.DAILY: 'daily'>, color_mode=<ColorMode.AUTO: 'auto'>, object_colors=<ObjectColorMode.AUTO: 'auto'>, audit_redaction=<AuditRedaction.SAFE: 'safe'>)` |
|
|
15
15
|
| `columns` | `dict[str, dict[str, list[str]]]` | `{}` |
|
|
16
|
+
| `saved_searches` | `dict[str, dict[str, dict[str, dict[str, str]]]]` | `{}` |
|
|
16
17
|
|
|
17
18
|
## `Profile`
|
|
18
19
|
|
|
@@ -34,4 +35,5 @@ All fields below describe `~/.nsc/config.yaml`.
|
|
|
34
35
|
| `timeout` | `<class 'float'>` | `30.0` |
|
|
35
36
|
| `schema_refresh` | `<enum 'SchemaRefresh'>` | `<SchemaRefresh.DAILY: 'daily'>` |
|
|
36
37
|
| `color_mode` | `<enum 'ColorMode'>` | `<ColorMode.AUTO: 'auto'>` |
|
|
38
|
+
| `object_colors` | `<enum 'ObjectColorMode'>` | `<ObjectColorMode.AUTO: 'auto'>` |
|
|
37
39
|
| `audit_redaction` | `<enum 'AuditRedaction'>` | `<AuditRedaction.SAFE: 'safe'>` |
|
|
@@ -94,6 +94,14 @@ def _extract_global_overrides(args: list[str]) -> CLIOverrides:
|
|
|
94
94
|
kwargs["refresh_schema"] = True
|
|
95
95
|
i += 1
|
|
96
96
|
continue
|
|
97
|
+
if a == "--object-colors":
|
|
98
|
+
kwargs["object_colors"] = True
|
|
99
|
+
i += 1
|
|
100
|
+
continue
|
|
101
|
+
if a == "--no-object-colors":
|
|
102
|
+
kwargs["object_colors"] = False
|
|
103
|
+
i += 1
|
|
104
|
+
continue
|
|
97
105
|
i += 1
|
|
98
106
|
return CLIOverrides(**kwargs) # type: ignore[arg-type]
|
|
99
107
|
|
|
@@ -310,6 +318,13 @@ def _root(
|
|
|
310
318
|
),
|
|
311
319
|
] = False,
|
|
312
320
|
output: Annotated[str | None, typer.Option("--output", "-o")] = None,
|
|
321
|
+
object_colors: Annotated[
|
|
322
|
+
bool | None,
|
|
323
|
+
typer.Option(
|
|
324
|
+
"--object-colors/--no-object-colors",
|
|
325
|
+
help="Render NetBox-native object colors (role/tag/…) in table output.",
|
|
326
|
+
),
|
|
327
|
+
] = None,
|
|
313
328
|
debug: Annotated[bool, typer.Option("--debug")] = False,
|
|
314
329
|
) -> None:
|
|
315
330
|
"""Root callback — global options live here."""
|
|
@@ -321,6 +336,7 @@ def _root(
|
|
|
321
336
|
schema_override=schema,
|
|
322
337
|
refresh_schema=refresh_schema,
|
|
323
338
|
output=output,
|
|
339
|
+
object_colors=object_colors,
|
|
324
340
|
)
|
|
325
341
|
try:
|
|
326
342
|
config = load_config(default_paths().config_file)
|