excalidraw-mcp 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 (59) hide show
  1. excalidraw_mcp-0.1.2/.gitignore +26 -0
  2. excalidraw_mcp-0.1.2/.idea/.gitignore +8 -0
  3. excalidraw_mcp-0.1.2/.idea/excalidraw-mcp.iml +21 -0
  4. excalidraw_mcp-0.1.2/.idea/inspectionProfiles/Project_Default.xml +29 -0
  5. excalidraw_mcp-0.1.2/.idea/inspectionProfiles/profiles_settings.xml +6 -0
  6. excalidraw_mcp-0.1.2/.idea/misc.xml +7 -0
  7. excalidraw_mcp-0.1.2/.idea/modules.xml +8 -0
  8. excalidraw_mcp-0.1.2/.idea/ruff.xml +6 -0
  9. excalidraw_mcp-0.1.2/.idea/vcs.xml +6 -0
  10. excalidraw_mcp-0.1.2/.idea/webResources.xml +14 -0
  11. excalidraw_mcp-0.1.2/.idea/workspace.xml +165 -0
  12. excalidraw_mcp-0.1.2/.pre-commit-config.yaml +96 -0
  13. excalidraw_mcp-0.1.2/CLAUDE.md +263 -0
  14. excalidraw_mcp-0.1.2/LICENSE +29 -0
  15. excalidraw_mcp-0.1.2/PKG-INFO +595 -0
  16. excalidraw_mcp-0.1.2/README.md +569 -0
  17. excalidraw_mcp-0.1.2/RULES.md +267 -0
  18. excalidraw_mcp-0.1.2/SETUP.md +410 -0
  19. excalidraw_mcp-0.1.2/example.mcp.json +12 -0
  20. excalidraw_mcp-0.1.2/excalidraw_mcp/__init__.py +1 -0
  21. excalidraw_mcp-0.1.2/excalidraw_mcp/__main__.py +9 -0
  22. excalidraw_mcp-0.1.2/excalidraw_mcp/config.py +200 -0
  23. excalidraw_mcp-0.1.2/excalidraw_mcp/element_factory.py +262 -0
  24. excalidraw_mcp-0.1.2/excalidraw_mcp/http_client.py +238 -0
  25. excalidraw_mcp-0.1.2/excalidraw_mcp/mcp_tools.py +409 -0
  26. excalidraw_mcp-0.1.2/excalidraw_mcp/process_manager.py +209 -0
  27. excalidraw_mcp-0.1.2/excalidraw_mcp/server.py +67 -0
  28. excalidraw_mcp-0.1.2/frontend/index.html +284 -0
  29. excalidraw_mcp-0.1.2/frontend/src/App.tsx +461 -0
  30. excalidraw_mcp-0.1.2/frontend/src/main.tsx +14 -0
  31. excalidraw_mcp-0.1.2/jest.config.cjs +43 -0
  32. excalidraw_mcp-0.1.2/package.json +110 -0
  33. excalidraw_mcp-0.1.2/pyproject.toml +257 -0
  34. excalidraw_mcp-0.1.2/src/config.ts +205 -0
  35. excalidraw_mcp-0.1.2/src/middleware/auth.ts +171 -0
  36. excalidraw_mcp-0.1.2/src/middleware/security.ts +187 -0
  37. excalidraw_mcp-0.1.2/src/middleware/validation.ts +243 -0
  38. excalidraw_mcp-0.1.2/src/server.ts +535 -0
  39. excalidraw_mcp-0.1.2/src/storage/element-storage.ts +419 -0
  40. excalidraw_mcp-0.1.2/src/types.ts +233 -0
  41. excalidraw_mcp-0.1.2/src/utils/delta-compression.ts +310 -0
  42. excalidraw_mcp-0.1.2/src/utils/logger.ts +27 -0
  43. excalidraw_mcp-0.1.2/src/websocket/message-batcher.ts +320 -0
  44. excalidraw_mcp-0.1.2/test/config.test.ts +90 -0
  45. excalidraw_mcp-0.1.2/test/setup.ts +123 -0
  46. excalidraw_mcp-0.1.2/test/storage/element-storage.test.ts +288 -0
  47. excalidraw_mcp-0.1.2/test/unit/delta-compression.test.ts +397 -0
  48. excalidraw_mcp-0.1.2/tests/__init__.py +1 -0
  49. excalidraw_mcp-0.1.2/tests/conftest.py +444 -0
  50. excalidraw_mcp-0.1.2/tests/integration/test_mcp_tools.py +286 -0
  51. excalidraw_mcp-0.1.2/tests/performance/test_element_performance.py +366 -0
  52. excalidraw_mcp-0.1.2/tests/security/test_input_validation.py +293 -0
  53. excalidraw_mcp-0.1.2/tests/test_config.py +163 -0
  54. excalidraw_mcp-0.1.2/tests/test_http_client.py +225 -0
  55. excalidraw_mcp-0.1.2/tests/unit/test_config.py +293 -0
  56. excalidraw_mcp-0.1.2/tests/unit/test_element_factory.py +213 -0
  57. excalidraw_mcp-0.1.2/tsconfig.json +65 -0
  58. excalidraw_mcp-0.1.2/uv.lock +2653 -0
  59. excalidraw_mcp-0.1.2/vite.config.js +27 -0
@@ -0,0 +1,26 @@
1
+ # Dependencies
2
+ node_modules/
3
+ package-lock.json
4
+
5
+ # Build artifacts
6
+ dist/
7
+ public/dist/
8
+
9
+ # Environment files
10
+ .env
11
+
12
+ # Logs
13
+ *.log
14
+
15
+ # Editor artifacts
16
+ .cursor/
17
+ .claude/
18
+
19
+ # Development artifacts
20
+ *.excalidraw
21
+
22
+ docs/
23
+ */__pycache__/
24
+ /.benchmarks/
25
+ /.mcp.json
26
+ /.envrc
@@ -0,0 +1,8 @@
1
+ # Default ignored files
2
+ /shelf/
3
+ /workspace.xml
4
+ # Editor-based HTTP Client requests
5
+ /httpRequests/
6
+ # Datasource local storage ignored files
7
+ /dataSources/
8
+ /dataSources.local.xml
@@ -0,0 +1,21 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <module type="PYTHON_MODULE" version="4">
3
+ <component name="NewModuleRootManager">
4
+ <content url="file://$MODULE_DIR$">
5
+ <sourceFolder url="file://$MODULE_DIR$/excalidraw_mcp" isTestSource="false" />
6
+ <sourceFolder url="file://$MODULE_DIR$/frontend" isTestSource="false" />
7
+ <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
8
+ <sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
9
+ <sourceFolder url="file://$MODULE_DIR$/tests" isTestSource="true" />
10
+ <excludeFolder url="file://$MODULE_DIR$/.venv" />
11
+ <excludeFolder url="file://$MODULE_DIR$/dist" />
12
+ <excludeFolder url="file://$MODULE_DIR$/node_modules" />
13
+ </content>
14
+ <orderEntry type="jdk" jdkName="Python 3.12 (excalidraw-mcp)" jdkType="Python SDK" />
15
+ <orderEntry type="sourceFolder" forTests="false" />
16
+ </component>
17
+ <component name="PyDocumentationSettings">
18
+ <option name="format" value="PLAIN" />
19
+ <option name="myDocStringFormat" value="Plain" />
20
+ </component>
21
+ </module>
@@ -0,0 +1,29 @@
1
+ <component name="InspectionProjectProfileManager">
2
+ <profile version="1.0">
3
+ <option name="myName" value="Project Default" />
4
+ <inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
5
+ <inspection_tool class="JSHint" enabled="true" level="ERROR" enabled_by_default="true" />
6
+ <inspection_tool class="PyPep8NamingInspection" enabled="true" level="WEAK WARNING" enabled_by_default="true">
7
+ <option name="ignoredErrors">
8
+ <list>
9
+ <option value="N802" />
10
+ </list>
11
+ </option>
12
+ </inspection_tool>
13
+ <inspection_tool class="PyUnresolvedReferencesInspection" enabled="true" level="WARNING" enabled_by_default="true">
14
+ <option name="ignoredIdentifiers">
15
+ <list>
16
+ <option value="google.cloud.storage" />
17
+ <option value="firebase.ic" />
18
+ <option value="templates.ic" />
19
+ <option value="cloud_storage.ic" />
20
+ <option value="memorystore.ic" />
21
+ <option value="main.ic" />
22
+ <option value="models.ic" />
23
+ <option value="sys._getframe" />
24
+ </list>
25
+ </option>
26
+ </inspection_tool>
27
+ <inspection_tool class="PyprojectInspection" enabled="false" level="WARNING" enabled_by_default="false" />
28
+ </profile>
29
+ </component>
@@ -0,0 +1,6 @@
1
+ <component name="InspectionProjectProfileManager">
2
+ <settings>
3
+ <option name="USE_PROJECT_PROFILE" value="false" />
4
+ <version value="1.0" />
5
+ </settings>
6
+ </component>
@@ -0,0 +1,7 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="Black">
4
+ <option name="sdkName" value="Python 3.12 (excalidraw-mcp)" />
5
+ </component>
6
+ <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.12 (excalidraw-mcp)" project-jdk-type="Python SDK" />
7
+ </project>
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ProjectModuleManager">
4
+ <modules>
5
+ <module fileurl="file://$PROJECT_DIR$/.idea/excalidraw-mcp.iml" filepath="$PROJECT_DIR$/.idea/excalidraw-mcp.iml" />
6
+ </modules>
7
+ </component>
8
+ </project>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="RuffConfigService">
4
+ <option name="globalRuffExecutablePath" value="/usr/local/bin/ruff" />
5
+ </component>
6
+ </project>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="VcsDirectoryMappings">
4
+ <mapping directory="" vcs="Git" />
5
+ </component>
6
+ </project>
@@ -0,0 +1,14 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="WebResourcesPaths">
4
+ <contentEntries>
5
+ <entry url="file://$PROJECT_DIR$">
6
+ <entryData>
7
+ <resourceRoots>
8
+ <path value="file://$PROJECT_DIR$/node_modules" />
9
+ </resourceRoots>
10
+ </entryData>
11
+ </entry>
12
+ </contentEntries>
13
+ </component>
14
+ </project>
@@ -0,0 +1,165 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="AutoImportSettings">
4
+ <option name="autoReloadType" value="SELECTIVE" />
5
+ </component>
6
+ <component name="ChangeListManager">
7
+ <list default="true" id="1ce40c62-8e46-4cda-886d-fb114b426e4d" name="Changes" comment="">
8
+ <change afterPath="$PROJECT_DIR$/.pre-commit-config.yaml" afterDir="false" />
9
+ <change beforePath="$PROJECT_DIR$/.gitignore" beforeDir="false" afterPath="$PROJECT_DIR$/.gitignore" afterDir="false" />
10
+ <change beforePath="$PROJECT_DIR$/CLAUDE.md" beforeDir="false" afterPath="$PROJECT_DIR$/CLAUDE.md" afterDir="false" />
11
+ <change beforePath="$PROJECT_DIR$/LICENSE" beforeDir="false" afterPath="$PROJECT_DIR$/LICENSE" afterDir="false" />
12
+ <change beforePath="$PROJECT_DIR$/README.md" beforeDir="false" afterPath="$PROJECT_DIR$/README.md" afterDir="false" />
13
+ <change beforePath="$PROJECT_DIR$/RULES.md" beforeDir="false" afterPath="$PROJECT_DIR$/RULES.md" afterDir="false" />
14
+ <change beforePath="$PROJECT_DIR$/SETUP.md" beforeDir="false" afterPath="$PROJECT_DIR$/SETUP.md" afterDir="false" />
15
+ <change beforePath="$PROJECT_DIR$/example.mcp.json" beforeDir="false" afterPath="$PROJECT_DIR$/example.mcp.json" afterDir="false" />
16
+ <change beforePath="$PROJECT_DIR$/excalidraw_mcp/__init__.py" beforeDir="false" afterPath="$PROJECT_DIR$/excalidraw_mcp/__init__.py" afterDir="false" />
17
+ <change beforePath="$PROJECT_DIR$/excalidraw_mcp/__main__.py" beforeDir="false" afterPath="$PROJECT_DIR$/excalidraw_mcp/__main__.py" afterDir="false" />
18
+ <change beforePath="$PROJECT_DIR$/excalidraw_mcp/__pycache__/__init__.cpython-313.pyc" beforeDir="false" />
19
+ <change beforePath="$PROJECT_DIR$/excalidraw_mcp/__pycache__/server.cpython-313.pyc" beforeDir="false" />
20
+ <change beforePath="$PROJECT_DIR$/excalidraw_mcp/config.py" beforeDir="false" afterPath="$PROJECT_DIR$/excalidraw_mcp/config.py" afterDir="false" />
21
+ <change beforePath="$PROJECT_DIR$/excalidraw_mcp/element_factory.py" beforeDir="false" afterPath="$PROJECT_DIR$/excalidraw_mcp/element_factory.py" afterDir="false" />
22
+ <change beforePath="$PROJECT_DIR$/excalidraw_mcp/http_client.py" beforeDir="false" afterPath="$PROJECT_DIR$/excalidraw_mcp/http_client.py" afterDir="false" />
23
+ <change beforePath="$PROJECT_DIR$/excalidraw_mcp/mcp_tools.py" beforeDir="false" afterPath="$PROJECT_DIR$/excalidraw_mcp/mcp_tools.py" afterDir="false" />
24
+ <change beforePath="$PROJECT_DIR$/excalidraw_mcp/process_manager.py" beforeDir="false" afterPath="$PROJECT_DIR$/excalidraw_mcp/process_manager.py" afterDir="false" />
25
+ <change beforePath="$PROJECT_DIR$/excalidraw_mcp/server.py" beforeDir="false" afterPath="$PROJECT_DIR$/excalidraw_mcp/server.py" afterDir="false" />
26
+ <change beforePath="$PROJECT_DIR$/frontend/index.html" beforeDir="false" afterPath="$PROJECT_DIR$/frontend/index.html" afterDir="false" />
27
+ <change beforePath="$PROJECT_DIR$/frontend/src/App.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/frontend/src/App.tsx" afterDir="false" />
28
+ <change beforePath="$PROJECT_DIR$/frontend/src/main.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/frontend/src/main.tsx" afterDir="false" />
29
+ <change beforePath="$PROJECT_DIR$/jest.config.cjs" beforeDir="false" afterPath="$PROJECT_DIR$/jest.config.cjs" afterDir="false" />
30
+ <change beforePath="$PROJECT_DIR$/pyproject.toml" beforeDir="false" afterPath="$PROJECT_DIR$/pyproject.toml" afterDir="false" />
31
+ <change beforePath="$PROJECT_DIR$/src/config.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/config.ts" afterDir="false" />
32
+ <change beforePath="$PROJECT_DIR$/src/middleware/auth.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/middleware/auth.ts" afterDir="false" />
33
+ <change beforePath="$PROJECT_DIR$/src/middleware/security.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/middleware/security.ts" afterDir="false" />
34
+ <change beforePath="$PROJECT_DIR$/src/middleware/validation.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/middleware/validation.ts" afterDir="false" />
35
+ <change beforePath="$PROJECT_DIR$/src/server.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/server.ts" afterDir="false" />
36
+ <change beforePath="$PROJECT_DIR$/src/storage/element-storage.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/storage/element-storage.ts" afterDir="false" />
37
+ <change beforePath="$PROJECT_DIR$/src/types.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/types.ts" afterDir="false" />
38
+ <change beforePath="$PROJECT_DIR$/src/utils/delta-compression.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/utils/delta-compression.ts" afterDir="false" />
39
+ <change beforePath="$PROJECT_DIR$/src/utils/logger.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/utils/logger.ts" afterDir="false" />
40
+ <change beforePath="$PROJECT_DIR$/src/websocket/message-batcher.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/websocket/message-batcher.ts" afterDir="false" />
41
+ <change beforePath="$PROJECT_DIR$/test/config.test.ts" beforeDir="false" afterPath="$PROJECT_DIR$/test/config.test.ts" afterDir="false" />
42
+ <change beforePath="$PROJECT_DIR$/test/setup.ts" beforeDir="false" afterPath="$PROJECT_DIR$/test/setup.ts" afterDir="false" />
43
+ <change beforePath="$PROJECT_DIR$/test/storage/element-storage.test.ts" beforeDir="false" afterPath="$PROJECT_DIR$/test/storage/element-storage.test.ts" afterDir="false" />
44
+ <change beforePath="$PROJECT_DIR$/test/unit/delta-compression.test.ts" beforeDir="false" afterPath="$PROJECT_DIR$/test/unit/delta-compression.test.ts" afterDir="false" />
45
+ <change beforePath="$PROJECT_DIR$/tests/__init__.py" beforeDir="false" afterPath="$PROJECT_DIR$/tests/__init__.py" afterDir="false" />
46
+ <change beforePath="$PROJECT_DIR$/tests/conftest.py" beforeDir="false" afterPath="$PROJECT_DIR$/tests/conftest.py" afterDir="false" />
47
+ <change beforePath="$PROJECT_DIR$/tests/integration/test_mcp_tools.py" beforeDir="false" afterPath="$PROJECT_DIR$/tests/integration/test_mcp_tools.py" afterDir="false" />
48
+ <change beforePath="$PROJECT_DIR$/tests/performance/test_element_performance.py" beforeDir="false" afterPath="$PROJECT_DIR$/tests/performance/test_element_performance.py" afterDir="false" />
49
+ <change beforePath="$PROJECT_DIR$/tests/security/test_input_validation.py" beforeDir="false" afterPath="$PROJECT_DIR$/tests/security/test_input_validation.py" afterDir="false" />
50
+ <change beforePath="$PROJECT_DIR$/tests/test_config.py" beforeDir="false" afterPath="$PROJECT_DIR$/tests/test_config.py" afterDir="false" />
51
+ <change beforePath="$PROJECT_DIR$/tests/test_http_client.py" beforeDir="false" afterPath="$PROJECT_DIR$/tests/test_http_client.py" afterDir="false" />
52
+ <change beforePath="$PROJECT_DIR$/tests/unit/__pycache__/test_config.cpython-313-pytest-8.4.1.pyc" beforeDir="false" />
53
+ <change beforePath="$PROJECT_DIR$/tests/unit/__pycache__/test_element_factory.cpython-313-pytest-8.4.1.pyc" beforeDir="false" />
54
+ <change beforePath="$PROJECT_DIR$/tests/unit/test_config.py" beforeDir="false" afterPath="$PROJECT_DIR$/tests/unit/test_config.py" afterDir="false" />
55
+ <change beforePath="$PROJECT_DIR$/tests/unit/test_element_factory.py" beforeDir="false" afterPath="$PROJECT_DIR$/tests/unit/test_element_factory.py" afterDir="false" />
56
+ <change beforePath="$PROJECT_DIR$/tsconfig.json" beforeDir="false" afterPath="$PROJECT_DIR$/tsconfig.json" afterDir="false" />
57
+ <change beforePath="$PROJECT_DIR$/uv.lock" beforeDir="false" afterPath="$PROJECT_DIR$/uv.lock" afterDir="false" />
58
+ <change beforePath="$PROJECT_DIR$/vite.config.js" beforeDir="false" afterPath="$PROJECT_DIR$/vite.config.js" afterDir="false" />
59
+ </list>
60
+ <option name="SHOW_DIALOG" value="false" />
61
+ <option name="HIGHLIGHT_CONFLICTS" value="true" />
62
+ <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
63
+ <option name="LAST_RESOLUTION" value="IGNORE" />
64
+ </component>
65
+ <component name="Git.Settings">
66
+ <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
67
+ </component>
68
+ <component name="GitHubPullRequestSearchHistory">{
69
+ &quot;lastFilter&quot;: {
70
+ &quot;state&quot;: &quot;OPEN&quot;,
71
+ &quot;assignee&quot;: &quot;lesleslie&quot;
72
+ }
73
+ }</component>
74
+ <component name="GitLabMergeRequestFiltersHistory">{
75
+ &quot;lastFilter&quot;: {
76
+ &quot;state&quot;: &quot;OPENED&quot;,
77
+ &quot;assignee&quot;: {
78
+ &quot;type&quot;: &quot;org.jetbrains.plugins.gitlab.mergerequest.ui.filters.GitLabMergeRequestsFiltersValue.MergeRequestsMemberFilterValue.MergeRequestsAssigneeFilterValue&quot;,
79
+ &quot;username&quot;: &quot;lesleslie&quot;,
80
+ &quot;fullname&quot;: &quot;Les Leslie&quot;
81
+ }
82
+ }
83
+ }</component>
84
+ <component name="GitLabMergeRequestsSettings">{
85
+ &quot;selectedUrlAndAccountId&quot;: {
86
+ &quot;first&quot;: &quot;https://gitlab.com/lesleslie/excalidraw-mcp.git&quot;,
87
+ &quot;second&quot;: &quot;97b5872b-7573-42a7-9547-7db3d03839d1&quot;
88
+ }
89
+ }</component>
90
+ <component name="GithubPullRequestsUISettings">{
91
+ &quot;selectedUrlAndAccountId&quot;: {
92
+ &quot;url&quot;: &quot;https://github.com/lesleslie/excalidraw-mcp.git&quot;,
93
+ &quot;accountId&quot;: &quot;70562ca4-32e7-481d-95b9-6692e8825e1c&quot;
94
+ }
95
+ }</component>
96
+ <component name="ProjectColorInfo">{
97
+ &quot;associatedIndex&quot;: 8
98
+ }</component>
99
+ <component name="ProjectId" id="31crBc28ZgsQqqr0YBS650ySaRy" />
100
+ <component name="ProjectViewState">
101
+ <option name="hideEmptyMiddlePackages" value="true" />
102
+ <option name="showLibraryContents" value="true" />
103
+ </component>
104
+ <component name="PropertiesComponent">{
105
+ &quot;keyToString&quot;: {
106
+ &quot;ASKED_MARK_IGNORED_FILES_AS_EXCLUDED&quot;: &quot;true&quot;,
107
+ &quot;ASKED_SHARE_PROJECT_CONFIGURATION_FILES&quot;: &quot;true&quot;,
108
+ &quot;ModuleVcsDetector.initialDetectionPerformed&quot;: &quot;true&quot;,
109
+ &quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
110
+ &quot;RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252&quot;: &quot;true&quot;,
111
+ &quot;RunOnceActivity.git.unshallow&quot;: &quot;true&quot;,
112
+ &quot;dart.analysis.tool.window.visible&quot;: &quot;false&quot;,
113
+ &quot;git-widget-placeholder&quot;: &quot;main&quot;,
114
+ &quot;junie.onboarding.icon.badge.shown&quot;: &quot;true&quot;,
115
+ &quot;last_opened_file_path&quot;: &quot;/Users/les/Projects/excalidraw-mcp&quot;,
116
+ &quot;node.js.detected.package.eslint&quot;: &quot;true&quot;,
117
+ &quot;node.js.detected.package.tslint&quot;: &quot;true&quot;,
118
+ &quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;,
119
+ &quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;,
120
+ &quot;nodejs_package_manager_path&quot;: &quot;npm&quot;,
121
+ &quot;settings.editor.selected.configurable&quot;: &quot;com.intellij.pycharm.community.ide.impl.configuration.PythonContentEntriesConfigurable&quot;,
122
+ &quot;to.speed.mode.migration.done&quot;: &quot;true&quot;,
123
+ &quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;
124
+ }
125
+ }</component>
126
+ <component name="RecentsManager">
127
+ <key name="CopyFile.RECENT_KEYS">
128
+ <recent name="$PROJECT_DIR$" />
129
+ </key>
130
+ </component>
131
+ <component name="SharedIndexes">
132
+ <attachedChunks>
133
+ <set>
134
+ <option value="bundled-js-predefined-d6986cc7102b-b598e85cdad2-JavaScript-PY-252.25557.130" />
135
+ <option value="bundled-python-sdk-1bde30d8e611-7b97d883f26b-com.jetbrains.pycharm.pro.sharedIndexes.bundled-PY-252.25557.130" />
136
+ </set>
137
+ </attachedChunks>
138
+ </component>
139
+ <component name="TaskManager">
140
+ <task active="true" id="Default" summary="Default task">
141
+ <changelist id="1ce40c62-8e46-4cda-886d-fb114b426e4d" name="Changes" comment="" />
142
+ <created>1755834070142</created>
143
+ <option name="number" value="Default" />
144
+ <option name="presentableId" value="Default" />
145
+ <updated>1755834070142</updated>
146
+ <workItem from="1755834071260" duration="9017000" />
147
+ <workItem from="1755884632901" duration="245000" />
148
+ <workItem from="1755885415908" duration="2618000" />
149
+ <workItem from="1755991493689" duration="169000" />
150
+ <workItem from="1755992411146" duration="4540000" />
151
+ <workItem from="1756276096436" duration="651000" />
152
+ <workItem from="1756278414341" duration="1239000" />
153
+ <workItem from="1756291782615" duration="119000" />
154
+ <workItem from="1756291931091" duration="436000" />
155
+ <workItem from="1756292439065" duration="501000" />
156
+ <workItem from="1756293019869" duration="37000" />
157
+ <workItem from="1756779302806" duration="2296000" />
158
+ <workItem from="1756789971697" duration="1238000" />
159
+ </task>
160
+ <servers />
161
+ </component>
162
+ <component name="TypeScriptGeneratedFilesManager">
163
+ <option name="version" value="3" />
164
+ </component>
165
+ </project>
@@ -0,0 +1,96 @@
1
+ repos:
2
+ # File structure and format validators
3
+ - repo: https://github.com/pre-commit/pre-commit-hooks
4
+ rev: v6.0.0
5
+ hooks:
6
+ - id: trailing-whitespace
7
+ name: trailing-whitespace
8
+ exclude: ^\.venv/
9
+ - id: end-of-file-fixer
10
+ name: end-of-file-fixer
11
+ exclude: ^\.venv/
12
+ - id: check-yaml
13
+ name: check-yaml
14
+ exclude: ^\.venv/
15
+ - id: check-toml
16
+ name: check-toml
17
+ exclude: ^\.venv/
18
+ - id: check-added-large-files
19
+ name: check-added-large-files
20
+ exclude: ^\.venv/
21
+ - repo: https://github.com/astral-sh/uv-pre-commit
22
+ rev: 0.8.14
23
+ hooks:
24
+ - id: uv-lock
25
+ files: ^pyproject\.toml$
26
+ # Security checks
27
+ - repo: https://github.com/gitleaks/gitleaks
28
+ rev: v8.28.0
29
+ hooks:
30
+ - id: gitleaks
31
+ exclude: uv\.lock|pyproject\.toml|tests/.*|docs/.*|.*\.md
32
+ # Security checks
33
+ - repo: https://github.com/PyCQA/bandit
34
+ rev: 1.8.6
35
+ hooks:
36
+ - id: bandit
37
+ args: ["-c", "pyproject.toml", "-r", "-ll"]
38
+ files: ^crackerjack/.*\.py$
39
+ stages: ["pre-push", "manual"]
40
+ # Code formatting and quality
41
+ - repo: https://github.com/codespell-project/codespell
42
+ rev: v2.4.1
43
+ hooks:
44
+ - id: codespell
45
+ exclude: ^\.venv/
46
+ additional_dependencies: ["tomli"]
47
+ # Code formatting and quality
48
+ - repo: https://github.com/astral-sh/ruff-pre-commit
49
+ rev: v0.12.11
50
+ hooks:
51
+ - id: ruff-check
52
+ exclude: ^\.venv/
53
+ - id: ruff-format
54
+ exclude: ^\.venv/
55
+ # Code formatting and quality
56
+ - repo: https://github.com/executablebooks/mdformat
57
+ rev: 0.7.22
58
+ hooks:
59
+ - id: mdformat
60
+ exclude: ^\.venv/
61
+ additional_dependencies: ["mdformat-ruff"]
62
+ - repo: https://github.com/jendrikseipp/vulture
63
+ rev: v2.14
64
+ hooks:
65
+ - id: vulture
66
+ files: ^crackerjack/.*\.py$
67
+ stages: ["pre-push", "manual"]
68
+ - repo: https://github.com/fredrikaverpil/creosote
69
+ rev: v4.1.0
70
+ hooks:
71
+ - id: creosote
72
+ exclude: ^\.venv/
73
+ stages: ["pre-push", "manual"]
74
+ - repo: https://github.com/rohaquinlop/complexipy-pre-commit
75
+ rev: v3.3.0
76
+ hooks:
77
+ - id: complexipy
78
+ args: ["-d", "low"]
79
+ files: ^crackerjack/.*\.py$
80
+ exclude: ^(\.venv/|tests/)
81
+ stages: ["pre-push", "manual"]
82
+ - repo: https://github.com/dosisod/refurb
83
+ rev: v2.1.0
84
+ hooks:
85
+ - id: refurb
86
+ args: ["--ignore", "FURB184", "--ignore", "FURB120"]
87
+ files: ^crackerjack/.*\.py$
88
+ exclude: ^tests/.*\.py$
89
+ stages: ["pre-push", "manual"]
90
+ - repo: https://github.com/RobertCraigie/pyright-python
91
+ rev: v1.1.404
92
+ hooks:
93
+ - id: pyright
94
+ files: ^crackerjack/.*\.py$
95
+ exclude: ^crackerjack/(mcp|plugins)/.*\.py$|crackerjack/code_cleaner\.py$
96
+ stages: ["pre-push", "manual"]