buildlog 0.9.0__py3-none-any.whl → 0.10.1__py3-none-any.whl

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 (23) hide show
  1. buildlog/cli.py +304 -26
  2. buildlog/constants.py +160 -0
  3. buildlog/core/__init__.py +44 -0
  4. buildlog/core/operations.py +1170 -0
  5. buildlog/data/seeds/bragi.yaml +61 -0
  6. buildlog/mcp/__init__.py +51 -3
  7. buildlog/mcp/server.py +36 -0
  8. buildlog/mcp/tools.py +526 -12
  9. {buildlog-0.9.0.data → buildlog-0.10.1.data}/data/share/buildlog/post_gen.py +10 -5
  10. buildlog-0.10.1.data/data/share/buildlog/template/buildlog/.gitkeep +0 -0
  11. buildlog-0.10.1.data/data/share/buildlog/template/buildlog/assets/.gitkeep +0 -0
  12. {buildlog-0.9.0.dist-info → buildlog-0.10.1.dist-info}/METADATA +28 -26
  13. {buildlog-0.9.0.dist-info → buildlog-0.10.1.dist-info}/RECORD +23 -19
  14. {buildlog-0.9.0.data → buildlog-0.10.1.data}/data/share/buildlog/copier.yml +0 -0
  15. {buildlog-0.9.0.data/data/share/buildlog/template/buildlog → buildlog-0.10.1.data/data/share/buildlog/template/buildlog/.buildlog}/.gitkeep +0 -0
  16. {buildlog-0.9.0.data/data/share/buildlog/template/buildlog/assets → buildlog-0.10.1.data/data/share/buildlog/template/buildlog/.buildlog/seeds}/.gitkeep +0 -0
  17. {buildlog-0.9.0.data → buildlog-0.10.1.data}/data/share/buildlog/template/buildlog/2026-01-01-example.md +0 -0
  18. {buildlog-0.9.0.data → buildlog-0.10.1.data}/data/share/buildlog/template/buildlog/BUILDLOG_SYSTEM.md +0 -0
  19. {buildlog-0.9.0.data → buildlog-0.10.1.data}/data/share/buildlog/template/buildlog/_TEMPLATE.md +0 -0
  20. {buildlog-0.9.0.data → buildlog-0.10.1.data}/data/share/buildlog/template/buildlog/_TEMPLATE_QUICK.md +0 -0
  21. {buildlog-0.9.0.dist-info → buildlog-0.10.1.dist-info}/WHEEL +0 -0
  22. {buildlog-0.9.0.dist-info → buildlog-0.10.1.dist-info}/entry_points.txt +0 -0
  23. {buildlog-0.9.0.dist-info → buildlog-0.10.1.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,61 @@
1
+ # Bragi - LLM Prose Pattern Detection (named for the skald of the Aesir)
2
+ # Detect and flag synthetic-sounding prose patterns common in LLM-generated text
3
+ # These patterns aren't inherently wrong, but their overuse signals machine authorship
4
+
5
+ persona: bragi
6
+ version: 1
7
+
8
+ rules:
9
+ - rule: "Em-dash usage"
10
+ category: prose
11
+ context: "Anywhere: headlines, parentheticals, contrasts, asides"
12
+ antipattern: "Any use of em dashes (—). Includes 'Not X — Y' pivots, parenthetical asides, and dramatic pauses."
13
+ rationale: "LLMs deploy em dashes constantly and poorly. Ban them outright. Use colons, semicolons, commas, parentheses, or separate sentences instead."
14
+
15
+ - rule: "Dismissive 'with' framing"
16
+ category: prose
17
+ context: "Feature descriptions, project summaries, demo introductions"
18
+ antipattern: "'A demo with persistence', 'a prototype with authentication' — reducing a significant feature to a prepositional afterthought"
19
+ rationale: "Makes complex work sound trivially assembled. Signals the author hasn't weighed the feature's actual cost."
20
+
21
+ - rule: "Tricolon and five-item enumerations"
22
+ category: prose
23
+ context: "Value propositions, team descriptions, capability lists"
24
+ antipattern: "'They execute, improvise, and forget' or 'fast, reliable, scalable, secure, and observable' — rhythmic clause lists"
25
+ rationale: "LLMs default to tricolons and pentalogies for rhetorical rhythm. Real technical writing itemizes what matters, not what sounds balanced."
26
+
27
+ - rule: "Performative honesty"
28
+ category: prose
29
+ context: "Status updates, retrospectives, project assessments"
30
+ antipattern: "'Being honest about where things are:', 'To be frank:', 'The truth is:' — flagging your own candor"
31
+ rationale: "If you have to announce you're being honest, the surrounding text is performing. Just state the thing."
32
+
33
+ - rule: "Self-referential pivot"
34
+ category: prose
35
+ context: "Comparative sections, differentiation arguments"
36
+ antipattern: "'This is where X diverges from...', 'This is where things get interesting' — narrating the structure of your own argument"
37
+ rationale: "Meta-commentary about your own text is a crutch. Make the point; don't announce you're about to make it."
38
+
39
+ - rule: "Punchy fragment marketing copy"
40
+ category: prose
41
+ context: "Taglines, hero sections, feature callouts"
42
+ antipattern: "'One knowledge base, every agent surface.' — sentence fragments styled as advertising slogans"
43
+ rationale: "Technical docs aren't ad copy. Fragment slogans trade precision for vibes."
44
+
45
+ - rule: "Colon-into-bold-statement"
46
+ category: prose
47
+ context: "Section transitions, key takeaways, framing statements"
48
+ antipattern: "'The question it answers: **How do you...**' — colon followed by a bolded rhetorical question or declaration"
49
+ rationale: "This is a formatting crutch that substitutes typographic emphasis for actual argumentative weight."
50
+
51
+ - rule: "Rhythmic parallel construction closers"
52
+ category: prose
53
+ context: "Paragraph endings, section closers, conclusions"
54
+ antipattern: "'decisions tied to outcomes, updated by evidence, grounded in practice' — parallel participial phrases as closers"
55
+ rationale: "These read as sermon cadences. They sound authoritative but say little. End with a concrete claim instead."
56
+
57
+ - rule: "Hedging with 'not' lists"
58
+ category: prose
59
+ context: "Definitions, scope statements, positioning"
60
+ antipattern: "'This is not X. Not Y. Not Z.' — defining something entirely by what it isn't, in staccato negation"
61
+ rationale: "Negative definition is evasive. Say what the thing is. Reserve negation for genuine disambiguation."
buildlog/mcp/__init__.py CHANGED
@@ -1,17 +1,65 @@
1
1
  """MCP server for buildlog integration."""
2
2
 
3
3
  from buildlog.mcp.tools import (
4
+ buildlog_bandit_status,
5
+ buildlog_commit,
4
6
  buildlog_diff,
7
+ buildlog_distill,
8
+ buildlog_entry_list,
9
+ buildlog_entry_new,
10
+ buildlog_experiment_end,
11
+ buildlog_experiment_metrics,
12
+ buildlog_experiment_report,
13
+ buildlog_experiment_start,
14
+ buildlog_gauntlet_accept_risk,
15
+ buildlog_gauntlet_generate,
16
+ buildlog_gauntlet_issues,
17
+ buildlog_gauntlet_list_personas,
18
+ buildlog_gauntlet_loop,
19
+ buildlog_gauntlet_prompt,
20
+ buildlog_gauntlet_rules,
21
+ buildlog_init,
5
22
  buildlog_learn_from_review,
23
+ buildlog_log_mistake,
24
+ buildlog_log_reward,
25
+ buildlog_overview,
6
26
  buildlog_promote,
7
27
  buildlog_reject,
28
+ buildlog_rewards,
29
+ buildlog_skills,
30
+ buildlog_stats,
8
31
  buildlog_status,
32
+ buildlog_update,
9
33
  )
10
34
 
11
35
  __all__ = [
12
- "buildlog_status",
13
- "buildlog_promote",
14
- "buildlog_reject",
36
+ "buildlog_bandit_status",
37
+ "buildlog_commit",
15
38
  "buildlog_diff",
39
+ "buildlog_distill",
40
+ "buildlog_entry_list",
41
+ "buildlog_entry_new",
42
+ "buildlog_experiment_end",
43
+ "buildlog_experiment_metrics",
44
+ "buildlog_experiment_report",
45
+ "buildlog_experiment_start",
46
+ "buildlog_gauntlet_accept_risk",
47
+ "buildlog_gauntlet_generate",
48
+ "buildlog_gauntlet_issues",
49
+ "buildlog_gauntlet_list_personas",
50
+ "buildlog_gauntlet_loop",
51
+ "buildlog_gauntlet_prompt",
52
+ "buildlog_gauntlet_rules",
53
+ "buildlog_init",
16
54
  "buildlog_learn_from_review",
55
+ "buildlog_log_mistake",
56
+ "buildlog_log_reward",
57
+ "buildlog_overview",
58
+ "buildlog_promote",
59
+ "buildlog_reject",
60
+ "buildlog_rewards",
61
+ "buildlog_skills",
62
+ "buildlog_stats",
63
+ "buildlog_status",
64
+ "buildlog_update",
17
65
  ]
buildlog/mcp/server.py CHANGED
@@ -6,20 +6,34 @@ from mcp.server.fastmcp import FastMCP
6
6
 
7
7
  from buildlog.mcp.tools import (
8
8
  buildlog_bandit_status,
9
+ buildlog_commit,
9
10
  buildlog_diff,
11
+ buildlog_distill,
12
+ buildlog_entry_list,
13
+ buildlog_entry_new,
10
14
  buildlog_experiment_end,
11
15
  buildlog_experiment_metrics,
12
16
  buildlog_experiment_report,
13
17
  buildlog_experiment_start,
14
18
  buildlog_gauntlet_accept_risk,
19
+ buildlog_gauntlet_generate,
15
20
  buildlog_gauntlet_issues,
21
+ buildlog_gauntlet_list_personas,
22
+ buildlog_gauntlet_loop,
23
+ buildlog_gauntlet_prompt,
24
+ buildlog_gauntlet_rules,
25
+ buildlog_init,
16
26
  buildlog_learn_from_review,
17
27
  buildlog_log_mistake,
18
28
  buildlog_log_reward,
29
+ buildlog_overview,
19
30
  buildlog_promote,
20
31
  buildlog_reject,
21
32
  buildlog_rewards,
33
+ buildlog_skills,
34
+ buildlog_stats,
22
35
  buildlog_status,
36
+ buildlog_update,
23
37
  )
24
38
 
25
39
  mcp = FastMCP("buildlog")
@@ -47,6 +61,28 @@ mcp.tool()(buildlog_gauntlet_accept_risk)
47
61
  # Bandit tools
48
62
  mcp.tool()(buildlog_bandit_status)
49
63
 
64
+ # Entry & overview tools
65
+ mcp.tool()(buildlog_gauntlet_rules)
66
+ mcp.tool()(buildlog_overview)
67
+ mcp.tool()(buildlog_entry_new)
68
+ mcp.tool()(buildlog_entry_list)
69
+
70
+ # P0: Gauntlet loop completion
71
+ mcp.tool()(buildlog_commit)
72
+ mcp.tool()(buildlog_gauntlet_prompt)
73
+ mcp.tool()(buildlog_gauntlet_loop)
74
+
75
+ # P1: Learning pipeline
76
+ mcp.tool()(buildlog_distill)
77
+ mcp.tool()(buildlog_skills)
78
+ mcp.tool()(buildlog_stats)
79
+ mcp.tool()(buildlog_gauntlet_list_personas)
80
+
81
+ # P2: Nice-to-have
82
+ mcp.tool()(buildlog_gauntlet_generate)
83
+ mcp.tool()(buildlog_init)
84
+ mcp.tool()(buildlog_update)
85
+
50
86
 
51
87
  def main() -> None:
52
88
  """Run the MCP server."""