hanzo-mcp 0.6.12__py3-none-any.whl → 0.6.13__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.

Potentially problematic release.


This version of hanzo-mcp might be problematic. Click here for more details.

Files changed (77) hide show
  1. hanzo_mcp/__init__.py +2 -2
  2. hanzo_mcp/cli.py +2 -2
  3. hanzo_mcp/cli_enhanced.py +4 -4
  4. hanzo_mcp/cli_plugin.py +91 -0
  5. hanzo_mcp/config/__init__.py +1 -1
  6. hanzo_mcp/config/settings.py +69 -6
  7. hanzo_mcp/config/tool_config.py +2 -2
  8. hanzo_mcp/dev_server.py +3 -3
  9. hanzo_mcp/prompts/project_system.py +1 -1
  10. hanzo_mcp/server.py +6 -2
  11. hanzo_mcp/server_enhanced.py +69 -0
  12. hanzo_mcp/tools/__init__.py +75 -29
  13. hanzo_mcp/tools/agent/__init__.py +1 -1
  14. hanzo_mcp/tools/agent/agent_tool.py +2 -2
  15. hanzo_mcp/tools/common/__init__.py +15 -1
  16. hanzo_mcp/tools/common/base.py +4 -4
  17. hanzo_mcp/tools/common/batch_tool.py +1 -1
  18. hanzo_mcp/tools/common/config_tool.py +2 -2
  19. hanzo_mcp/tools/common/context.py +2 -2
  20. hanzo_mcp/tools/common/context_fix.py +26 -0
  21. hanzo_mcp/tools/common/critic_tool.py +196 -0
  22. hanzo_mcp/tools/common/decorators.py +208 -0
  23. hanzo_mcp/tools/common/enhanced_base.py +106 -0
  24. hanzo_mcp/tools/common/mode.py +116 -0
  25. hanzo_mcp/tools/common/mode_loader.py +105 -0
  26. hanzo_mcp/tools/common/permissions.py +1 -1
  27. hanzo_mcp/tools/common/personality.py +936 -0
  28. hanzo_mcp/tools/common/plugin_loader.py +287 -0
  29. hanzo_mcp/tools/common/stats.py +4 -4
  30. hanzo_mcp/tools/common/tool_list.py +1 -1
  31. hanzo_mcp/tools/common/validation.py +1 -1
  32. hanzo_mcp/tools/config/__init__.py +3 -1
  33. hanzo_mcp/tools/config/config_tool.py +1 -1
  34. hanzo_mcp/tools/config/mode_tool.py +209 -0
  35. hanzo_mcp/tools/database/__init__.py +1 -1
  36. hanzo_mcp/tools/editor/__init__.py +1 -1
  37. hanzo_mcp/tools/filesystem/__init__.py +19 -14
  38. hanzo_mcp/tools/filesystem/batch_search.py +3 -3
  39. hanzo_mcp/tools/filesystem/diff.py +2 -2
  40. hanzo_mcp/tools/filesystem/rules_tool.py +235 -0
  41. hanzo_mcp/tools/filesystem/{unified_search.py → search_tool.py} +12 -12
  42. hanzo_mcp/tools/filesystem/{symbols_unified.py → symbols_tool.py} +104 -5
  43. hanzo_mcp/tools/filesystem/watch.py +3 -2
  44. hanzo_mcp/tools/jupyter/__init__.py +2 -2
  45. hanzo_mcp/tools/jupyter/jupyter.py +1 -1
  46. hanzo_mcp/tools/llm/__init__.py +3 -3
  47. hanzo_mcp/tools/llm/llm_tool.py +648 -143
  48. hanzo_mcp/tools/mcp/__init__.py +2 -2
  49. hanzo_mcp/tools/mcp/{mcp_unified.py → mcp_tool.py} +3 -3
  50. hanzo_mcp/tools/shell/__init__.py +6 -6
  51. hanzo_mcp/tools/shell/base_process.py +4 -2
  52. hanzo_mcp/tools/shell/bash_session_executor.py +1 -1
  53. hanzo_mcp/tools/shell/{bash_unified.py → bash_tool.py} +1 -1
  54. hanzo_mcp/tools/shell/command_executor.py +2 -2
  55. hanzo_mcp/tools/shell/{npx_unified.py → npx_tool.py} +1 -1
  56. hanzo_mcp/tools/shell/open.py +2 -2
  57. hanzo_mcp/tools/shell/{process_unified.py → process_tool.py} +1 -1
  58. hanzo_mcp/tools/shell/run_command_windows.py +1 -1
  59. hanzo_mcp/tools/shell/uvx.py +47 -2
  60. hanzo_mcp/tools/shell/uvx_background.py +47 -2
  61. hanzo_mcp/tools/shell/{uvx_unified.py → uvx_tool.py} +1 -1
  62. hanzo_mcp/tools/todo/__init__.py +14 -19
  63. hanzo_mcp/tools/todo/todo.py +22 -1
  64. hanzo_mcp/tools/vector/__init__.py +1 -1
  65. hanzo_mcp/tools/vector/infinity_store.py +2 -2
  66. hanzo_mcp/tools/vector/project_manager.py +1 -1
  67. hanzo_mcp-0.6.13.dist-info/METADATA +359 -0
  68. {hanzo_mcp-0.6.12.dist-info → hanzo_mcp-0.6.13.dist-info}/RECORD +72 -64
  69. {hanzo_mcp-0.6.12.dist-info → hanzo_mcp-0.6.13.dist-info}/entry_points.txt +1 -0
  70. hanzo_mcp/tools/common/palette.py +0 -344
  71. hanzo_mcp/tools/common/palette_loader.py +0 -108
  72. hanzo_mcp/tools/config/palette_tool.py +0 -179
  73. hanzo_mcp/tools/llm/llm_unified.py +0 -851
  74. hanzo_mcp-0.6.12.dist-info/METADATA +0 -339
  75. {hanzo_mcp-0.6.12.dist-info → hanzo_mcp-0.6.13.dist-info}/WHEEL +0 -0
  76. {hanzo_mcp-0.6.12.dist-info → hanzo_mcp-0.6.13.dist-info}/licenses/LICENSE +0 -0
  77. {hanzo_mcp-0.6.12.dist-info → hanzo_mcp-0.6.13.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,936 @@
1
+ """Tool personality system for organizing development tools based on famous programmers."""
2
+
3
+ import os
4
+ from dataclasses import dataclass
5
+ from typing import Dict, List, Optional, Set
6
+
7
+
8
+ @dataclass
9
+ class ToolPersonality:
10
+ """Represents a programmer personality with tool preferences."""
11
+ name: str
12
+ programmer: str
13
+ description: str
14
+ tools: List[str]
15
+ environment: Optional[Dict[str, str]] = None
16
+ philosophy: Optional[str] = None
17
+
18
+ def __post_init__(self):
19
+ """Validate personality configuration."""
20
+ if not self.name:
21
+ raise ValueError("Personality name is required")
22
+ if not self.tools:
23
+ raise ValueError("Personality must include at least one tool")
24
+
25
+
26
+ class PersonalityRegistry:
27
+ """Registry for tool personalities."""
28
+
29
+ _personalities: Dict[str, ToolPersonality] = {}
30
+ _active_personality: Optional[str] = None
31
+
32
+ @classmethod
33
+ def register(cls, personality: ToolPersonality) -> None:
34
+ """Register a tool personality."""
35
+ cls._personalities[personality.name] = personality
36
+
37
+ @classmethod
38
+ def get(cls, name: str) -> Optional[ToolPersonality]:
39
+ """Get a personality by name."""
40
+ return cls._personalities.get(name)
41
+
42
+ @classmethod
43
+ def list(cls) -> List[ToolPersonality]:
44
+ """List all registered personalities."""
45
+ return list(cls._personalities.values())
46
+
47
+ @classmethod
48
+ def set_active(cls, name: str) -> None:
49
+ """Set the active personality."""
50
+ if name not in cls._personalities:
51
+ raise ValueError(f"Personality '{name}' not found")
52
+ cls._active_personality = name
53
+
54
+ @classmethod
55
+ def get_active(cls) -> Optional[ToolPersonality]:
56
+ """Get the active personality."""
57
+ if cls._active_personality:
58
+ return cls._personalities.get(cls._active_personality)
59
+ return None
60
+
61
+ @classmethod
62
+ def get_active_tools(cls) -> Set[str]:
63
+ """Get the set of tools from the active personality."""
64
+ personality = cls.get_active()
65
+ if personality:
66
+ return set(personality.tools)
67
+ return set()
68
+
69
+
70
+ # Essential tools that are always available
71
+ ESSENTIAL_TOOLS = ["read", "write", "edit", "tree", "bash", "think"]
72
+
73
+ # Common tool sets for reuse
74
+ UNIX_TOOLS = ["grep", "find_files", "bash", "process", "diff"]
75
+ BUILD_TOOLS = ["bash", "npx", "uvx", "process"]
76
+ VERSION_CONTROL = ["git_search", "diff"]
77
+ AI_TOOLS = ["agent", "consensus", "critic", "think"]
78
+ SEARCH_TOOLS = ["search", "symbols", "grep", "git_search"]
79
+ DATABASE_TOOLS = ["sql_query", "sql_search", "graph_add", "graph_query"]
80
+ VECTOR_TOOLS = ["vector_index", "vector_search"]
81
+
82
+ # 100 Programmer Personalities
83
+ personalities = [
84
+ # 1-10: Language Creators
85
+ ToolPersonality(
86
+ name="guido",
87
+ programmer="Guido van Rossum",
88
+ description="Python's BDFL - readability counts",
89
+ philosophy="There should be one-- and preferably only one --obvious way to do it.",
90
+ tools=ESSENTIAL_TOOLS + ["uvx", "jupyter", "multi_edit", "symbols", "rules"] + AI_TOOLS + SEARCH_TOOLS,
91
+ environment={"PYTHONPATH": ".", "PYTEST_ARGS": "-xvs"}
92
+ ),
93
+ ToolPersonality(
94
+ name="matz",
95
+ programmer="Yukihiro Matsumoto",
96
+ description="Ruby creator - optimize for developer happiness",
97
+ philosophy="Ruby is designed to make programmers happy.",
98
+ tools=ESSENTIAL_TOOLS + ["npx", "symbols", "batch", "todo"] + SEARCH_TOOLS,
99
+ environment={"RUBY_VERSION": "3.0", "BUNDLE_PATH": "vendor/bundle"}
100
+ ),
101
+ ToolPersonality(
102
+ name="brendan",
103
+ programmer="Brendan Eich",
104
+ description="JavaScript creator - dynamic and flexible",
105
+ philosophy="Always bet on JS.",
106
+ tools=ESSENTIAL_TOOLS + ["npx", "watch", "symbols", "todo", "rules"] + BUILD_TOOLS + SEARCH_TOOLS,
107
+ environment={"NODE_ENV": "development", "NPM_CONFIG_LOGLEVEL": "warn"}
108
+ ),
109
+ ToolPersonality(
110
+ name="dennis",
111
+ programmer="Dennis Ritchie",
112
+ description="C creator - close to the metal",
113
+ philosophy="UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity.",
114
+ tools=ESSENTIAL_TOOLS + ["symbols", "content_replace"] + UNIX_TOOLS,
115
+ environment={"CC": "gcc", "CFLAGS": "-Wall -O2"}
116
+ ),
117
+ ToolPersonality(
118
+ name="bjarne",
119
+ programmer="Bjarne Stroustrup",
120
+ description="C++ creator - zero-overhead abstractions",
121
+ philosophy="C++ is designed to allow you to express ideas.",
122
+ tools=ESSENTIAL_TOOLS + ["symbols", "multi_edit", "content_replace"] + UNIX_TOOLS + BUILD_TOOLS,
123
+ environment={"CXX": "g++", "CXXFLAGS": "-std=c++20 -Wall"}
124
+ ),
125
+ ToolPersonality(
126
+ name="james",
127
+ programmer="James Gosling",
128
+ description="Java creator - write once, run anywhere",
129
+ philosophy="Java is C++ without the guns, knives, and clubs.",
130
+ tools=ESSENTIAL_TOOLS + ["symbols", "batch", "todo"] + BUILD_TOOLS,
131
+ environment={"JAVA_HOME": "/usr/lib/jvm/java-11-openjdk"}
132
+ ),
133
+ ToolPersonality(
134
+ name="anders",
135
+ programmer="Anders Hejlsberg",
136
+ description="TypeScript/C# creator - type safety matters",
137
+ philosophy="TypeScript is JavaScript that scales.",
138
+ tools=ESSENTIAL_TOOLS + ["npx", "symbols", "watch", "rules"] + BUILD_TOOLS + SEARCH_TOOLS,
139
+ environment={"TYPESCRIPT_VERSION": "5.0"}
140
+ ),
141
+ ToolPersonality(
142
+ name="larry",
143
+ programmer="Larry Wall",
144
+ description="Perl creator - there's more than one way to do it",
145
+ philosophy="The three chief virtues of a programmer are laziness, impatience, and hubris.",
146
+ tools=ESSENTIAL_TOOLS + ["grep", "content_replace", "batch"] + UNIX_TOOLS,
147
+ environment={"PERL5LIB": "./lib"}
148
+ ),
149
+ ToolPersonality(
150
+ name="rasmus",
151
+ programmer="Rasmus Lerdorf",
152
+ description="PHP creator - pragmatic web development",
153
+ philosophy="I'm not a real programmer. I throw together things until it works.",
154
+ tools=ESSENTIAL_TOOLS + ["npx", "sql_query", "watch"] + DATABASE_TOOLS,
155
+ environment={"PHP_VERSION": "8.0"}
156
+ ),
157
+ ToolPersonality(
158
+ name="rich",
159
+ programmer="Rich Hickey",
160
+ description="Clojure creator - simplicity matters",
161
+ philosophy="Programming is not about typing... it's about thinking.",
162
+ tools=ESSENTIAL_TOOLS + ["symbols", "todo", "batch"] + AI_TOOLS,
163
+ environment={"CLOJURE_VERSION": "1.11"}
164
+ ),
165
+
166
+ # 11-20: Systems & Infrastructure
167
+ ToolPersonality(
168
+ name="linus",
169
+ programmer="Linus Torvalds",
170
+ description="Linux & Git creator - pragmatic excellence",
171
+ philosophy="Talk is cheap. Show me the code.",
172
+ tools=ESSENTIAL_TOOLS + ["git_search", "diff", "content_replace", "critic"] + UNIX_TOOLS,
173
+ environment={"KERNEL_VERSION": "6.0", "GIT_AUTHOR_NAME": "Linus Torvalds"}
174
+ ),
175
+ ToolPersonality(
176
+ name="rob",
177
+ programmer="Rob Pike",
178
+ description="Go creator - simplicity and concurrency",
179
+ philosophy="A little copying is better than a little dependency.",
180
+ tools=ESSENTIAL_TOOLS + ["symbols", "batch", "process"] + UNIX_TOOLS + BUILD_TOOLS,
181
+ environment={"GOPATH": "~/go", "GO111MODULE": "on"}
182
+ ),
183
+ ToolPersonality(
184
+ name="ken",
185
+ programmer="Ken Thompson",
186
+ description="Unix creator - elegant minimalism",
187
+ philosophy="When in doubt, use brute force.",
188
+ tools=ESSENTIAL_TOOLS + UNIX_TOOLS,
189
+ environment={"PATH": "/usr/local/bin:$PATH"}
190
+ ),
191
+ ToolPersonality(
192
+ name="bill",
193
+ programmer="Bill Joy",
194
+ description="Vi creator & BSD contributor",
195
+ philosophy="The best way to predict the future is to invent it.",
196
+ tools=ESSENTIAL_TOOLS + ["neovim_edit", "neovim_command"] + UNIX_TOOLS,
197
+ environment={"EDITOR": "vi"}
198
+ ),
199
+ ToolPersonality(
200
+ name="richard",
201
+ programmer="Richard Stallman",
202
+ description="GNU creator - software freedom",
203
+ philosophy="Free software is a matter of liberty, not price.",
204
+ tools=ESSENTIAL_TOOLS + ["content_replace", "batch"] + UNIX_TOOLS,
205
+ environment={"EDITOR": "emacs"}
206
+ ),
207
+ ToolPersonality(
208
+ name="brian",
209
+ programmer="Brian Kernighan",
210
+ description="AWK co-creator & Unix pioneer",
211
+ philosophy="Controlling complexity is the essence of computer programming.",
212
+ tools=ESSENTIAL_TOOLS + ["grep", "content_replace"] + UNIX_TOOLS,
213
+ environment={"AWK": "gawk"}
214
+ ),
215
+ ToolPersonality(
216
+ name="donald",
217
+ programmer="Donald Knuth",
218
+ description="TeX creator - literate programming",
219
+ philosophy="Premature optimization is the root of all evil.",
220
+ tools=ESSENTIAL_TOOLS + ["symbols", "todo", "critic"],
221
+ environment={"TEXMFHOME": "~/texmf"}
222
+ ),
223
+ ToolPersonality(
224
+ name="graydon",
225
+ programmer="Graydon Hoare",
226
+ description="Rust creator - memory safety without GC",
227
+ philosophy="Memory safety without garbage collection, concurrency without data races.",
228
+ tools=ESSENTIAL_TOOLS + ["symbols", "multi_edit", "critic", "todo"] + BUILD_TOOLS,
229
+ environment={"RUST_BACKTRACE": "1", "CARGO_HOME": "~/.cargo"}
230
+ ),
231
+ ToolPersonality(
232
+ name="ryan",
233
+ programmer="Ryan Dahl",
234
+ description="Node.js & Deno creator",
235
+ philosophy="I/O needs to be done differently.",
236
+ tools=ESSENTIAL_TOOLS + ["npx", "uvx", "watch", "process"] + BUILD_TOOLS,
237
+ environment={"DENO_DIR": "~/.deno"}
238
+ ),
239
+ ToolPersonality(
240
+ name="mitchell",
241
+ programmer="Mitchell Hashimoto",
242
+ description="HashiCorp founder - infrastructure as code",
243
+ philosophy="Automate everything.",
244
+ tools=ESSENTIAL_TOOLS + ["bash", "process", "watch", "todo"] + BUILD_TOOLS,
245
+ environment={"TERRAFORM_VERSION": "1.0"}
246
+ ),
247
+
248
+ # 21-30: Web & Frontend
249
+ ToolPersonality(
250
+ name="tim",
251
+ programmer="Tim Berners-Lee",
252
+ description="WWW inventor - open web",
253
+ philosophy="The Web is for everyone.",
254
+ tools=ESSENTIAL_TOOLS + ["npx", "watch", "rules"] + SEARCH_TOOLS,
255
+ environment={"W3C_VALIDATOR": "true"}
256
+ ),
257
+ ToolPersonality(
258
+ name="douglas",
259
+ programmer="Douglas Crockford",
260
+ description="JSON creator - JavaScript the good parts",
261
+ philosophy="JavaScript has some extraordinarily good parts.",
262
+ tools=ESSENTIAL_TOOLS + ["npx", "symbols", "critic"] + SEARCH_TOOLS,
263
+ environment={"JSLINT": "true"}
264
+ ),
265
+ ToolPersonality(
266
+ name="john",
267
+ programmer="John Resig",
268
+ description="jQuery creator - write less, do more",
269
+ philosophy="Do more with less code.",
270
+ tools=ESSENTIAL_TOOLS + ["npx", "watch", "symbols"] + SEARCH_TOOLS,
271
+ environment={"JQUERY_VERSION": "3.6"}
272
+ ),
273
+ ToolPersonality(
274
+ name="evan",
275
+ programmer="Evan You",
276
+ description="Vue.js creator - progressive framework",
277
+ philosophy="Approachable, versatile, performant.",
278
+ tools=ESSENTIAL_TOOLS + ["npx", "watch", "symbols", "todo"] + BUILD_TOOLS,
279
+ environment={"VUE_VERSION": "3"}
280
+ ),
281
+ ToolPersonality(
282
+ name="jordan",
283
+ programmer="Jordan Walke",
284
+ description="React creator - declarative UIs",
285
+ philosophy="Learn once, write anywhere.",
286
+ tools=ESSENTIAL_TOOLS + ["npx", "watch", "symbols", "rules"] + BUILD_TOOLS,
287
+ environment={"REACT_VERSION": "18"}
288
+ ),
289
+ ToolPersonality(
290
+ name="jeremy",
291
+ programmer="Jeremy Ashkenas",
292
+ description="CoffeeScript & Backbone creator",
293
+ philosophy="It's just JavaScript.",
294
+ tools=ESSENTIAL_TOOLS + ["npx", "symbols", "watch"],
295
+ environment={"COFFEE_VERSION": "2.0"}
296
+ ),
297
+ ToolPersonality(
298
+ name="david",
299
+ programmer="David Heinemeier Hansson",
300
+ description="Rails creator - convention over configuration",
301
+ philosophy="Optimize for programmer happiness.",
302
+ tools=ESSENTIAL_TOOLS + ["npx", "sql_query", "watch", "todo"] + DATABASE_TOOLS,
303
+ environment={"RAILS_ENV": "development"}
304
+ ),
305
+ ToolPersonality(
306
+ name="taylor",
307
+ programmer="Taylor Otwell",
308
+ description="Laravel creator - PHP artisan",
309
+ philosophy="Love beautiful code? We do too.",
310
+ tools=ESSENTIAL_TOOLS + ["npx", "sql_query", "watch"] + DATABASE_TOOLS,
311
+ environment={"LARAVEL_VERSION": "10"}
312
+ ),
313
+ ToolPersonality(
314
+ name="adrian",
315
+ programmer="Adrian Holovaty",
316
+ description="Django co-creator - web framework for perfectionists",
317
+ philosophy="The web framework for perfectionists with deadlines.",
318
+ tools=ESSENTIAL_TOOLS + ["uvx", "sql_query", "watch"] + DATABASE_TOOLS,
319
+ environment={"DJANGO_SETTINGS_MODULE": "settings"}
320
+ ),
321
+ ToolPersonality(
322
+ name="matt",
323
+ programmer="Matt Mullenweg",
324
+ description="WordPress creator - democratize publishing",
325
+ philosophy="Code is poetry.",
326
+ tools=ESSENTIAL_TOOLS + ["sql_query", "watch", "rules"] + DATABASE_TOOLS,
327
+ environment={"WP_DEBUG": "true"}
328
+ ),
329
+
330
+ # 31-40: Database & Data
331
+ ToolPersonality(
332
+ name="michael_s",
333
+ programmer="Michael Stonebraker",
334
+ description="PostgreSQL creator - ACID matters",
335
+ philosophy="One size does not fit all in databases.",
336
+ tools=ESSENTIAL_TOOLS + DATABASE_TOOLS + ["batch", "todo"],
337
+ environment={"PGDATA": "/var/lib/postgresql/data"}
338
+ ),
339
+ ToolPersonality(
340
+ name="michael_w",
341
+ programmer="Michael Widenius",
342
+ description="MySQL/MariaDB creator",
343
+ philosophy="A small fast database for the web.",
344
+ tools=ESSENTIAL_TOOLS + DATABASE_TOOLS + ["watch"],
345
+ environment={"MYSQL_HOME": "/usr/local/mysql"}
346
+ ),
347
+ ToolPersonality(
348
+ name="salvatore",
349
+ programmer="Salvatore Sanfilippo",
350
+ description="Redis creator - data structures server",
351
+ philosophy="Simplicity is a great virtue.",
352
+ tools=ESSENTIAL_TOOLS + ["bash", "watch", "process"] + DATABASE_TOOLS,
353
+ environment={"REDIS_VERSION": "7.0"}
354
+ ),
355
+ ToolPersonality(
356
+ name="dwight",
357
+ programmer="Dwight Merriman",
358
+ description="MongoDB co-creator - document databases",
359
+ philosophy="Build the database you want to use.",
360
+ tools=ESSENTIAL_TOOLS + DATABASE_TOOLS + ["watch", "todo"],
361
+ environment={"MONGO_VERSION": "6.0"}
362
+ ),
363
+ ToolPersonality(
364
+ name="edgar",
365
+ programmer="Edgar F. Codd",
366
+ description="Relational model inventor",
367
+ philosophy="Data independence is key.",
368
+ tools=ESSENTIAL_TOOLS + DATABASE_TOOLS + ["critic"],
369
+ environment={"SQL_MODE": "ANSI"}
370
+ ),
371
+ ToolPersonality(
372
+ name="jim_gray",
373
+ programmer="Jim Gray",
374
+ description="Transaction processing pioneer",
375
+ philosophy="The transaction is the unit of work.",
376
+ tools=ESSENTIAL_TOOLS + DATABASE_TOOLS + ["batch", "critic"],
377
+ environment={"ISOLATION_LEVEL": "SERIALIZABLE"}
378
+ ),
379
+ ToolPersonality(
380
+ name="jeff_dean",
381
+ programmer="Jeff Dean",
382
+ description="MapReduce & BigTable co-creator",
383
+ philosophy="Design for planet-scale.",
384
+ tools=ESSENTIAL_TOOLS + DATABASE_TOOLS + VECTOR_TOOLS + ["batch"],
385
+ environment={"HADOOP_HOME": "/opt/hadoop"}
386
+ ),
387
+ ToolPersonality(
388
+ name="sanjay",
389
+ programmer="Sanjay Ghemawat",
390
+ description="MapReduce & BigTable co-creator",
391
+ philosophy="Simple abstractions for complex systems.",
392
+ tools=ESSENTIAL_TOOLS + DATABASE_TOOLS + ["batch", "process"],
393
+ environment={"SPARK_HOME": "/opt/spark"}
394
+ ),
395
+ ToolPersonality(
396
+ name="mike",
397
+ programmer="Mike Cafarella",
398
+ description="Hadoop co-creator",
399
+ philosophy="Storage is cheap, compute is cheap.",
400
+ tools=ESSENTIAL_TOOLS + DATABASE_TOOLS + ["batch", "process"],
401
+ environment={"HADOOP_CONF_DIR": "/etc/hadoop"}
402
+ ),
403
+ ToolPersonality(
404
+ name="matei",
405
+ programmer="Matei Zaharia",
406
+ description="Apache Spark creator",
407
+ philosophy="In-memory computing changes everything.",
408
+ tools=ESSENTIAL_TOOLS + DATABASE_TOOLS + ["batch", "process", "jupyter"],
409
+ environment={"SPARK_MASTER": "local[*]"}
410
+ ),
411
+
412
+ # 41-50: AI & Machine Learning
413
+ ToolPersonality(
414
+ name="yann",
415
+ programmer="Yann LeCun",
416
+ description="Deep learning pioneer - ConvNets",
417
+ philosophy="AI is not magic; it's just math and data.",
418
+ tools=ESSENTIAL_TOOLS + AI_TOOLS + VECTOR_TOOLS + ["jupyter", "watch"],
419
+ environment={"PYTORCH_VERSION": "2.0"}
420
+ ),
421
+ ToolPersonality(
422
+ name="geoffrey",
423
+ programmer="Geoffrey Hinton",
424
+ description="Deep learning godfather",
425
+ philosophy="The brain has to work with what it's got.",
426
+ tools=ESSENTIAL_TOOLS + AI_TOOLS + VECTOR_TOOLS + ["jupyter"],
427
+ environment={"TF_VERSION": "2.13"}
428
+ ),
429
+ ToolPersonality(
430
+ name="yoshua",
431
+ programmer="Yoshua Bengio",
432
+ description="Deep learning pioneer",
433
+ philosophy="We need to think about AI that helps humanity.",
434
+ tools=ESSENTIAL_TOOLS + AI_TOOLS + VECTOR_TOOLS + ["jupyter", "batch"],
435
+ environment={"THEANO_FLAGS": "device=cuda"}
436
+ ),
437
+ ToolPersonality(
438
+ name="andrew",
439
+ programmer="Andrew Ng",
440
+ description="AI educator & Coursera co-founder",
441
+ philosophy="AI is the new electricity.",
442
+ tools=ESSENTIAL_TOOLS + AI_TOOLS + ["jupyter", "todo", "watch"],
443
+ environment={"CUDA_VISIBLE_DEVICES": "0"}
444
+ ),
445
+ ToolPersonality(
446
+ name="demis",
447
+ programmer="Demis Hassabis",
448
+ description="DeepMind co-founder",
449
+ philosophy="Solve intelligence, use it to solve everything else.",
450
+ tools=ESSENTIAL_TOOLS + AI_TOOLS + VECTOR_TOOLS + ["agent", "consensus"],
451
+ environment={"JAX_VERSION": "0.4"}
452
+ ),
453
+ ToolPersonality(
454
+ name="ilya",
455
+ programmer="Ilya Sutskever",
456
+ description="OpenAI co-founder",
457
+ philosophy="Scale is all you need.",
458
+ tools=ESSENTIAL_TOOLS + AI_TOOLS + ["agent", "consensus", "critic"],
459
+ environment={"OPENAI_API_KEY": "sk-..."}
460
+ ),
461
+ ToolPersonality(
462
+ name="andrej",
463
+ programmer="Andrej Karpathy",
464
+ description="AI educator & Tesla AI director",
465
+ philosophy="Build it from scratch to understand it.",
466
+ tools=ESSENTIAL_TOOLS + AI_TOOLS + ["jupyter", "watch", "todo"],
467
+ environment={"CUDA_HOME": "/usr/local/cuda"}
468
+ ),
469
+ ToolPersonality(
470
+ name="chris",
471
+ programmer="Chris Olah",
472
+ description="AI interpretability researcher",
473
+ philosophy="Understanding neural networks matters.",
474
+ tools=ESSENTIAL_TOOLS + AI_TOOLS + VECTOR_TOOLS + ["jupyter", "critic"],
475
+ environment={"DISTILL_MODE": "interactive"}
476
+ ),
477
+ ToolPersonality(
478
+ name="francois",
479
+ programmer="François Chollet",
480
+ description="Keras creator",
481
+ philosophy="Deep learning for humans.",
482
+ tools=ESSENTIAL_TOOLS + AI_TOOLS + ["jupyter", "watch", "todo"],
483
+ environment={"KERAS_BACKEND": "tensorflow"}
484
+ ),
485
+ ToolPersonality(
486
+ name="jeremy_howard",
487
+ programmer="Jeremy Howard",
488
+ description="fast.ai founder",
489
+ philosophy="Deep learning should be accessible to all.",
490
+ tools=ESSENTIAL_TOOLS + AI_TOOLS + ["jupyter", "watch", "rules"],
491
+ environment={"FASTAI_VERSION": "2.7"}
492
+ ),
493
+
494
+ # 51-60: Security & Cryptography
495
+ ToolPersonality(
496
+ name="bruce",
497
+ programmer="Bruce Schneier",
498
+ description="Security expert & cryptographer",
499
+ philosophy="Security is a process, not a product.",
500
+ tools=ESSENTIAL_TOOLS + ["critic", "symbols", "git_search"] + UNIX_TOOLS,
501
+ environment={"SECURITY_AUDIT": "true"}
502
+ ),
503
+ ToolPersonality(
504
+ name="phil",
505
+ programmer="Phil Zimmermann",
506
+ description="PGP creator - privacy matters",
507
+ philosophy="If privacy is outlawed, only outlaws will have privacy.",
508
+ tools=ESSENTIAL_TOOLS + ["critic", "content_replace"] + UNIX_TOOLS,
509
+ environment={"GPG_TTY": "$(tty)"}
510
+ ),
511
+ ToolPersonality(
512
+ name="whitfield",
513
+ programmer="Whitfield Diffie",
514
+ description="Public-key cryptography pioneer",
515
+ philosophy="Privacy is necessary for an open society.",
516
+ tools=ESSENTIAL_TOOLS + ["critic", "symbols"],
517
+ environment={"OPENSSL_VERSION": "3.0"}
518
+ ),
519
+ ToolPersonality(
520
+ name="ralph",
521
+ programmer="Ralph Merkle",
522
+ description="Merkle trees inventor",
523
+ philosophy="Cryptography is about mathematical guarantees.",
524
+ tools=ESSENTIAL_TOOLS + ["symbols", "critic", "batch"],
525
+ environment={"HASH_ALGORITHM": "SHA256"}
526
+ ),
527
+ ToolPersonality(
528
+ name="daniel_b",
529
+ programmer="Daniel J. Bernstein",
530
+ description="djb - qmail & Curve25519 creator",
531
+ philosophy="Security through simplicity.",
532
+ tools=ESSENTIAL_TOOLS + ["critic", "symbols"] + UNIX_TOOLS,
533
+ environment={"QMAIL_HOME": "/var/qmail"}
534
+ ),
535
+ ToolPersonality(
536
+ name="moxie",
537
+ programmer="Moxie Marlinspike",
538
+ description="Signal creator - privacy for everyone",
539
+ philosophy="Making private communication simple.",
540
+ tools=ESSENTIAL_TOOLS + ["critic", "symbols", "rules"],
541
+ environment={"SIGNAL_PROTOCOL": "true"}
542
+ ),
543
+ ToolPersonality(
544
+ name="theo",
545
+ programmer="Theo de Raadt",
546
+ description="OpenBSD creator - security by default",
547
+ philosophy="Shut up and hack.",
548
+ tools=ESSENTIAL_TOOLS + ["critic", "diff"] + UNIX_TOOLS,
549
+ environment={"OPENBSD_VERSION": "7.3"}
550
+ ),
551
+ ToolPersonality(
552
+ name="dan_kaminsky",
553
+ programmer="Dan Kaminsky",
554
+ description="DNS security researcher",
555
+ philosophy="Break it to make it better.",
556
+ tools=ESSENTIAL_TOOLS + ["critic", "symbols", "process"] + UNIX_TOOLS,
557
+ environment={"DNSSEC": "true"}
558
+ ),
559
+ ToolPersonality(
560
+ name="katie",
561
+ programmer="Katie Moussouris",
562
+ description="Bug bounty pioneer",
563
+ philosophy="Hackers are a resource, not a threat.",
564
+ tools=ESSENTIAL_TOOLS + ["critic", "symbols", "todo"],
565
+ environment={"BUG_BOUNTY": "enabled"}
566
+ ),
567
+ ToolPersonality(
568
+ name="matt_blaze",
569
+ programmer="Matt Blaze",
570
+ description="Cryptographer & security researcher",
571
+ philosophy="Crypto is hard to get right.",
572
+ tools=ESSENTIAL_TOOLS + ["critic", "symbols", "git_search"],
573
+ environment={"CRYPTO_LIBRARY": "nacl"}
574
+ ),
575
+
576
+ # 61-70: Gaming & Graphics
577
+ ToolPersonality(
578
+ name="john_carmack",
579
+ programmer="John Carmack",
580
+ description="id Software - Doom & Quake creator",
581
+ philosophy="Focus is a matter of deciding what things you're not going to do.",
582
+ tools=ESSENTIAL_TOOLS + ["symbols", "watch", "process"] + BUILD_TOOLS,
583
+ environment={"OPENGL_VERSION": "4.6"}
584
+ ),
585
+ ToolPersonality(
586
+ name="sid",
587
+ programmer="Sid Meier",
588
+ description="Civilization creator",
589
+ philosophy="A game is a series of interesting choices.",
590
+ tools=ESSENTIAL_TOOLS + ["todo", "watch", "process"],
591
+ environment={"GAME_MODE": "debug"}
592
+ ),
593
+ ToolPersonality(
594
+ name="shigeru",
595
+ programmer="Shigeru Miyamoto",
596
+ description="Mario & Zelda creator",
597
+ philosophy="A delayed game is eventually good, but a rushed game is forever bad.",
598
+ tools=ESSENTIAL_TOOLS + ["todo", "watch", "critic"],
599
+ environment={"NINTENDO_SDK": "true"}
600
+ ),
601
+ ToolPersonality(
602
+ name="gabe",
603
+ programmer="Gabe Newell",
604
+ description="Valve founder - Half-Life & Steam",
605
+ philosophy="The easiest way to stop piracy is not by putting antipiracy technology to work. It's by giving those people a service that's better than what they're receiving from the pirates.",
606
+ tools=ESSENTIAL_TOOLS + ["process", "watch", "todo"] + BUILD_TOOLS,
607
+ environment={"STEAM_RUNTIME": "1"}
608
+ ),
609
+ ToolPersonality(
610
+ name="markus",
611
+ programmer="Markus Persson",
612
+ description="Minecraft creator - Notch",
613
+ philosophy="Just make games for yourself and try to have fun.",
614
+ tools=ESSENTIAL_TOOLS + ["watch", "todo", "process"],
615
+ environment={"LWJGL_VERSION": "3.3"}
616
+ ),
617
+ ToolPersonality(
618
+ name="jonathan",
619
+ programmer="Jonathan Blow",
620
+ description="Braid & The Witness creator",
621
+ philosophy="Optimize for deep, meaningful experiences.",
622
+ tools=ESSENTIAL_TOOLS + ["symbols", "critic", "watch"],
623
+ environment={"JAI_COMPILER": "beta"}
624
+ ),
625
+ ToolPersonality(
626
+ name="casey",
627
+ programmer="Casey Muratori",
628
+ description="Handmade Hero creator",
629
+ philosophy="Performance matters. Write code from scratch.",
630
+ tools=ESSENTIAL_TOOLS + ["symbols", "watch", "process", "critic"],
631
+ environment={"HANDMADE": "true"}
632
+ ),
633
+ ToolPersonality(
634
+ name="tim_sweeney",
635
+ programmer="Tim Sweeney",
636
+ description="Epic Games founder - Unreal Engine",
637
+ philosophy="The engine is the game.",
638
+ tools=ESSENTIAL_TOOLS + ["symbols", "watch", "process"] + BUILD_TOOLS,
639
+ environment={"UNREAL_ENGINE": "5"}
640
+ ),
641
+ ToolPersonality(
642
+ name="hideo",
643
+ programmer="Hideo Kojima",
644
+ description="Metal Gear creator",
645
+ philosophy="70% of my body is made of movies.",
646
+ tools=ESSENTIAL_TOOLS + ["todo", "watch", "critic"],
647
+ environment={"KOJIMA_PRODUCTIONS": "true"}
648
+ ),
649
+ ToolPersonality(
650
+ name="will",
651
+ programmer="Will Wright",
652
+ description="SimCity & The Sims creator",
653
+ philosophy="Games are a form of communication.",
654
+ tools=ESSENTIAL_TOOLS + ["todo", "watch", "process"],
655
+ environment={"SIMULATION_MODE": "debug"}
656
+ ),
657
+
658
+ # 71-80: Open Source Leaders
659
+ ToolPersonality(
660
+ name="miguel",
661
+ programmer="Miguel de Icaza",
662
+ description="GNOME & Mono creator",
663
+ philosophy="Open source is about standing on the shoulders of giants.",
664
+ tools=ESSENTIAL_TOOLS + ["symbols", "todo"] + BUILD_TOOLS,
665
+ environment={"MONO_VERSION": "6.12"}
666
+ ),
667
+ ToolPersonality(
668
+ name="nat",
669
+ programmer="Nat Friedman",
670
+ description="GitHub CEO & AI entrepreneur",
671
+ philosophy="Developers are the builders of the digital world.",
672
+ tools=ESSENTIAL_TOOLS + AI_TOOLS + ["git_search", "todo"],
673
+ environment={"GITHUB_TOKEN": "ghp_..."}
674
+ ),
675
+ ToolPersonality(
676
+ name="patrick",
677
+ programmer="Patrick Volkerding",
678
+ description="Slackware creator",
679
+ philosophy="Keep it simple, keep it stable.",
680
+ tools=ESSENTIAL_TOOLS + UNIX_TOOLS,
681
+ environment={"SLACKWARE_VERSION": "15.0"}
682
+ ),
683
+ ToolPersonality(
684
+ name="ian",
685
+ programmer="Ian Murdock",
686
+ description="Debian founder",
687
+ philosophy="Free software, free society.",
688
+ tools=ESSENTIAL_TOOLS + UNIX_TOOLS + ["todo"],
689
+ environment={"DEBIAN_FRONTEND": "noninteractive"}
690
+ ),
691
+ ToolPersonality(
692
+ name="mark_shuttleworth",
693
+ programmer="Mark Shuttleworth",
694
+ description="Ubuntu founder",
695
+ philosophy="Linux for human beings.",
696
+ tools=ESSENTIAL_TOOLS + ["todo", "rules"] + BUILD_TOOLS,
697
+ environment={"UBUNTU_VERSION": "22.04"}
698
+ ),
699
+ ToolPersonality(
700
+ name="lennart",
701
+ programmer="Lennart Poettering",
702
+ description="systemd creator",
703
+ philosophy="Do one thing and do it well... or do everything.",
704
+ tools=ESSENTIAL_TOOLS + ["process", "watch"] + UNIX_TOOLS,
705
+ environment={"SYSTEMD_VERSION": "253"}
706
+ ),
707
+ ToolPersonality(
708
+ name="bram",
709
+ programmer="Bram Moolenaar",
710
+ description="Vim creator",
711
+ philosophy="The best way to avoid RSI is to not type so much.",
712
+ tools=ESSENTIAL_TOOLS + ["neovim_edit", "neovim_command", "neovim_session"],
713
+ environment={"VIM_VERSION": "9.0"}
714
+ ),
715
+ ToolPersonality(
716
+ name="daniel_r",
717
+ programmer="Daniel Robbins",
718
+ description="Gentoo founder",
719
+ philosophy="Your system, your way.",
720
+ tools=ESSENTIAL_TOOLS + BUILD_TOOLS + UNIX_TOOLS,
721
+ environment={"GENTOO_PROFILE": "default/linux/amd64/17.1"}
722
+ ),
723
+ ToolPersonality(
724
+ name="judd",
725
+ programmer="Judd Vinet",
726
+ description="Arch Linux creator",
727
+ philosophy="Keep it simple.",
728
+ tools=ESSENTIAL_TOOLS + BUILD_TOOLS + UNIX_TOOLS,
729
+ environment={"ARCH_VERSION": "rolling"}
730
+ ),
731
+ ToolPersonality(
732
+ name="fabrice",
733
+ programmer="Fabrice Bellard",
734
+ description="QEMU & FFmpeg creator",
735
+ philosophy="Small, fast, and elegant code.",
736
+ tools=ESSENTIAL_TOOLS + ["symbols", "process"] + BUILD_TOOLS,
737
+ environment={"QEMU_VERSION": "8.0"}
738
+ ),
739
+
740
+ # 81-90: Modern Innovators
741
+ ToolPersonality(
742
+ name="vitalik",
743
+ programmer="Vitalik Buterin",
744
+ description="Ethereum creator",
745
+ philosophy="Decentralization matters.",
746
+ tools=ESSENTIAL_TOOLS + ["symbols", "critic", "todo"] + AI_TOOLS,
747
+ environment={"ETH_NETWORK": "mainnet"}
748
+ ),
749
+ ToolPersonality(
750
+ name="satoshi",
751
+ programmer="Satoshi Nakamoto",
752
+ description="Bitcoin creator",
753
+ philosophy="Trust in mathematics.",
754
+ tools=ESSENTIAL_TOOLS + ["critic", "symbols"] + UNIX_TOOLS,
755
+ environment={"BITCOIN_NETWORK": "mainnet"}
756
+ ),
757
+ ToolPersonality(
758
+ name="chris_lattner",
759
+ programmer="Chris Lattner",
760
+ description="LLVM & Swift creator",
761
+ philosophy="Compiler infrastructure should be modular.",
762
+ tools=ESSENTIAL_TOOLS + ["symbols", "multi_edit", "critic"] + BUILD_TOOLS,
763
+ environment={"LLVM_VERSION": "16"}
764
+ ),
765
+ ToolPersonality(
766
+ name="joe",
767
+ programmer="Joe Armstrong",
768
+ description="Erlang creator",
769
+ philosophy="Let it crash.",
770
+ tools=ESSENTIAL_TOOLS + ["process", "watch", "critic"],
771
+ environment={"ERL_VERSION": "OTP-26"}
772
+ ),
773
+ ToolPersonality(
774
+ name="jose",
775
+ programmer="José Valim",
776
+ description="Elixir creator",
777
+ philosophy="Productive. Reliable. Fast.",
778
+ tools=ESSENTIAL_TOOLS + ["watch", "process", "todo"],
779
+ environment={"ELIXIR_VERSION": "1.15"}
780
+ ),
781
+ ToolPersonality(
782
+ name="sebastian",
783
+ programmer="Sebastian Thrun",
784
+ description="Udacity founder & self-driving car pioneer",
785
+ philosophy="Education should be accessible to all.",
786
+ tools=ESSENTIAL_TOOLS + AI_TOOLS + ["jupyter", "watch"],
787
+ environment={"ROS_VERSION": "noetic"}
788
+ ),
789
+ ToolPersonality(
790
+ name="palmer",
791
+ programmer="Palmer Luckey",
792
+ description="Oculus founder",
793
+ philosophy="VR is the final medium.",
794
+ tools=ESSENTIAL_TOOLS + ["watch", "process"] + BUILD_TOOLS,
795
+ environment={"UNITY_VERSION": "2023.1"}
796
+ ),
797
+ ToolPersonality(
798
+ name="dylan",
799
+ programmer="Dylan Field",
800
+ description="Figma co-founder",
801
+ philosophy="Design tools should be collaborative.",
802
+ tools=ESSENTIAL_TOOLS + ["watch", "todo", "rules"],
803
+ environment={"FIGMA_API": "enabled"}
804
+ ),
805
+ ToolPersonality(
806
+ name="guillermo",
807
+ programmer="Guillermo Rauch",
808
+ description="Vercel founder & Next.js creator",
809
+ philosophy="Make the Web. Faster.",
810
+ tools=ESSENTIAL_TOOLS + ["npx", "watch", "rules"] + BUILD_TOOLS,
811
+ environment={"NEXT_VERSION": "14"}
812
+ ),
813
+ ToolPersonality(
814
+ name="tom",
815
+ programmer="Tom Preston-Werner",
816
+ description="GitHub co-founder & TOML creator",
817
+ philosophy="Optimize for happiness.",
818
+ tools=ESSENTIAL_TOOLS + ["git_search", "todo", "rules"],
819
+ environment={"GITHUB_ACTIONS": "true"}
820
+ ),
821
+
822
+ # 91-100: Special Configurations
823
+ ToolPersonality(
824
+ name="fullstack",
825
+ programmer="Full Stack Developer",
826
+ description="Every tool for every job",
827
+ philosophy="Jack of all trades, master of... well, all trades.",
828
+ tools=list(set(ESSENTIAL_TOOLS + AI_TOOLS + SEARCH_TOOLS + DATABASE_TOOLS +
829
+ BUILD_TOOLS + UNIX_TOOLS + VECTOR_TOOLS + ["todo", "rules", "watch",
830
+ "jupyter", "neovim_edit", "mcp", "consensus"])),
831
+ environment={"ALL_TOOLS": "enabled"}
832
+ ),
833
+ ToolPersonality(
834
+ name="minimal",
835
+ programmer="Minimalist",
836
+ description="Just the essentials",
837
+ philosophy="Less is more.",
838
+ tools=ESSENTIAL_TOOLS,
839
+ environment={"MINIMAL_MODE": "true"}
840
+ ),
841
+ ToolPersonality(
842
+ name="data_scientist",
843
+ programmer="Data Scientist",
844
+ description="Analyze all the things",
845
+ philosophy="In God we trust. All others must bring data.",
846
+ tools=ESSENTIAL_TOOLS + ["jupyter", "sql_query", "stats"] + VECTOR_TOOLS + AI_TOOLS,
847
+ environment={"JUPYTER_THEME": "dark"}
848
+ ),
849
+ ToolPersonality(
850
+ name="devops",
851
+ programmer="DevOps Engineer",
852
+ description="Automate everything",
853
+ philosophy="You build it, you run it.",
854
+ tools=ESSENTIAL_TOOLS + BUILD_TOOLS + ["process", "watch", "todo"] + UNIX_TOOLS,
855
+ environment={"CI_CD": "enabled"}
856
+ ),
857
+ ToolPersonality(
858
+ name="security",
859
+ programmer="Security Researcher",
860
+ description="Break it to secure it",
861
+ philosophy="The only secure system is one that's powered off.",
862
+ tools=ESSENTIAL_TOOLS + ["critic", "symbols", "git_search"] + UNIX_TOOLS,
863
+ environment={"SECURITY_MODE": "paranoid"}
864
+ ),
865
+ ToolPersonality(
866
+ name="academic",
867
+ programmer="Academic Researcher",
868
+ description="Publish or perish",
869
+ philosophy="Standing on the shoulders of giants.",
870
+ tools=ESSENTIAL_TOOLS + ["jupyter", "todo", "critic"] + AI_TOOLS + SEARCH_TOOLS,
871
+ environment={"LATEX_ENGINE": "xelatex"}
872
+ ),
873
+ ToolPersonality(
874
+ name="startup",
875
+ programmer="Startup Founder",
876
+ description="Move fast and fix things",
877
+ philosophy="Done is better than perfect.",
878
+ tools=ESSENTIAL_TOOLS + ["todo", "agent", "consensus"] + BUILD_TOOLS + DATABASE_TOOLS,
879
+ environment={"STARTUP_MODE": "hustle"}
880
+ ),
881
+ ToolPersonality(
882
+ name="enterprise",
883
+ programmer="Enterprise Developer",
884
+ description="Process and compliance",
885
+ philosophy="Nobody ever got fired for buying IBM.",
886
+ tools=ESSENTIAL_TOOLS + ["todo", "critic", "rules", "stats"] + DATABASE_TOOLS,
887
+ environment={"COMPLIANCE": "SOC2"}
888
+ ),
889
+ ToolPersonality(
890
+ name="creative",
891
+ programmer="Creative Coder",
892
+ description="Code as art",
893
+ philosophy="Programming is the art of the possible.",
894
+ tools=ESSENTIAL_TOOLS + ["watch", "jupyter", "todo"] + AI_TOOLS,
895
+ environment={"P5_MODE": "global"}
896
+ ),
897
+ ToolPersonality(
898
+ name="hanzo",
899
+ programmer="Hanzo AI Default",
900
+ description="Balanced productivity and quality",
901
+ philosophy="The Zen of Model Context Protocol.",
902
+ tools=ESSENTIAL_TOOLS + ["agent", "consensus", "critic", "todo", "rules", "symbols",
903
+ "search", "git_search", "watch", "jupyter"] + BUILD_TOOLS,
904
+ environment={"HANZO_MODE": "zen"}
905
+ )
906
+ ]
907
+
908
+ # Register all personalities
909
+ def register_default_personalities():
910
+ """Register all default tool personalities."""
911
+ for personality in personalities:
912
+ PersonalityRegistry.register(personality)
913
+
914
+
915
+ # Ensure agent tool is enabled when API keys are present
916
+ def ensure_agent_enabled(personality: ToolPersonality) -> ToolPersonality:
917
+ """Ensure agent tool is enabled if API keys are present."""
918
+ api_keys_present = any(
919
+ os.environ.get(key) for key in [
920
+ "OPENAI_API_KEY",
921
+ "ANTHROPIC_API_KEY",
922
+ "GOOGLE_API_KEY",
923
+ "HANZO_API_KEY",
924
+ "GROQ_API_KEY",
925
+ "TOGETHER_API_KEY",
926
+ "MISTRAL_API_KEY",
927
+ "PERPLEXITY_API_KEY"
928
+ ]
929
+ )
930
+
931
+ if api_keys_present and "agent" not in personality.tools:
932
+ personality.tools.append("agent")
933
+ if "consensus" not in personality.tools:
934
+ personality.tools.append("consensus")
935
+
936
+ return personality