campfire-cli 0.1.1__tar.gz → 0.1.2__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.
Files changed (178) hide show
  1. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/PKG-INFO +13 -2
  2. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/README.md +12 -1
  3. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/pyproject.toml +1 -1
  4. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/__init__.py +1 -1
  5. campfire_cli-0.1.2/src/campfire_cli/common/agent_hints.py +52 -0
  6. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/container.py +31 -0
  7. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/main.py +20 -0
  8. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/tests/conftest.py +6 -0
  9. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/tests/integration/test_cli.py +49 -0
  10. campfire_cli-0.1.2/tests/unit/test_agent_hints.py +39 -0
  11. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/uv.lock +1 -1
  12. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/.github/workflows/ci.yml +0 -0
  13. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/.github/workflows/release.yml +0 -0
  14. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/.gitignore +0 -0
  15. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/AGENTS.md +0 -0
  16. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/ARCHITECTURE.md +0 -0
  17. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/COMMAND.md +0 -0
  18. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/DECISIONS.md +0 -0
  19. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/LICENSE +0 -0
  20. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/SPEC.md +0 -0
  21. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/alembic/SPEC.md +0 -0
  22. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/alembic/env.py +0 -0
  23. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/alembic/script.py.mako +0 -0
  24. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/alembic/versions/001_initial_schema.py +0 -0
  25. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/alembic.ini +0 -0
  26. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/scripts/SPEC.md +0 -0
  27. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/alembic/__init__.py +0 -0
  28. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/alembic/env.py +0 -0
  29. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/alembic/script.py.mako +0 -0
  30. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/alembic/versions/001_initial_schema.py +0 -0
  31. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/alembic/versions/002_workspace_project_registry.py +0 -0
  32. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/alembic/versions/003_unified_workspace_state.py +0 -0
  33. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/alembic/versions/004_restructure_workspace_domain.py +0 -0
  34. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/alembic/versions/005_decision_channel.py +0 -0
  35. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/alembic/versions/006_workspace_topology_index.py +0 -0
  36. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/alembic/versions/007_workspace_adoption.py +0 -0
  37. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/alembic/versions/__init__.py +0 -0
  38. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/SPEC.md +0 -0
  39. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/__init__.py +0 -0
  40. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/base/SPEC.md +0 -0
  41. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/base/__init__.py +0 -0
  42. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/base/cli/base_cli.py +0 -0
  43. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/base/repository/base_repository.py +0 -0
  44. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/base/schema/base_schema.py +0 -0
  45. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/base/service/base_service.py +0 -0
  46. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/decision/SPEC.md +0 -0
  47. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/decision/__init__.py +0 -0
  48. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/decision/cli/decision_cli.py +0 -0
  49. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/decision/repository/decision_repository.py +0 -0
  50. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/decision/schema/decision_schema.py +0 -0
  51. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/decision/service/decision_projection_service.py +0 -0
  52. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/decision/service/decision_service.py +0 -0
  53. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/document/SPEC.md +0 -0
  54. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/document/__init__.py +0 -0
  55. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/document/cli/__init__.py +0 -0
  56. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/document/cli/document_cli.py +0 -0
  57. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/document/cli/profile_cli.py +0 -0
  58. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/document/cli/type_cli.py +0 -0
  59. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/document/repository/__init__.py +0 -0
  60. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/document/repository/document_profile_repository.py +0 -0
  61. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/document/repository/document_type_repository.py +0 -0
  62. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/document/service/__init__.py +0 -0
  63. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/document/service/document_profile_service.py +0 -0
  64. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/document/service/document_rule_service.py +0 -0
  65. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/document/service/document_scanner.py +0 -0
  66. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/document/service/document_service.py +0 -0
  67. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/document/service/document_type_service.py +0 -0
  68. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/document/service/frontmatter_apply.py +0 -0
  69. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/document/service/frontmatter_formatter.py +0 -0
  70. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/document/service/frontmatter_plan.py +0 -0
  71. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/document/service/profile_registry.py +0 -0
  72. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/document/service/type_apply.py +0 -0
  73. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/document/service/type_plan.py +0 -0
  74. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/maintenance/SPEC.md +0 -0
  75. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/maintenance/__init__.py +0 -0
  76. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/maintenance/cli/maintenance_cli.py +0 -0
  77. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/maintenance/repository/maintenance_repository.py +0 -0
  78. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/maintenance/schema/maintenance_schema.py +0 -0
  79. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/maintenance/service/archive_service.py +0 -0
  80. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/maintenance/service/link_service.py +0 -0
  81. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/maintenance/service/maintenance_protocol.py +0 -0
  82. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/maintenance/service/maintenance_service.py +0 -0
  83. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/maintenance/service/moc_service.py +0 -0
  84. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/maintenance/service/plan_service.py +0 -0
  85. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/skill/SPEC.md +0 -0
  86. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/skill/__init__.py +0 -0
  87. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/skill/cli/skill_cli.py +0 -0
  88. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/skill/repository/skill_repository.py +0 -0
  89. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/skill/schema/skill_schema.py +0 -0
  90. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/skill/service/skill_service.py +0 -0
  91. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/workspace/SPEC.md +0 -0
  92. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/workspace/__init__.py +0 -0
  93. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/workspace/cli/__init__.py +0 -0
  94. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/workspace/cli/adoption_cli.py +0 -0
  95. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/workspace/cli/config_cli.py +0 -0
  96. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/workspace/cli/domain_cli.py +0 -0
  97. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/workspace/cli/project_cli.py +0 -0
  98. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/workspace/cli/restructure_cli.py +0 -0
  99. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/workspace/cli/space_cli.py +0 -0
  100. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/workspace/cli/workspace_cli.py +0 -0
  101. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/workspace/repository/__init__.py +0 -0
  102. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/workspace/repository/adoption_repository.py +0 -0
  103. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/workspace/repository/manifest_repository.py +0 -0
  104. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/workspace/repository/restructure_repository.py +0 -0
  105. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/workspace/repository/workspace_repository.py +0 -0
  106. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/workspace/schema/__init__.py +0 -0
  107. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/workspace/schema/adoption_schema.py +0 -0
  108. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/workspace/schema/restructure_schema.py +0 -0
  109. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/workspace/schema/workspace_schema.py +0 -0
  110. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/workspace/service/__init__.py +0 -0
  111. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/workspace/service/adoption_protocol.py +0 -0
  112. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/workspace/service/adoption_service.py +0 -0
  113. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/workspace/service/config_service.py +0 -0
  114. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/workspace/service/domain_restructure_service.py +0 -0
  115. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/workspace/service/project_service.py +0 -0
  116. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/workspace/service/restructure_protocol.py +0 -0
  117. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/workspace/service/restructure_service.py +0 -0
  118. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/workspace/service/restructure_verifier.py +0 -0
  119. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/workspace/service/structure_service.py +0 -0
  120. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/workspace/service/workspace_protocol.py +0 -0
  121. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/app/workspace/service/workspace_service.py +0 -0
  122. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/common/SPEC.md +0 -0
  123. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/common/__init__.py +0 -0
  124. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/common/database/__init__.py +0 -0
  125. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/common/database/migrations.py +0 -0
  126. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/common/database/models.py +0 -0
  127. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/common/database/session.py +0 -0
  128. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/common/documents/__init__.py +0 -0
  129. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/common/documents/document_types.py +0 -0
  130. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/common/documents/frontmatter_schema.py +0 -0
  131. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/common/documents/markdown.py +0 -0
  132. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/common/exceptions/__init__.py +0 -0
  133. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/common/exceptions/base.py +0 -0
  134. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/common/filesystem/__init__.py +0 -0
  135. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/common/filesystem/atomic.py +0 -0
  136. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/common/filesystem/locking.py +0 -0
  137. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/common/governance/__init__.py +0 -0
  138. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/common/governance/issues.py +0 -0
  139. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/common/governance/locking.py +0 -0
  140. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/common/governance/snapshots.py +0 -0
  141. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/common/hashing.py +0 -0
  142. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/common/reports/__init__.py +0 -0
  143. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/common/reports/json_report.py +0 -0
  144. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/common/reports/markdown_report.py +0 -0
  145. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/config/SPEC.md +0 -0
  146. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/config/defaults.py +0 -0
  147. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/config/settings.py +0 -0
  148. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/resources/__init__.py +0 -0
  149. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/resources/bases/Agent/346/211/247/350/241/214/345/267/245/344/275/234/345/217/260.base" +0 -0
  150. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/resources/bases/SPEC.md +0 -0
  151. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/resources/bases//344/273/273/345/212/241/345/267/245/344/275/234/345/217/260.base" +0 -0
  152. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/resources/bases//345/206/263/347/255/226/345/267/245/344/275/234/345/217/260.base" +0 -0
  153. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/resources/bases//345/276/205/345/275/222/346/241/243/346/226/207/346/241/243.base" +0 -0
  154. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/resources/bases//351/241/271/347/233/256/346/226/207/346/241/243.base" +0 -0
  155. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/resources/defaults/__init__.py +0 -0
  156. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/resources/defaults/config.yml +0 -0
  157. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/resources/skills/SPEC.md +0 -0
  158. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/resources/skills/campfire-context-bootstrap/SKILL.md +0 -0
  159. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/resources/skills/campfire-context-bootstrap/agents/openai.yaml +0 -0
  160. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/resources/skills/campfire-conversation-router/SKILL.md +0 -0
  161. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/resources/skills/campfire-conversation-router/agents/openai.yaml +0 -0
  162. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/resources/skills/campfire-conversation-router/references/inbox-handoff.md +0 -0
  163. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/resources/skills/campfire-conversation-router/references/learning-intake.md +0 -0
  164. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/resources/skills/campfire-conversation-router/references/task-intake.md +0 -0
  165. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/resources/skills/campfire-document-capture/SKILL.md +0 -0
  166. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/resources/skills/campfire-inbox-triage/SKILL.md +0 -0
  167. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/resources/skills/campfire-weekly-report-writing/SKILL.md +0 -0
  168. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/resources/skills/campfire-weekly-report-writing/agents/openai.yaml +0 -0
  169. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/resources/skills/campfire-workspace-adoption/SKILL.md +0 -0
  170. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/resources/skills/campfire-workspace-maintenance/SKILL.md +0 -0
  171. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/resources/skills/campfire-workspace-maintenance/references//344/273/273/345/212/241/346/255/243/346/226/207/347/273/223/346/236/204.md" +0 -0
  172. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/src/campfire_cli/resources/skills/campfire-workspace-restructure/SKILL.md +0 -0
  173. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/tests/SPEC.md +0 -0
  174. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/tests/unit/test_atomic_write.py +0 -0
  175. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/tests/unit/test_common_governance.py +0 -0
  176. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/tests/unit/test_config.py +0 -0
  177. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/tests/unit/test_frontmatter.py +0 -0
  178. {campfire_cli-0.1.1 → campfire_cli-0.1.2}/tests/unit/test_repository_boundaries.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: campfire-cli
3
- Version: 0.1.1
3
+ Version: 0.1.2
4
4
  Summary: Local-first shared context and governance CLI for humans and agents
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -32,7 +32,18 @@ Vault 根目录的 `.campfire.yaml` 是可跨设备同步的 Workspace/Project
32
32
 
33
33
  ## 安装与调用
34
34
 
35
- 开发机安装:
35
+ 标准安装(已发布至 PyPI,无需源码仓库):
36
+
37
+ ```bash
38
+ uv tool install campfire-cli
39
+ campfire version
40
+ ```
41
+
42
+ 升级使用 `uv tool upgrade campfire-cli`(或 `pipx upgrade campfire-cli`),随后运行 `campfire upgrade`(别名 `campfire update`)对齐本机治理资源:SQLite Schema 迁移、全局 Skill、Base 与全局提示词路标。
43
+
44
+ `campfire setup` 初始化时会向 `~/.claude/CLAUDE.md` 与 `~/.agents/AGENTS.md` 注入 campfire 路标块(幂等、带注释标记、不触碰块外内容;可用 `CAMPFIRE_AGENT_HINT_PATH` 覆盖目标文件列表),让 Agent 冷启动时知道本机装有 campfire。
45
+
46
+ 开发机安装(跟随本地源码):
36
47
 
37
48
  ```bash
38
49
  uv tool install --editable /path/to/campfire-cli
@@ -16,7 +16,18 @@ Vault 根目录的 `.campfire.yaml` 是可跨设备同步的 Workspace/Project
16
16
 
17
17
  ## 安装与调用
18
18
 
19
- 开发机安装:
19
+ 标准安装(已发布至 PyPI,无需源码仓库):
20
+
21
+ ```bash
22
+ uv tool install campfire-cli
23
+ campfire version
24
+ ```
25
+
26
+ 升级使用 `uv tool upgrade campfire-cli`(或 `pipx upgrade campfire-cli`),随后运行 `campfire upgrade`(别名 `campfire update`)对齐本机治理资源:SQLite Schema 迁移、全局 Skill、Base 与全局提示词路标。
27
+
28
+ `campfire setup` 初始化时会向 `~/.claude/CLAUDE.md` 与 `~/.agents/AGENTS.md` 注入 campfire 路标块(幂等、带注释标记、不触碰块外内容;可用 `CAMPFIRE_AGENT_HINT_PATH` 覆盖目标文件列表),让 Agent 冷启动时知道本机装有 campfire。
29
+
30
+ 开发机安装(跟随本地源码):
20
31
 
21
32
  ```bash
22
33
  uv tool install --editable /path/to/campfire-cli
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "campfire-cli"
3
- version = "0.1.1"
3
+ version = "0.1.2"
4
4
  description = "Local-first shared context and governance CLI for humans and agents"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -1,3 +1,3 @@
1
1
  """Campfire CLI package."""
2
2
 
3
- __version__ = "0.1.1"
3
+ __version__ = "0.1.2"
@@ -0,0 +1,52 @@
1
+ from __future__ import annotations
2
+
3
+ import os
4
+ from pathlib import Path
5
+
6
+ from campfire_cli.common.filesystem import atomic_write
7
+
8
+ HINT_START = "<!-- campfire:agent-hints:start -->"
9
+ HINT_END = "<!-- campfire:agent-hints:end -->"
10
+
11
+ HINT_BODY = """## Campfire 文档治理
12
+
13
+ 本机装有 campfire CLI(`campfire --help`),Obsidian Vault 已注册为文档工作区。
14
+ 当用户要求"沉淀/记录/写文档/归档/跟踪问题"到知识库或项目文档时,先运行
15
+ `campfire workspace resolve` 解析工作区,再按 campfire skill 流程处理;
16
+ 不要直接在代码仓库里创建笔记文件。"""
17
+
18
+
19
+ def default_hint_paths() -> list[Path]:
20
+ override = os.environ.get("CAMPFIRE_AGENT_HINT_PATH")
21
+ if override:
22
+ return [Path(item).expanduser().resolve() for item in override.split(os.pathsep) if item]
23
+ home = Path.home()
24
+ return [home / ".claude" / "CLAUDE.md", home / ".agents" / "AGENTS.md"]
25
+
26
+
27
+ def render_hint_block() -> str:
28
+ return f"{HINT_START}\n{HINT_BODY}\n{HINT_END}"
29
+
30
+
31
+ def inject_agent_hint(path: Path) -> str:
32
+ """幂等地向 path 写入 campfire 路标块,返回 created/appended/updated/kept。
33
+
34
+ 块由 HTML 注释标记包围;已存在时整体替换以升级内容,块外用户内容不动。
35
+ """
36
+ block = render_hint_block()
37
+ current = path.read_text(encoding="utf-8") if path.is_file() else ""
38
+ if HINT_START in current and HINT_END in current:
39
+ start = current.index(HINT_START)
40
+ end = current.index(HINT_END) + len(HINT_END)
41
+ updated = current[:start] + block + current[end:]
42
+ action = "updated" if updated != current else "kept"
43
+ elif current:
44
+ separator = "" if current.endswith("\n\n") else ("\n" if current.endswith("\n") else "\n\n")
45
+ updated = current + separator + block + "\n"
46
+ action = "appended"
47
+ else:
48
+ updated = block + "\n"
49
+ action = "created"
50
+ if action != "kept":
51
+ atomic_write(path, updated)
52
+ return action
@@ -28,6 +28,7 @@ from campfire_cli.app.workspace.service.domain_restructure_service import (
28
28
  )
29
29
  from campfire_cli.app.workspace.service.restructure_service import RestructureService
30
30
  from campfire_cli.app.workspace.service.workspace_service import WorkspaceService
31
+ from campfire_cli.common.agent_hints import default_hint_paths, inject_agent_hint
31
32
  from campfire_cli.common.database import create_sqlite_engine, open_session, upgrade_database
32
33
  from campfire_cli.common.exceptions import ConfigurationError
33
34
  from campfire_cli.config.defaults import effective_config
@@ -60,10 +61,40 @@ class AppContainer:
60
61
  "config": WorkspaceConfigService(settings).check().model_dump(mode="json"),
61
62
  "skills": container.skill.sync(dry_run=False).model_dump(mode="json"),
62
63
  "bases": container.base.sync(dry_run=False).model_dump(mode="json"),
64
+ "agent_hints": cls._inject_hints(),
63
65
  },
64
66
  "health": container.maintenance.check(summary=True).model_dump(mode="json"),
65
67
  }
66
68
 
69
+ @classmethod
70
+ def upgrade(cls) -> dict:
71
+ """对齐本机治理资源与当前包版本:Schema 迁移、Skill、Base 与提示词路标。"""
72
+ home = campfire_home()
73
+ upgrade_database(home / "campfire.db")
74
+ workspaces = []
75
+ for workspace_id in SqliteWorkspaceRepository(home).load_registry().workspaces:
76
+ container = cls.build(workspace_id)
77
+ workspaces.append(
78
+ {
79
+ "workspace_id": workspace_id,
80
+ "bases": container.base.sync(dry_run=False).model_dump(mode="json"),
81
+ }
82
+ )
83
+ return {
84
+ "status": "ok",
85
+ "database": {"status": "up-to-date"},
86
+ "skills": cls.build_skill().sync(dry_run=False).model_dump(mode="json"),
87
+ "agent_hints": cls._inject_hints(),
88
+ "workspaces": workspaces,
89
+ }
90
+
91
+ @staticmethod
92
+ def _inject_hints() -> list[dict[str, str]]:
93
+ return [
94
+ {"path": str(path), "action": inject_agent_hint(path)}
95
+ for path in default_hint_paths()
96
+ ]
97
+
67
98
  @classmethod
68
99
  def build_skill(cls) -> SkillService:
69
100
  """Build the global Skill service without requiring a registered Workspace."""
@@ -131,3 +131,23 @@ def setup(
131
131
  typer.echo(json.dumps({"status": "error", "message": str(exc)}, ensure_ascii=False))
132
132
  raise typer.Exit(exc.exit_code) from exc
133
133
  typer.echo(json.dumps(result, ensure_ascii=False, indent=2))
134
+
135
+
136
+ @app.command("upgrade")
137
+ def upgrade() -> None:
138
+ """升级本机治理资源:SQLite Schema 迁移、全局 Skill、Base 与提示词路标。"""
139
+ try:
140
+ result = AppContainer.upgrade()
141
+ except AppError as exc:
142
+ typer.echo(
143
+ json.dumps({"status": "error", "message": str(exc)}, ensure_ascii=False),
144
+ err=True,
145
+ )
146
+ raise typer.Exit(exc.exit_code) from exc
147
+ typer.echo(json.dumps(result, ensure_ascii=False, indent=2))
148
+
149
+
150
+ @app.command("update", hidden=True)
151
+ def update() -> None:
152
+ """campfire upgrade 的等价别名。"""
153
+ upgrade()
@@ -8,6 +8,12 @@ from campfire_cli.app.workspace.repository.workspace_repository import SqliteWor
8
8
  from campfire_cli.app.workspace.schema.workspace_schema import WorkspaceEntry, WorkspaceRegistry
9
9
 
10
10
 
11
+ @pytest.fixture(autouse=True)
12
+ def _isolate_agent_hints(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None:
13
+ """所有测试的提示词注入一律落在临时目录,绝不触碰用户真实全局文件。"""
14
+ monkeypatch.setenv("CAMPFIRE_AGENT_HINT_PATH", str(tmp_path / "agent-hints"))
15
+
16
+
11
17
  @pytest.fixture
12
18
  def workspace(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> Path:
13
19
  campfire_home = tmp_path / "_campfire"
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import json
4
+ import os
4
5
  import subprocess
5
6
  from pathlib import Path
6
7
 
@@ -2097,3 +2098,51 @@ def test_project_resolve_does_not_match_by_shared_remote_alone(
2097
2098
  )
2098
2099
  assert within["status"] == "matched"
2099
2100
  assert within["matches"][0]["project"]["id"] == "registered-app"
2101
+
2102
+
2103
+ def test_setup_injects_agent_hints_idempotently(
2104
+ workspace: Path, monkeypatch
2105
+ ) -> None:
2106
+ claude_md = workspace / "CLAUDE.md"
2107
+ agents_md = workspace / "AGENTS.md"
2108
+ monkeypatch.setenv(
2109
+ "CAMPFIRE_AGENT_HINT_PATH", f"{claude_md}{os.pathsep}{agents_md}"
2110
+ )
2111
+ first = runner.invoke(app, ["setup", "--workspace", str(workspace)])
2112
+ assert first.exit_code == 0, first.output
2113
+ payload = json.loads(first.output)
2114
+ actions = payload["resources"]["agent_hints"]
2115
+ assert {item["action"] for item in actions} == {"created"}
2116
+ for item in [claude_md, agents_md]:
2117
+ assert "campfire:agent-hints:start" in item.read_text(encoding="utf-8")
2118
+
2119
+ second = runner.invoke(app, ["setup", "--workspace", str(workspace)])
2120
+ assert second.exit_code == 0, second.output
2121
+ assert {
2122
+ item["action"] for item in json.loads(second.output)["resources"]["agent_hints"]
2123
+ } == {"kept"}
2124
+
2125
+
2126
+ def test_upgrade_syncs_resources_and_accepts_update_alias(
2127
+ workspace: Path, monkeypatch
2128
+ ) -> None:
2129
+ claude_md = workspace / "CLAUDE.md"
2130
+ monkeypatch.setenv("CAMPFIRE_AGENT_HINT_PATH", str(claude_md))
2131
+ stale = workspace / "_global_skills" / "campfire-document-capture" / "SKILL.md"
2132
+ result = runner.invoke(app, ["upgrade"])
2133
+ assert result.exit_code == 0, result.output
2134
+ payload = json.loads(result.output)
2135
+ assert payload["status"] == "ok"
2136
+ assert payload["database"]["status"] == "up-to-date"
2137
+ assert payload["skills"]["status"] == "synced"
2138
+ assert payload["agent_hints"][0]["action"] == "created"
2139
+ assert [item["workspace_id"] for item in payload["workspaces"]] == ["test"]
2140
+ assert stale.is_file()
2141
+ stale.write_text("过时内容\n", encoding="utf-8")
2142
+
2143
+ alias = runner.invoke(app, ["update"])
2144
+ assert alias.exit_code == 0, alias.output
2145
+ aliased = json.loads(alias.output)
2146
+ assert aliased["skills"]["status"] == "synced"
2147
+ assert aliased["agent_hints"][0]["action"] == "kept"
2148
+ assert stale.read_text(encoding="utf-8") != "过时内容\n"
@@ -0,0 +1,39 @@
1
+ from __future__ import annotations
2
+
3
+ from pathlib import Path
4
+
5
+ from campfire_cli.common.agent_hints import (
6
+ HINT_END,
7
+ HINT_START,
8
+ inject_agent_hint,
9
+ )
10
+
11
+
12
+ def test_inject_creates_then_keeps(tmp_path: Path) -> None:
13
+ target = tmp_path / "CLAUDE.md"
14
+ assert inject_agent_hint(target) == "created"
15
+ content = target.read_text(encoding="utf-8")
16
+ assert content.startswith(HINT_START)
17
+ assert content.endswith(HINT_END + "\n")
18
+ assert inject_agent_hint(target) == "kept"
19
+
20
+
21
+ def test_inject_appends_without_touching_existing_content(tmp_path: Path) -> None:
22
+ target = tmp_path / "CLAUDE.md"
23
+ original = "# 我的规范\n\n- 保持原样\n"
24
+ target.write_text(original, encoding="utf-8")
25
+ assert inject_agent_hint(target) == "appended"
26
+ content = target.read_text(encoding="utf-8")
27
+ assert content.startswith(original)
28
+ assert HINT_END in content
29
+
30
+
31
+ def test_inject_replaces_stale_block_only(tmp_path: Path) -> None:
32
+ target = tmp_path / "CLAUDE.md"
33
+ stale = f"# 头部\n\n{HINT_START}\n旧内容\n{HINT_END}\n# 尾部\n"
34
+ target.write_text(stale, encoding="utf-8")
35
+ assert inject_agent_hint(target) == "updated"
36
+ content = target.read_text(encoding="utf-8")
37
+ assert "旧内容" not in content
38
+ assert content.startswith("# 头部")
39
+ assert content.endswith("# 尾部\n")
@@ -36,7 +36,7 @@ wheels = [
36
36
 
37
37
  [[package]]
38
38
  name = "campfire-cli"
39
- version = "0.1.1"
39
+ version = "0.1.2"
40
40
  source = { editable = "." }
41
41
  dependencies = [
42
42
  { name = "alembic" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes