campfire-cli 0.1.22__tar.gz → 0.1.24__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.24}/ARCHITECTURE.md +6 -6
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/COMMAND.md +1 -1
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/PKG-INFO +8 -2
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/README.md +7 -1
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/SPEC.md +1 -1
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/pyproject.toml +1 -1
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/__init__.py +1 -1
- campfire_cli-0.1.24/src/campfire_cli/app/base/SPEC.md +3 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/base/service/base_service.py +1 -1
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/document_scanner.py +18 -4
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/index/document_index_service.py +0 -29
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/mutation/document_move_service.py +1 -5
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/maintenance/SPEC.md +2 -2
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/maintenance/service/maintenance_protocol.py +1 -4
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/maintenance/service/maintenance_service.py +1 -28
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/maintenance/service/moc_service.py +2 -51
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/SPEC.md +2 -2
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/service/restructure_service.py +3 -3
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/service/structure_service.py +5 -10
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/agent_hints.py +1 -1
- campfire_cli-0.1.24/src/campfire_cli/resources/bases/SPEC.md +3 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/defaults/config.yml +7 -31
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/SPEC.md +1 -1
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-kanban-board/SKILL.md +1 -1
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-workspace-maintenance/SKILL.md +3 -3
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/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.24}/tests/integration/test_cli.py +1 -1
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/integration/test_domain_rename_sync.py +90 -4
- campfire_cli-0.1.24/tests/integration/test_relation_pages_cli.py +97 -0
- campfire_cli-0.1.24/tests/unit/test_document_scanner.py +33 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_domain_paths.py +18 -1
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/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.24}/.github/workflows/ci.yml +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/.github/workflows/release.yml +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/.gitignore +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/.python-version +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/AGENTS.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/DECISIONS.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/LICENSE +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/alembic/SPEC.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/alembic/env.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/alembic/script.py.mako +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/alembic/versions/001_initial_schema.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/alembic.ini +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/scripts/SPEC.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/scripts/pypi_verify.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/scripts/quality_check.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/scripts/release_check.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/alembic/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/alembic/env.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/alembic/script.py.mako +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/alembic/versions/001_initial_schema.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/alembic/versions/002_workspace_project_registry.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/alembic/versions/003_unified_workspace_state.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/alembic/versions/004_restructure_workspace_domain.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/alembic/versions/005_decision_channel.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/alembic/versions/006_workspace_topology_index.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/alembic/versions/007_workspace_adoption.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/alembic/versions/008_remove_adoption_batches.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/alembic/versions/009_document_query_index.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/alembic/versions/010_project_domain_identity.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/alembic/versions/011_document_state_model.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/alembic/versions/012_remove_decision_channel.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/alembic/versions/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/SPEC.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/base/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/base/cli/base_cli.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/base/repository/base_repository.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/base/schema/base_schema.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/base/schema/operation_schema.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/SPEC.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/cli/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/cli/document_cli.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/cli/profile_cli.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/cli/type_cli.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/repository/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/repository/document_index_repository.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/repository/document_profile_repository.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/repository/document_type_repository.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/schema/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/schema/document_schema.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/document_service.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/index/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/index/document_index_builder.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/index/document_index_protocol.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/mutation/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/mutation/document_apply_service.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/mutation/document_relocation.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/mutation/frontmatter_apply.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/rules/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/rules/document_patch_values.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/rules/document_profile_service.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/rules/document_rule_service.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/rules/document_type_service.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/rules/frontmatter_formatter.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/rules/frontmatter_plan.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/rules/kanban_service.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/rules/profile_candidates.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/rules/profile_registry.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/rules/type_plan.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/maintenance/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/maintenance/cli/maintenance_cli.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/maintenance/repository/maintenance_repository.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/maintenance/schema/maintenance_schema.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/skill/SPEC.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/skill/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/skill/cli/skill_cli.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/skill/repository/skill_repository.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/skill/schema/skill_schema.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/skill/service/skill_service.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/cli/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/cli/config_cli.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/cli/domain_cli.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/cli/project_cli.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/cli/restructure_cli.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/cli/space_cli.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/cli/workspace_cli.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/repository/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/repository/manifest_repository.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/repository/restructure_repository.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/repository/workspace_repository.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/schema/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/schema/adoption_schema.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/schema/restructure_schema.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/schema/workspace_schema.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/service/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/service/adoption_service.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/service/config_service.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/service/domain_restructure_service.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/service/project_service.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/service/restructure_protocol.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/service/restructure_verifier.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/service/workspace_protocol.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/service/workspace_service.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/SPEC.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/cli_output.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/database/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/database/migrations.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/database/models.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/database/session.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/documents/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/documents/document_types.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/documents/domain_context.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/documents/frontmatter_format.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/documents/frontmatter_schema.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/documents/markdown.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/documents/related_docs.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/exceptions/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/exceptions/base.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/filesystem/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/filesystem/atomic.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/filesystem/change_set.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/filesystem/cwd.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/filesystem/locking.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/filesystem/plan.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/governance/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/governance/issues.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/governance/locking.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/governance/snapshots.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/hashing.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/package_version.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/reports/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/reports/json_report.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/reports/markdown_report.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/config/SPEC.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/config/defaults.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/config/settings.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/container.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/main.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/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.24}/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.24}/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.24}/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.24}/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.24}/src/campfire_cli/resources/defaults/__init__.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/TEMPLATE.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-context-bootstrap/SKILL.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-context-bootstrap/agents/openai.yaml +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-conversation-router/SKILL.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-conversation-router/agents/openai.yaml +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-conversation-router/references/inbox-handoff.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-conversation-router/references/learning-intake.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-conversation-router/references/task-intake.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-document-capture/SKILL.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/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.24}/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.24}/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.24}/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.24}/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.24}/src/campfire_cli/resources/skills/campfire-inbox-triage/SKILL.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-task-management/SKILL.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-weekly-report-writing/SKILL.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-weekly-report-writing/agents/openai.yaml +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-workspace-adoption/SKILL.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-workspace-onboarding/SKILL.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-workspace-restructure/SKILL.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-workspace-restructure/references/restructure-spec.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/workspace/_/346/250/241/346/235/277/README.md" +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/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.24}/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.24}/tests/SPEC.md +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/conftest.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/integration/test_profile_resolution.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/integration/test_skill_examples.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/integration/test_workspace_templates.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/perf/test_read_counts.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/perf/test_resolve_subprocess_count.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_agent_hints.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_atomic_write.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_base_service.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_config.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_document_apply.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_document_index.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_domain_context.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_file_change_executor.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_frontmatter.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_generated_regions.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_kanban_service.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_migrations.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_operation_schema.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_package_version.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_pypi_verify.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_related_docs.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_release_check.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_repository_boundaries.py +0 -0
- {campfire_cli-0.1.22 → campfire_cli-0.1.24}/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;MOC 保留领域导航,Base 使用 `_治理视图/`;不再生成 `_generated/` 关系页。归档是 `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
|
|
|
@@ -108,7 +108,7 @@ Campfire 不是“Markdown 版 kubectl”,而是面向人机协作场景组合
|
|
|
108
108
|
命令副作用按下列边界分类:
|
|
109
109
|
|
|
110
110
|
- **必须纳入当前事务**:不执行就会让当前意图产生破损状态的变更,例如结构迁移时的 Domain 声明、Project 归属和可移植 Manifest 对齐。
|
|
111
|
-
- **必须显式返回**:可从原始事实重建的派生结果,例如 MOC
|
|
111
|
+
- **必须显式返回**:可从原始事实重建的派生结果,例如 MOC 和治理报告;这些作为 `follow_up` 由 Skill 显式执行。
|
|
112
112
|
- **禁止捎带**:与当前意图无关的全 Workspace 格式化、归档、结构重构或其他写操作。
|
|
113
113
|
|
|
114
114
|
“一次改多个文件”不等于不原子;“一次只改一个字段”也不自动等于边界正确。评审新命令时必须逐项回答:
|
|
@@ -124,7 +124,7 @@ Campfire 不是“Markdown 版 kubectl”,而是面向人机协作场景组合
|
|
|
124
124
|
命令设计遵循以下约束:
|
|
125
125
|
|
|
126
126
|
1. **对象域优先**:公共入口采用 `campfire <object-domain> <verb>`,例如 `document apply`、`maintenance check`;动词在所属业务对象内保持单义,不为同一行为保留多个别名。
|
|
127
|
-
2. **意图原子、派生显式**:`document apply` 创建或更新文档,并在显式类型变化时将类型、文件名前缀和确定性引用作为同一变更提交;`document move` 原子完成单文档跨 Domain 移动、目标 Profile 对齐和确定性引用修复。命令只在 MOC
|
|
127
|
+
2. **意图原子、派生显式**:`document apply` 创建或更新文档,并在显式类型变化时将类型、文件名前缀和确定性引用作为同一变更提交;`document move` 原子完成单文档跨 Domain 移动、目标 Profile 对齐和确定性引用修复。命令只在 MOC 等可见派生内容可能变化时返回零或一个可直接执行的最小 scope `maintenance sync`。
|
|
128
128
|
3. **契约声明式,变更显式**:Profile 是字段、类型、枚举、顺序和条件必填的 SSOT。Agent 提交业务值,CLI 解析有效 Profile 并拒绝猜测;已有文档只修改明确给出的字段或正文操作。
|
|
129
129
|
4. **写入先证明安全**:写命令默认预览,显式确认后才提交;提交时在锁内复核快照或期望哈希,多文件变更作为一个 ChangeSet 执行,失败回滚,避免静默覆盖和部分写入。
|
|
130
130
|
5. **人类与 Agent 共用一个契约**:命令和结果只有一套语义。JSON 状态、issues、missing fields 与 follow-up 供 Agent 稳定消费,`tree` 和分层 `-h` 供人类与 Agent 渐进发现,不维护第二套参数目录。
|
|
@@ -165,13 +165,13 @@ SQLite 中的 Workspace 与 Project 注册数据是结构化事实,文档索
|
|
|
165
165
|
|
|
166
166
|
### 文档查询投影
|
|
167
167
|
|
|
168
|
-
文档索引保存列表查询需要的结构化字段、内容哈希、源文件 stat
|
|
168
|
+
文档索引保存列表查询需要的结构化字段、内容哈希、源文件 stat,以及Frontmatter `related_docs` 形成的确定关系,不解析正文 WikiLink、Markdown Link 或 Embed。它不复制正文,不保存相似度建议,也不把文件 mtime 解释为任务时间。
|
|
169
169
|
|
|
170
170
|
每次 `document list` 或 `document inspect` 先对账文件清单、size、mtime、有效配置哈希和 Space/Domain 拓扑哈希。stat 只用于筛选变化候选,内容哈希才表示内容版本;新增、修改和删除会在查询前自动 reconcile。候选快照在内存中完成后,通过单个 SQLite 事务替换文档、关系和 generation,中断不能暴露半套新索引。
|
|
171
171
|
|
|
172
172
|
`document list` 只做结构化精确枚举与 AND 筛选;未来正文关键词、模糊匹配、相关性排序或混合检索使用独立 `document search`。`document inspect.relations` 只返回可证明的 declared、outgoing、incoming 和 unresolved;相似文档属于未来独立 suggestions,不能混入确定关系。
|
|
173
173
|
|
|
174
|
-
索引新鲜度是 CLI 内部读取保障,不生成让 Agent 手工执行的 index follow-up。MOC
|
|
174
|
+
索引新鲜度是 CLI 内部读取保障,不生成让 Agent 手工执行的 index follow-up。MOC 等 Workspace 内可见生成物仍由成功写命令按需返回 scoped `maintenance sync`。
|
|
175
175
|
|
|
176
176
|
### 设备本地与跨设备边界
|
|
177
177
|
|
|
@@ -237,7 +237,7 @@ Human / Browser ──> HTTP Adapter ──┘ │
|
|
|
237
237
|
1. 人类和 Agent 使用同一套 CLI 契约,不维护两套规则。
|
|
238
238
|
2. 写操作默认先计划、再确认、再执行;执行前复核并发变更。
|
|
239
239
|
3. 规则集中在配置契约和规则引擎,Skill、模板、CLI 不复制枚举定义。
|
|
240
|
-
4. MOC、Base
|
|
240
|
+
4. MOC、Base 和报告能生成就不手工维护;文档关系通过 CLI 查询,不再复制为关系页。
|
|
241
241
|
5. 有歧义的分类和结构重构进入待确认,不由 Agent 擅自决定。
|
|
242
242
|
6. Markdown 内容可脱离 Campfire 阅读和迁移;文档查询投影在 SQLite 丢失后可以重建,Decision 与未完成批次等工作流状态不作此承诺。
|
|
243
243
|
7. 只有一个用户级 SQLite;所有 Workspace 业务表必须携带 `workspace_id`,Repository 查询不得越界。
|
|
@@ -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.24
|
|
4
4
|
Summary: Local-first shared context and governance CLI for humans and agents
|
|
5
5
|
License-Expression: MIT
|
|
6
6
|
License-File: LICENSE
|
|
@@ -27,6 +27,12 @@ Description-Content-Type: text/markdown
|
|
|
27
27
|
|
|
28
28
|
## 安装
|
|
29
29
|
|
|
30
|
+
### v0.1.24 变更说明
|
|
31
|
+
|
|
32
|
+
`maintenance sync` 不再生成 `_generated/相关文档-*.md`,并移除 MOC 自动区域中的关系页入口;MOC 的文档导航、分组和模板入口保持不变。`related_docs` 仍为可选字段,Agent 通过 `document list` 定位文档、通过 `document inspect` 查询出向、入向及失效关联,查询不要求先同步 MOC。
|
|
33
|
+
|
|
34
|
+
同步不会删除或改写历史关系页,也不会修改人工正文链接。历史清理须先核实来源和人工内容,再确认具体范围;不能按 `_generated` 或 `generated` 目录名递归删除。Base 同步策略和领域模型不在本次变更范围内。
|
|
35
|
+
|
|
30
36
|
标准安装(已发布至 PyPI,无需源码仓库):
|
|
31
37
|
|
|
32
38
|
```bash
|
|
@@ -99,7 +105,7 @@ campfire document list # 精确枚举和筛选受管
|
|
|
99
105
|
campfire document apply / move / rename # 结构写入、跨 Domain 移动、原地改名
|
|
100
106
|
campfire document profile list / show / resolve # Frontmatter Profile 规则
|
|
101
107
|
campfire document type list # 文档类型与前缀
|
|
102
|
-
campfire base list / show / check / sync # Obsidian Base
|
|
108
|
+
campfire base list / show / check / sync # Obsidian Base `_治理视图/`
|
|
103
109
|
```
|
|
104
110
|
|
|
105
111
|
通用模板集中在 Workspace 根目录 `_模板/`,方便人类查看维护;模板使用 `template` 类型和基础属性。正文顶部说明适用类型和裁剪规则,Agent 按需参考,不强制套用;更新已有文档优先保留合理结构。局部模板只在用户或领域规则明确指定时使用,不逐层查找或自动覆盖。模板不替代 Profile,也不校验正文。
|
|
@@ -11,6 +11,12 @@
|
|
|
11
11
|
|
|
12
12
|
## 安装
|
|
13
13
|
|
|
14
|
+
### v0.1.24 变更说明
|
|
15
|
+
|
|
16
|
+
`maintenance sync` 不再生成 `_generated/相关文档-*.md`,并移除 MOC 自动区域中的关系页入口;MOC 的文档导航、分组和模板入口保持不变。`related_docs` 仍为可选字段,Agent 通过 `document list` 定位文档、通过 `document inspect` 查询出向、入向及失效关联,查询不要求先同步 MOC。
|
|
17
|
+
|
|
18
|
+
同步不会删除或改写历史关系页,也不会修改人工正文链接。历史清理须先核实来源和人工内容,再确认具体范围;不能按 `_generated` 或 `generated` 目录名递归删除。Base 同步策略和领域模型不在本次变更范围内。
|
|
19
|
+
|
|
14
20
|
标准安装(已发布至 PyPI,无需源码仓库):
|
|
15
21
|
|
|
16
22
|
```bash
|
|
@@ -83,7 +89,7 @@ campfire document list # 精确枚举和筛选受管
|
|
|
83
89
|
campfire document apply / move / rename # 结构写入、跨 Domain 移动、原地改名
|
|
84
90
|
campfire document profile list / show / resolve # Frontmatter Profile 规则
|
|
85
91
|
campfire document type list # 文档类型与前缀
|
|
86
|
-
campfire base list / show / check / sync # Obsidian Base
|
|
92
|
+
campfire base list / show / check / sync # Obsidian Base `_治理视图/`
|
|
87
93
|
```
|
|
88
94
|
|
|
89
95
|
通用模板集中在 Workspace 根目录 `_模板/`,方便人类查看维护;模板使用 `template` 类型和基础属性。正文顶部说明适用类型和裁剪规则,Agent 按需参考,不强制套用;更新已有文档优先保留合理结构。局部模板只在用户或领域规则明确指定时使用,不逐层查找或自动覆盖。模板不替代 Profile,也不校验正文。
|
|
@@ -116,7 +116,7 @@ Campfire 使用语义化版本:
|
|
|
116
116
|
|
|
117
117
|
## Workspace 索引
|
|
118
118
|
|
|
119
|
-
- Markdown Frontmatter 的 `related_docs` 是文档关系唯一 SSOT,采用 `[[Workspace相对路径.md]]`。不解析、索引或自动改写正文链接;历史正文保留,SQLite
|
|
119
|
+
- Markdown Frontmatter 的 `related_docs` 是文档关系唯一 SSOT,采用 `[[Workspace相对路径.md]]`。不解析、索引或自动改写正文链接;历史正文保留,SQLite 关系投影可从该字段重建;不再生成 Markdown 关系页,Agent 通过 document inspect 查询关系。
|
|
120
120
|
- 改名、移动与类型联动改名只定向更新 `related_docs` 引用方;预览输出 `expected_plan`,确认复核整个变更集摘要和文件哈希。文件提交后的索引失败必须报告已写入事实,并使索引可在下次查询恢复。
|
|
121
121
|
|
|
122
122
|
- SQLite `spaces`、`domains`、`documents` 只允许作为可重建本机投影,不得反向覆盖 Markdown SSOT。
|
{campfire_cli-0.1.22 → campfire_cli-0.1.24}/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
|
|
@@ -123,35 +123,6 @@ class DocumentIndexService:
|
|
|
123
123
|
"in_degree": len(incoming),
|
|
124
124
|
}
|
|
125
125
|
|
|
126
|
-
def relation_views(self, sources: list[Path]) -> dict[Path, list[dict[str, Any]]]:
|
|
127
|
-
self.reconcile()
|
|
128
|
-
records = {r.path: r for r in self._repository.load_documents() if r.queryable}
|
|
129
|
-
results = {path: [] for path in sources}
|
|
130
|
-
by_name = {p.relative_to(self._settings.vault_root).as_posix(): p for p in sources}
|
|
131
|
-
for edge in self._repository.load_edges():
|
|
132
|
-
if edge.resolution != "resolved":
|
|
133
|
-
continue
|
|
134
|
-
for source, target, kind in (
|
|
135
|
-
(edge.source_path, edge.target_path, "direct-link"),
|
|
136
|
-
(edge.target_path, edge.source_path, "backlink"),
|
|
137
|
-
):
|
|
138
|
-
if source not in by_name or target not in records:
|
|
139
|
-
continue
|
|
140
|
-
record = records[target]
|
|
141
|
-
results[by_name[source]].append(
|
|
142
|
-
{
|
|
143
|
-
"target": target.removesuffix(".md"),
|
|
144
|
-
"target_name": record.name or Path(target).stem,
|
|
145
|
-
"target_domain": record.domain_id or "",
|
|
146
|
-
"type": kind,
|
|
147
|
-
"score": 1.0,
|
|
148
|
-
"reasons": ["related_docs 显式关联"],
|
|
149
|
-
}
|
|
150
|
-
)
|
|
151
|
-
for items in results.values():
|
|
152
|
-
items.sort(key=lambda item: (item["type"], item["target"]))
|
|
153
|
-
return results
|
|
154
|
-
|
|
155
126
|
def referencing(self, relative_path: str) -> list[str]:
|
|
156
127
|
self.reconcile()
|
|
157
128
|
return sorted(
|
|
@@ -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)
|
|
@@ -8,7 +8,7 @@ Domain MOC 只列出该 Domain `_模板/` 中实际存在的模板;根目录 `
|
|
|
8
8
|
|
|
9
9
|
受管范围由当前 Workspace 中实际存在的 `_空间.md` 动态发现,不使用固定 Space 白名单;`scope_roots` 只补充 `_待用户确认/` 等非 Space 系统范围。声明文件由 Workspace App 校验,不计入普通文档问题。
|
|
10
10
|
|
|
11
|
-
`check --scope` 的 status 表示当前筛选结果,`workspace_status` 表示全 Workspace 状态。`sync --scope` 只发现并扫描 scope 内的 Domain
|
|
11
|
+
`check --scope` 的 status 表示当前筛选结果,`workspace_status` 表示全 Workspace 状态。`sync --scope` 只发现并扫描 scope 内的 Domain 和文档,刷新 MOC 并触发文档索引 reconcile;只受当前范围的结构问题阻塞。`document list/inspect` 不以 Maintenance 为前置步骤。单篇内容创建、补全和修改属于 Document App,批量迁移属于 Workspace Restructure。
|
|
12
12
|
|
|
13
13
|
```text
|
|
14
14
|
maintenance/
|
|
@@ -20,4 +20,4 @@ maintenance/
|
|
|
20
20
|
归档仅是 Document Profile 中的 `document_status` 值,通过 `document apply` 修改;Maintenance 不提供归档命令。
|
|
21
21
|
|
|
22
22
|
scoped sync 在全局拓扑中检查目标身份是否重复,再按稳定 Domain id 和当前 scope 更新结构投影;合法外部改名不依赖先 check。文档索引先独立提交完整 generation,再在文件变更事务内提交领域索引;领域索引提交失败回滚其事务并补偿生成文件,不在领域提交之后追加可能失败的文档索引提交。两个投影可分别重建,不宣称文件系统与 SQLite 共享事务。可捕获失败返回阶段与实际写入状态,补偿失败须停止并核对文件,不盲目重放。
|
|
23
|
-
|
|
23
|
+
Maintenance 不再生成关系页,也不读取关系展示投影;MOC 保留导航、文档分组与模板入口,移除自动关系入口。related_docs 与正反向查询仍由 Document App 管理。sync 不删除或改写历史关系页及自定义文件;历史清理须独立盘点和确认,不按目录名递归删除,不改写人工正文链接。
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from
|
|
4
|
-
from typing import Any, Protocol
|
|
3
|
+
from typing import Protocol
|
|
5
4
|
|
|
6
5
|
from campfire_cli.app.document.schema import DocumentIndexResult
|
|
7
6
|
from campfire_cli.app.maintenance.schema.maintenance_schema import (
|
|
@@ -15,8 +14,6 @@ from campfire_cli.app.maintenance.schema.maintenance_schema import (
|
|
|
15
14
|
class DocumentIndexMaintainerProtocol(Protocol):
|
|
16
15
|
"""Expose only the index maintenance operations needed by Maintenance."""
|
|
17
16
|
|
|
18
|
-
def relation_views(self, sources: list[Path]) -> dict[Path, list[dict[str, Any]]]: ...
|
|
19
|
-
|
|
20
17
|
def rebuild(self) -> DocumentIndexResult: ...
|
|
21
18
|
|
|
22
19
|
def reconcile(self) -> DocumentIndexResult: ...
|
|
@@ -226,22 +226,8 @@ class MaintenanceService:
|
|
|
226
226
|
templates_by_domain = {
|
|
227
227
|
domain.id: governance_sync.direct_templates(domain) for domain in domains
|
|
228
228
|
}
|
|
229
|
-
project_domain_ids = {
|
|
230
|
-
domain.id for domain in domains if domain.governance == "project-docs"
|
|
231
|
-
}
|
|
232
|
-
domain_by_note = {
|
|
233
|
-
note: domain_id
|
|
234
|
-
for domain_id, notes in notes_by_domain.items()
|
|
235
|
-
for note in notes
|
|
236
|
-
if domain_id not in project_domain_ids
|
|
237
|
-
}
|
|
238
|
-
all_notes = sorted(
|
|
239
|
-
domain_by_note,
|
|
240
|
-
key=lambda path: str(path.relative_to(self._settings.vault_root)).casefold(),
|
|
241
|
-
)
|
|
242
229
|
try:
|
|
243
230
|
indexed_document_count = self._document_index.reconcile().document_count
|
|
244
|
-
all_relations = self._document_index.relation_views(all_notes)
|
|
245
231
|
except AppError as exc:
|
|
246
232
|
return self._sync_failure(exc, "document-index", scope)
|
|
247
233
|
for domain in sorted(domains, key=lambda item: item.id):
|
|
@@ -256,21 +242,8 @@ class MaintenanceService:
|
|
|
256
242
|
marker_name,
|
|
257
243
|
)
|
|
258
244
|
else:
|
|
259
|
-
relation_page = None
|
|
260
|
-
if notes:
|
|
261
|
-
relations = {note: all_relations[note] for note in notes}
|
|
262
|
-
relation_page = domain.path / "generated" / f"相关文档-{domain.name}.md"
|
|
263
|
-
relation_content = governance_sync.relation_markdown(domain, notes, relations)
|
|
264
|
-
existing = (
|
|
265
|
-
relation_page.read_text(encoding="utf-8") if relation_page.is_file() else ""
|
|
266
|
-
)
|
|
267
|
-
generated_snapshot[
|
|
268
|
-
relation_page.relative_to(self._settings.vault_root).as_posix()
|
|
269
|
-
] = file_sha256(relation_page) if relation_page.is_file() else None
|
|
270
|
-
if existing != relation_content:
|
|
271
|
-
changes.append((relation_page, relation_content))
|
|
272
245
|
generated = governance_sync.generate_domain_content(
|
|
273
|
-
domain, domains, notes, templates_by_domain[domain.id]
|
|
246
|
+
domain, domains, notes, templates_by_domain[domain.id]
|
|
274
247
|
)
|
|
275
248
|
moc = domain.path / f"{domain.moc}.md"
|
|
276
249
|
if not moc.is_file():
|
{campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/maintenance/service/moc_service.py
RENAMED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"""
|
|
2
2
|
SPEC:
|
|
3
3
|
name: moc_service
|
|
4
|
-
purpose: 幂等生成领域 MOC
|
|
4
|
+
purpose: 幂等生成领域 MOC 自动区域
|
|
5
5
|
default_env_file: none
|
|
6
6
|
env_override: none
|
|
7
7
|
idempotent: true
|
|
8
8
|
behavior:
|
|
9
|
-
-
|
|
9
|
+
- 从领域声明和文档属性生成目录内容
|
|
10
10
|
- 内容未变化时不重写文件
|
|
11
11
|
- 支持 dry-run 和 JSON 输出
|
|
12
12
|
safety:
|
|
@@ -19,7 +19,6 @@ SPEC:
|
|
|
19
19
|
from __future__ import annotations
|
|
20
20
|
|
|
21
21
|
import os
|
|
22
|
-
import re
|
|
23
22
|
from pathlib import Path
|
|
24
23
|
from typing import Any
|
|
25
24
|
|
|
@@ -31,15 +30,6 @@ START_MARKER = "<!-- AUTO-GENERATED:DOMAIN-INDEX:START -->"
|
|
|
31
30
|
END_MARKER = "<!-- AUTO-GENERATED:DOMAIN-INDEX:END -->"
|
|
32
31
|
|
|
33
32
|
|
|
34
|
-
def note_title(path: Path) -> str:
|
|
35
|
-
return title_from_text(path.read_text(encoding="utf-8"), path.stem)
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
def title_from_text(text: str, fallback: str) -> str:
|
|
39
|
-
match = re.search(r"^#\s+(.+)$", text, re.MULTILINE)
|
|
40
|
-
return match.group(1).strip() if match else fallback
|
|
41
|
-
|
|
42
|
-
|
|
43
33
|
def direct_notes(domain: Domain, marker_name: str) -> list[Path]:
|
|
44
34
|
excluded = {marker_name, f"{domain.moc}.md"}
|
|
45
35
|
return sorted(
|
|
@@ -78,24 +68,11 @@ def replace_generated_region(original: str, generated: str) -> str:
|
|
|
78
68
|
return original[:start] + "\n\n" + generated.rstrip() + "\n\n" + original[end:]
|
|
79
69
|
|
|
80
70
|
|
|
81
|
-
def write_if_changed(
|
|
82
|
-
path: Path, content: str, dry_run: bool, changes: list[str], vault_root: Path
|
|
83
|
-
) -> None:
|
|
84
|
-
previous = path.read_text(encoding="utf-8") if path.exists() else None
|
|
85
|
-
if previous == content:
|
|
86
|
-
return
|
|
87
|
-
changes.append(str(path.relative_to(vault_root)))
|
|
88
|
-
if not dry_run:
|
|
89
|
-
path.parent.mkdir(parents=True, exist_ok=True)
|
|
90
|
-
path.write_text(content, encoding="utf-8")
|
|
91
|
-
|
|
92
|
-
|
|
93
71
|
def generate_domain_content(
|
|
94
72
|
domain: Domain,
|
|
95
73
|
domains: list[Domain],
|
|
96
74
|
notes: list[Path],
|
|
97
75
|
templates: list[Path],
|
|
98
|
-
relation_page: Path | None,
|
|
99
76
|
) -> str:
|
|
100
77
|
children = sorted(
|
|
101
78
|
[item for item in domains if item.parent_domain == domain.id],
|
|
@@ -109,8 +86,6 @@ def generate_domain_content(
|
|
|
109
86
|
lines.extend(["", "## 本领域文档", ""])
|
|
110
87
|
lines.extend([f"- [[{note.stem}]]" for note in notes] or ["- 暂无"])
|
|
111
88
|
append_template_section(lines, domain, templates)
|
|
112
|
-
lines.extend(["", "## 自动关系", ""])
|
|
113
|
-
lines.append(f"- [[{relation_page.stem}|相关文档计算结果]]" if relation_page else "- 暂无")
|
|
114
89
|
return "\n".join(lines)
|
|
115
90
|
|
|
116
91
|
|
|
@@ -168,27 +143,3 @@ def generate_project_domain_content(
|
|
|
168
143
|
append_template_section(lines, domain, templates)
|
|
169
144
|
lines.append("")
|
|
170
145
|
return "\n".join(lines).rstrip()
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
def relation_markdown(
|
|
174
|
-
domain: Domain, notes: list[Path], relations: dict[Path, list[dict[str, Any]]]
|
|
175
|
-
) -> str:
|
|
176
|
-
lines = [
|
|
177
|
-
f"# {domain.name}相关文档",
|
|
178
|
-
"",
|
|
179
|
-
"> 本页由 `campfire maintenance sync` 自动生成,请勿手工编辑。",
|
|
180
|
-
"",
|
|
181
|
-
]
|
|
182
|
-
for note in notes:
|
|
183
|
-
lines.extend([f"## [[{note.stem}]]", ""])
|
|
184
|
-
items = relations.get(note, [])
|
|
185
|
-
if not items:
|
|
186
|
-
lines.extend(["- 暂无 related_docs 关联", ""])
|
|
187
|
-
continue
|
|
188
|
-
for item in items:
|
|
189
|
-
reason = "、".join(item["reasons"]) or "related_docs 显式关联"
|
|
190
|
-
lines.append(
|
|
191
|
-
f"- [[{item['target']}|{item['target_name']}]]:`{item['type']}`;依据:{reason}"
|
|
192
|
-
)
|
|
193
|
-
lines.append("")
|
|
194
|
-
return "\n".join(lines).rstrip() + "\n"
|
|
@@ -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
|
|
@@ -50,7 +50,7 @@ HINT_BODY = """## Campfire 文档治理
|
|
|
50
50
|
11. 设置 `document_status=archived` 前必须获得用户针对该文档的明确同意;
|
|
51
51
|
`--confirm` 只确认 CLI 写入,不代表归档授权。
|
|
52
52
|
|
|
53
|
-
`.campfire.yaml`、声明 Frontmatter、自动生成区域、Base
|
|
53
|
+
`.campfire.yaml`、声明 Frontmatter、自动生成区域、Base 和 SQLite
|
|
54
54
|
是 CLI 管理资源。Agent 可以读取,但只能通过 Campfire 语义命令写入;缺少
|
|
55
55
|
对应命令时停止并报告能力缺口,不直接编辑。声明文件标记外正文不受此限制。
|
|
56
56
|
`_空间.md` 与 `_领域.md` 的人工正文维护局部业务规则;通用结构事实和索引
|
|
@@ -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
|