traceforge-toolkit 0.1.0__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 (205) hide show
  1. traceforge/__init__.py +72 -0
  2. traceforge/__main__.py +5 -0
  3. traceforge/_generated.py +254 -0
  4. traceforge/adapters/__init__.py +12 -0
  5. traceforge/adapters/base.py +82 -0
  6. traceforge/adapters/genai_otel.py +164 -0
  7. traceforge/adapters/mapped_json.py +297 -0
  8. traceforge/adapters/otel.py +220 -0
  9. traceforge/boundary/__init__.py +46 -0
  10. traceforge/boundary/data/boundary-model.joblib +0 -0
  11. traceforge/boundary/decode.py +87 -0
  12. traceforge/boundary/features.py +137 -0
  13. traceforge/boundary/inference.py +267 -0
  14. traceforge/boundary/inferencer.py +146 -0
  15. traceforge/classify/__init__.py +95 -0
  16. traceforge/classify/cmd.py +109 -0
  17. traceforge/classify/coding.py +213 -0
  18. traceforge/classify/config.py +554 -0
  19. traceforge/classify/core.py +266 -0
  20. traceforge/classify/data/binary_info.yaml +358 -0
  21. traceforge/classify/data/canonical_tools.yaml +251 -0
  22. traceforge/classify/data/effect_overrides.yaml +480 -0
  23. traceforge/classify/data/mcp_profiles.yaml +711 -0
  24. traceforge/classify/data/recommendation_rules.yaml +111 -0
  25. traceforge/classify/data/risk.yaml +534 -0
  26. traceforge/classify/data/shell_defaults.yaml +95 -0
  27. traceforge/classify/data/shell_rules.yaml +1192 -0
  28. traceforge/classify/data/tool_classifications.yaml +215 -0
  29. traceforge/classify/data/verb_inference.yaml +218 -0
  30. traceforge/classify/mcp.py +181 -0
  31. traceforge/classify/phases.py +75 -0
  32. traceforge/classify/powershell.py +93 -0
  33. traceforge/classify/registry.py +138 -0
  34. traceforge/classify/risk.py +553 -0
  35. traceforge/classify/rules.py +215 -0
  36. traceforge/classify/schema.yaml +282 -0
  37. traceforge/classify/shell.py +503 -0
  38. traceforge/classify/tools.py +91 -0
  39. traceforge/classify/workflow.py +32 -0
  40. traceforge/cli/__init__.py +42 -0
  41. traceforge/cli/config_cmd.py +130 -0
  42. traceforge/cli/detect.py +46 -0
  43. traceforge/cli/download_cmd.py +74 -0
  44. traceforge/cli/factory.py +60 -0
  45. traceforge/cli/gate_cmd.py +30 -0
  46. traceforge/cli/init_cmd.py +86 -0
  47. traceforge/cli/replay.py +130 -0
  48. traceforge/cli/runner.py +181 -0
  49. traceforge/cli/score.py +217 -0
  50. traceforge/cli/status.py +65 -0
  51. traceforge/cli/watch.py +297 -0
  52. traceforge/config/__init__.py +80 -0
  53. traceforge/config/defaults.py +149 -0
  54. traceforge/config/loader.py +239 -0
  55. traceforge/config/mappings.py +104 -0
  56. traceforge/config/models.py +579 -0
  57. traceforge/enricher.py +576 -0
  58. traceforge/formatting/__init__.py +12 -0
  59. traceforge/formatting/budget.py +92 -0
  60. traceforge/formatting/density.py +154 -0
  61. traceforge/gate/__init__.py +17 -0
  62. traceforge/gate/client.py +145 -0
  63. traceforge/gate/external.py +305 -0
  64. traceforge/gate/registry.py +108 -0
  65. traceforge/gate/server.py +174 -0
  66. traceforge/gates/__init__.py +8 -0
  67. traceforge/gates/pii.py +352 -0
  68. traceforge/gates/pii_patterns.yaml +228 -0
  69. traceforge/governance/__init__.py +121 -0
  70. traceforge/governance/assessor.py +441 -0
  71. traceforge/governance/budget.py +59 -0
  72. traceforge/governance/canonical.py +56 -0
  73. traceforge/governance/codec.py +414 -0
  74. traceforge/governance/context.py +249 -0
  75. traceforge/governance/drift.py +196 -0
  76. traceforge/governance/emitter.py +234 -0
  77. traceforge/governance/envelope.py +138 -0
  78. traceforge/governance/ifc.py +364 -0
  79. traceforge/governance/integrity.py +162 -0
  80. traceforge/governance/labeler.py +250 -0
  81. traceforge/governance/mcp_drift.py +328 -0
  82. traceforge/governance/monitor.py +539 -0
  83. traceforge/governance/observer.py +276 -0
  84. traceforge/governance/persistence.py +401 -0
  85. traceforge/governance/phase1.py +77 -0
  86. traceforge/governance/pii.py +276 -0
  87. traceforge/governance/pipeline.py +840 -0
  88. traceforge/governance/registry.py +110 -0
  89. traceforge/governance/results.py +183 -0
  90. traceforge/governance/risk_wrapper.py +113 -0
  91. traceforge/governance/rules.py +368 -0
  92. traceforge/governance/scorer.py +262 -0
  93. traceforge/governance/shield.py +318 -0
  94. traceforge/governance/state.py +466 -0
  95. traceforge/governance/types.py +176 -0
  96. traceforge/mappings/__init__.py +1 -0
  97. traceforge/mappings/aider.yaml +216 -0
  98. traceforge/mappings/aider_markdown.yaml +113 -0
  99. traceforge/mappings/amazonq.yaml +56 -0
  100. traceforge/mappings/antigravity.yaml +88 -0
  101. traceforge/mappings/claude.yaml +93 -0
  102. traceforge/mappings/cline.yaml +286 -0
  103. traceforge/mappings/codex.yaml +158 -0
  104. traceforge/mappings/continue_dev.yaml +57 -0
  105. traceforge/mappings/copilot.yaml +266 -0
  106. traceforge/mappings/copilot_markdown.yaml +72 -0
  107. traceforge/mappings/copilot_vscode.yaml +181 -0
  108. traceforge/mappings/crewai.yaml +592 -0
  109. traceforge/mappings/goose.yaml +128 -0
  110. traceforge/mappings/langgraph.yaml +165 -0
  111. traceforge/mappings/maf.yaml +90 -0
  112. traceforge/mappings/maf_transcript.yaml +99 -0
  113. traceforge/mappings/openai_agents.yaml +144 -0
  114. traceforge/mappings/opencode.yaml +473 -0
  115. traceforge/mappings/openhands.yaml +320 -0
  116. traceforge/mappings/pydantic_ai.yaml +183 -0
  117. traceforge/mappings/smolagents.yaml +89 -0
  118. traceforge/mappings/sweagent.yaml +82 -0
  119. traceforge/migrations/__init__.py +1 -0
  120. traceforge/migrations/env.py +60 -0
  121. traceforge/migrations/models.py +145 -0
  122. traceforge/migrations/runner.py +44 -0
  123. traceforge/migrations/script.py.mako +25 -0
  124. traceforge/migrations/versions/0001_initial.py +176 -0
  125. traceforge/migrations/versions/__init__.py +4 -0
  126. traceforge/models.py +29 -0
  127. traceforge/parsers/__init__.py +21 -0
  128. traceforge/parsers/aider.py +416 -0
  129. traceforge/parsers/base.py +226 -0
  130. traceforge/parsers/copilot.py +314 -0
  131. traceforge/phase/__init__.py +50 -0
  132. traceforge/phase/data/phase-model.joblib +0 -0
  133. traceforge/phase/data/potion-base-8M/README.md +99 -0
  134. traceforge/phase/data/potion-base-8M/config.json +13 -0
  135. traceforge/phase/data/potion-base-8M/model.safetensors +0 -0
  136. traceforge/phase/data/potion-base-8M/modules.json +14 -0
  137. traceforge/phase/data/potion-base-8M/tokenizer.json +1 -0
  138. traceforge/phase/event_rows.py +107 -0
  139. traceforge/phase/features.py +468 -0
  140. traceforge/phase/inference.py +279 -0
  141. traceforge/phase/inferencer.py +171 -0
  142. traceforge/phase/segmentation.py +258 -0
  143. traceforge/pipeline.py +891 -0
  144. traceforge/preprocessors/__init__.py +34 -0
  145. traceforge/preprocessors/amazonq.py +224 -0
  146. traceforge/preprocessors/antigravity.py +116 -0
  147. traceforge/preprocessors/claude.py +95 -0
  148. traceforge/preprocessors/cline.py +36 -0
  149. traceforge/preprocessors/codex.py +311 -0
  150. traceforge/preprocessors/continue_dev.py +119 -0
  151. traceforge/preprocessors/copilot_vscode.py +171 -0
  152. traceforge/preprocessors/goose.py +156 -0
  153. traceforge/preprocessors/maf_transcript.py +84 -0
  154. traceforge/preprocessors/openai_agents.py +86 -0
  155. traceforge/preprocessors/opencode.py +85 -0
  156. traceforge/preprocessors/openhands.py +36 -0
  157. traceforge/preprocessors/pydantic_ai.py +62 -0
  158. traceforge/preprocessors/registry.py +24 -0
  159. traceforge/preprocessors/smolagents.py +90 -0
  160. traceforge/py.typed +0 -0
  161. traceforge/sdk/__init__.py +59 -0
  162. traceforge/sdk/gate_policy.py +63 -0
  163. traceforge/sdk/gate_types.py +140 -0
  164. traceforge/sdk/pipeline.py +265 -0
  165. traceforge/sdk/verdict.py +81 -0
  166. traceforge/sinks/__init__.py +23 -0
  167. traceforge/sinks/base.py +95 -0
  168. traceforge/sinks/callback.py +132 -0
  169. traceforge/sinks/console.py +112 -0
  170. traceforge/sinks/factory.py +94 -0
  171. traceforge/sinks/jsonl.py +125 -0
  172. traceforge/sinks/otel_exporter.py +212 -0
  173. traceforge/sinks/parquet.py +260 -0
  174. traceforge/sinks/s3.py +206 -0
  175. traceforge/sinks/sqlite_output.py +234 -0
  176. traceforge/sinks/webhook.py +136 -0
  177. traceforge/sources/__init__.py +18 -0
  178. traceforge/sources/auto_detect.py +173 -0
  179. traceforge/sources/base.py +45 -0
  180. traceforge/sources/file_poll.py +136 -0
  181. traceforge/sources/file_watch.py +221 -0
  182. traceforge/sources/http_poll.py +141 -0
  183. traceforge/sources/replay.py +63 -0
  184. traceforge/sources/sqlite.py +187 -0
  185. traceforge/sources/sse.py +198 -0
  186. traceforge/telemetry/__init__.py +192 -0
  187. traceforge/title/__init__.py +23 -0
  188. traceforge/title/_resolve.py +79 -0
  189. traceforge/title/context.py +295 -0
  190. traceforge/title/data/boilerplate_files.json +14 -0
  191. traceforge/title/heuristics.py +429 -0
  192. traceforge/title/hygiene.py +90 -0
  193. traceforge/title/inference.py +314 -0
  194. traceforge/title/inferencer.py +477 -0
  195. traceforge/title/naming.py +398 -0
  196. traceforge/trace.py +291 -0
  197. traceforge/tracking/__init__.py +30 -0
  198. traceforge/tracking/models.py +115 -0
  199. traceforge/tracking/phase_tracker.py +288 -0
  200. traceforge/types.py +315 -0
  201. traceforge_toolkit-0.1.0.dist-info/METADATA +188 -0
  202. traceforge_toolkit-0.1.0.dist-info/RECORD +205 -0
  203. traceforge_toolkit-0.1.0.dist-info/WHEEL +4 -0
  204. traceforge_toolkit-0.1.0.dist-info/entry_points.txt +2 -0
  205. traceforge_toolkit-0.1.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,109 @@
1
+ """cmd.exe command classification via lightweight tokenization.
2
+
3
+ No tree-sitter grammar exists for cmd.exe with sufficient maturity.
4
+ Uses simple splitting on & and && operators (respecting quotes) and
5
+ the shared rule table for binary-level classification.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import os
11
+ import re
12
+ from typing import TYPE_CHECKING
13
+
14
+ from traceforge.classify.core import Classification
15
+ from traceforge.classify.coding import CodingMechanism
16
+ from traceforge.classify.shell import (
17
+ build_classification_from_commands,
18
+ classify_single_command,
19
+ )
20
+
21
+ if TYPE_CHECKING:
22
+ from traceforge.classify.config import ClassificationEngine
23
+
24
+ _STRIP_BINARY_EXT = re.compile(r"\.(exe|cmd|bat|ps1|sh|com)$", re.IGNORECASE)
25
+
26
+
27
+ def _split_cmd_commands(command: str) -> list[str]:
28
+ """Split a cmd.exe command on & and && operators, respecting quotes."""
29
+ segments: list[str] = []
30
+ current = ""
31
+ i = 0
32
+ in_dquote = False
33
+
34
+ while i < len(command):
35
+ ch = command[i]
36
+ if ch == '"':
37
+ in_dquote = not in_dquote
38
+ current += ch
39
+ elif ch == "&" and not in_dquote:
40
+ if current.strip():
41
+ segments.append(current.strip())
42
+ current = ""
43
+ if i + 1 < len(command) and command[i + 1] == "&":
44
+ i += 1
45
+ else:
46
+ current += ch
47
+ i += 1
48
+
49
+ if current.strip():
50
+ segments.append(current.strip())
51
+ return segments
52
+
53
+
54
+ def _extract_binary_and_subcmd(segment: str) -> tuple[str, str | None, list[str]]:
55
+ """Extract binary, first positional arg, and flags from a cmd segment."""
56
+ parts = segment.split()
57
+ if not parts:
58
+ return "", None, []
59
+
60
+ binary = _STRIP_BINARY_EXT.sub("", os.path.basename(parts[0]).lower())
61
+
62
+ subcmd = None
63
+ flags: list[str] = []
64
+ for p in parts[1:]:
65
+ if p.startswith("/") or p.startswith("-"):
66
+ flags.append(p)
67
+ elif subcmd is None:
68
+ subcmd = p
69
+
70
+ return binary, subcmd, flags
71
+
72
+
73
+ def classify_cmd_command(
74
+ command: str,
75
+ *,
76
+ engine: ClassificationEngine,
77
+ ) -> Classification:
78
+ """Classify a cmd.exe command string into a full Classification."""
79
+ if not command or not command.strip():
80
+ return Classification(
81
+ mechanism=CodingMechanism.PROCESS_SHELL,
82
+ effect=None,
83
+ )
84
+
85
+ segments = _split_cmd_commands(command)
86
+ if not segments:
87
+ return Classification(
88
+ mechanism=CodingMechanism.PROCESS_SHELL,
89
+ effect=None,
90
+ )
91
+
92
+ from traceforge.classify.shell import _CommandClassification
93
+
94
+ command_results: list[_CommandClassification] = []
95
+ for segment in segments:
96
+ binary, subcmd, flags = _extract_binary_and_subcmd(segment)
97
+ if not binary:
98
+ continue
99
+ cmd_cls = classify_single_command(binary, subcmd, flags, engine=engine)
100
+ command_results.append(cmd_cls)
101
+
102
+ if not command_results:
103
+ return Classification(
104
+ mechanism=CodingMechanism.PROCESS_SHELL,
105
+ effect=None,
106
+ capability=frozenset({"subprocess"}),
107
+ )
108
+
109
+ return build_classification_from_commands(command_results, shell_dialect="cmd")
@@ -0,0 +1,213 @@
1
+ """Coding domain subtypes — extends core dimensions for software engineering agents.
2
+
3
+ Ships built-in with traceforge. Registered automatically on import.
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ from enum import StrEnum
9
+
10
+
11
+ # ── Shell-specific types (coding domain only) ──
12
+
13
+
14
+ class ShellDialect(StrEnum):
15
+ """Shell language dialect for process.shell mechanism."""
16
+
17
+ BASH = "bash"
18
+ POWERSHELL = "powershell"
19
+ CMD = "cmd"
20
+ ZSH = "zsh"
21
+ FISH = "fish"
22
+ POSIX_SH = "posix_sh"
23
+
24
+
25
+ class ShellStructure(StrEnum):
26
+ """Shell-specific structural patterns (extends core Structure)."""
27
+
28
+ PIPED = "piped"
29
+ REDIRECTED = "redirected"
30
+
31
+
32
+ # ── Mechanism subtypes ──
33
+
34
+
35
+ class CodingMechanism(StrEnum):
36
+ """Coding-specific mechanism subtypes.
37
+
38
+ Extends core Mechanism with finer-grained resource domains specific to
39
+ software development. Mechanism is the resource domain ONLY — what the
40
+ tool talks to. Direction/intent is expressed through Action and Effect.
41
+ """
42
+
43
+ PROCESS_SHELL = "process.shell" # Runs commands in a shell (bash, powershell)
44
+ PROCESS_REPL = "process.repl" # Interactive language runtime (python, node)
45
+ PROCESS_DEBUG = "process.debug" # Debugger attached to a process (gdb, lldb)
46
+ NETWORK_HTTP = "network.http" # HTTP/HTTPS requests (fetch, curl, API calls)
47
+ DATABASE_SQL = "database.sql" # SQL database queries (postgres, mysql, sqlite)
48
+ DATABASE_NOSQL = "database.nosql" # NoSQL database operations (mongo, redis)
49
+ DELEGATION_AGENT = "delegation.agent" # Spawns a sub-agent to do work
50
+ DELEGATION_SELF = "delegation.self" # Self-delegates (plans, checkpoints)
51
+ COMMUNICATION_USER = "communication.user" # Talks to the human user
52
+ COMMUNICATION_SYSTEM = "communication.system" # Internal agent bookkeeping
53
+
54
+
55
+ # ── Scope subtypes ──
56
+
57
+
58
+ class CodingScope(StrEnum):
59
+ """Coding-specific scope subtypes."""
60
+
61
+ SOURCE_CODE = "artifact.source_code"
62
+ TEST_CODE = "artifact.test_code"
63
+ BUILD_OUTPUT = "artifact.build_output"
64
+ CONTAINER_IMAGE = "artifact.container_image"
65
+ PACKAGE = "artifact.package"
66
+ DOCUMENTATION = "artifact.documentation"
67
+ API_SPEC = "artifact.api_spec"
68
+ REPOSITORY = "artifact.repository"
69
+ DEPENDENCY = "configuration.dependency"
70
+ ENVIRONMENT = "configuration.environment"
71
+ INFRASTRUCTURE = "configuration.infrastructure"
72
+ CI_CD_CONFIG = "configuration.ci_cd"
73
+ PROCESS = "state.process"
74
+ SERVICE = "state.service"
75
+ DEPLOYMENT = "state.deployment"
76
+ VCS_STATE = "state.repository"
77
+
78
+
79
+ # ── Role subtypes ──
80
+
81
+
82
+ class CodingRole(StrEnum):
83
+ """Coding-specific role subtypes."""
84
+
85
+ # validator.*
86
+ LINTER = "validator.linter"
87
+ TEST_RUNNER = "validator.test_runner"
88
+ TYPE_CHECKER = "validator.type_checker"
89
+ SECURITY_SCANNER = "validator.security_scanner"
90
+ BUILD_CHECKER = "validator.build_checker"
91
+
92
+ # transformer.*
93
+ COMPILER = "transformer.compiler"
94
+ FORMATTER = "transformer.formatter"
95
+ BUNDLER = "transformer.bundler"
96
+ TRANSPILER = "transformer.transpiler"
97
+ MINIFIER = "transformer.minifier"
98
+ REFACTORER = "transformer.refactorer"
99
+
100
+ # generator.*
101
+ CODE_GENERATOR = "generator.code_generator"
102
+ SCAFFOLDER = "generator.scaffolder"
103
+ DOC_GENERATOR = "generator.doc_generator"
104
+
105
+ # executor.*
106
+ SCRIPT_RUNNER = "executor.script_runner"
107
+ REPL = "executor.repl"
108
+ CONTAINER_RUNTIME = "executor.container_runtime"
109
+
110
+ # orchestrator.*
111
+ PACKAGE_MANAGER = "orchestrator.package_manager"
112
+ TASK_RUNNER = "orchestrator.task_runner"
113
+ CI_CD = "orchestrator.ci_cd"
114
+
115
+ # observer.*
116
+ DEBUGGER = "observer.debugger"
117
+ PROFILER = "observer.profiler"
118
+ LOGGER = "observer.logger"
119
+
120
+ # retriever.*
121
+ SEARCH_INDEX = "retriever.search_index"
122
+ FILE_BROWSER = "retriever.file_browser"
123
+ WEB_SCRAPER = "retriever.web_scraper"
124
+ API_CLIENT = "retriever.api_client"
125
+
126
+ # modifier.*
127
+ FILE_EDITOR = "modifier.file_editor"
128
+
129
+ # persistence.*
130
+ VERSION_CONTROL = "persistence.version_control"
131
+ DATABASE = "persistence.database"
132
+ CACHE = "persistence.cache"
133
+
134
+ # communicator.*
135
+ USER_PROMPT = "communicator.user_prompt"
136
+ SYSTEM_REPORTER = "communicator.system_reporter"
137
+
138
+
139
+ # ── Action subtypes ──
140
+
141
+
142
+ class CodingAction(StrEnum):
143
+ """Coding-specific action subtypes.
144
+
145
+ Actions are pure verbs. Use Mechanism/Scope for object/target context.
146
+ """
147
+
148
+ # validate.*
149
+ LINT = "validate.lint"
150
+ TEST = "validate.test"
151
+ TYPECHECK = "validate.typecheck"
152
+ SECURITY_SCAN = "validate.security_scan"
153
+ BUILD_CHECK = "validate.build_check"
154
+
155
+ # retrieve.*
156
+ SEARCH = "retrieve.search"
157
+ READ = "retrieve.read"
158
+ QUERY = "retrieve.query"
159
+ BROWSE = "retrieve.browse"
160
+
161
+ # transform.*
162
+ COMPILE = "transform.compile"
163
+ FORMAT = "transform.format"
164
+ BUNDLE = "transform.bundle"
165
+ TRANSPILE = "transform.transpile"
166
+ REFACTOR = "transform.refactor"
167
+
168
+ # generate.*
169
+ CODE_GEN = "generate.code"
170
+ SCAFFOLD = "generate.scaffold"
171
+ DOC_GEN = "generate.documentation"
172
+
173
+ # execute.*
174
+ RUN_SCRIPT = "execute.script"
175
+ RUN_SERVICE = "execute.service"
176
+ RUN_REPL = "execute.repl"
177
+ RUN_COMMAND = "execute.run_script"
178
+
179
+ # deliver.*
180
+ DEPLOY = "deliver.deploy"
181
+ PUBLISH = "deliver.publish"
182
+ PUSH = "deliver.push"
183
+ RELEASE = "deliver.release"
184
+
185
+ # configure.*
186
+ INSTALL = "configure.install"
187
+ SETUP = "configure.setup"
188
+ PROVISION = "configure.provision"
189
+
190
+ # persist.*
191
+ COMMIT = "persist.commit"
192
+ WRITE = "persist.write"
193
+ STAGE = "persist.stage"
194
+ INSTALL_PKG = "persist.install"
195
+
196
+ # modify.*
197
+ EDIT = "modify.edit"
198
+ MERGE = "modify.merge"
199
+ REBASE = "modify.rebase"
200
+
201
+ # remove.*
202
+ DELETE = "remove.delete"
203
+ TEARDOWN = "remove.teardown"
204
+ CLEAN = "remove.clean"
205
+ UNINSTALL = "remove.uninstall"
206
+
207
+ # analyze.*
208
+ PROFILE = "analyze.profile"
209
+ MEASURE = "analyze.measure"
210
+ DIFF = "analyze.diff"
211
+
212
+ # retrieve.* (additional subtypes for precision)
213
+ RETRIEVE_DIFF = "retrieve.diff"