campfire-cli 0.1.22__tar.gz → 0.1.23__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.
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/ARCHITECTURE.md +1 -1
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/COMMAND.md +1 -1
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/PKG-INFO +2 -2
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/README.md +1 -1
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/pyproject.toml +1 -1
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/__init__.py +1 -1
- campfire_cli-0.1.23/src/campfire_cli/app/base/SPEC.md +3 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/base/service/base_service.py +1 -1
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/document_scanner.py +18 -4
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/mutation/document_move_service.py +1 -5
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/maintenance/service/maintenance_service.py +1 -1
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/SPEC.md +2 -2
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/service/restructure_service.py +3 -3
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/service/structure_service.py +5 -10
- campfire_cli-0.1.23/src/campfire_cli/resources/bases/SPEC.md +3 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/defaults/config.yml +7 -31
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-workspace-maintenance/SKILL.md +1 -1
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-workspace-onboarding/references//346/240/207/345/207/206/345/267/245/344/275/234/345/214/272/347/273/223/346/236/204.md +2 -2
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/integration/test_cli.py +1 -1
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/integration/test_domain_rename_sync.py +2 -0
- campfire_cli-0.1.23/tests/unit/test_document_scanner.py +33 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_domain_paths.py +18 -1
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/uv.lock +1 -1
- campfire_cli-0.1.22/src/campfire_cli/app/base/SPEC.md +0 -3
- campfire_cli-0.1.22/src/campfire_cli/resources/bases/SPEC.md +0 -3
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/.github/workflows/ci.yml +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/.github/workflows/release.yml +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/.gitignore +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/.python-version +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/AGENTS.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/DECISIONS.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/LICENSE +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/SPEC.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/alembic/SPEC.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/alembic/env.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/alembic/script.py.mako +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/alembic/versions/001_initial_schema.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/alembic.ini +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/scripts/SPEC.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/scripts/pypi_verify.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/scripts/quality_check.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/scripts/release_check.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/alembic/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/alembic/env.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/alembic/script.py.mako +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/alembic/versions/001_initial_schema.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/alembic/versions/002_workspace_project_registry.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/alembic/versions/003_unified_workspace_state.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/alembic/versions/004_restructure_workspace_domain.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/alembic/versions/005_decision_channel.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/alembic/versions/006_workspace_topology_index.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/alembic/versions/007_workspace_adoption.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/alembic/versions/008_remove_adoption_batches.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/alembic/versions/009_document_query_index.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/alembic/versions/010_project_domain_identity.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/alembic/versions/011_document_state_model.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/alembic/versions/012_remove_decision_channel.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/alembic/versions/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/SPEC.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/base/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/base/cli/base_cli.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/base/repository/base_repository.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/base/schema/base_schema.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/base/schema/operation_schema.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/SPEC.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/cli/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/cli/document_cli.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/cli/profile_cli.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/cli/type_cli.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/repository/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/repository/document_index_repository.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/repository/document_profile_repository.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/repository/document_type_repository.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/schema/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/schema/document_schema.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/document_service.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/index/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/index/document_index_builder.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/index/document_index_protocol.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/index/document_index_service.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/mutation/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/mutation/document_apply_service.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/mutation/document_relocation.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/mutation/frontmatter_apply.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/rules/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/rules/document_patch_values.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/rules/document_profile_service.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/rules/document_rule_service.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/rules/document_type_service.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/rules/frontmatter_formatter.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/rules/frontmatter_plan.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/rules/kanban_service.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/rules/profile_candidates.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/rules/profile_registry.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/rules/type_plan.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/maintenance/SPEC.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/maintenance/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/maintenance/cli/maintenance_cli.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/maintenance/repository/maintenance_repository.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/maintenance/schema/maintenance_schema.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/maintenance/service/maintenance_protocol.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/maintenance/service/moc_service.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/skill/SPEC.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/skill/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/skill/cli/skill_cli.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/skill/repository/skill_repository.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/skill/schema/skill_schema.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/skill/service/skill_service.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/cli/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/cli/config_cli.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/cli/domain_cli.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/cli/project_cli.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/cli/restructure_cli.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/cli/space_cli.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/cli/workspace_cli.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/repository/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/repository/manifest_repository.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/repository/restructure_repository.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/repository/workspace_repository.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/schema/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/schema/adoption_schema.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/schema/restructure_schema.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/schema/workspace_schema.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/service/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/service/adoption_service.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/service/config_service.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/service/domain_restructure_service.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/service/project_service.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/service/restructure_protocol.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/service/restructure_verifier.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/service/workspace_protocol.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/service/workspace_service.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/SPEC.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/agent_hints.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/cli_output.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/database/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/database/migrations.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/database/models.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/database/session.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/documents/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/documents/document_types.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/documents/domain_context.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/documents/frontmatter_format.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/documents/frontmatter_schema.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/documents/markdown.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/documents/related_docs.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/exceptions/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/exceptions/base.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/filesystem/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/filesystem/atomic.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/filesystem/change_set.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/filesystem/cwd.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/filesystem/locking.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/filesystem/plan.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/governance/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/governance/issues.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/governance/locking.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/governance/snapshots.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/hashing.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/package_version.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/reports/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/reports/json_report.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/reports/markdown_report.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/config/SPEC.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/config/defaults.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/config/settings.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/container.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/main.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/bases//344/273/273/345/212/241/345/267/245/344/275/234/345/217/260-/344/270/252/344/272/272.base" +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/bases//344/273/273/345/212/241/345/267/245/344/275/234/345/217/260-/351/241/271/347/233/256.base" +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/bases//345/275/222/346/241/243/346/226/207/346/241/243/345/267/245/344/275/234/345/217/260.base" +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/bases//345/276/205/344/272/272/345/206/263/347/255/226/345/267/245/344/275/234/345/217/260.base" +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/bases//346/226/207/346/241/243/345/267/245/344/275/234/345/217/260.base" +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/defaults/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/SPEC.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/TEMPLATE.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-context-bootstrap/SKILL.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-context-bootstrap/agents/openai.yaml +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-conversation-router/SKILL.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-conversation-router/agents/openai.yaml +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-conversation-router/references/inbox-handoff.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-conversation-router/references/learning-intake.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-conversation-router/references/task-intake.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-document-capture/SKILL.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-document-capture/references//344/273/273/345/212/241/344/270/216/350/256/241/345/210/222/346/262/211/346/267/200.md" +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-document-capture/references//345/267/262/346/234/211/346/226/207/346/241/243/346/233/264/346/226/260.md" +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-document-capture/references//351/200/232/347/224/250/347/237/245/350/257/206/346/262/211/346/267/200.md" +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-document-capture/references//351/227/256/351/242/230/344/270/216/345/206/263/347/255/226/346/262/211/346/267/200.md" +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-document-capture/references//351/241/271/347/233/256/345/206/205/345/256/271/346/262/211/346/267/200.md" +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-inbox-triage/SKILL.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-kanban-board/SKILL.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-task-management/SKILL.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-weekly-report-writing/SKILL.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-weekly-report-writing/agents/openai.yaml +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-workspace-adoption/SKILL.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-workspace-onboarding/SKILL.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-workspace-restructure/SKILL.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-workspace-restructure/references/restructure-spec.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/workspace/_/346/250/241/346/235/277/README.md" +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/workspace/_/346/250/241/346/235/277//346/250/241/346/235/277-/344/273/273/345/212/241.md" +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/workspace/_/346/250/241/346/235/277//346/250/241/346/235/277-/347/211/210/346/234/254/345/217/221/345/270/203/346/270/205/345/215/225.md" +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/SPEC.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/conftest.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/integration/test_profile_resolution.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/integration/test_skill_examples.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/integration/test_workspace_templates.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/perf/test_read_counts.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/perf/test_resolve_subprocess_count.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_agent_hints.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_atomic_write.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_base_service.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_config.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_document_apply.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_document_index.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_domain_context.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_file_change_executor.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_frontmatter.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_generated_regions.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_kanban_service.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_migrations.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_operation_schema.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_package_version.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_pypi_verify.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_related_docs.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_release_check.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_repository_boundaries.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_workspace_manifest.py +0 -0
|
@@ -40,7 +40,7 @@ Campfire 当前不负责 Agent 调度、实时消息推送或替代 Jira/Notion
|
|
|
40
40
|
Schema + 命名 + 生命周期 + 计划/审批/执行 + 链接 + 归档 + 审计
|
|
41
41
|
```
|
|
42
42
|
|
|
43
|
-
Domain
|
|
43
|
+
Domain 由声明而不是目录名称决定;`任务/`、`记录/`、`assets/` 等普通目录可按需要成为 Domain,但文档类型不强制绑定同名目录。以下划线开头的 `_xxx/` 统一表示治理基础设施,不能声明为 Space 或 Domain;CLI 派生目录使用 `_generated/`,Base 使用 `_治理视图/`。归档是 `document_status=archived`,不对应特殊物理目录。
|
|
44
44
|
|
|
45
45
|
Task Channel 借鉴 Go 的原则:**Do not communicate by sharing memory; instead, share memory by communicating.** 多个参与者不依赖各自会话中的隐式记忆,而是通过明确的任务状态与事件共享上下文。它是持久异步 Channel,不承诺实时唤醒;外部 Agent 运行时可在其上增加通知和调度。
|
|
46
46
|
|
|
@@ -42,7 +42,7 @@ campfire base list / show / check / sync
|
|
|
42
42
|
|
|
43
43
|
Space、Domain、Project 的 `create`/`adopt`,以及文档移动和重构写操作默认先预览;审查通过后才追加 `--confirm`。归档通过 `document apply --set document_status=archived` 修改,且必须先获得用户明确同意。已注册 Workspace 只通过根级 `campfire --workspace <id> ...` 选择;已声明 Space、Domain 和 Project 使用稳定 ID,CLI 自行推导路径和父子关系。路径参数只用于新位置、具体文件、外部输入和显式扫描范围。
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
目录名以 `_` 开头时表示系统治理区域,不能声明为 Space 或 Domain;错误结果返回命中的 `reserved_directory` 和修复提示。其他目录名默认没有隐藏保留语义,`任务/`、`记录/`、`assets/`、`archive/`、`generated/` 均可按需 create/adopt 为 Domain。文档类型不强制对应同名 Domain,归档只通过 `document_status=archived` 表达;CLI 关系页写入 `_generated/`,Base 写入 `_治理视图/`。
|
|
46
46
|
|
|
47
47
|
`document apply` 可新建、更新、为已有正文补齐 Frontmatter,或通过显式 `--type` 原子转换文档类型。新建文档在 Frontmatter 后包含唯一的 `<!-- CAMPFIRE:BODY -->`,调用方只在锚点后编辑正文;存量文档不强制迁移。创建或唯一更新时可省略 `.md`;创建和类型转换时还可省略类型前缀。CLI 在 `normalization` 中返回每项标准化,并在 `target` 中返回最终路径;调用方不手工同步类型、前缀与 Markdown 后缀。`document move` 可在任意已声明 Domain 之间移动单篇文档,并对齐目标 Profile 与可确定引用。目标 Profile 缺少语义字段时返回 `missing_fields`,调用方补齐明确业务值。只有实际写入成功的结果才可返回零或一个、且可直接执行的 scoped `maintenance sync` follow-up;Domain 内部路径会归一化为对应 Domain,预览、阻塞或无派生影响时返回空列表。具体参数以对应命令的 `-h` 为准。
|
|
48
48
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: campfire-cli
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.23
|
|
4
4
|
Summary: Local-first shared context and governance CLI for humans and agents
|
|
5
5
|
License-Expression: MIT
|
|
6
6
|
License-File: LICENSE
|
|
@@ -99,7 +99,7 @@ campfire document list # 精确枚举和筛选受管
|
|
|
99
99
|
campfire document apply / move / rename # 结构写入、跨 Domain 移动、原地改名
|
|
100
100
|
campfire document profile list / show / resolve # Frontmatter Profile 规则
|
|
101
101
|
campfire document type list # 文档类型与前缀
|
|
102
|
-
campfire base list / show / check / sync # Obsidian Base
|
|
102
|
+
campfire base list / show / check / sync # Obsidian Base `_治理视图/`
|
|
103
103
|
```
|
|
104
104
|
|
|
105
105
|
通用模板集中在 Workspace 根目录 `_模板/`,方便人类查看维护;模板使用 `template` 类型和基础属性。正文顶部说明适用类型和裁剪规则,Agent 按需参考,不强制套用;更新已有文档优先保留合理结构。局部模板只在用户或领域规则明确指定时使用,不逐层查找或自动覆盖。模板不替代 Profile,也不校验正文。
|
|
@@ -83,7 +83,7 @@ campfire document list # 精确枚举和筛选受管
|
|
|
83
83
|
campfire document apply / move / rename # 结构写入、跨 Domain 移动、原地改名
|
|
84
84
|
campfire document profile list / show / resolve # Frontmatter Profile 规则
|
|
85
85
|
campfire document type list # 文档类型与前缀
|
|
86
|
-
campfire base list / show / check / sync # Obsidian Base
|
|
86
|
+
campfire base list / show / check / sync # Obsidian Base `_治理视图/`
|
|
87
87
|
```
|
|
88
88
|
|
|
89
89
|
通用模板集中在 Workspace 根目录 `_模板/`,方便人类查看维护;模板使用 `template` 类型和基础属性。正文顶部说明适用类型和裁剪规则,Agent 按需参考,不强制套用;更新已有文档优先保留合理结构。局部模板只在用户或领域规则明确指定时使用,不逐层查找或自动覆盖。模板不替代 Profile,也不校验正文。
|
{campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/base/service/base_service.py
RENAMED
|
@@ -127,7 +127,7 @@ class BaseService:
|
|
|
127
127
|
return self._repository.source_root()
|
|
128
128
|
|
|
129
129
|
def _target_root(self) -> Path:
|
|
130
|
-
return self._settings.vault_root / self._settings.bases.get("target", "治理视图")
|
|
130
|
+
return self._settings.vault_root / self._settings.bases.get("target", "_治理视图")
|
|
131
131
|
|
|
132
132
|
def _managed_names(self) -> list[str]:
|
|
133
133
|
return list(config_section("bases").get("managed_bases", []))
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
from collections.abc import Iterable
|
|
6
|
-
from pathlib import Path
|
|
6
|
+
from pathlib import Path, PurePosixPath
|
|
7
7
|
from typing import Any
|
|
8
8
|
|
|
9
9
|
from campfire_cli.common.documents.document_types import safe_path
|
|
@@ -24,13 +24,25 @@ def is_system_scope_path(root: Path, path: Path, config: dict[str, Any]) -> bool
|
|
|
24
24
|
)
|
|
25
25
|
|
|
26
26
|
|
|
27
|
+
def ignored_directory(name: str, config: dict[str, Any]) -> bool:
|
|
28
|
+
"""Return whether a directory is outside managed document scopes."""
|
|
29
|
+
managed_system_directories = {
|
|
30
|
+
part
|
|
31
|
+
for raw_root in config.get("scope_roots", [])
|
|
32
|
+
for part in PurePosixPath(raw_root).parts
|
|
33
|
+
if part.startswith("_")
|
|
34
|
+
}
|
|
35
|
+
return name.startswith(".") or (
|
|
36
|
+
name.startswith("_") and name not in managed_system_directories
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
|
|
27
40
|
def iter_documents(
|
|
28
41
|
root: Path,
|
|
29
42
|
config: dict[str, Any],
|
|
30
43
|
roots: Iterable[Path] | None = None,
|
|
31
44
|
) -> list[Path]:
|
|
32
45
|
root = root.resolve()
|
|
33
|
-
ignored = set(config.get("ignored_directories", []))
|
|
34
46
|
documents: set[Path] = set()
|
|
35
47
|
space_marker = config.get("space_marker", "_空间.md")
|
|
36
48
|
if roots is not None:
|
|
@@ -50,8 +62,10 @@ def iter_documents(
|
|
|
50
62
|
if not scope.exists():
|
|
51
63
|
continue
|
|
52
64
|
for path in scope.rglob("*.md"):
|
|
53
|
-
|
|
54
|
-
if exempt_document(path, config) or any(
|
|
65
|
+
scoped_parts = path.relative_to(scope).parts[:-1]
|
|
66
|
+
if exempt_document(path, config) or any(
|
|
67
|
+
ignored_directory(part, config) for part in scoped_parts
|
|
68
|
+
):
|
|
55
69
|
continue
|
|
56
70
|
if not path.is_file() or any(
|
|
57
71
|
part.is_symlink() for part in (path, *path.parents) if part != root
|
|
@@ -365,8 +365,4 @@ class DocumentMoveService:
|
|
|
365
365
|
|
|
366
366
|
def _is_reserved_target(self, context: DomainContext, target: Path) -> bool:
|
|
367
367
|
relative = target.parent.relative_to(context.root)
|
|
368
|
-
|
|
369
|
-
*self._settings.document_types.get("ignored_directories", []),
|
|
370
|
-
*self._settings.governance.get("project_reserved_directories", []),
|
|
371
|
-
}
|
|
372
|
-
return any(part in reserved or part.startswith(".") for part in relative.parts)
|
|
368
|
+
return any(part.startswith(("_", ".")) for part in relative.parts)
|
|
@@ -259,7 +259,7 @@ class MaintenanceService:
|
|
|
259
259
|
relation_page = None
|
|
260
260
|
if notes:
|
|
261
261
|
relations = {note: all_relations[note] for note in notes}
|
|
262
|
-
relation_page = domain.path / "
|
|
262
|
+
relation_page = domain.path / "_generated" / f"相关文档-{domain.name}.md"
|
|
263
263
|
relation_content = governance_sync.relation_markdown(domain, notes, relations)
|
|
264
264
|
existing = (
|
|
265
265
|
relation_page.read_text(encoding="utf-8") if relation_page.is_file() else ""
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
`workspace space/domain create` 只创建不存在的新目录;`space adopt` 原地纳管已有 Space,`domain adopt` 可原地声明或把一个 Vault 内外已有目录接管到明确目标。Domain 所属 Space 和最近父 Domain 从目标路径唯一推导;Project 从 Manifest 绑定的根 Domain id 与祖先拓扑推导,Domain 声明不保存 Project。外部来源始终保留。命令默认只输出计划,追加 `--confirm` 才写入。
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
目录名称不决定文档类型或强制归属。以下划线开头的 `_xxx/` 是系统治理目录,不能声明为 Space/Domain;拒绝结果必须返回命中的目录名和修复提示。其他名称没有隐藏保留名单,`任务/`、`记录/`、`assets/`、`archive/`、`generated/` 均可按组织需要创建或接管为 Domain。非系统目录直接包含文档或子 Domain 时必须有 `_领域.md`,否则报告 `undeclared-domain-directory`。归档只由文档状态表达,不要求物理 `archive/`。
|
|
14
14
|
|
|
15
15
|
`workspace config check` 统一校验包内产品默认值和当前 Workspace 的有效治理契约,包括目录与 Space 冲突、文档类型前缀、Profile 引用和继承、归档策略以及托管资源列表。
|
|
16
16
|
|
|
@@ -20,7 +20,7 @@ Adoption、文档批量 Restructure 与 Domain Restructure 均使用共享 Chang
|
|
|
20
20
|
|
|
21
21
|
`domain rename --name` 只改显示名称;`--folder-name` 只改原父级下目录名称,可显式同时提供。目录改名使用共享计划摘要,确认必须提供 `--expected-plan`,保护附件、声明和受管引用;Domain id、子领域身份与 Project 绑定不变。大小写不敏感文件系统的纯大小写改名明确阻止,提示先预览中间名迁移,不静默覆盖。不承诺断电原子性,回滚失败报告需要人工核对的路径。
|
|
22
22
|
|
|
23
|
-
Space 是 Workspace 根下以 `_空间.md` 声明的顶级内容容器;Domain 位于 Space 内,以 `_领域.md` 声明并可任意嵌套。子 Domain 必须处于父 Domain 路径下、属于同一 Space 并继承 governance。`_收件箱`、`_待用户确认` 与
|
|
23
|
+
Space 是 Workspace 根下以 `_空间.md` 声明的顶级内容容器;Domain 位于 Space 内,以 `_领域.md` 声明并可任意嵌套。子 Domain 必须处于父 Domain 路径下、属于同一 Space 并继承 governance。`_收件箱`、`_待用户确认` 与 `_治理视图` 是系统区域,不是 Space;其中 `_待用户确认/` 是受管文档范围,但没有虚构的 Domain 或 Project。Maintenance 只消费本模块发现的结构,不维护第二套领域规则。
|
|
24
24
|
|
|
25
25
|
Space 与 Domain 声明 Frontmatter 只由本模块解释、格式化和修改;Document App 对其返回 `not-applicable`。`workspace space/domain format` 只规范化 Frontmatter 并逐字节保留 Markdown 正文。声明文件中 `AUTO-GENERATED` 标记区域由 CLI 独占,标记外正文允许人和 Agent 编辑。`workspace space check --space <id>` 支持对单个 Space 做局部复检。
|
|
26
26
|
|
|
@@ -8,6 +8,7 @@ from uuid import uuid4
|
|
|
8
8
|
import yaml
|
|
9
9
|
|
|
10
10
|
from campfire_cli.app.base.schema.operation_schema import maintenance_sync_follow_up
|
|
11
|
+
from campfire_cli.app.document.service.document_scanner import ignored_directory
|
|
11
12
|
from campfire_cli.app.document.service.rules.document_rule_service import DocumentRuleService
|
|
12
13
|
from campfire_cli.app.document.service.rules.profile_candidates import workspace_candidate_sets
|
|
13
14
|
from campfire_cli.app.workspace.schema.restructure_schema import (
|
|
@@ -424,15 +425,14 @@ class RestructureService:
|
|
|
424
425
|
)
|
|
425
426
|
|
|
426
427
|
def _inventory_documents(self, root: Path) -> list[Path]:
|
|
427
|
-
ignored = set(self._settings.document_types.get("ignored_directories", []))
|
|
428
|
-
ignored.update({".git", ".obsidian", ".campfire"})
|
|
429
428
|
exempt = set(self._settings.document_types.get("exempt_basenames", []))
|
|
430
429
|
return sorted(
|
|
431
430
|
path
|
|
432
431
|
for path in root.rglob("*.md")
|
|
433
432
|
if path.name not in exempt
|
|
434
433
|
and not any(
|
|
435
|
-
part
|
|
434
|
+
ignored_directory(part, self._settings.document_types)
|
|
435
|
+
for part in path.relative_to(root).parts[:-1]
|
|
436
436
|
)
|
|
437
437
|
)
|
|
438
438
|
|
|
@@ -24,7 +24,6 @@ from campfire_cli.common.documents.domain_context import (
|
|
|
24
24
|
from campfire_cli.common.documents.frontmatter_format import format_text
|
|
25
25
|
from campfire_cli.common.exceptions import ConfigurationError
|
|
26
26
|
from campfire_cli.common.filesystem import atomic_write, workspace_write_lock
|
|
27
|
-
from campfire_cli.config.defaults import config_section
|
|
28
27
|
|
|
29
28
|
SPACE_MARKER = "_空间.md"
|
|
30
29
|
DOMAIN_MARKER = "_领域.md"
|
|
@@ -34,19 +33,15 @@ DECLARATION_MANAGED_COMMENT = (
|
|
|
34
33
|
ID_RE = re.compile(r"[a-z0-9][a-z0-9-]{0,62}")
|
|
35
34
|
|
|
36
35
|
|
|
37
|
-
def reserved_directories() -> set[str]:
|
|
38
|
-
return set(config_section("workspace")["reserved_directories"])
|
|
39
|
-
|
|
40
|
-
|
|
41
36
|
def validate_domain_path_parts(parts: tuple[str, ...], path: str) -> None:
|
|
42
|
-
reserved = next((part for part in parts if part
|
|
37
|
+
reserved = next((part for part in parts if part.startswith("_")), None)
|
|
43
38
|
if reserved is not None:
|
|
44
39
|
raise ConfigurationError(
|
|
45
40
|
f"Domain 路径命中系统保留目录:{reserved}",
|
|
46
41
|
code="reserved-directory",
|
|
47
42
|
path=path,
|
|
48
43
|
reserved_directory=reserved,
|
|
49
|
-
hint="
|
|
44
|
+
hint="下划线开头的目录用于系统治理;请选择不以 _ 开头的 Domain 路径。",
|
|
50
45
|
)
|
|
51
46
|
hidden = next((part for part in parts if part.startswith(".")), None)
|
|
52
47
|
if hidden is not None:
|
|
@@ -198,7 +193,7 @@ class SpaceService:
|
|
|
198
193
|
if (
|
|
199
194
|
relative.is_absolute()
|
|
200
195
|
or len(relative.parts) != 1
|
|
201
|
-
or relative.name
|
|
196
|
+
or relative.name.startswith(("_", "."))
|
|
202
197
|
):
|
|
203
198
|
raise ConfigurationError("Space path 必须是 Workspace 根下的单层非保留目录")
|
|
204
199
|
target = self.root / relative
|
|
@@ -283,7 +278,7 @@ class DomainService:
|
|
|
283
278
|
if not directory.is_dir() or directory == space_root:
|
|
284
279
|
continue
|
|
285
280
|
parts = directory.relative_to(space_root).parts
|
|
286
|
-
if any(part
|
|
281
|
+
if any(part.startswith(("_", ".")) for part in parts):
|
|
287
282
|
continue
|
|
288
283
|
direct_notes = [
|
|
289
284
|
item for item in directory.glob("*.md") if item.name != DOMAIN_MARKER
|
|
@@ -302,7 +297,7 @@ class DomainService:
|
|
|
302
297
|
)
|
|
303
298
|
for marker in sorted(space_root.rglob(DOMAIN_MARKER)):
|
|
304
299
|
if any(
|
|
305
|
-
part
|
|
300
|
+
part.startswith(("_", "."))
|
|
306
301
|
for part in marker.relative_to(space_root).parts[:-1]
|
|
307
302
|
):
|
|
308
303
|
continue
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
version:
|
|
1
|
+
version: 2
|
|
2
2
|
workspace:
|
|
3
|
-
version:
|
|
3
|
+
version: 2
|
|
4
4
|
system_directories:
|
|
5
5
|
- _收件箱/用户输入
|
|
6
6
|
- _收件箱/待接管
|
|
7
7
|
- _待用户确认
|
|
8
8
|
- _模板
|
|
9
|
-
- 治理视图
|
|
9
|
+
- _治理视图
|
|
10
10
|
spaces:
|
|
11
11
|
- id: knowledge
|
|
12
12
|
name: 知识
|
|
@@ -28,43 +28,19 @@ workspace:
|
|
|
28
28
|
name: 创作
|
|
29
29
|
path: myblog
|
|
30
30
|
type: content
|
|
31
|
-
reserved_directories:
|
|
32
|
-
- _收件箱
|
|
33
|
-
- _待用户确认
|
|
34
|
-
- _协作
|
|
35
|
-
- 治理视图
|
|
36
|
-
- assets
|
|
37
|
-
- archive
|
|
38
|
-
- generated
|
|
39
|
-
- _总览
|
|
40
|
-
- _模板
|
|
41
|
-
- a_skill
|
|
42
31
|
governance:
|
|
43
|
-
version:
|
|
32
|
+
version: 2
|
|
44
33
|
inbox: _收件箱
|
|
45
34
|
human_request_root: _待用户确认
|
|
46
35
|
collaboration_root: _协作
|
|
47
36
|
space_marker: _空间.md
|
|
48
37
|
domain_marker: _领域.md
|
|
49
|
-
ignored_directories:
|
|
50
|
-
- assets
|
|
51
|
-
- archive
|
|
52
|
-
- generated
|
|
53
|
-
project_reserved_directories:
|
|
54
|
-
- archive
|
|
55
|
-
- _总览
|
|
56
|
-
- _模板
|
|
57
|
-
- a_skill
|
|
58
38
|
document_types:
|
|
59
|
-
version:
|
|
39
|
+
version: 3
|
|
60
40
|
space_marker: _空间.md
|
|
61
41
|
scope_roots:
|
|
62
42
|
- _待用户确认
|
|
63
43
|
- _模板
|
|
64
|
-
ignored_directories:
|
|
65
|
-
- assets
|
|
66
|
-
- generated
|
|
67
|
-
- a_skill
|
|
68
44
|
exempt_basenames:
|
|
69
45
|
- _领域.md
|
|
70
46
|
- _空间.md
|
|
@@ -287,8 +263,8 @@ skills:
|
|
|
287
263
|
unknown_skill_policy: ignore
|
|
288
264
|
orphaned_skill_policy: report
|
|
289
265
|
bases:
|
|
290
|
-
version:
|
|
291
|
-
target: 治理视图
|
|
266
|
+
version: 2
|
|
267
|
+
target: _治理视图
|
|
292
268
|
managed_bases:
|
|
293
269
|
- 文档工作台.base
|
|
294
270
|
- 任务工作台-项目.base
|
|
@@ -42,7 +42,7 @@ description: "持续维护 Campfire Workspace 的结构与文档合规;适用
|
|
|
42
42
|
|
|
43
43
|
1. 选择最窄的操作范围。诊断用对应 check;新建 Space/Domain 用 create,已有目录接管用 adopt;不要手写声明。
|
|
44
44
|
2. 修改文档结构时只查询尚未知的 Profile;apply 负责结构,正文由 Edit 维护。新建后用返回的 target 在 `<!-- CAMPFIRE:BODY -->` 后补正文,不手工同步类型前缀。
|
|
45
|
-
3.
|
|
45
|
+
3. `_xxx/` 统一表示系统治理目录,不能声明为 Domain;其他目录名没有隐藏保留语义。新 Domain 使用 create,已有内容目录使用 adopt,文档类型不强制决定目录;归档只更新 `document_status`,不创建或移动到 `archive/`。
|
|
46
46
|
4. 只改标题用 rename,跨 Domain 用 move;确认带上预览返回的 `--expected-hash` 和 `--expected-plan`。批量语义迁移使用重构流程,不逐文件绕过计划。
|
|
47
47
|
5. 声明顺序异常时使用诊断返回的 format 修复入口,不把 formatter 列为日常必经步骤。声明标记外的人工正文可直接编辑。
|
|
48
48
|
6. sync 自身直接写入派生物;用户要求预览时才使用 --dry-run,不传不存在的 --confirm。使用实际 follow_up 的 scope 或用户明确的治理范围,不无条件扩大全库。
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
│ ├── README.md
|
|
15
15
|
│ ├── 模板-任务.md
|
|
16
16
|
│ └── 模板-版本发布清单.md
|
|
17
|
-
├── 治理视图/
|
|
17
|
+
├── _治理视图/ # CLI 管理的 Base
|
|
18
18
|
├── mynote/ # 知识
|
|
19
19
|
├── mywork/ # 工作
|
|
20
20
|
├── mylog/ # 日志
|
|
@@ -34,7 +34,7 @@ campfire workspace create --id <workspace-id> --path <path>
|
|
|
34
34
|
|
|
35
35
|
## Base 演示
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
创建后,`_治理视图/` 由 `campfire base sync` 维护以下开箱即用的 Obsidian Base:
|
|
38
38
|
|
|
39
39
|
- `文档工作台.base`:按类型查看当前文档、草稿和当前计划。
|
|
40
40
|
- `任务工作台-项目.base`:按 `related_project` 查看项目任务和阻塞任务。
|
|
@@ -164,7 +164,7 @@ def test_first_time_workspace_create_and_existing_directory_setup(tmp_path: Path
|
|
|
164
164
|
assert create_payload["resources"]["bases"]["status"] == "synced"
|
|
165
165
|
assert create_payload["resources"]["skills"]["status"] == "synced"
|
|
166
166
|
assert (created / ".campfire.yaml").is_file()
|
|
167
|
-
assert (created / "治理视图" / "文档工作台.base").is_file()
|
|
167
|
+
assert (created / "_治理视图" / "文档工作台.base").is_file()
|
|
168
168
|
assert {
|
|
169
169
|
"mynote",
|
|
170
170
|
"mywork",
|
|
@@ -55,6 +55,8 @@ def domain_tree(workspace: Path) -> AppContainer:
|
|
|
55
55
|
handle.write("\n未提交的人工正文 [[mynote/金融/子领域/知识-说明.md]]\n")
|
|
56
56
|
(workspace / "mynote/金融/附件.bin").write_bytes(b"\x00\xffasset")
|
|
57
57
|
assert container.maintenance.sync(scope="mynote").status == "synced"
|
|
58
|
+
assert (workspace / "mynote/金融/子领域/_generated/相关文档-child.md").is_file()
|
|
59
|
+
assert not list((workspace / "mynote").rglob("generated"))
|
|
58
60
|
return container
|
|
59
61
|
|
|
60
62
|
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
|
|
3
|
+
from campfire_cli.app.document.service.document_scanner import iter_documents
|
|
4
|
+
from campfire_cli.config.defaults import config_section
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def test_scanner_only_skips_prefixed_directories_inside_a_scope(workspace: Path) -> None:
|
|
8
|
+
domain = workspace / "mywork/Example"
|
|
9
|
+
domain.mkdir()
|
|
10
|
+
ordinary = [domain / name / f"记录-{name}.md" for name in ("assets", "archive", "generated")]
|
|
11
|
+
for path in ordinary:
|
|
12
|
+
path.parent.mkdir()
|
|
13
|
+
path.write_text("普通内容。\n", encoding="utf-8")
|
|
14
|
+
system_note = domain / "_generated/相关文档-Example.md"
|
|
15
|
+
system_note.parent.mkdir()
|
|
16
|
+
system_note.write_text("派生内容。\n", encoding="utf-8")
|
|
17
|
+
|
|
18
|
+
scanned = iter_documents(workspace, config_section("document_types"), roots=[domain])
|
|
19
|
+
|
|
20
|
+
assert set(scanned) == set(ordinary)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def test_scanner_allows_an_explicit_underscored_scope_root(workspace: Path) -> None:
|
|
24
|
+
request = workspace / "_待用户确认/请求-确认.md"
|
|
25
|
+
request.write_text("待确认。\n", encoding="utf-8")
|
|
26
|
+
|
|
27
|
+
scanned = iter_documents(
|
|
28
|
+
workspace,
|
|
29
|
+
config_section("document_types"),
|
|
30
|
+
roots=[workspace / "_待用户确认"],
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
assert scanned == [request]
|
|
@@ -45,7 +45,8 @@ def test_task_and_record_directories_can_be_domains(workspace: Path) -> None:
|
|
|
45
45
|
|
|
46
46
|
|
|
47
47
|
@pytest.mark.parametrize(
|
|
48
|
-
"path, reserved",
|
|
48
|
+
"path, reserved",
|
|
49
|
+
[("mywork/_generated/子领域", "_generated"), ("mywork/_任意系统区", "_任意系统区")],
|
|
49
50
|
)
|
|
50
51
|
def test_reserved_domain_path_reports_the_matching_directory(
|
|
51
52
|
workspace: Path, path: str, reserved: str
|
|
@@ -66,3 +67,19 @@ def test_reserved_domain_path_reports_the_matching_directory(
|
|
|
66
67
|
assert payload["path"] == path
|
|
67
68
|
assert payload["reserved_directory"] == reserved
|
|
68
69
|
assert payload["hint"]
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
@pytest.mark.parametrize("name", ["assets", "archive", "generated", "a_skill"])
|
|
73
|
+
def test_plain_directory_names_can_be_domains(workspace: Path, name: str) -> None:
|
|
74
|
+
created = DomainService(workspace, campfire_home()).create(
|
|
75
|
+
domain_id=name.replace("_", "-"),
|
|
76
|
+
name=name,
|
|
77
|
+
path=f"mywork/{name}",
|
|
78
|
+
domain_type="work-domain",
|
|
79
|
+
governance="work-docs",
|
|
80
|
+
project_id=None,
|
|
81
|
+
confirm=True,
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
assert created.status == "created"
|
|
85
|
+
assert (workspace / f"mywork/{name}/_领域.md").is_file()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/alembic/versions/001_initial_schema.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/base/repository/base_repository.py
RENAMED
|
File without changes
|
|
File without changes
|
{campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/base/schema/operation_schema.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/cli/document_cli.py
RENAMED
|
File without changes
|
{campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/cli/profile_cli.py
RENAMED
|
File without changes
|
|
File without changes
|
{campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/repository/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/schema/__init__.py
RENAMED
|
File without changes
|
{campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/schema/document_schema.py
RENAMED
|
File without changes
|
{campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/index/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|