agent-wiki-cli 2.3.0__tar.gz → 2.3.1__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.
- {agent_wiki_cli-2.3.0/src/agent_wiki_cli.egg-info → agent_wiki_cli-2.3.1}/PKG-INFO +1 -1
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/pyproject.toml +1 -1
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1/src/agent_wiki_cli.egg-info}/PKG-INFO +1 -1
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/agent_wiki_cli.egg-info/SOURCES.txt +2 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/concept_identity.py +31 -1
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/knowledge_governance.py +23 -28
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/knowledge_storage.py +18 -2
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/knowledge_storage_access.py +2 -1
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_architecture_layers.py +1 -1
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_concept_identity.py +45 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_core_check_performance.py +152 -0
- agent_wiki_cli-2.3.1/tests/test_credential_named_knowledge.py +172 -0
- agent_wiki_cli-2.3.1/tests/test_dependency_audit.py +386 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_governance.py +54 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_storage.py +23 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_package_metadata.py +1 -1
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_release_static_checks.py +1 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_validation.py +5 -6
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/LICENSE +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/MANIFEST.in +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/README.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/docs/automation.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/docs/cli-reference.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/docs/native-agent-workflow.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/docs/native-knowledge-provider.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/docs/security-model.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/docs/standalone-documentation.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/docs/wiki-guide.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/examples/plugins/documentation-hooks/README.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/examples/plugins/documentation-hooks/detectors.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/examples/plugins/documentation-hooks/llm-wiki-plugin.json +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/examples/plugins/documentation-hooks/styles.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/release_build_backend.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/setup.cfg +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/agent_wiki_cli.egg-info/dependency_links.txt +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/agent_wiki_cli.egg-info/entry_points.txt +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/agent_wiki_cli.egg-info/requires.txt +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/agent_wiki_cli.egg-info/top_level.txt +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/__init__.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/api.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/api_types.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/cli.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/__init__.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/api_diff_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/bootstrap_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/bump_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/ci_check_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/context_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/docs_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/doctor_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/extract_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/generate_prompt_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/hook_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/init_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/install_ci_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/install_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/knowledge_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/knowledge_storage_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/lint_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/mcp_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/metrics_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/migrate_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/obsidian_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/plugins_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/prepare_extractors_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/query_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/queue_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/release_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/review_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/search_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/site_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/skills_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/status_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/sync_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/task_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/team_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/trigger_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/uninstall_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/commands/upgrade_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/config.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/eval_lite/__init__.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/eval_lite/planner.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/examples/plugins/documentation-hooks/README.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/examples/plugins/documentation-hooks/detectors.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/examples/plugins/documentation-hooks/llm-wiki-plugin.json +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/examples/plugins/documentation-hooks/styles.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/extractors/__init__.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/extractors/common.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/extractors/fastapi_contracts.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/extractors/go_extractor.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/extractors/go_scripts/go.mod +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/extractors/go_scripts/main.go +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/extractors/haskell_extractor.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/extractors/haskell_scripts/Inventory.hs +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/extractors/haskell_scripts/Json.hs +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/extractors/haskell_scripts/Main.hs +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/extractors/haskell_scripts/Parser.hs +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/extractors/haskell_scripts/Paths.hs +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/extractors/python_bindings.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/extractors/python_contracts.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/extractors/python_extractor.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/extractors/rust_extractor.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/extractors/rust_scripts/Cargo.lock +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/extractors/rust_scripts/Cargo.toml +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/extractors/rust_scripts/src/main.rs +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/extractors/ts_extractor.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/extractors/ts_scripts/extract.js +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/extractors/ts_scripts/package-lock.json +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/extractors/ts_scripts/package.json +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/py.typed +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/schemas/__init__.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/schemas/llm-wiki-knowledge-object-v1.schema.json +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/schemas/llm-wiki-knowledge-pack-index-v1.schema.json +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/schemas/llm-wiki-knowledge-pack-index-v2.schema.json +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/schemas/llm-wiki-knowledge-v1.schema.json +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/schemas/llm-wiki-knowledge-v2.schema.json +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/schemas/llm-wiki-knowledge-v3.schema.json +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/schemas/llm-wiki-knowledge-v4.schema.json +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/schemas/llm-wiki-manifest-catalog-v1.schema.json +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/schemas/llm-wiki-manifest-v6.schema.json +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/__init__.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/analysis_capture.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/analysis_compatibility.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/analysis_contracts.json +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/api_contracts.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/api_diff.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/bootstrap_runtime.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/bootstrap_service.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/calibration/__init__.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/calibration/broker.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/calibration/contracts.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/calibration/controller.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/calibration/host_broker.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/canonical_json.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/canonical_pages.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/capability_diagnostics.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/change_selection.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/ci_installer.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/ci_report.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/circuit_breaker.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/context_budget.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/context_knowledge_contract.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/context_packet.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/context_service.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/context_session.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/contracts.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/data_flow.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/dependencies.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/dependency_versions.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/diagrams.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/doctor_service.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/documentation_calibration.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/documentation_calibration_broker.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/documentation_calibration_controller.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/documentation_calibration_host_broker.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/documentation_claim_evidence.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/documentation_model_policy.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/documentation_native.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/documentation_policy.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/documentation_queries.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/documentation_query_builder.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/documentation_review.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/documentation_run/__init__.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/documentation_run/contracts.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/documentation_run/dependencies.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/documentation_run/export.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/documentation_run/integrity.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/documentation_run/packet.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/documentation_run/prepare.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/documentation_run/record.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/documentation_run/refresh.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/documentation_run/schema.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/documentation_run/verify.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/documentation_run/workspace.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/documentation_wiki_input.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/documentation_worklist.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/entrypoints.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/extraction_jobs.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/extraction_service.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/extractor_helpers.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/filesystem_guard.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/go_calls.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/health_contract.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/health_details.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/health_policy.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/health_summary.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/immutable.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/impact.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/imports.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/infrastructure_inventory.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/infrastructure_sync.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/instruction_ownership.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/inventory_cache.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/io.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/knowledge_artifacts.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/knowledge_audit.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/knowledge_consumption.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/knowledge_coverage.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/knowledge_envelope.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/knowledge_evidence.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/knowledge_freshness.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/knowledge_generation.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/knowledge_graph.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/knowledge_index.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/knowledge_links.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/knowledge_loader.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/knowledge_maintenance.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/knowledge_model.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/knowledge_observability.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/knowledge_orchestration.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/knowledge_packs.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/knowledge_projection.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/knowledge_reuse.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/knowledge_storage_diagnostics.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/knowledge_storage_io.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/knowledge_storage_lifecycle.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/knowledge_stream_audit.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/knowledge_verification.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/legacy_hooks.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/lint_service.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/lockfile.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/maintenance_queue.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/manifest_storage.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/markdown_sections.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/mcp_server.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/metrics.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/module_maps.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/native_inspection.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/obsidian.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/packages.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/packet_field_policy.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/paths.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/plugin_samples.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/plugins.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/progress.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/protected_artifacts.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/python_calls.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/python_imports.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/python_observations.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/python_stdlib.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/redaction.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/relationships.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/rendering_lifecycle.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/request_json.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/resource_diagnostics.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/review_service.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/runtime_output.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/schema.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/search_rank.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/search_service.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/section_ownership.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/secure_file.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/site_export.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/site_html_check.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/skills.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/source_selection.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/source_snapshot.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/storage_receipts.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/storage_sort.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/storage_spool.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/sync_analysis.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/sync_manifest.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/task_context.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/task_context_v2.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/task_contract.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/task_evidence.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/team.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/token_counting.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/validation.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/verification_contracts.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/versioning.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/wiki_git_policy.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/wiki_lifecycle.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/wiki_media.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/wiki_scaffold.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/wiki_surface.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/wiki_surface_index.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/workflow_profile.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/agent-docs/SKILL.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/agent-docs/reference.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/attack-surface/SKILL.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/attack-surface/reference.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/dep-audit/SKILL.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/dep-audit/reference.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/dep-vuln-triage/SKILL.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/dep-vuln-triage/reference.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/doc-hub/SKILL.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/doc-hub/reference.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/doc-review/SKILL.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/doc-review/reference.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/impact-analysis/SKILL.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/impact-analysis/reference.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/infra-review/SKILL.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/infra-review/reference.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/native-coding/SKILL.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/native-coding/profile.json +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/onboarding-guide/SKILL.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/onboarding-guide/reference.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/publish-docs/SKILL.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/publish-docs/reference.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/usage-examples/SKILL.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/usage-examples/reference.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/user-docs-author/SKILL.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/user-docs-author/reference.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/wiki-bootstrap/SKILL.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/wiki-bootstrap/reference.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/wiki-reference/SKILL.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/wiki-reference/reference.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/wiki-reference/references/context-query.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/wiki-reference/references/extractors-dependencies.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/wiki-reference/references/governance.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/wiki-reference/references/knowledge-consumption.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/wiki-reference/references/maintenance.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/wiki-reference/references/publishing.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/wiki-reference/references/repository-handoff.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/wiki-reference/references/resources-context.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/wiki-reference/references/surfaces-naming.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/wiki-semantic-enhance/SKILL.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/wiki-semantic-enhance/reference.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/wiki-sync/SKILL.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/skills/wiki-sync/reference.md +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_action_runtimes.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_agent_instruction_decisions.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_analysis_compatibility.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_analysis_qualification.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_api.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_api_contracts.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_api_diff.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_api_exception_taxonomy.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_artifact_fixture_clock.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_bandit_decision.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_bandit_probe_metadata.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_bandit_runner.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_bootstrap.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_bootstrap_api_contracts.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_bootstrap_service.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_bump.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_calibration_cli.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_calibration_isolation.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_capability_diagnostics.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_change_selection.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_ci_check.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_ci_runtime_output.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_ci_toolchain_setup.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_ci_workflow_wrapper.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_circuit_breaker.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_cli.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_cli_error_streams.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_config.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_context.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_context_budget.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_context_integration.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_context_knowledge_contract.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_context_knowledge_runtime.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_context_packet.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_context_packet_knowledge.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_context_session.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_core_shard_runner.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_core_shard_workflow.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_core_shards.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_data_flow.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_dep_vuln_triage_skill.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_dependencies.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_dependencies_external.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_dependency_downloads.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_dependency_setup_probe.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_dependency_setup_workflow.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_dependency_version_details.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_diagrams.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_docker_bootstrap.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_docker_extract.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_docker_lint.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_docs_cli.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_doctor.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_documentation_adversarial.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_documentation_calibration.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_documentation_calibration_broker.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_documentation_calibration_controller.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_documentation_calibration_host_broker.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_documentation_calibration_oci_integration.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_documentation_claim_evidence.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_documentation_control_integrity.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_documentation_dogfood.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_documentation_input_recheck.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_documentation_model_policy.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_documentation_native.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_documentation_native_lifecycle.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_documentation_prepare_transaction.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_documentation_projection_policy.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_documentation_protocol.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_documentation_queries.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_documentation_refresh_continuation.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_documentation_review.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_documentation_run_fixtures.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_documentation_wiki_input.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_documentation_worklist.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_documentation_workspace.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_e2e.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_enriched_projection_resilience.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_entrypoints.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_eval_lite.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_examples.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_extract.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_extract_api_contracts.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_extract_data_flow_details.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_extractor_helpers.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_extractor_inventory_contracts.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_filesystem_guard.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_filesystem_guard_windows.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_filesystem_guard_windows_model.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_generate_prompt.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_generated_relationship_pages.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_github_action.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_github_action_shell.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_go_calls.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_go_extract.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_governance_reconciliation.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_graph_section_end_to_end.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_guarded_read_metadata.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_haskell_extract.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_health_details.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_helper_packaging_parity.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_hook.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_hosted_evidence.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_impact.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_imports.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_infra_review_skill.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_infrastructure_inventory.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_infrastructure_sync.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_init.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_install.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_install_ci.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_instruction_ownership.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_inventory_cache.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_io.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_artifacts.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_benchmark.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_cmd.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_commands.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_compatibility.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_consumption.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_contract.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_coverage.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_envelope.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_evidence.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_freshness.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_generation.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_graph.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_hardening.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_health_refresh.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_index.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_links.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_lint.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_loader.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_maintenance.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_model.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_observability.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_packs.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_performance.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_producer_languages.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_projection.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_projection_e2e.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_queries.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_query_adapters.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_reuse.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_scale.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_storage_artifacts.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_storage_lifecycle.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_knowledge_verification_view.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_lint.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_llm_wiki_convergence_script.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_llm_wiki_convergence_workflow.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_lockfile.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_maintenance_queue.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_managed_reference_topics.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_manifest_storage.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_markdown_sections.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_mcp.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_mcp_probe.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_mcp_sdk.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_metrics.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_migrate.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_module_maps.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_multilanguage_wiki.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_native_inspection.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_native_knowledge_semantics_docs.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_native_query_boundaries.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_native_reduction_contracts.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_native_skill_preflight_and_reanchor.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_native_workflow_baseline.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_native_workflow_codex_host.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_native_workflow_executable.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_native_workflow_oracles.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_native_workflow_scenarios.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_native_workflow_trace.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_navigation_layouts.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_obsidian.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_optimization_evidence.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_optimization_measurements.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_package_validation.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_packages.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_packet_field_policy.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_paths.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_plugin_sample.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_plugins.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_progress.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_protected_artifacts.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_protocol_registry.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_provider_conformance.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_provisioning_failures.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_public_docs_performance.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_public_docs_vocabulary.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_publishing_hub_attack_contracts.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_pytest_portability.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_python_call_bindings.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_python_import_scopes.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_python_observation_cache.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_python_source_inventory.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_python_typed_dicts.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_qualified_context_acceptance.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_quality_workflows.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_readonly_subprocess_stdin.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_redaction.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_reference_skill_verifier.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_relationships.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_release.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_release_build_backend.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_release_dogfood.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_release_qualification.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_release_supply_chain.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_release_workflows.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_rendering_lifecycle.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_resource_diagnostics.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_route_projection_regressions.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_runtime_output.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_rust_extract.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_schema.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_schema_context_baselines.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_search_rank.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_section_ownership.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_secure_file.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_site_export.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_site_knowledge_metadata.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_site_root_identity.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_skill_contracts.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_skill_contracts_all.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_skill_ownership_boundaries.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_skill_policy_routes.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_skills.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_source_selection.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_source_snapshot.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_static_quality_architecture.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_status.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_storage_followup_controls.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_storage_locality.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_storage_performance.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_surface_initialization.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_sync.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_sync_api_contracts.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_sync_manifest.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_sync_no_plugins.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_sync_runtime_regressions.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_task_context.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_task_context_v2.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_team.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_team_policy_regressions.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_trigger.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_ts_extract.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_typed_graph_queries.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_ubuntu_shadow.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_ubuntu_suites.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_uninstall.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_upgrade.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_validated_knowledge_reuse.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_verification_contracts.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_verified_bug_migrations.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_versioning.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_wiki_git_policy.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_wiki_helper_cache.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_wiki_integrity_action.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_wiki_lifecycle.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_wiki_reference_skill.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_wiki_surface.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_wiki_surface_index.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_wiki_sync_cleanup.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_workflow_contracts.py +0 -0
- {agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/tests/test_workflow_interfaces.py +0 -0
|
@@ -349,10 +349,12 @@ tests/test_core_check_performance.py
|
|
|
349
349
|
tests/test_core_shard_runner.py
|
|
350
350
|
tests/test_core_shard_workflow.py
|
|
351
351
|
tests/test_core_shards.py
|
|
352
|
+
tests/test_credential_named_knowledge.py
|
|
352
353
|
tests/test_data_flow.py
|
|
353
354
|
tests/test_dep_vuln_triage_skill.py
|
|
354
355
|
tests/test_dependencies.py
|
|
355
356
|
tests/test_dependencies_external.py
|
|
357
|
+
tests/test_dependency_audit.py
|
|
356
358
|
tests/test_dependency_downloads.py
|
|
357
359
|
tests/test_dependency_setup_probe.py
|
|
358
360
|
tests/test_dependency_setup_workflow.py
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""Pure stable-identity primitives for
|
|
1
|
+
"""Pure stable-identity primitives for knowledge concepts.
|
|
2
2
|
|
|
3
3
|
The records in this module deliberately contain no filesystem behavior. They
|
|
4
4
|
validate the small identity vocabulary used by a governance ledger, derive an
|
|
@@ -20,6 +20,7 @@ from enum import Enum
|
|
|
20
20
|
from typing import TypeVar, cast
|
|
21
21
|
from urllib.parse import quote, unquote, urlsplit
|
|
22
22
|
|
|
23
|
+
from .validation import require_repository_relative_path
|
|
23
24
|
from .wiki_surface import (
|
|
24
25
|
WikiSurfaceError,
|
|
25
26
|
canonical_path,
|
|
@@ -315,6 +316,35 @@ def validate_concept_kind(value: object) -> str:
|
|
|
315
316
|
return text
|
|
316
317
|
|
|
317
318
|
|
|
319
|
+
def natural_key_for(concept_kind: str, canonical_path: str) -> str:
|
|
320
|
+
"""Build a natural key from safe coordinates, independent of governance.
|
|
321
|
+
|
|
322
|
+
Credential-related words are ordinary identifier text. Coordinate grammar
|
|
323
|
+
rejects unsafe paths and credential-bearing authorities; it does not apply
|
|
324
|
+
the separate policy for credential-like governance metadata fields.
|
|
325
|
+
"""
|
|
326
|
+
|
|
327
|
+
kind = validate_concept_kind(concept_kind)
|
|
328
|
+
path = require_repository_relative_path(
|
|
329
|
+
canonical_path,
|
|
330
|
+
text_error=ConceptIdentityError(
|
|
331
|
+
"canonical_path", "must be a repository-relative POSIX path"
|
|
332
|
+
),
|
|
333
|
+
posix_error=ConceptIdentityError(
|
|
334
|
+
"canonical_path", "must be a repository-relative POSIX path"
|
|
335
|
+
),
|
|
336
|
+
normalized_error=ConceptIdentityError(
|
|
337
|
+
"canonical_path", "must be a normalized relative path"
|
|
338
|
+
),
|
|
339
|
+
control_error=ConceptIdentityError(
|
|
340
|
+
"canonical_path", "must not contain control characters"
|
|
341
|
+
),
|
|
342
|
+
reject_delete_character=True,
|
|
343
|
+
control_after_normalization=True,
|
|
344
|
+
)
|
|
345
|
+
return validate_natural_key(f"{kind}:{path}")
|
|
346
|
+
|
|
347
|
+
|
|
318
348
|
def validate_natural_key(value: object) -> str:
|
|
319
349
|
"""Validate one normalized, non-prose concept natural key.
|
|
320
350
|
|
{agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/knowledge_governance.py
RENAMED
|
@@ -41,10 +41,12 @@ from .concept_identity import (
|
|
|
41
41
|
ConceptIdentityError,
|
|
42
42
|
derive_concept_uid as _derive_identity_uid,
|
|
43
43
|
identity_coordinate_key,
|
|
44
|
+
natural_key_for as _identity_natural_key_for,
|
|
44
45
|
validate_alias_value,
|
|
45
46
|
validate_bundle_id,
|
|
46
47
|
validate_concept_kind,
|
|
47
48
|
validate_concept_uid,
|
|
49
|
+
validate_locator,
|
|
48
50
|
validate_natural_key,
|
|
49
51
|
)
|
|
50
52
|
from .knowledge_evidence import (
|
|
@@ -68,7 +70,6 @@ from .validation import (
|
|
|
68
70
|
require_mapping,
|
|
69
71
|
require_no_control_characters,
|
|
70
72
|
require_nonnegative_int,
|
|
71
|
-
require_repository_relative_path,
|
|
72
73
|
require_sha256,
|
|
73
74
|
)
|
|
74
75
|
from .wiki_media import contains_uri_authority_userinfo
|
|
@@ -389,11 +390,12 @@ def natural_key_for(
|
|
|
389
390
|
concept_kind: str,
|
|
390
391
|
canonical_path: str,
|
|
391
392
|
) -> str:
|
|
392
|
-
"""Build
|
|
393
|
+
"""Build a shared natural key with governance-compatible diagnostics."""
|
|
393
394
|
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
395
|
+
try:
|
|
396
|
+
return _identity_natural_key_for(concept_kind, canonical_path)
|
|
397
|
+
except ConceptIdentityError as exc:
|
|
398
|
+
raise GovernanceError(exc.field, exc.message) from exc
|
|
397
399
|
|
|
398
400
|
|
|
399
401
|
def derive_concept_uid(
|
|
@@ -3307,28 +3309,6 @@ def _identity_ownership_key(alias_type: str, value: str) -> str:
|
|
|
3307
3309
|
raise GovernanceError("identity", exc.message) from exc
|
|
3308
3310
|
|
|
3309
3311
|
|
|
3310
|
-
def _relative_path(value: object, path: str) -> str:
|
|
3311
|
-
result = require_repository_relative_path(
|
|
3312
|
-
value,
|
|
3313
|
-
text_error=GovernanceError(
|
|
3314
|
-
path, "must be a repository-relative POSIX path"
|
|
3315
|
-
),
|
|
3316
|
-
posix_error=GovernanceError(
|
|
3317
|
-
path, "must be a repository-relative POSIX path"
|
|
3318
|
-
),
|
|
3319
|
-
normalized_error=GovernanceError(
|
|
3320
|
-
path, "must be a normalized relative path"
|
|
3321
|
-
),
|
|
3322
|
-
control_error=GovernanceError(
|
|
3323
|
-
path, "must not contain control characters"
|
|
3324
|
-
),
|
|
3325
|
-
reject_delete_character=True,
|
|
3326
|
-
control_after_normalization=True,
|
|
3327
|
-
)
|
|
3328
|
-
_safe_text(result, path)
|
|
3329
|
-
return result
|
|
3330
|
-
|
|
3331
|
-
|
|
3332
3312
|
def _section_locator(value: object, path: str) -> str:
|
|
3333
3313
|
if (
|
|
3334
3314
|
not isinstance(value, str)
|
|
@@ -3341,7 +3321,22 @@ def _section_locator(value: object, path: str) -> str:
|
|
|
3341
3321
|
path,
|
|
3342
3322
|
"must be an exact llm-wiki section locator",
|
|
3343
3323
|
)
|
|
3344
|
-
|
|
3324
|
+
page_locator, _, section_path = value.partition("#section/")
|
|
3325
|
+
if not section_path:
|
|
3326
|
+
raise GovernanceError(path, "must contain a section coordinate")
|
|
3327
|
+
try:
|
|
3328
|
+
validate_locator(page_locator)
|
|
3329
|
+
except ConceptIdentityError as exc:
|
|
3330
|
+
raise GovernanceError(path, exc.message) from exc
|
|
3331
|
+
# Page identifiers and heading text may legitimately discuss credentials.
|
|
3332
|
+
# Validate coordinates independently of actor/method metadata safeguards.
|
|
3333
|
+
require_no_control_characters(
|
|
3334
|
+
value,
|
|
3335
|
+
error=GovernanceError(path, "must not contain control characters"),
|
|
3336
|
+
reject_delete_character=True,
|
|
3337
|
+
)
|
|
3338
|
+
if contains_uri_authority_userinfo(value):
|
|
3339
|
+
raise GovernanceError(path, "must not contain URI credentials")
|
|
3345
3340
|
return value
|
|
3346
3341
|
|
|
3347
3342
|
|
{agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/knowledge_storage.py
RENAMED
|
@@ -160,9 +160,25 @@ def _node_aliases(node: Any) -> set[str]:
|
|
|
160
160
|
|
|
161
161
|
|
|
162
162
|
def _concept_aliases(concept: Mapping[str, Any]) -> set[str]:
|
|
163
|
-
from .
|
|
163
|
+
from .concept_identity import ConceptIdentityError, natural_key_for, validate_locator
|
|
164
|
+
|
|
165
|
+
path = concept["document"]["canonical_path"]
|
|
166
|
+
try:
|
|
167
|
+
natural_key = natural_key_for(concept["concept_kind"], path)
|
|
168
|
+
except ConceptIdentityError as exc:
|
|
169
|
+
# Include only a validated page coordinate; unsafe values (including
|
|
170
|
+
# URI credentials) must never be reflected in storage diagnostics.
|
|
171
|
+
try:
|
|
172
|
+
coordinate = repr(validate_locator(path))
|
|
173
|
+
except ConceptIdentityError:
|
|
174
|
+
coordinate = "a concept (invalid canonical path omitted)"
|
|
175
|
+
raise KnowledgeStorageError(
|
|
176
|
+
f"concepts.aliases.{exc.field}",
|
|
177
|
+
f"cannot build lookup identity for {coordinate}: {exc.message}",
|
|
178
|
+
code="storage-identity-invalid",
|
|
179
|
+
) from exc
|
|
164
180
|
aliases = {"concept:" + concept["locator"], "page:" + concept["document"]["canonical_path"],
|
|
165
|
-
"concept:" +
|
|
181
|
+
"concept:" + natural_key,
|
|
166
182
|
_owner(concept), *("term:" + term for term in re.findall(r"\w+", concept["title"].casefold())[:64])}
|
|
167
183
|
from .contracts import GOVERNANCE_EXTENSION_KEY
|
|
168
184
|
governance = concept.get("extensions", {}).get(GOVERNANCE_EXTENSION_KEY)
|
{agent_wiki_cli-2.3.0 → agent_wiki_cli-2.3.1}/src/llm_wiki_cli/services/knowledge_storage_access.py
RENAMED
|
@@ -8,9 +8,10 @@ import json
|
|
|
8
8
|
from pathlib import Path
|
|
9
9
|
from typing import Any
|
|
10
10
|
|
|
11
|
+
from .concept_identity import natural_key_for
|
|
11
12
|
from .knowledge_envelope import EvaluatedEnvelope
|
|
12
13
|
from .knowledge_governance import (
|
|
13
|
-
GOVERNANCE_FILENAME, parse_governance_ledger, lifecycle_state_by_uid,
|
|
14
|
+
GOVERNANCE_FILENAME, parse_governance_ledger, lifecycle_state_by_uid,
|
|
14
15
|
)
|
|
15
16
|
from .contracts import GOVERNANCE_EXTENSION_KEY
|
|
16
17
|
from .knowledge_model import _parse_bundle
|
|
@@ -41,6 +41,7 @@ _VALIDATION_DUPLICATE_EXEMPT_NAMES = frozenset(
|
|
|
41
41
|
)
|
|
42
42
|
REQUIRED_SHARED_VALIDATION_ADAPTERS_BY_FAMILY = {
|
|
43
43
|
"bootstrap_runtime": frozenset({"_path_text", "_safe_page_component"}),
|
|
44
|
+
"concept_identity": frozenset({"natural_key_for"}),
|
|
44
45
|
"context_service": frozenset({"_nonnegative_count"}),
|
|
45
46
|
"data_flow": frozenset({"_positive_source_line"}),
|
|
46
47
|
"dependencies": frozenset(
|
|
@@ -197,7 +198,6 @@ REQUIRED_SHARED_VALIDATION_ADAPTERS_BY_FAMILY = {
|
|
|
197
198
|
"_hash",
|
|
198
199
|
"_nonnegative_int",
|
|
199
200
|
"_object",
|
|
200
|
-
"_relative_path",
|
|
201
201
|
}
|
|
202
202
|
),
|
|
203
203
|
"knowledge_graph": frozenset(
|
|
@@ -22,6 +22,7 @@ from llm_wiki_cli.services.concept_identity import (
|
|
|
22
22
|
find_identity_collisions,
|
|
23
23
|
identity_coordinate_key,
|
|
24
24
|
move_allocation,
|
|
25
|
+
natural_key_for,
|
|
25
26
|
validate_alias_value,
|
|
26
27
|
validate_bundle_id,
|
|
27
28
|
validate_concept_kind,
|
|
@@ -195,6 +196,50 @@ def test_natural_key_accepts_occurrence_fragments_and_canonical_utf8_escapes():
|
|
|
195
196
|
)
|
|
196
197
|
|
|
197
198
|
|
|
199
|
+
@pytest.mark.parametrize("name", [
|
|
200
|
+
"RuntimeSecretField", "SecretMaterialError", "ResetPasswordForm",
|
|
201
|
+
"PasswdEntry", "ApiKeySettings", "AccessTokenProvider", "PrivateKeyStore",
|
|
202
|
+
])
|
|
203
|
+
def test_natural_key_construction_accepts_credential_related_identifiers(name):
|
|
204
|
+
from llm_wiki_cli.services import knowledge_governance
|
|
205
|
+
|
|
206
|
+
path = f"entities/{name}.md"
|
|
207
|
+
expected = f"code-entity:{path}"
|
|
208
|
+
assert natural_key_for("code-entity", path) == expected
|
|
209
|
+
assert knowledge_governance.natural_key_for("code-entity", path) == expected
|
|
210
|
+
assert validate_locator(f"llm-wiki://entities/{name}") == f"llm-wiki://entities/{name}"
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def test_natural_key_construction_preserves_existing_identity_bytes():
|
|
214
|
+
key = natural_key_for("source-module", "modules/core.md")
|
|
215
|
+
assert key == "source-module:modules/core.md"
|
|
216
|
+
assert derive_concept_uid("bundle:project-1", "source-module", key) == (
|
|
217
|
+
"lw:module:27b9ae241cad1427564442436cbc22a2"
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
@pytest.mark.parametrize("path", [
|
|
222
|
+
"", None, "/tmp/entities/core.md", "C:/wiki/entities/core.md", "C:core.md",
|
|
223
|
+
r"entities\core.md", "entities/../core.md", "entities/./core.md",
|
|
224
|
+
"entities//core.md", "entities/core.md/", "entities/CON.md",
|
|
225
|
+
"entities/core.md ", "entities/core\x00.md", "entities/core\x7f.md",
|
|
226
|
+
"entities/core\u200b.md", "entities/%2E%2E/core.md", "entities/%GG.md",
|
|
227
|
+
"https://user:CREDENTIAL_SENTINEL@example.test/core.md",
|
|
228
|
+
"user:CREDENTIAL_SENTINEL@example.test/core.md",
|
|
229
|
+
"git@example.test/core.md",
|
|
230
|
+
])
|
|
231
|
+
def test_natural_key_construction_keeps_path_and_credential_safeguards(path):
|
|
232
|
+
from llm_wiki_cli.services import knowledge_governance
|
|
233
|
+
|
|
234
|
+
with pytest.raises(ConceptIdentityError) as identity_error:
|
|
235
|
+
natural_key_for("code-entity", path)
|
|
236
|
+
with pytest.raises(knowledge_governance.GovernanceError) as governance_error:
|
|
237
|
+
knowledge_governance.natural_key_for("code-entity", path)
|
|
238
|
+
assert identity_error.value.field in {"canonical_path", "natural_key"}
|
|
239
|
+
assert str(identity_error.value) == str(governance_error.value)
|
|
240
|
+
assert "CREDENTIAL_SENTINEL" not in str(identity_error.value)
|
|
241
|
+
|
|
242
|
+
|
|
198
243
|
@pytest.mark.parametrize(
|
|
199
244
|
"value",
|
|
200
245
|
[
|
|
@@ -249,6 +249,7 @@ def test_extracted_input_changes_are_rejected(frozen, tmp_path):
|
|
|
249
249
|
("python_peak_bytes", 100),
|
|
250
250
|
("input_tree_sha256", {}),
|
|
251
251
|
("policy_sha256", "b" * 64),
|
|
252
|
+
("adapter_inventory_sha256", "b" * 64),
|
|
252
253
|
],
|
|
253
254
|
)
|
|
254
255
|
def test_observation_results_are_bound_and_finite(field, value):
|
|
@@ -261,6 +262,7 @@ def test_observation_results_are_bound_and_finite(field, value):
|
|
|
261
262
|
"python_peak_bytes": None,
|
|
262
263
|
"input_tree_sha256": "c" * 64,
|
|
263
264
|
"policy_sha256": "a" * 64,
|
|
265
|
+
"adapter_inventory_sha256": None,
|
|
264
266
|
}
|
|
265
267
|
changed = deepcopy(row)
|
|
266
268
|
changed[field] = value
|
|
@@ -399,3 +401,153 @@ def test_failed_windows_tree_cleanup_is_reported_and_root_is_reaped(
|
|
|
399
401
|
["owned"], cwd=tmp_path, env={}, log=io.BytesIO(), platform_name="nt"
|
|
400
402
|
)
|
|
401
403
|
assert process.killed and process.waits == 2
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
def _inventory_work(tmp_path):
|
|
407
|
+
work = tmp_path / "work"
|
|
408
|
+
for role, inventory in (
|
|
409
|
+
("baseline", "{'knowledge_governance': frozenset({'_relative_path'})}"),
|
|
410
|
+
("candidate", "{'concept_identity': frozenset({'natural_key_for'})}"),
|
|
411
|
+
):
|
|
412
|
+
policy = work / role / "tests/test_architecture_layers.py"
|
|
413
|
+
policy.parent.mkdir(parents=True)
|
|
414
|
+
policy.write_text(
|
|
415
|
+
"import ast\nfrom pathlib import Path\n"
|
|
416
|
+
f"{performance.ADAPTER_INVENTORY} = {inventory}\n"
|
|
417
|
+
"def test_shared_validation_adapters_remain_thin():\n"
|
|
418
|
+
" root = Path(__file__).parents[1] / 'src/llm_wiki_cli/services'\n"
|
|
419
|
+
f" for family, names in {performance.ADAPTER_INVENTORY}.items():\n"
|
|
420
|
+
" tree = ast.parse((root / (family + '.py')).read_text())\n"
|
|
421
|
+
" defined = {n.name for n in ast.walk(tree) if isinstance(n, ast.FunctionDef)}\n"
|
|
422
|
+
" assert names <= defined\n",
|
|
423
|
+
encoding="utf-8",
|
|
424
|
+
)
|
|
425
|
+
services = work / "candidate/src/llm_wiki_cli/services"
|
|
426
|
+
services.mkdir(parents=True)
|
|
427
|
+
(services / "concept_identity.py").write_text("def natural_key_for(value):\n return value\n")
|
|
428
|
+
return work
|
|
429
|
+
|
|
430
|
+
|
|
431
|
+
@pytest.fixture
|
|
432
|
+
def policy_imports():
|
|
433
|
+
previous_path = sys.path[:]
|
|
434
|
+
previous_modules = {name: module for name, module in sys.modules.items()
|
|
435
|
+
if name == "tests" or name.startswith("tests.")}
|
|
436
|
+
try:
|
|
437
|
+
yield
|
|
438
|
+
finally:
|
|
439
|
+
sys.path[:] = previous_path
|
|
440
|
+
for name in list(sys.modules):
|
|
441
|
+
if name == "tests" or name.startswith("tests."):
|
|
442
|
+
del sys.modules[name]
|
|
443
|
+
sys.modules.update(previous_modules)
|
|
444
|
+
|
|
445
|
+
|
|
446
|
+
def test_moved_adapter_inventory_is_identical_input_for_both_policy_workers(tmp_path):
|
|
447
|
+
work = _inventory_work(tmp_path)
|
|
448
|
+
inventory = performance.comparison_inventory(work)
|
|
449
|
+
assert inventory["removed"] == [["knowledge_governance", "_relative_path"]]
|
|
450
|
+
assert inventory["added"] == [["concept_identity", "natural_key_for"]]
|
|
451
|
+
assert inventory["baseline_sha256"] != inventory["candidate_sha256"]
|
|
452
|
+
before = performance.tree_identity(work)
|
|
453
|
+
for role in ("baseline", "candidate"):
|
|
454
|
+
output = tmp_path / f"{role}.json"
|
|
455
|
+
result = subprocess.run(
|
|
456
|
+
[sys.executable, "-I", "-B", performance.__file__, "worker", "--work", str(work),
|
|
457
|
+
"--inputs", str(tmp_path), "--role", role, "--target", "adapters", "--output", str(output)],
|
|
458
|
+
stdin=subprocess.DEVNULL, capture_output=True, text=True, timeout=30,
|
|
459
|
+
)
|
|
460
|
+
assert result.returncode == 0, result.stderr
|
|
461
|
+
row = json.loads(output.read_text())
|
|
462
|
+
performance.validate_observation(
|
|
463
|
+
row, target="adapters", role=role, coverage=False, memory=False,
|
|
464
|
+
policy_sha256=performance.digest(work / role / "tests/test_architecture_layers.py"),
|
|
465
|
+
adapter_inventory_sha256=inventory["candidate_sha256"],
|
|
466
|
+
)
|
|
467
|
+
with pytest.raises(ValueError, match="identity"):
|
|
468
|
+
performance.validate_observation(
|
|
469
|
+
row, target="adapters", role=role, coverage=False, memory=False,
|
|
470
|
+
policy_sha256=row["policy_sha256"], adapter_inventory_sha256=inventory["baseline_sha256"],
|
|
471
|
+
)
|
|
472
|
+
assert performance.tree_identity(work) == before
|
|
473
|
+
|
|
474
|
+
|
|
475
|
+
@pytest.mark.parametrize("role", ["baseline", "candidate"])
|
|
476
|
+
def test_worker_retains_failed_assertion_traceback_with_current_inventory(tmp_path, role):
|
|
477
|
+
work = _inventory_work(tmp_path)
|
|
478
|
+
(work / "candidate/src/llm_wiki_cli/services/concept_identity.py").write_text("")
|
|
479
|
+
output = tmp_path / "observation.json"
|
|
480
|
+
result = subprocess.run(
|
|
481
|
+
[sys.executable, "-I", "-B", performance.__file__, "worker", "--work", str(work),
|
|
482
|
+
"--inputs", str(tmp_path), "--role", role, "--target", "adapters", "--output", str(output)],
|
|
483
|
+
stdin=subprocess.DEVNULL, capture_output=True, text=True, timeout=30,
|
|
484
|
+
)
|
|
485
|
+
assert result.returncode == 1
|
|
486
|
+
assert "test_shared_validation_adapters_remain_thin" in result.stderr
|
|
487
|
+
assert "AssertionError" in result.stderr
|
|
488
|
+
assert not output.exists()
|
|
489
|
+
|
|
490
|
+
|
|
491
|
+
@pytest.mark.parametrize("relative", ["knowledge_governance.py", "knowledge_governance/nested.py"])
|
|
492
|
+
def test_comparison_cannot_drop_requirements_for_remaining_definitions(tmp_path, relative):
|
|
493
|
+
work = _inventory_work(tmp_path)
|
|
494
|
+
path = work / "candidate/src/llm_wiki_cli/services" / relative
|
|
495
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
496
|
+
path.write_text("class Adapter:\n def _relative_path(self, value):\n return value\n")
|
|
497
|
+
with pytest.raises(ValueError, match="required adapter that still exists"):
|
|
498
|
+
performance.comparison_inventory(work)
|
|
499
|
+
|
|
500
|
+
|
|
501
|
+
@pytest.mark.parametrize("declaration", [
|
|
502
|
+
"get_inventory()", "{'../escape': frozenset({'validate'})}",
|
|
503
|
+
"{'owner': frozenset({123})}", "{'owner': frozenset(build_names())}",
|
|
504
|
+
"{'owner': frozenset({'one'}), 'owner': frozenset({'two'})}",
|
|
505
|
+
])
|
|
506
|
+
def test_adapter_inventory_rejects_nonliteral_or_ambiguous_data(tmp_path, declaration):
|
|
507
|
+
policy = tmp_path / "tests/test_architecture_layers.py"
|
|
508
|
+
policy.parent.mkdir()
|
|
509
|
+
policy.write_text(f"{performance.ADAPTER_INVENTORY} = {declaration}\n")
|
|
510
|
+
with pytest.raises(ValueError):
|
|
511
|
+
performance.adapter_inventory(tmp_path)
|
|
512
|
+
|
|
513
|
+
|
|
514
|
+
def test_adapter_inventory_accepts_an_empty_literal_frozenset(tmp_path):
|
|
515
|
+
policy = tmp_path / "tests/test_architecture_layers.py"
|
|
516
|
+
policy.parent.mkdir()
|
|
517
|
+
policy.write_text(f"{performance.ADAPTER_INVENTORY} = {{'owner': frozenset()}}\n")
|
|
518
|
+
assert performance.adapter_inventory(tmp_path) == {"owner": []}
|
|
519
|
+
|
|
520
|
+
|
|
521
|
+
def test_mixed_missing_inventory_is_not_silently_accepted(tmp_path):
|
|
522
|
+
work = _inventory_work(tmp_path)
|
|
523
|
+
(work / "baseline/tests/test_architecture_layers.py").write_text("pass\n")
|
|
524
|
+
with pytest.raises(ValueError, match="both policies"):
|
|
525
|
+
performance.comparison_inventory(work)
|
|
526
|
+
|
|
527
|
+
|
|
528
|
+
def test_runtime_inventory_must_match_its_frozen_declaration(tmp_path, policy_imports):
|
|
529
|
+
work = _inventory_work(tmp_path)
|
|
530
|
+
policy = work / "baseline/tests/test_architecture_layers.py"
|
|
531
|
+
policy.write_text(policy.read_text() + f"\n{performance.ADAPTER_INVENTORY}.clear()\n")
|
|
532
|
+
inventory = performance.adapter_inventory(work / "baseline")
|
|
533
|
+
module = performance.load_policy(work / "baseline", work / "candidate", policy.name, "baseline")
|
|
534
|
+
with pytest.raises(ValueError, match="changed its declared adapter inventory"):
|
|
535
|
+
performance.bind_inventory(module, inventory, performance.adapter_inventory(work / "candidate"))
|
|
536
|
+
|
|
537
|
+
|
|
538
|
+
def test_complete_adapter_controls_detect_a_weakened_candidate_assertion(tmp_path, policy_imports):
|
|
539
|
+
work = tmp_path / "work"
|
|
540
|
+
tests = Path(__file__).parent
|
|
541
|
+
for role in ("baseline", "candidate"):
|
|
542
|
+
target = work / role / "tests"
|
|
543
|
+
target.mkdir(parents=True)
|
|
544
|
+
(target / "__init__.py").write_text("")
|
|
545
|
+
for name in ("test_architecture_layers.py", "python_source_inventory.py"):
|
|
546
|
+
shutil.copyfile(tests / name, target / name)
|
|
547
|
+
args = argparse.Namespace(work=work)
|
|
548
|
+
results = performance.adapter_control_parity(args)
|
|
549
|
+
assert [r["expected_pass"] for r in results] == [True, False, False, False, False]
|
|
550
|
+
policy = work / "candidate/tests/test_architecture_layers.py"
|
|
551
|
+
policy.write_text(policy.read_text() + "\ndef test_shared_validation_adapters_remain_thin():\n pass\n")
|
|
552
|
+
with pytest.raises(ValueError, match="adapter control outcome differs: missing/candidate"):
|
|
553
|
+
performance.adapter_control_parity(args)
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"""Credential-related identifiers survive storage and governance operations."""
|
|
2
|
+
|
|
3
|
+
import hashlib
|
|
4
|
+
import sys
|
|
5
|
+
|
|
6
|
+
import pytest
|
|
7
|
+
|
|
8
|
+
from llm_wiki_cli import api
|
|
9
|
+
from llm_wiki_cli.cli import main
|
|
10
|
+
from llm_wiki_cli.services.io import read_md, write_md
|
|
11
|
+
from llm_wiki_cli.services.knowledge_governance import (
|
|
12
|
+
GOVERNANCE_FILENAME, load_governance,
|
|
13
|
+
)
|
|
14
|
+
from llm_wiki_cli.services.knowledge_loader import load_knowledge_state
|
|
15
|
+
from llm_wiki_cli.services.knowledge_storage import KnowledgeStorageError
|
|
16
|
+
from llm_wiki_cli.services.knowledge_storage_access import capture_knowledge_slice
|
|
17
|
+
from llm_wiki_cli.services.knowledge_storage_diagnostics import storage_report
|
|
18
|
+
from llm_wiki_cli.services.knowledge_storage_lifecycle import (
|
|
19
|
+
export_knowledge_v1, migrate_knowledge_storage, recover_knowledge_storage,
|
|
20
|
+
)
|
|
21
|
+
from llm_wiki_cli.services.section_ownership import observe_page_sections
|
|
22
|
+
from llm_wiki_cli.services.wiki_surface import PageKind
|
|
23
|
+
from tests.test_knowledge_storage_lifecycle import snapshot
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
NAMES = (
|
|
27
|
+
"RuntimeSecretField", "SecretMaterialError", "ResetPasswordForm",
|
|
28
|
+
"PasswdEntry", "ApiKeySettings", "AccessTokenProvider", "PrivateKeyStore",
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@pytest.fixture(params=[False, True], ids=["ungoverned", "governed"])
|
|
33
|
+
def credential_named_wiki(tmp_path, monkeypatch, capsys, request):
|
|
34
|
+
monkeypatch.chdir(tmp_path)
|
|
35
|
+
# Do not discover the caller's Git repository under a custom pytest base.
|
|
36
|
+
(tmp_path / ".git").write_text("gitdir: absent\n", encoding="utf-8")
|
|
37
|
+
source = tmp_path / "source"
|
|
38
|
+
source.mkdir()
|
|
39
|
+
(source / "models.py").write_text(
|
|
40
|
+
"\n\n".join(f'class {name}:\n """A documented field type."""\n pass' for name in NAMES),
|
|
41
|
+
encoding="utf-8",
|
|
42
|
+
)
|
|
43
|
+
root = tmp_path / "wiki"
|
|
44
|
+
api.bootstrap_wiki(str(source), str(root), skip_workflows=True,
|
|
45
|
+
skip_flows=True, skip_dependencies=True)
|
|
46
|
+
|
|
47
|
+
def command(*args):
|
|
48
|
+
monkeypatch.setattr(sys, "argv", ["llm-wiki", *args])
|
|
49
|
+
main()
|
|
50
|
+
return capsys.readouterr()
|
|
51
|
+
|
|
52
|
+
page = root / "entities" / "RuntimeSecretField.md"
|
|
53
|
+
content = read_md(page)
|
|
54
|
+
assert "## Description" in content
|
|
55
|
+
authored = content.replace("## Description", "## Description\n\nPreserve this authored explanation.", 1)
|
|
56
|
+
# Exercise Windows-style input on every host. The owning writer emits the
|
|
57
|
+
# canonical UTF-8/LF bytes required by storage and task receipt commitments.
|
|
58
|
+
write_md(page, authored.replace("\n", "\r\n"))
|
|
59
|
+
assert page.read_bytes() == authored.encode("utf-8")
|
|
60
|
+
command("sync", "--src-dir", "source", "--wiki-dir", "wiki", "--jobs", "1",
|
|
61
|
+
"--no-plugins", "--progress", "never")
|
|
62
|
+
selectors = [f"code-entity:entities/{name}.md" for name in NAMES]
|
|
63
|
+
if request.param:
|
|
64
|
+
command("knowledge", "init", "--wiki-dir", "wiki")
|
|
65
|
+
ledger = load_governance(root).ledger
|
|
66
|
+
assert ledger is not None
|
|
67
|
+
allocation = next(a for a in ledger.concepts.values()
|
|
68
|
+
if a.locator == "llm-wiki://entities/RuntimeSecretField")
|
|
69
|
+
historical = "llm-wiki://entities/PreviousSecretField"
|
|
70
|
+
command("knowledge", "alias", "--wiki-dir", "wiki", "--uid", allocation.uid,
|
|
71
|
+
"--type", "locator", "--value", historical)
|
|
72
|
+
observed = observe_page_sections(page.read_text(encoding="utf-8"), allocation.locator, PageKind.ENTITIES)
|
|
73
|
+
section = next(s for s in observed.sections if s.title == "Description" and s.semantic_hash is not None)
|
|
74
|
+
command("knowledge", "review", "--wiki-dir", "wiki", "--uid", allocation.uid,
|
|
75
|
+
"--section", section.locator, "--reviewer-kind", "human", "--reviewer-id", "reviewer-1",
|
|
76
|
+
"--method", "manual-review", "--method-version", "1", "--authored-at", "2026-09-28T12:00:00Z")
|
|
77
|
+
selectors.extend([allocation.uid, historical])
|
|
78
|
+
else:
|
|
79
|
+
assert not (root / GOVERNANCE_FILENAME).exists()
|
|
80
|
+
knowledge = load_knowledge_state(root).knowledge
|
|
81
|
+
assert knowledge is not None
|
|
82
|
+
for concept in knowledge.concepts:
|
|
83
|
+
raw = (root / concept.document.canonical_path).read_bytes()
|
|
84
|
+
assert concept.facets.semantics.page_hash == "sha256:" + hashlib.sha256(raw).hexdigest()
|
|
85
|
+
return root, selectors, command
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
@pytest.mark.parametrize("format_name", [
|
|
89
|
+
"sharded-v2", "packed-v3", "packed-v3-deflate", "packed-v4", "packed-v4-deflate",
|
|
90
|
+
])
|
|
91
|
+
def test_migration_preserves_named_concepts_authority_aliases_and_recovery(
|
|
92
|
+
credential_named_wiki, tmp_path, format_name,
|
|
93
|
+
):
|
|
94
|
+
root, selectors, _command = credential_named_wiki
|
|
95
|
+
before = snapshot(root)
|
|
96
|
+
logical = load_knowledge_state(root).knowledge
|
|
97
|
+
recovery = tmp_path / "recovery"
|
|
98
|
+
preview = migrate_knowledge_storage(root, to=format_name, dry_run=True, recovery_dir=recovery)
|
|
99
|
+
assert preview["changed"]
|
|
100
|
+
assert snapshot(root) == before
|
|
101
|
+
assert not recovery.exists()
|
|
102
|
+
|
|
103
|
+
applied = migrate_knowledge_storage(root, to=format_name, recovery_dir=recovery)
|
|
104
|
+
assert applied["root_hash"] == preview["root_hash"]
|
|
105
|
+
assert load_knowledge_state(root).knowledge == logical
|
|
106
|
+
for name, raw in before.items():
|
|
107
|
+
if name.endswith(".md") or name == GOVERNANCE_FILENAME:
|
|
108
|
+
assert (root / name).read_bytes() == raw
|
|
109
|
+
after = snapshot(root)
|
|
110
|
+
assert not migrate_knowledge_storage(root, to=format_name)["changed"]
|
|
111
|
+
assert snapshot(root) == after
|
|
112
|
+
|
|
113
|
+
# Both manifest encodings must support lookup validation with these names.
|
|
114
|
+
for indexed_manifest in (False, True):
|
|
115
|
+
if indexed_manifest:
|
|
116
|
+
migrate_knowledge_storage(root, to="indexed-v6", recovery_dir=tmp_path / "manifest-recovery")
|
|
117
|
+
assert load_knowledge_state(root).knowledge == logical
|
|
118
|
+
assert storage_report(root, full=True)["integrity"] == "valid-committed-snapshot"
|
|
119
|
+
for selector in selectors:
|
|
120
|
+
capture = capture_knowledge_slice(root, ["concept:" + selector], collections=("concepts",))
|
|
121
|
+
selected = capture.slice.to_payload()
|
|
122
|
+
assert selected["lookup_complete"]
|
|
123
|
+
assert len(selected["records"]["concepts"]) == 1, selector
|
|
124
|
+
assert selected["records"]["concepts"][0]["value"]["title"] in NAMES
|
|
125
|
+
capture.finish()
|
|
126
|
+
task = {
|
|
127
|
+
"schema_version": "llm-wiki-task-request/v2",
|
|
128
|
+
"options": {"read_scope": "snapshot", "knowledge_mode": "required"},
|
|
129
|
+
"requirements": [{"id": "field", "facet": "concept", "selector": selectors[-1]}],
|
|
130
|
+
}
|
|
131
|
+
answer = api.build_task_context(task, wiki_dir=str(root))
|
|
132
|
+
assert api.validate_task_context(answer.rendered, task)["state"] == "covered"
|
|
133
|
+
|
|
134
|
+
export_knowledge_v1(root, tmp_path / "export.json")
|
|
135
|
+
assert (tmp_path / "export.json").read_bytes() == before[".llm-wiki-knowledge.json"]
|
|
136
|
+
recover_knowledge_storage(root, tmp_path / "manifest-recovery")
|
|
137
|
+
recover_knowledge_storage(root, recovery)
|
|
138
|
+
for name, raw in before.items():
|
|
139
|
+
assert (root / name).read_bytes() == raw
|
|
140
|
+
assert load_knowledge_state(root).knowledge == logical
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def test_sync_preserves_named_concepts_and_governance_after_migration(credential_named_wiki, tmp_path):
|
|
144
|
+
root, _selectors, command = credential_named_wiki
|
|
145
|
+
before = snapshot(root)
|
|
146
|
+
migrate_knowledge_storage(root, to="packed-v4-deflate", recovery_dir=tmp_path / "recovery")
|
|
147
|
+
command("sync", "--src-dir", "source", "--wiki-dir", "wiki", "--jobs", "1",
|
|
148
|
+
"--no-plugins", "--progress", "never")
|
|
149
|
+
assert "Preserve this authored explanation." in (root / "entities" / "RuntimeSecretField.md").read_text(encoding="utf-8")
|
|
150
|
+
if GOVERNANCE_FILENAME in before:
|
|
151
|
+
assert (root / GOVERNANCE_FILENAME).read_bytes() == before[GOVERNANCE_FILENAME]
|
|
152
|
+
report = storage_report(root, full=True)
|
|
153
|
+
assert report["ok"] and report["format"] == "packed-v4-deflate"
|
|
154
|
+
first_sync = snapshot(root)
|
|
155
|
+
command("sync", "--src-dir", "source", "--wiki-dir", "wiki", "--jobs", "1",
|
|
156
|
+
"--no-plugins", "--progress", "never")
|
|
157
|
+
assert snapshot(root) == first_sync
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def test_migration_rejects_newline_changes_after_commit(credential_named_wiki, tmp_path):
|
|
161
|
+
root, _selectors, _command = credential_named_wiki
|
|
162
|
+
page = root / "entities" / "RuntimeSecretField.md"
|
|
163
|
+
raw = page.read_bytes()
|
|
164
|
+
assert b"\r" not in raw and b"\n" in raw
|
|
165
|
+
page.write_bytes(raw.replace(b"\n", b"\r\n"))
|
|
166
|
+
before = snapshot(root)
|
|
167
|
+
recovery = tmp_path / "recovery"
|
|
168
|
+
with pytest.raises(KnowledgeStorageError, match="authored input changed") as raised:
|
|
169
|
+
migrate_knowledge_storage(root, to="packed-v4-deflate", dry_run=True, recovery_dir=recovery)
|
|
170
|
+
assert raised.value.code == "storage-mutation"
|
|
171
|
+
assert snapshot(root) == before
|
|
172
|
+
assert not recovery.exists()
|