devcouncil 0.1.0 → 0.1.1

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 (128) hide show
  1. package/LICENSE +201 -201
  2. package/README.md +62 -543
  3. package/package.json +1 -1
  4. package/pyproject.toml +29 -26
  5. package/src/devcouncil/__main__.py +4 -4
  6. package/src/devcouncil/app/__init__.py +28 -28
  7. package/src/devcouncil/app/config.py +135 -108
  8. package/src/devcouncil/app/errors.py +23 -23
  9. package/src/devcouncil/app/events.py +44 -44
  10. package/src/devcouncil/app/orchestrator.py +67 -67
  11. package/src/devcouncil/app/project_status.py +29 -0
  12. package/src/devcouncil/app/run_context.py +39 -39
  13. package/src/devcouncil/app/state_machine.py +108 -108
  14. package/src/devcouncil/artifacts/__init__.py +1 -1
  15. package/src/devcouncil/artifacts/coverage.py +96 -96
  16. package/src/devcouncil/artifacts/graph.py +143 -143
  17. package/src/devcouncil/artifacts/migrations.py +20 -20
  18. package/src/devcouncil/artifacts/schemas.py +23 -23
  19. package/src/devcouncil/artifacts/serializer.py +21 -21
  20. package/src/devcouncil/artifacts/validators.py +27 -27
  21. package/src/devcouncil/cli/commands/artifacts.py +51 -48
  22. package/src/devcouncil/cli/commands/ast.py +22 -0
  23. package/src/devcouncil/cli/commands/baseline.py +35 -32
  24. package/src/devcouncil/cli/commands/config.py +76 -54
  25. package/src/devcouncil/cli/commands/dashboard.py +26 -0
  26. package/src/devcouncil/cli/commands/doctor.py +86 -42
  27. package/src/devcouncil/cli/commands/go.py +237 -0
  28. package/src/devcouncil/cli/commands/hook.py +96 -29
  29. package/src/devcouncil/cli/commands/init.py +67 -56
  30. package/src/devcouncil/cli/commands/integrate.py +320 -14
  31. package/src/devcouncil/cli/commands/lsp.py +20 -0
  32. package/src/devcouncil/cli/commands/map.py +25 -21
  33. package/src/devcouncil/cli/commands/plan.py +257 -206
  34. package/src/devcouncil/cli/commands/prompt.py +36 -33
  35. package/src/devcouncil/cli/commands/repair.py +72 -69
  36. package/src/devcouncil/cli/commands/report.py +112 -54
  37. package/src/devcouncil/cli/commands/reset_demo_state.py +31 -28
  38. package/src/devcouncil/cli/commands/rollback.py +49 -47
  39. package/src/devcouncil/cli/commands/run.py +252 -207
  40. package/src/devcouncil/cli/commands/setup.py +159 -18
  41. package/src/devcouncil/cli/commands/show.py +76 -57
  42. package/src/devcouncil/cli/commands/status.py +117 -105
  43. package/src/devcouncil/cli/commands/tasks.py +55 -41
  44. package/src/devcouncil/cli/commands/trace.py +2 -1
  45. package/src/devcouncil/cli/commands/verify.py +158 -128
  46. package/src/devcouncil/cli/commands/version.py +20 -20
  47. package/src/devcouncil/cli/commands/watch.py +574 -0
  48. package/src/devcouncil/cli/main.py +42 -24
  49. package/src/devcouncil/council/prompts/arbiter.md +19 -19
  50. package/src/devcouncil/council/prompts/critic_a.md +10 -10
  51. package/src/devcouncil/council/prompts/critic_b.md +10 -10
  52. package/src/devcouncil/council/prompts/implementation_reviewer.md +16 -16
  53. package/src/devcouncil/council/prompts/planner_a.md +16 -16
  54. package/src/devcouncil/council/prompts/planner_b.md +16 -16
  55. package/src/devcouncil/council/prompts/rebuttal.md +10 -10
  56. package/src/devcouncil/council/prompts/spec_writer.md +12 -12
  57. package/src/devcouncil/domain/assumption.py +17 -17
  58. package/src/devcouncil/domain/critique.py +32 -32
  59. package/src/devcouncil/domain/evidence.py +27 -27
  60. package/src/devcouncil/domain/gap.py +26 -26
  61. package/src/devcouncil/domain/requirement.py +22 -22
  62. package/src/devcouncil/domain/task.py +26 -26
  63. package/src/devcouncil/execution/__init__.py +1 -1
  64. package/src/devcouncil/execution/context_builder.py +54 -54
  65. package/src/devcouncil/execution/executor.py +15 -15
  66. package/src/devcouncil/execution/hook_policy.py +24 -3
  67. package/src/devcouncil/execution/patch.py +28 -28
  68. package/src/devcouncil/execution/permissions.py +44 -44
  69. package/src/devcouncil/execution/prompt_builder.py +23 -23
  70. package/src/devcouncil/execution/task_runner.py +63 -63
  71. package/src/devcouncil/executors/__init__.py +1 -1
  72. package/src/devcouncil/executors/coding_cli.py +112 -0
  73. package/src/devcouncil/executors/mini_swe.py +63 -63
  74. package/src/devcouncil/executors/native/agent.py +81 -81
  75. package/src/devcouncil/executors/openhands.py +56 -56
  76. package/src/devcouncil/gating/__init__.py +1 -1
  77. package/src/devcouncil/gating/checks/clean_git.py +50 -45
  78. package/src/devcouncil/gating/checks/planned_files_check.py +32 -32
  79. package/src/devcouncil/gating/checks/requirement_coverage.py +26 -26
  80. package/src/devcouncil/gating/checks/secret_scan_check.py +34 -34
  81. package/src/devcouncil/gating/policy.py +157 -157
  82. package/src/devcouncil/indexing/__init__.py +1 -1
  83. package/src/devcouncil/indexing/ast_matcher.py +168 -0
  84. package/src/devcouncil/indexing/graph_index.py +48 -48
  85. package/src/devcouncil/indexing/lsp.py +120 -0
  86. package/src/devcouncil/indexing/repo_mapper.py +208 -204
  87. package/src/devcouncil/integrations/github.py +35 -35
  88. package/src/devcouncil/integrations/gitnexus.py +27 -27
  89. package/src/devcouncil/integrations/graphify.py +34 -34
  90. package/src/devcouncil/integrations/mcp/server.py +549 -96
  91. package/src/devcouncil/integrations/pr_comments.py +62 -0
  92. package/src/devcouncil/live/__init__.py +2 -0
  93. package/src/devcouncil/live/cards.py +207 -0
  94. package/src/devcouncil/live/models.py +63 -0
  95. package/src/devcouncil/live/repair_prompt.py +83 -0
  96. package/src/devcouncil/live/reviewer.py +70 -0
  97. package/src/devcouncil/live/signals.py +135 -0
  98. package/src/devcouncil/live/summary.py +34 -0
  99. package/src/devcouncil/live/tasks.py +18 -0
  100. package/src/devcouncil/live/transcripts.py +138 -0
  101. package/src/devcouncil/llm/__init__.py +1 -1
  102. package/src/devcouncil/llm/cache.py +38 -38
  103. package/src/devcouncil/llm/provider.py +146 -125
  104. package/src/devcouncil/llm/router.py +111 -111
  105. package/src/devcouncil/planning/__init__.py +1 -1
  106. package/src/devcouncil/planning/arbiter_service.py +57 -57
  107. package/src/devcouncil/planning/critique_service.py +66 -66
  108. package/src/devcouncil/planning/plan_service.py +46 -46
  109. package/src/devcouncil/planning/prompt_enhancer_service.py +86 -0
  110. package/src/devcouncil/planning/repair_service.py +39 -39
  111. package/src/devcouncil/planning/spec_service.py +44 -44
  112. package/src/devcouncil/reporting/github_check.py +32 -32
  113. package/src/devcouncil/reporting/json_report.py +20 -17
  114. package/src/devcouncil/reporting/markdown_report.py +68 -46
  115. package/src/devcouncil/reporting/report_builder.py +14 -14
  116. package/src/devcouncil/storage/db.py +66 -66
  117. package/src/devcouncil/storage/models.py +83 -83
  118. package/src/devcouncil/storage/repositories.py +299 -222
  119. package/src/devcouncil/telemetry/cost.py +34 -34
  120. package/src/devcouncil/telemetry/tracker.py +49 -49
  121. package/src/devcouncil/ui/__init__.py +1 -0
  122. package/src/devcouncil/ui/dashboard.py +122 -0
  123. package/src/devcouncil/utils/__init__.py +1 -1
  124. package/src/devcouncil/utils/redaction.py +141 -141
  125. package/src/devcouncil/verification/__init__.py +1 -1
  126. package/src/devcouncil/verification/implementation_reviewer.py +55 -55
  127. package/src/devcouncil/verification/verifier.py +319 -302
  128. package/uv.lock +1 -1
@@ -1,83 +1,83 @@
1
- from sqlmodel import SQLModel, Field
2
- from typing import Optional
3
-
4
-
5
- class SchemaVersionModel(SQLModel, table=True):
6
- __tablename__ = "schema_version"
7
- id: str = Field(primary_key=True, default="singleton")
8
- version: int
9
-
10
- class RequirementModel(SQLModel, table=True):
11
- __tablename__ = "requirements"
12
- id: str = Field(primary_key=True)
13
- title: str
14
- description: str
15
- priority: str
16
- source: str
17
- # Store complex lists as JSON strings for simplicity in SQLite
18
- acceptance_criteria_json: str = Field(default="[]")
19
-
20
- class AssumptionModel(SQLModel, table=True):
21
- __tablename__ = "assumptions"
22
- id: str = Field(primary_key=True)
23
- statement: str
24
- confidence: str
25
- impact: str
26
- reversible: bool
27
- requires_user_confirmation: bool
28
- linked_requirement_ids_json: str = Field(default="[]")
29
- status: str = "open"
30
-
31
- class TaskModel(SQLModel, table=True):
32
- __tablename__ = "tasks"
33
- id: str = Field(primary_key=True)
34
- title: str
35
- description: str
36
- requirement_ids_json: str = Field(default="[]")
37
- acceptance_criterion_ids_json: str = Field(default="[]")
38
- planned_files_json: str = Field(default="[]")
39
- expected_tests_json: str = Field(default="[]")
40
- allowed_commands_json: str = Field(default="[]")
41
- forbidden_changes_json: str = Field(default="[]")
42
- status: str = "planned"
43
-
44
- class EvidenceModel(SQLModel, table=True):
45
- __tablename__ = "evidence"
46
- id: Optional[int] = Field(default=None, primary_key=True)
47
- type: str # "command", "diff", "test"
48
- task_id: Optional[str] = None
49
- requirement_id: Optional[str] = None
50
- acceptance_criterion_id: Optional[str] = None
51
- data_json: str
52
-
53
- class GapModel(SQLModel, table=True):
54
- __tablename__ = "gaps"
55
- id: str = Field(primary_key=True)
56
- severity: str
57
- gap_type: str
58
- requirement_id: Optional[str] = None
59
- task_id: Optional[str] = None
60
- description: str
61
- evidence_json: str = Field(default="[]")
62
- recommended_fix: str
63
- blocking: bool
64
-
65
- class CritiqueFindingModel(SQLModel, table=True):
66
- __tablename__ = "critique_findings"
67
- id: str = Field(primary_key=True)
68
- source_agent: str
69
- target_plan_id: str
70
- severity: str
71
- finding_type: str
72
- claim: str
73
- linked_requirement_id: Optional[str] = None
74
- suggested_requirement: Optional[str] = None
75
- suggested_task: Optional[str] = None
76
- falsifiable_check: str
77
- status: str = "open"
78
-
79
- class ProjectStateModel(SQLModel, table=True):
80
- __tablename__ = "project_state"
81
- id: str = Field(primary_key=True, default="singleton")
82
- current_phase: str
83
- history_json: str = Field(default="[]")
1
+ from sqlmodel import SQLModel, Field
2
+ from typing import Optional
3
+
4
+
5
+ class SchemaVersionModel(SQLModel, table=True):
6
+ __tablename__ = "schema_version"
7
+ id: str = Field(primary_key=True, default="singleton")
8
+ version: int
9
+
10
+ class RequirementModel(SQLModel, table=True):
11
+ __tablename__ = "requirements"
12
+ id: str = Field(primary_key=True)
13
+ title: str
14
+ description: str
15
+ priority: str
16
+ source: str
17
+ # Store complex lists as JSON strings for simplicity in SQLite
18
+ acceptance_criteria_json: str = Field(default="[]")
19
+
20
+ class AssumptionModel(SQLModel, table=True):
21
+ __tablename__ = "assumptions"
22
+ id: str = Field(primary_key=True)
23
+ statement: str
24
+ confidence: str
25
+ impact: str
26
+ reversible: bool
27
+ requires_user_confirmation: bool
28
+ linked_requirement_ids_json: str = Field(default="[]")
29
+ status: str = "open"
30
+
31
+ class TaskModel(SQLModel, table=True):
32
+ __tablename__ = "tasks"
33
+ id: str = Field(primary_key=True)
34
+ title: str
35
+ description: str
36
+ requirement_ids_json: str = Field(default="[]")
37
+ acceptance_criterion_ids_json: str = Field(default="[]")
38
+ planned_files_json: str = Field(default="[]")
39
+ expected_tests_json: str = Field(default="[]")
40
+ allowed_commands_json: str = Field(default="[]")
41
+ forbidden_changes_json: str = Field(default="[]")
42
+ status: str = "planned"
43
+
44
+ class EvidenceModel(SQLModel, table=True):
45
+ __tablename__ = "evidence"
46
+ id: Optional[int] = Field(default=None, primary_key=True)
47
+ type: str # "command", "diff", "test"
48
+ task_id: Optional[str] = None
49
+ requirement_id: Optional[str] = None
50
+ acceptance_criterion_id: Optional[str] = None
51
+ data_json: str
52
+
53
+ class GapModel(SQLModel, table=True):
54
+ __tablename__ = "gaps"
55
+ id: str = Field(primary_key=True)
56
+ severity: str
57
+ gap_type: str
58
+ requirement_id: Optional[str] = None
59
+ task_id: Optional[str] = None
60
+ description: str
61
+ evidence_json: str = Field(default="[]")
62
+ recommended_fix: str
63
+ blocking: bool
64
+
65
+ class CritiqueFindingModel(SQLModel, table=True):
66
+ __tablename__ = "critique_findings"
67
+ id: str = Field(primary_key=True)
68
+ source_agent: str
69
+ target_plan_id: str
70
+ severity: str
71
+ finding_type: str
72
+ claim: str
73
+ linked_requirement_id: Optional[str] = None
74
+ suggested_requirement: Optional[str] = None
75
+ suggested_task: Optional[str] = None
76
+ falsifiable_check: str
77
+ status: str = "open"
78
+
79
+ class ProjectStateModel(SQLModel, table=True):
80
+ __tablename__ = "project_state"
81
+ id: str = Field(primary_key=True, default="singleton")
82
+ current_phase: str
83
+ history_json: str = Field(default="[]")