claude-mpm 5.4.59__py3-none-any.whl → 5.4.64__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 claude-mpm might be problematic. Click here for more details.

Files changed (129) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +5 -0
  3. claude_mpm/cli/startup.py +14 -9
  4. claude_mpm/scripts/start_activity_logging.py +0 -0
  5. claude_mpm/services/agents/deployment/agent_template_builder.py +8 -0
  6. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
  7. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
  8. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  9. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  10. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  11. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  12. claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
  13. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
  14. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
  15. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  16. claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
  17. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
  18. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  19. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  20. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
  21. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  22. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  23. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  24. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  25. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
  26. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
  27. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
  28. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
  29. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
  30. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
  31. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
  32. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
  33. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
  34. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
  35. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
  36. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
  37. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  38. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  39. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
  40. claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
  41. claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
  42. claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
  43. claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
  44. claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
  45. claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
  46. claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
  47. claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
  48. claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
  49. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
  50. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
  51. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
  52. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
  53. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
  54. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
  55. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
  56. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  57. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
  58. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
  59. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
  60. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
  61. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  62. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
  63. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  64. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  65. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  66. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  67. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  68. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  69. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  70. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  71. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  72. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  73. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  74. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  75. claude_mpm/skills/bundled/pm/pm-delegation-patterns/SKILL.md +167 -0
  76. claude_mpm/skills/bundled/pm/pm-git-file-tracking/SKILL.md +113 -0
  77. claude_mpm/skills/bundled/pm/pm-pr-workflow/SKILL.md +124 -0
  78. claude_mpm/skills/bundled/pm/pm-ticketing-integration/SKILL.md +154 -0
  79. claude_mpm/skills/bundled/pm/pm-verification-protocols/SKILL.md +198 -0
  80. claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
  81. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  82. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  83. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  84. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  85. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  86. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  87. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  88. claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
  89. claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
  90. claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
  91. claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
  92. claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
  93. claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
  94. claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
  95. claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
  96. claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
  97. claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
  98. claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
  99. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
  100. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  101. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
  102. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
  103. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
  104. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
  105. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
  106. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
  107. claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
  108. claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
  109. claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
  110. claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
  111. claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
  112. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
  113. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  114. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  115. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  116. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  117. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
  118. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  119. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  120. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  121. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  122. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  123. {claude_mpm-5.4.59.dist-info → claude_mpm-5.4.64.dist-info}/METADATA +1 -1
  124. {claude_mpm-5.4.59.dist-info → claude_mpm-5.4.64.dist-info}/RECORD +128 -11
  125. {claude_mpm-5.4.59.dist-info → claude_mpm-5.4.64.dist-info}/WHEEL +0 -0
  126. {claude_mpm-5.4.59.dist-info → claude_mpm-5.4.64.dist-info}/entry_points.txt +0 -0
  127. {claude_mpm-5.4.59.dist-info → claude_mpm-5.4.64.dist-info}/licenses/LICENSE +0 -0
  128. {claude_mpm-5.4.59.dist-info → claude_mpm-5.4.64.dist-info}/licenses/LICENSE-FAQ.md +0 -0
  129. {claude_mpm-5.4.59.dist-info → claude_mpm-5.4.64.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,420 @@
1
+ # Environment Validation Workflows
2
+
3
+ > **Part of**: [env-manager](../SKILL.md)
4
+ > **Category**: infrastructure
5
+ > **Reading Level**: Intermediate
6
+
7
+ ## Purpose
8
+
9
+ Complete validation workflows for environment variables: structure checks, completeness verification, naming conventions, and framework-specific validation patterns.
10
+
11
+ ## Validation Hierarchy
12
+
13
+ ### Level 1: Structure Validation (Basic)
14
+ Validates file format and syntax.
15
+
16
+ ### Level 2: Semantic Validation (Intermediate)
17
+ Validates naming, completeness, framework conventions.
18
+
19
+ ### Level 3: Integration Validation (Advanced)
20
+ Validates across environments, platforms, and services.
21
+
22
+ ## Structure Validation
23
+
24
+ ### Check 1: Valid Key-Value Format
25
+
26
+ **What to Check:**
27
+ ```bash
28
+ # Valid formats:
29
+ KEY=value
30
+ KEY="value with spaces"
31
+ KEY='single quoted'
32
+ KEY=
33
+
34
+ # Invalid formats:
35
+ key=value # lowercase
36
+ KEY = value # spaces around =
37
+ KEY=value # comment # inline comments (parser-dependent)
38
+ =value # missing key
39
+ KEY # missing =
40
+ ```
41
+
42
+ **Validation Script:**
43
+ ```python
44
+ import re
45
+ from pathlib import Path
46
+
47
+ def validate_structure(env_file: Path) -> list[str]:
48
+ """Validate .env file structure."""
49
+ errors = []
50
+ valid_line_pattern = re.compile(r'^[A-Z_][A-Z0-9_]*=.*$')
51
+
52
+ with open(env_file) as f:
53
+ for line_num, line in enumerate(f, 1):
54
+ line = line.strip()
55
+
56
+ # Skip empty lines and comments
57
+ if not line or line.startswith('#'):
58
+ continue
59
+
60
+ # Check format
61
+ if not valid_line_pattern.match(line):
62
+ errors.append(f"Line {line_num}: Invalid format: {line}")
63
+
64
+ # Check for inline comments (warning)
65
+ if '#' in line and not line.startswith('#'):
66
+ # Check if # is inside quotes
67
+ key, value = line.split('=', 1)
68
+ if '#' in value and not (value.startswith('"') or value.startswith("'")):
69
+ errors.append(f"Line {line_num}: WARNING: Possible inline comment: {line}")
70
+
71
+ return errors
72
+ ```
73
+
74
+ ### Check 2: No Duplicate Keys
75
+
76
+ **Issue:**
77
+ ```bash
78
+ # .env file
79
+ DATABASE_URL=postgres://local
80
+ DATABASE_URL=postgres://production # Duplicate! Which wins?
81
+ ```
82
+
83
+ **Validation:**
84
+ ```python
85
+ def check_duplicates(env_file: Path) -> dict[str, list[int]]:
86
+ """Find duplicate keys and their line numbers."""
87
+ keys = {}
88
+
89
+ with open(env_file) as f:
90
+ for line_num, line in enumerate(f, 1):
91
+ line = line.strip()
92
+ if not line or line.startswith('#'):
93
+ continue
94
+
95
+ if '=' in line:
96
+ key = line.split('=', 1)[0]
97
+ if key in keys:
98
+ keys[key].append(line_num)
99
+ else:
100
+ keys[key] = [line_num]
101
+
102
+ # Return only duplicates
103
+ return {k: v for k, v in keys.items() if len(v) > 1}
104
+ ```
105
+
106
+ ### Check 3: Proper Quoting
107
+
108
+ **Valid Quoting Patterns:**
109
+ ```bash
110
+ # No quotes needed
111
+ SIMPLE_VALUE=hello
112
+
113
+ # Quotes required for spaces
114
+ WITH_SPACES="hello world"
115
+
116
+ # Quotes required for special chars
117
+ SPECIAL_CHARS="value with = or # chars"
118
+
119
+ # Escape quotes inside quotes
120
+ ESCAPED="He said \"hello\""
121
+ ESCAPED_SINGLE='It'\''s working'
122
+ ```
123
+
124
+ **Validation:**
125
+ ```python
126
+ def validate_quoting(env_file: Path) -> list[str]:
127
+ """Check for proper quoting."""
128
+ warnings = []
129
+
130
+ with open(env_file) as f:
131
+ for line_num, line in enumerate(f, 1):
132
+ line = line.strip()
133
+ if not line or line.startswith('#') or '=' not in line:
134
+ continue
135
+
136
+ key, value = line.split('=', 1)
137
+
138
+ # Check for spaces without quotes
139
+ if ' ' in value and not (value.startswith('"') or value.startswith("'")):
140
+ warnings.append(f"Line {line_num}: Value with spaces should be quoted: {key}")
141
+
142
+ # Check for special chars without quotes
143
+ if any(char in value for char in ['#', '=', '$']) and not value.startswith(('"', "'")):
144
+ warnings.append(f"Line {line_num}: Value with special chars should be quoted: {key}")
145
+
146
+ return warnings
147
+ ```
148
+
149
+ ## Completeness Validation
150
+
151
+ ### Compare Against .env.example
152
+
153
+ **Workflow:**
154
+ ```python
155
+ def compare_env_files(env_file: Path, example_file: Path) -> dict:
156
+ """Compare .env against .env.example."""
157
+
158
+ def parse_keys(file_path: Path) -> set[str]:
159
+ keys = set()
160
+ with open(file_path) as f:
161
+ for line in f:
162
+ line = line.strip()
163
+ if line and not line.startswith('#') and '=' in line:
164
+ key = line.split('=', 1)[0]
165
+ keys.add(key)
166
+ return keys
167
+
168
+ env_keys = parse_keys(env_file)
169
+ example_keys = parse_keys(example_file)
170
+
171
+ return {
172
+ 'missing': example_keys - env_keys, # Required but missing
173
+ 'extra': env_keys - example_keys, # Present but not documented
174
+ 'common': env_keys & example_keys # Properly documented
175
+ }
176
+ ```
177
+
178
+ **Usage:**
179
+ ```bash
180
+ # Find missing required variables
181
+ python validate_env.py .env --compare .env.example
182
+
183
+ # Output:
184
+ # Missing variables (in .env.example but not .env):
185
+ # - DATABASE_URL
186
+ # - JWT_SECRET
187
+ # - SMTP_HOST
188
+ #
189
+ # Extra variables (in .env but not documented):
190
+ # - DEBUG_MODE
191
+ # - TEMP_API_KEY
192
+ ```
193
+
194
+ ### Check Required Variables by Environment
195
+
196
+ **Pattern:**
197
+ ```python
198
+ REQUIRED_VARS = {
199
+ 'development': [
200
+ 'NODE_ENV',
201
+ 'DATABASE_URL',
202
+ 'PORT'
203
+ ],
204
+ 'production': [
205
+ 'NODE_ENV',
206
+ 'DATABASE_URL',
207
+ 'PORT',
208
+ 'JWT_SECRET',
209
+ 'API_KEY',
210
+ 'REDIS_URL'
211
+ ],
212
+ 'test': [
213
+ 'NODE_ENV',
214
+ 'TEST_DATABASE_URL'
215
+ ]
216
+ }
217
+
218
+ def validate_required_vars(env_file: Path, environment: str) -> list[str]:
219
+ """Check if all required variables are present."""
220
+ required = REQUIRED_VARS.get(environment, [])
221
+ present = parse_keys(env_file)
222
+
223
+ missing = [var for var in required if var not in present]
224
+ return missing
225
+ ```
226
+
227
+ ## Naming Convention Validation
228
+
229
+ ### Standard Conventions
230
+
231
+ **Valid Names:**
232
+ ```bash
233
+ # Standard format: UPPERCASE_WITH_UNDERSCORES
234
+ DATABASE_URL=value
235
+ API_KEY=value
236
+ MAX_CONNECTIONS=10
237
+
238
+ # Framework-specific prefixes
239
+ NEXT_PUBLIC_API_URL=value # Next.js client-side
240
+ VITE_API_URL=value # Vite client-side
241
+ REACT_APP_API_URL=value # Create React App
242
+ ```
243
+
244
+ **Invalid Names:**
245
+ ```bash
246
+ # Bad patterns
247
+ databaseUrl=value # camelCase
248
+ database-url=value # kebab-case
249
+ database.url=value # dots
250
+ 123_KEY=value # starts with number
251
+ _PRIVATE_KEY=value # leading underscore (convention warning)
252
+ ```
253
+
254
+ **Validation:**
255
+ ```python
256
+ import re
257
+
258
+ def validate_naming_conventions(env_file: Path, framework: str = None) -> list[str]:
259
+ """Validate variable naming conventions."""
260
+ errors = []
261
+
262
+ # Standard pattern
263
+ standard_pattern = re.compile(r'^[A-Z][A-Z0-9_]*$')
264
+
265
+ # Framework-specific patterns
266
+ framework_patterns = {
267
+ 'nextjs': re.compile(r'^(NEXT_PUBLIC_|NEXT_)[A-Z0-9_]+$'),
268
+ 'vite': re.compile(r'^(VITE_)?[A-Z0-9_]+$'),
269
+ 'react': re.compile(r'^(REACT_APP_)?[A-Z0-9_]+$'),
270
+ }
271
+
272
+ with open(env_file) as f:
273
+ for line_num, line in enumerate(f, 1):
274
+ line = line.strip()
275
+ if not line or line.startswith('#') or '=' not in line:
276
+ continue
277
+
278
+ key = line.split('=', 1)[0]
279
+
280
+ # Check standard pattern
281
+ if not standard_pattern.match(key):
282
+ errors.append(f"Line {line_num}: Invalid naming: {key} (use UPPERCASE_WITH_UNDERSCORES)")
283
+
284
+ # Check framework-specific patterns
285
+ if framework and framework in framework_patterns:
286
+ pattern = framework_patterns[framework]
287
+ if not pattern.match(key):
288
+ errors.append(f"Line {line_num}: {framework} convention violation: {key}")
289
+
290
+ return errors
291
+ ```
292
+
293
+ ## Framework-Specific Validation
294
+
295
+ ### Next.js Validation
296
+
297
+ **Rules:**
298
+ ```python
299
+ def validate_nextjs_env(env_file: Path) -> list[str]:
300
+ """Validate Next.js environment variables."""
301
+ errors = []
302
+ warnings = []
303
+
304
+ with open(env_file) as f:
305
+ for line_num, line in enumerate(f, 1):
306
+ line = line.strip()
307
+ if not line or line.startswith('#') or '=' not in line:
308
+ continue
309
+
310
+ key, value = line.split('=', 1)
311
+
312
+ # Check NEXT_PUBLIC_ prefix rules
313
+ if key.startswith('NEXT_PUBLIC_'):
314
+ # Warn about secrets in public vars
315
+ if any(secret in key.lower() for secret in ['secret', 'key', 'password', 'token']):
316
+ errors.append(f"Line {line_num}: SECURITY: Secret in NEXT_PUBLIC_ var: {key}")
317
+
318
+ # Check for client-side vars without NEXT_PUBLIC_
319
+ if any(client in key.lower() for client in ['api_url', 'api_endpoint']):
320
+ if not key.startswith('NEXT_PUBLIC_'):
321
+ warnings.append(f"Line {line_num}: Client-side var without NEXT_PUBLIC_: {key}")
322
+
323
+ return errors, warnings
324
+ ```
325
+
326
+ **File Precedence Check:**
327
+ ```python
328
+ def check_nextjs_file_precedence(project_dir: Path) -> dict:
329
+ """Check Next.js .env file precedence."""
330
+ env_files = [
331
+ '.env.local',
332
+ '.env.development.local',
333
+ '.env.production.local',
334
+ '.env.development',
335
+ '.env.production',
336
+ '.env'
337
+ ]
338
+
339
+ found_files = []
340
+ for env_file in env_files:
341
+ if (project_dir / env_file).exists():
342
+ found_files.append(env_file)
343
+
344
+ # Parse and check for conflicts
345
+ all_vars = {}
346
+ for env_file in found_files:
347
+ vars_in_file = parse_env_file(project_dir / env_file)
348
+ for key, value in vars_in_file.items():
349
+ if key in all_vars:
350
+ all_vars[key].append((env_file, value))
351
+ else:
352
+ all_vars[key] = [(env_file, value)]
353
+
354
+ # Find variables defined in multiple files
355
+ conflicts = {k: v for k, v in all_vars.items() if len(v) > 1}
356
+
357
+ return {
358
+ 'files_found': found_files,
359
+ 'conflicts': conflicts,
360
+ 'precedence_order': env_files
361
+ }
362
+ ```
363
+
364
+ ### Express/Node.js Validation
365
+
366
+ **Standard Variables:**
367
+ ```python
368
+ NODE_STANDARD_VARS = {
369
+ 'NODE_ENV': ['development', 'production', 'test'],
370
+ 'PORT': r'^\d+$', # Must be a number
371
+ 'DATABASE_URL': r'^postgres://|mysql://|mongodb://', # Must be valid connection string
372
+ }
373
+
374
+ def validate_nodejs_env(env_file: Path) -> list[str]:
375
+ """Validate Node.js environment variables."""
376
+ errors = []
377
+ vars_dict = parse_env_file(env_file)
378
+
379
+ for key, value in vars_dict.items():
380
+ if key in NODE_STANDARD_VARS:
381
+ expected = NODE_STANDARD_VARS[key]
382
+
383
+ if isinstance(expected, list):
384
+ # Check enumeration
385
+ if value not in expected:
386
+ errors.append(f"{key}: Invalid value '{value}', expected one of {expected}")
387
+ elif isinstance(expected, str):
388
+ # Check regex pattern
389
+ if not re.match(expected, value):
390
+ errors.append(f"{key}: Value doesn't match expected format")
391
+
392
+ return errors
393
+ ```
394
+
395
+ ## Summary
396
+
397
+ **Validation Workflow:**
398
+ 1. **Structure**: Valid format, no duplicates, proper quoting
399
+ 2. **Completeness**: All required vars present, compare with .env.example
400
+ 3. **Naming**: UPPERCASE_WITH_UNDERSCORES, framework prefixes
401
+ 4. **Framework**: Next.js NEXT_PUBLIC_, file precedence
402
+ 5. **Platform**: Vercel/Railway/Heroku conventions
403
+
404
+ **Key Validations:**
405
+ - ✅ Valid key-value format
406
+ - ✅ No duplicate keys
407
+ - ✅ Proper quoting for spaces/special chars
408
+ - ✅ All required variables present
409
+ - ✅ Consistent naming conventions
410
+ - ✅ Framework-specific rules followed
411
+ - ✅ No secrets in client-side vars (NEXT_PUBLIC_)
412
+
413
+ ## Related References
414
+
415
+ - [Security](security.md): Secret scanning and exposure detection
416
+ - [Synchronization](synchronization.md): Platform sync validation
417
+ - [Frameworks](frameworks.md): Complete framework patterns
418
+
419
+ ---
420
+ **Lines**: 285 ✓ 150-300 range
@@ -0,0 +1,86 @@
1
+ ---
2
+ name: artifacts-builder
3
+ description: Suite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn/ui). Use for complex artifacts requiring state management, routing, or shadcn/ui components - not for simple single-file HTML/JSX artifacts.
4
+ license: Complete terms in LICENSE.txt
5
+ progressive_disclosure:
6
+ entry_point:
7
+ summary: "Build complex React + TypeScript + shadcn/ui artifacts bundled to single HTML files"
8
+ when_to_use: "Complex artifacts requiring state management, routing, or shadcn/ui components (not simple HTML/JSX)"
9
+ quick_start: |
10
+ 1. Initialize: bash scripts/init-artifact.sh <project-name>
11
+ 2. Develop: Edit generated React/TypeScript files
12
+ 3. Bundle: bash scripts/bundle-artifact.sh → creates bundle.html
13
+ 4. Share bundled HTML as artifact with user
14
+ Stack: React 18 + TypeScript + Vite + Tailwind CSS + shadcn/ui
15
+ note: "Already optimal at 73 lines - scripts/ directory provides implementation details, no fragmentation needed"
16
+ references: []
17
+ ---
18
+
19
+ # Artifacts Builder
20
+
21
+ To build powerful frontend claude.ai artifacts, follow these steps:
22
+ 1. Initialize the frontend repo using `scripts/init-artifact.sh`
23
+ 2. Develop your artifact by editing the generated code
24
+ 3. Bundle all code into a single HTML file using `scripts/bundle-artifact.sh`
25
+ 4. Display artifact to user
26
+ 5. (Optional) Test the artifact
27
+
28
+ **Stack**: React 18 + TypeScript + Vite + Parcel (bundling) + Tailwind CSS + shadcn/ui
29
+
30
+ ## Design & Style Guidelines
31
+
32
+ VERY IMPORTANT: To avoid what is often referred to as "AI slop", avoid using excessive centered layouts, purple gradients, uniform rounded corners, and Inter font.
33
+
34
+ ## Quick Start
35
+
36
+ ### Step 1: Initialize Project
37
+
38
+ Run the initialization script to create a new React project:
39
+ ```bash
40
+ bash scripts/init-artifact.sh <project-name>
41
+ cd <project-name>
42
+ ```
43
+
44
+ This creates a fully configured project with:
45
+ - ✅ React + TypeScript (via Vite)
46
+ - ✅ Tailwind CSS 3.4.1 with shadcn/ui theming system
47
+ - ✅ Path aliases (`@/`) configured
48
+ - ✅ 40+ shadcn/ui components pre-installed
49
+ - ✅ All Radix UI dependencies included
50
+ - ✅ Parcel configured for bundling (via .parcelrc)
51
+ - ✅ Node 18+ compatibility (auto-detects and pins Vite version)
52
+
53
+ ### Step 2: Develop Your Artifact
54
+
55
+ To build the artifact, edit the generated files. See **Common Development Tasks** below for guidance.
56
+
57
+ ### Step 3: Bundle to Single HTML File
58
+
59
+ To bundle the React app into a single HTML artifact:
60
+ ```bash
61
+ bash scripts/bundle-artifact.sh
62
+ ```
63
+
64
+ This creates `bundle.html` - a self-contained artifact with all JavaScript, CSS, and dependencies inlined. This file can be directly shared in Claude conversations as an artifact.
65
+
66
+ **Requirements**: Your project must have an `index.html` in the root directory.
67
+
68
+ **What the script does**:
69
+ - Installs bundling dependencies (parcel, @parcel/config-default, parcel-resolver-tspaths, html-inline)
70
+ - Creates `.parcelrc` config with path alias support
71
+ - Builds with Parcel (no source maps)
72
+ - Inlines all assets into single HTML using html-inline
73
+
74
+ ### Step 4: Share Artifact with User
75
+
76
+ Finally, share the bundled HTML file in conversation with the user so they can view it as an artifact.
77
+
78
+ ### Step 5: Testing/Visualizing the Artifact (Optional)
79
+
80
+ Note: This is a completely optional step. Only perform if necessary or requested.
81
+
82
+ To test/visualize the artifact, use available tools (including other Skills or built-in tools like Playwright or Puppeteer). In general, avoid testing the artifact upfront as it adds latency between the request and when the finished artifact can be seen. Test later, after presenting the artifact, if requested or if issues arise.
83
+
84
+ ## Reference
85
+
86
+ - **shadcn/ui components**: https://ui.shadcn.com/docs/components
@@ -0,0 +1,43 @@
1
+ ---
2
+ name: internal-comms
3
+ description: A set of resources to help me write all kinds of internal communications, using the formats that my company likes to use. Claude should use this skill whenever asked to write some sort of internal communications (status reports, leadership updates, 3P updates, company newsletters, FAQs, incident reports, project updates, etc.).
4
+ license: Complete terms in LICENSE.txt
5
+ progressive_disclosure:
6
+ entry_point:
7
+ summary: "Write internal communications using company-specific formats and guidelines"
8
+ when_to_use: "Writing 3P updates, newsletters, FAQs, status reports, leadership updates, project updates, or incident reports"
9
+ quick_start: |
10
+ 1. Identify communication type (3P update, newsletter, FAQ, etc.)
11
+ 2. Load appropriate guideline from examples/ directory
12
+ 3. Follow specific instructions for formatting, tone, and content
13
+ Available: examples/3p-updates.md, examples/company-newsletter.md, examples/faq-answers.md, examples/general-comms.md
14
+ note: "Already optimal at 32 lines - examples/ directory provides all format guidelines, no fragmentation needed"
15
+ references: []
16
+ ---
17
+
18
+ ## When to use this skill
19
+ To write internal communications, use this skill for:
20
+ - 3P updates (Progress, Plans, Problems)
21
+ - Company newsletters
22
+ - FAQ responses
23
+ - Status reports
24
+ - Leadership updates
25
+ - Project updates
26
+ - Incident reports
27
+
28
+ ## How to use this skill
29
+
30
+ To write any internal communication:
31
+
32
+ 1. **Identify the communication type** from the request
33
+ 2. **Load the appropriate guideline file** from the `examples/` directory:
34
+ - `examples/3p-updates.md` - For Progress/Plans/Problems team updates
35
+ - `examples/company-newsletter.md` - For company-wide newsletters
36
+ - `examples/faq-answers.md` - For answering frequently asked questions
37
+ - `examples/general-comms.md` - For anything else that doesn't explicitly match one of the above
38
+ 3. **Follow the specific instructions** in that file for formatting, tone, and content gathering
39
+
40
+ If the communication type doesn't match any existing guideline, ask for clarification or more context about the desired format.
41
+
42
+ ## Keywords
43
+ 3P updates, company newsletter, company comms, weekly update, faqs, common questions, updates, internal comms
@@ -0,0 +1,47 @@
1
+ ## Instructions
2
+ You are being asked to write a 3P update. 3P updates stand for "Progress, Plans, Problems." The main audience is for executives, leadership, other teammates, etc. They're meant to be very succinct and to-the-point: think something you can read in 30-60sec or less. They're also for people with some, but not a lot of context on what the team does.
3
+
4
+ 3Ps can cover a team of any size, ranging all the way up to the entire company. The bigger the team, the less granular the tasks should be. For example, "mobile team" might have "shipped feature" or "fixed bugs," whereas the company might have really meaty 3Ps, like "hired 20 new people" or "closed 10 new deals."
5
+
6
+ They represent the work of the team across a time period, almost always one week. They include three sections:
7
+ 1) Progress: what the team has accomplished over the next time period. Focus mainly on things shipped, milestones achieved, tasks created, etc.
8
+ 2) Plans: what the team plans to do over the next time period. Focus on what things are top-of-mind, really high priority, etc. for the team.
9
+ 3) Problems: anything that is slowing the team down. This could be things like too few people, bugs or blockers that are preventing the team from moving forward, some deal that fell through, etc.
10
+
11
+ Before writing them, make sure that you know the team name. If it's not specified, you can ask explicitly what the team name you're writing for is.
12
+
13
+
14
+ ## Tools Available
15
+ Whenever possible, try to pull from available sources to get the information you need:
16
+ - Slack: posts from team members with their updates - ideally look for posts in large channels with lots of reactions
17
+ - Google Drive: docs written from critical team members with lots of views
18
+ - Email: emails with lots of responses of lots of content that seems relevant
19
+ - Calendar: non-recurring meetings that have a lot of importance, like product reviews, etc.
20
+
21
+
22
+ Try to gather as much context as you can, focusing on the things that covered the time period you're writing for:
23
+ - Progress: anything between a week ago and today
24
+ - Plans: anything from today to the next week
25
+ - Problems: anything between a week ago and today
26
+
27
+
28
+ If you don't have access, you can ask the user for things they want to cover. They might also include these things to you directly, in which case you're mostly just formatting for this particular format.
29
+
30
+ ## Workflow
31
+
32
+ 1. **Clarify scope**: Confirm the team name and time period (usually past week for Progress/Problems, next
33
+ week for Plans)
34
+ 2. **Gather information**: Use available tools or ask the user directly
35
+ 3. **Draft the update**: Follow the strict formatting guidelines
36
+ 4. **Review**: Ensure it's concise (30-60 seconds to read) and data-driven
37
+
38
+ ## Formatting
39
+
40
+ The format is always the same, very strict formatting. Never use any formatting other than this. Pick an emoji that is fun and captures the vibe of the team and update.
41
+
42
+ [pick an emoji] [Team Name] (Dates Covered, usually a week)
43
+ Progress: [1-3 sentences of content]
44
+ Plans: [1-3 sentences of content]
45
+ Problems: [1-3 sentences of content]
46
+
47
+ Each section should be no more than 1-3 sentences: clear, to the point. It should be data-driven, and generally include metrics where possible. The tone should be very matter-of-fact, not super prose-heavy.
@@ -0,0 +1,65 @@
1
+ ## Instructions
2
+ You are being asked to write a company-wide newsletter update. You are meant to summarize the past week/month of a company in the form of a newsletter that the entire company will read. It should be maybe ~20-25 bullet points long. It will be sent via Slack and email, so make it consumable for that.
3
+
4
+ Ideally it includes the following attributes:
5
+ - Lots of links: pulling documents from Google Drive that are very relevant, linking to prominent Slack messages in announce channels and from executives, perhgaps referencing emails that went company-wide, highlighting significant things that have happened in the company.
6
+ - Short and to-the-point: each bullet should probably be no longer than ~1-2 sentences
7
+ - Use the "we" tense, as you are part of the company. Many of the bullets should say "we did this" or "we did that"
8
+
9
+ ## Tools to use
10
+ If you have access to the following tools, please try to use them. If not, you can also let the user know directly that their responses would be better if they gave them access.
11
+
12
+ - Slack: look for messages in channels with lots of people, with lots of reactions or lots of responses within the thread
13
+ - Email: look for things from executives that discuss company-wide announcements
14
+ - Calendar: if there were meetings with large attendee lists, particularly things like All-Hands meetings, big company announcements, etc. If there were documents attached to those meetings, those are great links to include.
15
+ - Documents: if there were new docs published in the last week or two that got a lot of attention, you can link them. These should be things like company-wide vision docs, plans for the upcoming quarter or half, things authored by critical executives, etc.
16
+ - External press: if you see references to articles or press we've received over the past week, that could be really cool too.
17
+
18
+ If you don't have access to any of these things, you can ask the user for things they want to cover. In this case, you'll mostly just be polishing up and fitting to this format more directly.
19
+
20
+ ## Sections
21
+ The company is pretty big: 1000+ people. There are a variety of different teams and initiatives going on across the company. To make sure the update works well, try breaking it into sections of similar things. You might break into clusters like {product development, go to market, finance} or {recruiting, execution, vision}, or {external news, internal news} etc. Try to make sure the different areas of the company are highlighted well.
22
+
23
+ ## Prioritization
24
+ Focus on:
25
+ - Company-wide impact (not team-specific details)
26
+ - Announcements from leadership
27
+ - Major milestones and achievements
28
+ - Information that affects most employees
29
+ - External recognition or press
30
+
31
+ Avoid:
32
+ - Overly granular team updates (save those for 3Ps)
33
+ - Information only relevant to small groups
34
+ - Duplicate information already communicated
35
+
36
+ ## Example Formats
37
+
38
+ :megaphone: Company Announcements
39
+ - Announcement 1
40
+ - Announcement 2
41
+ - Announcement 3
42
+
43
+ :dart: Progress on Priorities
44
+ - Area 1
45
+ - Sub-area 1
46
+ - Sub-area 2
47
+ - Sub-area 3
48
+ - Area 2
49
+ - Sub-area 1
50
+ - Sub-area 2
51
+ - Sub-area 3
52
+ - Area 3
53
+ - Sub-area 1
54
+ - Sub-area 2
55
+ - Sub-area 3
56
+
57
+ :pillar: Leadership Updates
58
+ - Post 1
59
+ - Post 2
60
+ - Post 3
61
+
62
+ :thread: Social Updates
63
+ - Update 1
64
+ - Update 2
65
+ - Update 3