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.
- package/.opencode/skills/.ma-agents.json +241 -0
- package/.opencode/skills/MANIFEST.yaml +254 -0
- package/.opencode/skills/ai-audit-trail/SKILL.md +23 -0
- package/.opencode/skills/auto-bug-detection/SKILL.md +169 -0
- package/.opencode/skills/cmake-best-practices/SKILL.md +64 -0
- package/.opencode/skills/cmake-best-practices/examples/cmake.md +59 -0
- package/.opencode/skills/code-documentation/SKILL.md +57 -0
- package/.opencode/skills/code-documentation/examples/cpp.md +29 -0
- package/.opencode/skills/code-documentation/examples/csharp.md +28 -0
- package/.opencode/skills/code-documentation/examples/javascript_typescript.md +28 -0
- package/.opencode/skills/code-documentation/examples/python.md +57 -0
- package/.opencode/skills/code-review/SKILL.md +43 -0
- package/.opencode/skills/commit-message/SKILL.md +79 -0
- package/.opencode/skills/cpp-best-practices/SKILL.md +234 -0
- package/.opencode/skills/cpp-best-practices/examples/modern-idioms.md +189 -0
- package/.opencode/skills/cpp-best-practices/examples/naming-and-organization.md +102 -0
- package/.opencode/skills/cpp-concurrency-safety/SKILL.md +60 -0
- package/.opencode/skills/cpp-concurrency-safety/examples/concurrency.md +73 -0
- package/.opencode/skills/cpp-const-correctness/SKILL.md +63 -0
- package/.opencode/skills/cpp-const-correctness/examples/const_correctness.md +54 -0
- package/.opencode/skills/cpp-memory-handling/SKILL.md +42 -0
- package/.opencode/skills/cpp-memory-handling/examples/modern-cpp.md +49 -0
- package/.opencode/skills/cpp-memory-handling/examples/smart-pointers.md +46 -0
- package/.opencode/skills/cpp-modern-composition/SKILL.md +64 -0
- package/.opencode/skills/cpp-modern-composition/examples/composition.md +51 -0
- package/.opencode/skills/cpp-robust-interfaces/SKILL.md +55 -0
- package/.opencode/skills/cpp-robust-interfaces/examples/interfaces.md +56 -0
- package/.opencode/skills/create-hardened-docker-skill/SKILL.md +637 -0
- package/.opencode/skills/create-hardened-docker-skill/scripts/create-all.sh +489 -0
- package/.opencode/skills/csharp-best-practices/SKILL.md +278 -0
- package/.opencode/skills/docker-hardening-verification/SKILL.md +28 -0
- package/.opencode/skills/docker-hardening-verification/scripts/verify-hardening.sh +39 -0
- package/.opencode/skills/docker-image-signing/SKILL.md +28 -0
- package/.opencode/skills/docker-image-signing/scripts/sign-image.sh +33 -0
- package/.opencode/skills/document-revision-history/SKILL.md +104 -0
- package/.opencode/skills/git-workflow-skill/SKILL.md +194 -0
- package/.opencode/skills/git-workflow-skill/hooks/commit-msg +61 -0
- package/.opencode/skills/git-workflow-skill/hooks/pre-commit +38 -0
- package/.opencode/skills/git-workflow-skill/hooks/prepare-commit-msg +56 -0
- package/.opencode/skills/git-workflow-skill/scripts/finish-feature.sh +192 -0
- package/.opencode/skills/git-workflow-skill/scripts/install-hooks.sh +55 -0
- package/.opencode/skills/git-workflow-skill/scripts/start-feature.sh +110 -0
- package/.opencode/skills/git-workflow-skill/scripts/validate-workflow.sh +229 -0
- package/.opencode/skills/js-ts-dependency-mgmt/SKILL.md +49 -0
- package/.opencode/skills/js-ts-dependency-mgmt/examples/dependency_mgmt.md +60 -0
- package/.opencode/skills/js-ts-security-skill/SKILL.md +64 -0
- package/.opencode/skills/js-ts-security-skill/scripts/verify-security.sh +136 -0
- package/.opencode/skills/logging-best-practices/SKILL.md +50 -0
- package/.opencode/skills/logging-best-practices/examples/cpp.md +36 -0
- package/.opencode/skills/logging-best-practices/examples/csharp.md +49 -0
- package/.opencode/skills/logging-best-practices/examples/javascript.md +77 -0
- package/.opencode/skills/logging-best-practices/examples/python.md +57 -0
- package/.opencode/skills/logging-best-practices/references/logging-standards.md +29 -0
- package/.opencode/skills/open-presentation/SKILL.md +35 -0
- package/.opencode/skills/opentelemetry-best-practices/SKILL.md +34 -0
- package/.opencode/skills/opentelemetry-best-practices/examples/go.md +32 -0
- package/.opencode/skills/opentelemetry-best-practices/examples/javascript.md +58 -0
- package/.opencode/skills/opentelemetry-best-practices/examples/python.md +37 -0
- package/.opencode/skills/opentelemetry-best-practices/references/otel-standards.md +37 -0
- package/.opencode/skills/python-best-practices/SKILL.md +385 -0
- package/.opencode/skills/python-dependency-mgmt/SKILL.md +42 -0
- package/.opencode/skills/python-dependency-mgmt/examples/dependency_mgmt.md +67 -0
- package/.opencode/skills/python-security-skill/SKILL.md +56 -0
- package/.opencode/skills/python-security-skill/examples/security.md +56 -0
- package/.opencode/skills/self-signed-cert/SKILL.md +42 -0
- package/.opencode/skills/self-signed-cert/scripts/generate-cert.ps1 +45 -0
- package/.opencode/skills/self-signed-cert/scripts/generate-cert.sh +43 -0
- package/.opencode/skills/skill-creator/SKILL.md +196 -0
- package/.opencode/skills/skill-creator/references/output-patterns.md +82 -0
- package/.opencode/skills/skill-creator/references/workflows.md +28 -0
- package/.opencode/skills/skill-creator/scripts/init_skill.py +208 -0
- package/.opencode/skills/skill-creator/scripts/package_skill.py +99 -0
- package/.opencode/skills/skill-creator/scripts/quick_validate.py +113 -0
- package/.opencode/skills/story-status-lookup/SKILL.md +78 -0
- package/.opencode/skills/test-accompanied-development/SKILL.md +50 -0
- package/.opencode/skills/test-generator/SKILL.md +65 -0
- package/.opencode/skills/vercel-react-best-practices/SKILL.md +109 -0
- package/.opencode/skills/verify-hardened-docker-skill/SKILL.md +442 -0
- package/.opencode/skills/verify-hardened-docker-skill/scripts/verify-docker-hardening.sh +439 -0
- package/AiAudit.md +5 -0
- package/QUICK_START.md +11 -5
- package/README.md +52 -1
- package/bin/cli.js +31 -4
- package/docs/BMAD_AI_Development_Training.pptx +0 -0
- package/docs/technical-notes/context-persistence-research.md +434 -0
- package/docs/technical-notes/enforcement-hooks-research.md +415 -0
- package/lib/agents.js +34 -0
- package/lib/bmad-extension/agents/bmm-architect.customize.yaml +5 -0
- package/lib/bmad-extension/agents/bmm-bmad-master.customize.yaml +5 -0
- package/lib/bmad-extension/agents/bmm-cyber.customize.yaml +30 -0
- package/lib/bmad-extension/agents/bmm-dev.customize.yaml +5 -0
- package/lib/bmad-extension/agents/bmm-devops.customize.yaml +30 -0
- package/lib/bmad-extension/agents/bmm-mil498.customize.yaml +42 -0
- package/lib/bmad-extension/agents/bmm-pm.customize.yaml +5 -0
- package/lib/bmad-extension/agents/bmm-qa.customize.yaml +5 -0
- package/lib/bmad-extension/agents/bmm-sm.customize.yaml +5 -0
- package/lib/bmad-extension/agents/bmm-sre.customize.yaml +30 -0
- package/lib/bmad-extension/agents/bmm-tech-writer.customize.yaml +5 -0
- package/lib/bmad-extension/agents/bmm-ux-designer.customize.yaml +5 -0
- package/lib/bmad-extension/module-help.csv +7 -0
- package/lib/bmad-extension/module.yaml +3 -0
- package/lib/bmad-extension/workflows/add-sprint/workflow.md +112 -0
- package/lib/bmad-extension/workflows/add-to-sprint/workflow.md +206 -0
- package/lib/bmad-extension/workflows/create-bug-story/workflow.md +186 -0
- package/lib/bmad-extension/workflows/modify-sprint/workflow.md +250 -0
- package/lib/bmad-extension/workflows/project-context-expansion/workflow.md +229 -0
- package/lib/bmad-extension/workflows/sprint-status-view/workflow.md +193 -0
- package/lib/bmad.js +168 -36
- package/lib/hooks/claude-code/verify-manifest.js +56 -0
- package/lib/installer.js +282 -1
- package/lib/methodology/BMAD_AI_Development_Training.pptx +0 -0
- package/lib/methodology/version.json +7 -0
- package/lib/skill-authoring.js +732 -0
- package/lib/templates/project-context.template.md +47 -0
- package/opencode.json +8 -0
- package/package.json +2 -2
- package/skills/auto-bug-detection/SKILL.md +165 -0
- package/skills/auto-bug-detection/skill.json +8 -0
- package/skills/code-review/SKILL.md +40 -0
- package/skills/cpp-best-practices/SKILL.md +230 -0
- package/skills/cpp-best-practices/examples/modern-idioms.md +189 -0
- package/skills/cpp-best-practices/examples/naming-and-organization.md +102 -0
- package/skills/cpp-best-practices/skill.json +25 -0
- package/skills/csharp-best-practices/SKILL.md +274 -0
- package/skills/csharp-best-practices/skill.json +23 -0
- package/skills/git-workflow-skill/skill.json +1 -1
- package/skills/open-presentation/SKILL.md +31 -0
- package/skills/open-presentation/skill.json +11 -0
- package/skills/python-best-practices/SKILL.md +381 -0
- package/skills/python-best-practices/skill.json +26 -0
- package/skills/story-status-lookup/SKILL.md +74 -0
- package/skills/story-status-lookup/skill.json +8 -0
- package/test/agent-injection-strategy.test.js +13 -7
- package/test/bmad-extension.test.js +237 -0
- package/test/bmad-output-policy.test.js +119 -0
- package/test/build-bmad-args.test.js +361 -0
- package/test/create-agent.test.js +232 -0
- package/test/enforcement-hooks.test.js +324 -0
- package/test/generate-project-context.test.js +337 -0
- package/test/integration-verification.test.js +402 -0
- package/test/opencode-agent.test.js +150 -0
- package/test/opencode-json-error.test.js +260 -0
- package/test/opencode-json-injection.test.js +256 -0
- package/test/opencode-json-merge.test.js +299 -0
- package/test/skill-authoring.test.js +272 -0
- package/test/skill-customize-agent.test.js +253 -0
- package/test/skill-mandatory.test.js +235 -0
- package/test/skill-validation.test.js +378 -0
- 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/)
|