ma-agents 2.20.3 → 2.22.0

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 (149) hide show
  1. package/.opencode/skills/.ma-agents.json +241 -0
  2. package/.opencode/skills/MANIFEST.yaml +254 -0
  3. package/.opencode/skills/ai-audit-trail/SKILL.md +23 -0
  4. package/.opencode/skills/auto-bug-detection/SKILL.md +169 -0
  5. package/.opencode/skills/cmake-best-practices/SKILL.md +64 -0
  6. package/.opencode/skills/cmake-best-practices/examples/cmake.md +59 -0
  7. package/.opencode/skills/code-documentation/SKILL.md +57 -0
  8. package/.opencode/skills/code-documentation/examples/cpp.md +29 -0
  9. package/.opencode/skills/code-documentation/examples/csharp.md +28 -0
  10. package/.opencode/skills/code-documentation/examples/javascript_typescript.md +28 -0
  11. package/.opencode/skills/code-documentation/examples/python.md +57 -0
  12. package/.opencode/skills/code-review/SKILL.md +43 -0
  13. package/.opencode/skills/commit-message/SKILL.md +79 -0
  14. package/.opencode/skills/cpp-best-practices/SKILL.md +234 -0
  15. package/.opencode/skills/cpp-best-practices/examples/modern-idioms.md +189 -0
  16. package/.opencode/skills/cpp-best-practices/examples/naming-and-organization.md +102 -0
  17. package/.opencode/skills/cpp-concurrency-safety/SKILL.md +60 -0
  18. package/.opencode/skills/cpp-concurrency-safety/examples/concurrency.md +73 -0
  19. package/.opencode/skills/cpp-const-correctness/SKILL.md +63 -0
  20. package/.opencode/skills/cpp-const-correctness/examples/const_correctness.md +54 -0
  21. package/.opencode/skills/cpp-memory-handling/SKILL.md +42 -0
  22. package/.opencode/skills/cpp-memory-handling/examples/modern-cpp.md +49 -0
  23. package/.opencode/skills/cpp-memory-handling/examples/smart-pointers.md +46 -0
  24. package/.opencode/skills/cpp-modern-composition/SKILL.md +64 -0
  25. package/.opencode/skills/cpp-modern-composition/examples/composition.md +51 -0
  26. package/.opencode/skills/cpp-robust-interfaces/SKILL.md +55 -0
  27. package/.opencode/skills/cpp-robust-interfaces/examples/interfaces.md +56 -0
  28. package/.opencode/skills/create-hardened-docker-skill/SKILL.md +637 -0
  29. package/.opencode/skills/create-hardened-docker-skill/scripts/create-all.sh +489 -0
  30. package/.opencode/skills/csharp-best-practices/SKILL.md +278 -0
  31. package/.opencode/skills/docker-hardening-verification/SKILL.md +28 -0
  32. package/.opencode/skills/docker-hardening-verification/scripts/verify-hardening.sh +39 -0
  33. package/.opencode/skills/docker-image-signing/SKILL.md +28 -0
  34. package/.opencode/skills/docker-image-signing/scripts/sign-image.sh +33 -0
  35. package/.opencode/skills/document-revision-history/SKILL.md +104 -0
  36. package/.opencode/skills/git-workflow-skill/SKILL.md +194 -0
  37. package/.opencode/skills/git-workflow-skill/hooks/commit-msg +61 -0
  38. package/.opencode/skills/git-workflow-skill/hooks/pre-commit +38 -0
  39. package/.opencode/skills/git-workflow-skill/hooks/prepare-commit-msg +56 -0
  40. package/.opencode/skills/git-workflow-skill/scripts/finish-feature.sh +192 -0
  41. package/.opencode/skills/git-workflow-skill/scripts/install-hooks.sh +55 -0
  42. package/.opencode/skills/git-workflow-skill/scripts/start-feature.sh +110 -0
  43. package/.opencode/skills/git-workflow-skill/scripts/validate-workflow.sh +229 -0
  44. package/.opencode/skills/js-ts-dependency-mgmt/SKILL.md +49 -0
  45. package/.opencode/skills/js-ts-dependency-mgmt/examples/dependency_mgmt.md +60 -0
  46. package/.opencode/skills/js-ts-security-skill/SKILL.md +64 -0
  47. package/.opencode/skills/js-ts-security-skill/scripts/verify-security.sh +136 -0
  48. package/.opencode/skills/logging-best-practices/SKILL.md +50 -0
  49. package/.opencode/skills/logging-best-practices/examples/cpp.md +36 -0
  50. package/.opencode/skills/logging-best-practices/examples/csharp.md +49 -0
  51. package/.opencode/skills/logging-best-practices/examples/javascript.md +77 -0
  52. package/.opencode/skills/logging-best-practices/examples/python.md +57 -0
  53. package/.opencode/skills/logging-best-practices/references/logging-standards.md +29 -0
  54. package/.opencode/skills/open-presentation/SKILL.md +35 -0
  55. package/.opencode/skills/opentelemetry-best-practices/SKILL.md +34 -0
  56. package/.opencode/skills/opentelemetry-best-practices/examples/go.md +32 -0
  57. package/.opencode/skills/opentelemetry-best-practices/examples/javascript.md +58 -0
  58. package/.opencode/skills/opentelemetry-best-practices/examples/python.md +37 -0
  59. package/.opencode/skills/opentelemetry-best-practices/references/otel-standards.md +37 -0
  60. package/.opencode/skills/python-best-practices/SKILL.md +385 -0
  61. package/.opencode/skills/python-dependency-mgmt/SKILL.md +42 -0
  62. package/.opencode/skills/python-dependency-mgmt/examples/dependency_mgmt.md +67 -0
  63. package/.opencode/skills/python-security-skill/SKILL.md +56 -0
  64. package/.opencode/skills/python-security-skill/examples/security.md +56 -0
  65. package/.opencode/skills/self-signed-cert/SKILL.md +42 -0
  66. package/.opencode/skills/self-signed-cert/scripts/generate-cert.ps1 +45 -0
  67. package/.opencode/skills/self-signed-cert/scripts/generate-cert.sh +43 -0
  68. package/.opencode/skills/skill-creator/SKILL.md +196 -0
  69. package/.opencode/skills/skill-creator/references/output-patterns.md +82 -0
  70. package/.opencode/skills/skill-creator/references/workflows.md +28 -0
  71. package/.opencode/skills/skill-creator/scripts/init_skill.py +208 -0
  72. package/.opencode/skills/skill-creator/scripts/package_skill.py +99 -0
  73. package/.opencode/skills/skill-creator/scripts/quick_validate.py +113 -0
  74. package/.opencode/skills/story-status-lookup/SKILL.md +78 -0
  75. package/.opencode/skills/test-accompanied-development/SKILL.md +50 -0
  76. package/.opencode/skills/test-generator/SKILL.md +65 -0
  77. package/.opencode/skills/vercel-react-best-practices/SKILL.md +109 -0
  78. package/.opencode/skills/verify-hardened-docker-skill/SKILL.md +442 -0
  79. package/.opencode/skills/verify-hardened-docker-skill/scripts/verify-docker-hardening.sh +439 -0
  80. package/AiAudit.md +5 -0
  81. package/QUICK_START.md +11 -5
  82. package/README.md +52 -1
  83. package/bin/cli.js +31 -4
  84. package/docs/BMAD_AI_Development_Training.pptx +0 -0
  85. package/docs/technical-notes/context-persistence-research.md +434 -0
  86. package/docs/technical-notes/enforcement-hooks-research.md +415 -0
  87. package/lib/agents.js +34 -0
  88. package/lib/bmad-extension/agents/bmm-architect.customize.yaml +5 -0
  89. package/lib/bmad-extension/agents/bmm-bmad-master.customize.yaml +5 -0
  90. package/lib/bmad-extension/agents/bmm-cyber.customize.yaml +30 -0
  91. package/lib/bmad-extension/agents/bmm-dev.customize.yaml +5 -0
  92. package/lib/bmad-extension/agents/bmm-devops.customize.yaml +30 -0
  93. package/lib/bmad-extension/agents/bmm-mil498.customize.yaml +42 -0
  94. package/lib/bmad-extension/agents/bmm-pm.customize.yaml +5 -0
  95. package/lib/bmad-extension/agents/bmm-qa.customize.yaml +5 -0
  96. package/lib/bmad-extension/agents/bmm-sm.customize.yaml +5 -0
  97. package/lib/bmad-extension/agents/bmm-sre.customize.yaml +30 -0
  98. package/lib/bmad-extension/agents/bmm-tech-writer.customize.yaml +5 -0
  99. package/lib/bmad-extension/agents/bmm-ux-designer.customize.yaml +5 -0
  100. package/lib/bmad-extension/module-help.csv +7 -0
  101. package/lib/bmad-extension/module.yaml +3 -0
  102. package/lib/bmad-extension/workflows/add-sprint/workflow.md +112 -0
  103. package/lib/bmad-extension/workflows/add-to-sprint/workflow.md +206 -0
  104. package/lib/bmad-extension/workflows/create-bug-story/workflow.md +186 -0
  105. package/lib/bmad-extension/workflows/modify-sprint/workflow.md +250 -0
  106. package/lib/bmad-extension/workflows/project-context-expansion/workflow.md +229 -0
  107. package/lib/bmad-extension/workflows/sprint-status-view/workflow.md +193 -0
  108. package/lib/bmad.js +168 -36
  109. package/lib/hooks/claude-code/verify-manifest.js +56 -0
  110. package/lib/installer.js +282 -1
  111. package/lib/methodology/BMAD_AI_Development_Training.pptx +0 -0
  112. package/lib/methodology/version.json +7 -0
  113. package/lib/skill-authoring.js +732 -0
  114. package/lib/templates/project-context.template.md +47 -0
  115. package/opencode.json +8 -0
  116. package/package.json +2 -2
  117. package/skills/auto-bug-detection/SKILL.md +165 -0
  118. package/skills/auto-bug-detection/skill.json +8 -0
  119. package/skills/code-review/SKILL.md +40 -0
  120. package/skills/cpp-best-practices/SKILL.md +230 -0
  121. package/skills/cpp-best-practices/examples/modern-idioms.md +189 -0
  122. package/skills/cpp-best-practices/examples/naming-and-organization.md +102 -0
  123. package/skills/cpp-best-practices/skill.json +25 -0
  124. package/skills/csharp-best-practices/SKILL.md +274 -0
  125. package/skills/csharp-best-practices/skill.json +23 -0
  126. package/skills/git-workflow-skill/skill.json +1 -1
  127. package/skills/open-presentation/SKILL.md +31 -0
  128. package/skills/open-presentation/skill.json +11 -0
  129. package/skills/python-best-practices/SKILL.md +381 -0
  130. package/skills/python-best-practices/skill.json +26 -0
  131. package/skills/story-status-lookup/SKILL.md +74 -0
  132. package/skills/story-status-lookup/skill.json +8 -0
  133. package/test/agent-injection-strategy.test.js +13 -7
  134. package/test/bmad-extension.test.js +237 -0
  135. package/test/bmad-output-policy.test.js +119 -0
  136. package/test/build-bmad-args.test.js +361 -0
  137. package/test/create-agent.test.js +232 -0
  138. package/test/enforcement-hooks.test.js +324 -0
  139. package/test/generate-project-context.test.js +337 -0
  140. package/test/integration-verification.test.js +402 -0
  141. package/test/opencode-agent.test.js +150 -0
  142. package/test/opencode-json-error.test.js +260 -0
  143. package/test/opencode-json-injection.test.js +256 -0
  144. package/test/opencode-json-merge.test.js +299 -0
  145. package/test/skill-authoring.test.js +272 -0
  146. package/test/skill-customize-agent.test.js +253 -0
  147. package/test/skill-mandatory.test.js +235 -0
  148. package/test/skill-validation.test.js +378 -0
  149. package/test/yes-flag.test.js +1 -1
@@ -0,0 +1,50 @@
1
+ ---
2
+ name: Logging Best Practices
3
+ description: Standardizes structured logging across Backend, Frontend, Realtime, and Algorithmic domains with mandatory exception handling.
4
+ ---
5
+ # Logging Best Practices
6
+
7
+ Enforce structured, context-rich logging according to market standards (OpenTelemetry) across all application domains.
8
+
9
+ ## Policy
10
+
11
+ **All logs must be structured (preferably JSON) and include mandatory context. Every exception MUST be logged with its full stack trace.**
12
+
13
+ ## Core Mandatory Fields
14
+
15
+ Every log entry must contain:
16
+ - `datetime`: ISO 8601 timestamp with timezone.
17
+ - `severity`: Standard level (DEBUG, INFO, WARN, ERROR, CRITICAL).
18
+ - `message`: Clear, concise description of the event.
19
+ - `placement`: File name and line number where the log was triggered.
20
+ - `process_name`: Name of the service or application.
21
+ - `container_id`: (If applicable) Docker/K8s container identifier.
22
+ - `trace_id` / `span_id`: For distributed tracing and request correlation.
23
+
24
+ ## Domain-Specific Requirements
25
+
26
+ ### 1. Backend Systems
27
+ - **Log**: Incoming/outgoing requests (method, status, duration).
28
+ - **Log**: Database query latencies and connection states.
29
+ - **Mandatory**: Full exception details in catch blocks.
30
+
31
+ ### 2. Frontend Applications
32
+ - **Log**: Client-side errors (JS runtime, UI crashes).
33
+ - **Log**: User interaction context (last clicked component, breadcrumbs).
34
+ - **Context**: Browser version, OS, Resolution.
35
+
36
+ ### 3. Realtime & Algorithmic Work
37
+ - **Log**: Iteration throughput and step-by-step latency.
38
+ - **Log**: Mathematical anomalies or convergence failures.
39
+ - **Mandatory**: Timeout exceptions and resource exhaustion warnings.
40
+
41
+ ## Rules
42
+
43
+ - **No PII/Secrets**: Never log passwords, keys, or private user data.
44
+ - **Asynchronous**: Prefer non-blocking logging to maintain performance.
45
+ - **Traceability**: Always include `trace_id` in logs that are part of a request flow.
46
+ - **Exception Policy**: Use the `ERROR` level for caught exceptions that affect flow, and `CRITICAL` for system-wide failures.
47
+
48
+ ## Reference
49
+
50
+ See [logging-standards.md](./references/logging-standards.md) for detailed field definitions and level guidance.
@@ -0,0 +1,36 @@
1
+ # C++ Logging Examples
2
+
3
+ ## Structured Logging with `spdlog`
4
+
5
+ ```cpp
6
+ #include "spdlog/spdlog.h"
7
+ #include "spdlog/sinks/stdout_color_sinks.h"
8
+ #include <exception>
9
+
10
+ void run_realtime_loop() {
11
+ auto logger = spdlog::get("realtime_logger");
12
+
13
+ try {
14
+ // Realtime/Algorithmic domain logging
15
+ logger->info("Computation step started. Input size: {}. Placement: {}:{}",
16
+ 1024, __FILE__, __LINE__);
17
+
18
+ if (check_anomaly()) {
19
+ logger->warn("Numerical anomaly detected! Severity: WARN");
20
+ }
21
+
22
+ } catch (const std::exception& e) {
23
+ // Mandatory Exception Logging
24
+ logger->critical("Critical failure in realtime loop! Error: {}. File: {}. Line: {}",
25
+ e.what(), __FILE__, __LINE__);
26
+ throw;
27
+ }
28
+ }
29
+
30
+ // Global setup for JSON output
31
+ void setup_logging() {
32
+ // Note: spdlog requires a custom formatter or sink for pure JSON output
33
+ // to match OTel standards perfectly.
34
+ spdlog::set_pattern("{\"datetime\":\"%Y-%m-%dT%H:%M:%SZ\",\"severity\":\"%l\",\"message\":\"%v\",\"process_name\":\"engine_v1\"}");
35
+ }
36
+ ```
@@ -0,0 +1,49 @@
1
+ # C# Logging Examples
2
+
3
+ ## Structured Logging with Serilog
4
+
5
+ ```csharp
6
+ using Serilog;
7
+ using System;
8
+
9
+ public class DataService
10
+ {
11
+ private readonly ILogger _logger = Log.ForContext<DataService>();
12
+
13
+ public void ProcessAlgorithm(double[] data)
14
+ {
15
+ try
16
+ {
17
+ _logger.Information("Algorithm iteration started. Data points: {Count}. Placement: {Placement}",
18
+ data.Length, "DataService.cs:45");
19
+
20
+ // Realtime/Algorithmic specific logging
21
+ var startTime = DateTime.UtcNow;
22
+ RunComplexMath(data);
23
+ var duration = (DateTime.UtcNow - startTime).TotalMilliseconds;
24
+
25
+ _logger.Information("Iteration complete. Latency: {Latency}ms", duration);
26
+ }
27
+ catch (Exception ex)
28
+ {
29
+ // Mandatory Exception Logging
30
+ _logger.Error(ex, "Algorithm execution failed at {Placement}. Container: {ContainerId}",
31
+ "DataService.cs:55", Environment.GetEnvironmentVariable("HOSTNAME"));
32
+ }
33
+ }
34
+ }
35
+ ```
36
+
37
+ ## Microsoft.Extensions.Logging (JSON Console)
38
+
39
+ ```csharp
40
+ // In Program.cs
41
+ builder.Logging.AddJsonConsole(options => {
42
+ options.TimestampFormat = "yyyy-MM-ddTHH:mm:ssZ ";
43
+ options.JsonWriterOptions = new JsonWriterOptions { Indented = true };
44
+ });
45
+
46
+ // Usage
47
+ _logger.LogError(exception, "Request failed at {Placement}. TraceId: {TraceId}",
48
+ "OrderController.cs:120", HttpContext.TraceIdentifier);
49
+ ```
@@ -0,0 +1,77 @@
1
+ # JavaScript/TypeScript Logging Examples
2
+
3
+ ## Backend (Node.js with `pino` or `winston`)
4
+
5
+ ```typescript
6
+ import pino from 'pino';
7
+
8
+ const logger = pino({
9
+ level: process.env.LOG_LEVEL || 'info',
10
+ formatters: {
11
+ level: (label) => {
12
+ return { severity: label.toUpperCase() };
13
+ },
14
+ },
15
+ base: {
16
+ process_name: 'api-gateway',
17
+ container_id: process.env.HOSTNAME || 'unknown'
18
+ }
19
+ });
20
+
21
+ async function handleRequest(req, res) {
22
+ const traceId = req.headers['x-trace-id'];
23
+ try {
24
+ logger.info({
25
+ msg: 'Handling incoming request',
26
+ trace_id: traceId,
27
+ path: req.path,
28
+ placement: 'router.ts:12'
29
+ });
30
+
31
+ // ... logic
32
+ } catch (error) {
33
+ // Mandatory Exception Logging
34
+ logger.error({
35
+ msg: 'Request handler failed',
36
+ trace_id: traceId,
37
+ err: error, // Pino automatically formats the stack trace
38
+ severity: 'ERROR',
39
+ placement: 'router.ts:25'
40
+ });
41
+ res.status(500).send('Internal Server Error');
42
+ }
43
+ }
44
+ ```
45
+
46
+ ## Frontend (Browser)
47
+
48
+ ```javascript
49
+ const logToServer = async (logEntry) => {
50
+ try {
51
+ await fetch('/api/logs', {
52
+ method: 'POST',
53
+ body: JSON.stringify({
54
+ ...logEntry,
55
+ datetime: new Date().toISOString(),
56
+ browser: navigator.userAgent,
57
+ process_name: 'frontend-spa'
58
+ })
59
+ });
60
+ } catch (e) {
61
+ console.error('Failed to ship logs', e);
62
+ }
63
+ };
64
+
65
+ // Global error handler
66
+ window.onerror = function(msg, url, lineNo, columnNo, error) {
67
+ logToServer({
68
+ severity: 'ERROR',
69
+ message: msg,
70
+ placement: `${url}:${lineNo}`,
71
+ exception: {
72
+ message: error?.message,
73
+ stack: error?.stack
74
+ }
75
+ });
76
+ };
77
+ ```
@@ -0,0 +1,57 @@
1
+ # Python Logging Examples
2
+
3
+ ## Structured Logging with `structlog`
4
+
5
+ ```python
6
+ import structlog
7
+ import os
8
+
9
+ logger = structlog.get_logger()
10
+
11
+ def process_data(data):
12
+ try:
13
+ # Algorithmic step logging
14
+ logger.info("calculation_step_started",
15
+ step="matrix_multiplication",
16
+ data_size=len(data),
17
+ placement="processor.py:45")
18
+
19
+ result = perform_complex_math(data)
20
+ return result
21
+ except Exception as e:
22
+ # Mandatory Exception Logging
23
+ logger.error("calculation_failed",
24
+ exception_type=type(e).__name__,
25
+ exception_msg=str(e),
26
+ stack_trace=True, # structlog captures this
27
+ severity="ERROR",
28
+ placement="processor.py:52",
29
+ container_id=os.getenv("HOSTNAME"))
30
+ raise
31
+ ```
32
+
33
+ ## Standard Library with JSON Formatter
34
+
35
+ ```python
36
+ import logging
37
+ import json
38
+ from datetime import datetime
39
+
40
+ class JsonFormatter(logging.Formatter):
41
+ def format(self, record):
42
+ log_entry = {
43
+ "datetime": datetime.utcnow().isoformat(),
44
+ "severity": record.levelname,
45
+ "message": record.getMessage(),
46
+ "placement": f"{record.filename}:{record.lineno}",
47
+ "process_name": record.processName,
48
+ "trace_id": getattr(record, 'trace_id', 'none')
49
+ }
50
+ if record.exc_info:
51
+ log_entry["exception"] = self.formatException(record.exc_info)
52
+ return json.dumps(log_entry)
53
+
54
+ # usage
55
+ logger = logging.getLogger("backend_service")
56
+ logger.error("Database connection failed", exc_info=True)
57
+ ```
@@ -0,0 +1,29 @@
1
+ # Logging Standards Reference
2
+
3
+ This document defines the semantic conventions and levels used in the Logging Best Practices skill.
4
+
5
+ ## Log Levels
6
+
7
+ | Level | Usage |
8
+ | :--- | :--- |
9
+ | **TRACE** | Fine-grained informational events (mostly for debugging logic flows). |
10
+ | **DEBUG** | Detailed information for developer troubleshooting. |
11
+ | **INFO** | Regular operational events (startup, shutdown, successful requests). |
12
+ | **WARN** | Potential issues or degraded states that don't stop the service. |
13
+ | **ERROR** | Operational failures that affect a specific request or operation. |
14
+ | **CRITICAL** | System-wide failures requiring immediate attention. |
15
+
16
+ ## OpenTelemetry Semantic Conventions
17
+
18
+ To ensure interoperability, use the following field names where possible:
19
+
20
+ - `timestamp`: The time when the event occurred.
21
+ - `severity_text`: The string representation of the log level.
22
+ - `body`: The primary log message.
23
+ - `attributes.service.name`: The value of `process_name`.
24
+ - `attributes.container.id`: The value of `container_id`.
25
+ - `attributes.code.filepath`: Path to the source file.
26
+ - `attributes.code.lineno`: Line number in the source file.
27
+ - `attributes.exception.type`: Class name of the exception.
28
+ - `attributes.exception.message`: Message from the exception.
29
+ - `attributes.exception.stacktrace`: Full stack trace.
@@ -0,0 +1,35 @@
1
+ ---
2
+ name: Open Presentation
3
+ description: Opens the BMAD-METHOD AI Development Training presentation from _bmad-output/methodology/
4
+ ---
5
+ # Open Presentation Skill
6
+
7
+ ## Description
8
+ Opens the BMAD-METHOD AI Development Training presentation installed at `_bmad-output/methodology/`.
9
+
10
+ ## Usage
11
+ Invoke this skill by typing `/open-presentation`.
12
+
13
+ ## Instructions
14
+
15
+ When the user invokes `/open-presentation`:
16
+
17
+ 1. **Locate the presentation** at `_bmad-output/methodology/BMAD_AI_Development_Training.pptx` relative to the project root.
18
+
19
+ 2. **Open it** using the OS default viewer via the Bash tool:
20
+ - **Windows**: `start "" "_bmad-output/methodology/BMAD_AI_Development_Training.pptx"`
21
+ - **macOS**: `open "_bmad-output/methodology/BMAD_AI_Development_Training.pptx"`
22
+ - **Linux**: `xdg-open "_bmad-output/methodology/BMAD_AI_Development_Training.pptx"`
23
+
24
+ 3. **If the file does not exist**, inform the user:
25
+ > "The methodology presentation has not been installed yet. Run `npx ma-agents install` with BMAD to deploy it to `_bmad-output/methodology/`."
26
+
27
+ 4. **Detect the OS** using the Node.js `process.platform` convention or by checking which command is available, then run the appropriate open command.
28
+
29
+ ## Examples
30
+
31
+ **User**: `/open-presentation`
32
+ **Assistant**: Opens `_bmad-output/methodology/BMAD_AI_Development_Training.pptx` in the system default PowerPoint viewer.
33
+
34
+ **User**: "open the methodology slides"
35
+ **Assistant**: [Treats this as /open-presentation and follows the instructions above]
@@ -0,0 +1,34 @@
1
+ ---
2
+ name: OpenTelemetry Best Practices
3
+ description: Standardizes distributed tracing, metrics, and semantic conventions for high-quality system observability.
4
+ ---
5
+ # OpenTelemetry Best Practices
6
+
7
+ Guidelines for implementing standardized distributed tracing and metrics using OpenTelemetry to ensure high-quality observability.
8
+
9
+ ## Mandatory Policies
10
+
11
+ ### 1. Semantic Conventions
12
+ You MUST use OpenTelemetry Semantic Conventions for all attribute names. Never invent custom names for standard concepts (e.g., use `http.method` instead of `method` or `http_method`).
13
+
14
+ ### 2. Context Propagation
15
+ You MUST ensure trace context is propagated across asynchronous boundaries. When starting a background task or making a network call, ensure the active span is correctly parented or the context is injected into headers.
16
+
17
+ ### 3. Span Granularity
18
+ - **Database**: Every query MUST have its own span with attributes for the statement (sanitized) and database name.
19
+ - **External API**: Every outgoing request MUST have a span.
20
+ - **Complex Logic**: Large internal computation blocks SHOULD have spans if they represent a distinct logical step.
21
+
22
+ ### 4. Meaningful Metrics
23
+ - **Counters**: Use for discrete events (e.g., `api.requests.total`).
24
+ - **Histograms**: Use for durations and sizes (e.g., `api.latency`).
25
+ - **Attributes**: Common attributes (e.g., `status_code`, `service.name`) SHOULD be applied to both spans and metrics.
26
+
27
+ ## Critical Rules
28
+ - **No Sensitive Data**: Never include PII, passwords, or tokens in span attributes or logs associated with spans.
29
+ - **Fail Gracefully**: Instrumentation should never crash the application. Use `tracer.startActiveSpan` carefully with `try...finally` to ensure spans are always ended.
30
+ - **Status Codes**: Always set the span status to `Error` when an exception is caught that isn't handled.
31
+
32
+ ## Resources
33
+ - [Semantic Conventions Reference](file:///skills/opentelemetry-best-practices/references/otel-standards.md)
34
+ - [Example Implementations](file:///skills/opentelemetry-best-practices/examples/javascript.md)
@@ -0,0 +1,32 @@
1
+ # OpenTelemetry Go Examples
2
+
3
+ Idiomatic usage of the OpenTelemetry Go SDK.
4
+
5
+ ## Context-Aware Tracing
6
+
7
+ ```go
8
+ import (
9
+ "context"
10
+ "go.opentelemetry.io/otel"
11
+ "go.opentelemetry.io/otel/attribute"
12
+ "go.opentelemetry.io/otel/codes"
13
+ )
14
+
15
+ var tracer = otel.Tracer("my-service")
16
+
17
+ func (s *Server) GetUser(ctx context.Context, id string) (*User, error) {
18
+ ctx, span := tracer.Start(ctx, "GetUser")
19
+ defer span.End()
20
+
21
+ span.SetAttributes(attribute.String("user.id", id))
22
+
23
+ user, err := s.db.FetchUser(ctx, id)
24
+ if err != nil {
25
+ span.RecordError(err)
26
+ span.SetStatus(codes.Error, err.Error())
27
+ return nil, err
28
+ }
29
+
30
+ return user, nil
31
+ }
32
+ ```
@@ -0,0 +1,58 @@
1
+ # OpenTelemetry JavaScript (Node.js) Examples
2
+
3
+ Idiomatic usage of the OpenTelemetry SDK in Node.js applications.
4
+
5
+ ## Tracing a Function
6
+
7
+ ```javascript
8
+ const { trace } = require('@opentelemetry/api');
9
+
10
+ const tracer = trace.getTracer('my-service');
11
+
12
+ async function processOrder(orderId) {
13
+ // Use startActiveSpan to automatically handle context propagation
14
+ return tracer.startActiveSpan('process.order', async (span) => {
15
+ try {
16
+ // Set semantic attributes
17
+ span.setAttribute('order.id', orderId);
18
+
19
+ const result = await someDatabaseCall(orderId);
20
+
21
+ span.setStatus({ code: SpanStatusCode.OK });
22
+ return result;
23
+ } catch (error) {
24
+ span.recordException(error);
25
+ span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });
26
+ throw error;
27
+ } finally {
28
+ span.end();
29
+ }
30
+ });
31
+ }
32
+ ```
33
+
34
+ ## Creating Metrics
35
+
36
+ ```javascript
37
+ const { metrics } = require('@opentelemetry/api');
38
+
39
+ const meter = metrics.getMeter('my-service');
40
+
41
+ const requestCounter = meter.createCounter('api.requests.total', {
42
+ description: 'Total number of API requests',
43
+ });
44
+
45
+ const latencyHistogram = meter.createHistogram('api.latency', {
46
+ description: 'API request latency',
47
+ unit: 'ms',
48
+ });
49
+
50
+ function handleRequest(req) {
51
+ const startTime = Date.now();
52
+
53
+ // Logic...
54
+
55
+ requestCounter.add(1, { 'http.method': req.method, 'status_code': 200 });
56
+ latencyHistogram.record(Date.now() - startTime, { 'http.method': req.method });
57
+ }
58
+ ```
@@ -0,0 +1,37 @@
1
+ # OpenTelemetry Python Examples
2
+
3
+ Idiomatic usage of the OpenTelemetry Python SDK.
4
+
5
+ ## Tracing with Decorators
6
+
7
+ ```python
8
+ from opentelemetry import trace
9
+
10
+ tracer = trace.get_tracer(__name__)
11
+
12
+ @tracer.start_as_current_span("process_data")
13
+ def process_data(data):
14
+ span = trace.get_current_span()
15
+ span.set_attribute("data.size", len(data))
16
+
17
+ # Process...
18
+ return True
19
+ ```
20
+
21
+ ## Manual Span Management
22
+
23
+ ```python
24
+ def fetch_external_resource(url):
25
+ with tracer.start_as_current_span("http_request") as span:
26
+ span.set_attribute("http.url", url)
27
+ span.set_attribute("http.method", "GET")
28
+
29
+ try:
30
+ response = requests.get(url)
31
+ span.set_attribute("http.status_code", response.status_code)
32
+ return response.json()
33
+ except Exception as e:
34
+ span.record_exception(e)
35
+ span.set_status(trace.Status(trace.StatusCode.ERROR))
36
+ raise
37
+ ```
@@ -0,0 +1,37 @@
1
+ # OpenTelemetry Standards & Semantic Conventions
2
+
3
+ This document outlines the specific attributes and naming conventions to follow when instrumenting services.
4
+
5
+ ## Common Attributes
6
+
7
+ | Attribute | Description | Example |
8
+ |-----------|-------------|---------|
9
+ | `service.name` | Logical name of the service | `user-auth-service` |
10
+ | `service.version` | Version of the service | `1.2.3` |
11
+ | `deployment.environment` | Target environment | `production` |
12
+
13
+ ## HTTP Semantic Conventions
14
+
15
+ | Attribute | Description | Example |
16
+ |-----------|-------------|---------|
17
+ | `http.method` | HTTP request method | `GET` |
18
+ | `http.status_code` | response status | `200` |
19
+ | `http.url` | Full request URL | `https://api.example.com/v1/users` |
20
+ | `http.user_agent` | User agent header | `Mozilla/5.0...` |
21
+
22
+ ## Database Semantic Conventions
23
+
24
+ | Attribute | Description | Example |
25
+ |-----------|-------------|---------|
26
+ | `db.system` | Database vendor | `postgresql` |
27
+ | `db.statement` | Sanitized SQL/query | `SELECT * FROM users WHERE id = ?` |
28
+ | `db.name` | Database name | `prod_db` |
29
+ | `db.operation` | Operation name | `SELECT` |
30
+
31
+ ## Span Status Values
32
+ - **Unset**: Default status.
33
+ - **Ok**: Explicitly marked as successful.
34
+ - **Error**: Encountered a failure. Describe the error in the `exception` event or attributes.
35
+
36
+ ## Useful links
37
+ - [Official OTel Semantic Conventions](https://opentelemetry.io/docs/specs/otel/common/semantic-conventions/)