cfsa-antigravity 2.0.0 → 2.1.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/README.md +14 -0
- package/package.json +1 -1
- package/template/.agent/instructions/commands.md +8 -32
- package/template/.agent/instructions/patterns.md +3 -3
- package/template/.agent/instructions/tech-stack.md +71 -23
- package/template/.agent/instructions/workflow.md +12 -1
- package/template/.agent/rules/completion-checklist.md +6 -0
- package/template/.agent/rules/security-first.md +3 -3
- package/template/.agent/rules/vertical-slices.md +1 -1
- package/template/.agent/skill-library/MANIFEST.md +6 -0
- package/template/.agent/skill-library/stack/devops/git-advanced/SKILL.md +972 -0
- package/template/.agent/skill-library/stack/devops/git-workflow/SKILL.md +420 -0
- package/template/.agent/skills/api-versioning/SKILL.md +44 -298
- package/template/.agent/skills/api-versioning/references/typescript.md +157 -0
- package/template/.agent/skills/architecture-mapping/SKILL.md +7 -7
- package/template/.agent/skills/bootstrap-agents/SKILL.md +151 -152
- package/template/.agent/skills/clean-code/SKILL.md +64 -118
- package/template/.agent/skills/clean-code/references/typescript.md +126 -0
- package/template/.agent/skills/database-schema-design/SKILL.md +93 -317
- package/template/.agent/skills/database-schema-design/references/relational.md +228 -0
- package/template/.agent/skills/error-handling-patterns/SKILL.md +62 -557
- package/template/.agent/skills/error-handling-patterns/references/go.md +162 -0
- package/template/.agent/skills/error-handling-patterns/references/python.md +262 -0
- package/template/.agent/skills/error-handling-patterns/references/rust.md +112 -0
- package/template/.agent/skills/error-handling-patterns/references/typescript.md +178 -0
- package/template/.agent/skills/idea-extraction/SKILL.md +119 -12
- package/template/.agent/skills/logging-best-practices/SKILL.md +108 -767
- package/template/.agent/skills/logging-best-practices/references/go.md +49 -0
- package/template/.agent/skills/logging-best-practices/references/python.md +52 -0
- package/template/.agent/skills/logging-best-practices/references/typescript.md +215 -0
- package/template/.agent/skills/migration-management/SKILL.md +127 -311
- package/template/.agent/skills/migration-management/references/relational.md +214 -0
- package/template/.agent/skills/parallel-feature-development/SKILL.md +34 -43
- package/template/.agent/skills/pipeline-rubrics/references/be-rubric.md +1 -1
- package/template/.agent/skills/pipeline-rubrics/references/ia-rubric.md +1 -1
- package/template/.agent/skills/prd-templates/SKILL.md +20 -3
- package/template/.agent/skills/prd-templates/references/be-spec-template.md +2 -2
- package/template/.agent/skills/prd-templates/references/decomposition-templates.md +2 -2
- package/template/.agent/skills/prd-templates/references/fe-spec-template.md +1 -1
- package/template/.agent/skills/prd-templates/references/ideation-domain-template.md +8 -2
- package/template/.agent/skills/prd-templates/references/ideation-index-template.md +25 -1
- package/template/.agent/skills/prd-templates/references/operational-templates.md +1 -1
- package/template/.agent/skills/prd-templates/references/placeholder-workflow-mapping.md +50 -21
- package/template/.agent/skills/prd-templates/references/skill-loading-protocol.md +32 -0
- package/template/.agent/skills/prd-templates/references/slice-completion-gates.md +21 -0
- package/template/.agent/skills/prd-templates/references/spec-coverage-sweep.md +3 -3
- package/template/.agent/skills/prd-templates/references/tdd-testing-policy.md +39 -0
- package/template/.agent/skills/prd-templates/references/vision-template.md +1 -1
- package/template/.agent/skills/regex-patterns/SKILL.md +122 -540
- package/template/.agent/skills/regex-patterns/references/go.md +44 -0
- package/template/.agent/skills/regex-patterns/references/javascript.md +63 -0
- package/template/.agent/skills/regex-patterns/references/python.md +77 -0
- package/template/.agent/skills/regex-patterns/references/rust.md +43 -0
- package/template/.agent/skills/session-continuity/SKILL.md +11 -9
- package/template/.agent/skills/session-continuity/protocols/02-progress-generation.md +2 -2
- package/template/.agent/skills/session-continuity/protocols/04-pattern-extraction.md +1 -1
- package/template/.agent/skills/session-continuity/protocols/05-session-close.md +1 -1
- package/template/.agent/skills/session-continuity/protocols/09-parallel-claim.md +1 -1
- package/template/.agent/skills/session-continuity/protocols/10-placeholder-verification-gate.md +57 -78
- package/template/.agent/skills/session-continuity/protocols/11-parallel-synthesis.md +1 -1
- package/template/.agent/skills/tdd-workflow/SKILL.md +94 -317
- package/template/.agent/skills/tdd-workflow/references/typescript.md +231 -0
- package/template/.agent/skills/testing-strategist/SKILL.md +74 -687
- package/template/.agent/skills/testing-strategist/references/typescript.md +328 -0
- package/template/.agent/skills/workflow-automation/SKILL.md +62 -154
- package/template/.agent/skills/workflow-automation/references/inngest.md +88 -0
- package/template/.agent/skills/workflow-automation/references/temporal.md +64 -0
- package/template/.agent/workflows/bootstrap-agents-fill.md +85 -143
- package/template/.agent/workflows/bootstrap-agents-provision.md +90 -107
- package/template/.agent/workflows/create-prd-architecture.md +16 -14
- package/template/.agent/workflows/create-prd-compile.md +11 -12
- package/template/.agent/workflows/create-prd-design-system.md +1 -1
- package/template/.agent/workflows/create-prd-security.md +9 -11
- package/template/.agent/workflows/create-prd-stack.md +10 -4
- package/template/.agent/workflows/create-prd.md +5 -6
- package/template/.agent/workflows/decompose-architecture-structure.md +3 -5
- package/template/.agent/workflows/decompose-architecture-validate.md +18 -1
- package/template/.agent/workflows/evolve-contract.md +11 -11
- package/template/.agent/workflows/ideate-discover.md +10 -6
- package/template/.agent/workflows/ideate-extract.md +61 -4
- package/template/.agent/workflows/ideate-validate.md +3 -3
- package/template/.agent/workflows/ideate.md +2 -2
- package/template/.agent/workflows/implement-slice-setup.md +25 -23
- package/template/.agent/workflows/implement-slice-tdd.md +51 -92
- package/template/.agent/workflows/implement-slice.md +4 -4
- package/template/.agent/workflows/plan-phase-preflight.md +6 -2
- package/template/.agent/workflows/plan-phase-write.md +6 -8
- package/template/.agent/workflows/resolve-ambiguity.md +1 -1
- package/template/.agent/workflows/update-architecture-map.md +22 -5
- package/template/.agent/workflows/validate-phase.md +26 -29
- package/template/.agent/workflows/verify-infrastructure.md +10 -10
- package/template/.agent/workflows/write-architecture-spec-design.md +17 -12
- package/template/.agent/workflows/write-be-spec-classify.md +25 -21
- package/template/.agent/workflows/write-be-spec.md +1 -1
- package/template/.agent/workflows/write-fe-spec-classify.md +6 -12
- package/template/.agent/workflows/write-fe-spec-write.md +1 -1
- package/template/AGENTS.md +1 -1
- package/template/GEMINI.md +3 -3
- package/template/docs/kit-architecture.md +34 -8
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Go Logging Patterns
|
|
2
|
+
|
|
3
|
+
Language-specific patterns for the `logging-best-practices` skill. Read `SKILL.md` first for universal methodology.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Libraries
|
|
8
|
+
|
|
9
|
+
| Library | Use Case |
|
|
10
|
+
|---------|----------|
|
|
11
|
+
| **zap** | High-performance structured logging |
|
|
12
|
+
| **zerolog** | Zero-allocation JSON logger |
|
|
13
|
+
|
|
14
|
+
## zap Setup
|
|
15
|
+
|
|
16
|
+
```go
|
|
17
|
+
package main
|
|
18
|
+
|
|
19
|
+
import "go.uber.org/zap"
|
|
20
|
+
|
|
21
|
+
func main() {
|
|
22
|
+
// Production config (JSON output)
|
|
23
|
+
logger, _ := zap.NewProduction()
|
|
24
|
+
defer logger.Sync()
|
|
25
|
+
|
|
26
|
+
// Development config (human-readable)
|
|
27
|
+
// logger, _ := zap.NewDevelopment()
|
|
28
|
+
|
|
29
|
+
logger.Info("User created",
|
|
30
|
+
zap.String("userId", user.ID),
|
|
31
|
+
zap.String("email", user.Email),
|
|
32
|
+
zap.String("requestId", req.ID),
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
logger.Error("Payment processing failed",
|
|
36
|
+
zap.Error(err),
|
|
37
|
+
zap.String("orderId", order.ID),
|
|
38
|
+
zap.Float64("amount", order.Total),
|
|
39
|
+
zap.String("userId", user.ID),
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
// Sugared logger for convenience (slightly slower)
|
|
43
|
+
sugar := logger.Sugar()
|
|
44
|
+
sugar.Infow("User login",
|
|
45
|
+
"userId", user.ID,
|
|
46
|
+
"ip", req.IP,
|
|
47
|
+
)
|
|
48
|
+
}
|
|
49
|
+
```
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Python Logging Patterns
|
|
2
|
+
|
|
3
|
+
Language-specific patterns for the `logging-best-practices` skill. Read `SKILL.md` first for universal methodology.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Libraries
|
|
8
|
+
|
|
9
|
+
| Library | Use Case |
|
|
10
|
+
|---------|----------|
|
|
11
|
+
| **structlog** | Structured logging with processors |
|
|
12
|
+
| **logging** | Standard library (structlog wraps it) |
|
|
13
|
+
|
|
14
|
+
## structlog Setup
|
|
15
|
+
|
|
16
|
+
```python
|
|
17
|
+
import structlog
|
|
18
|
+
import logging
|
|
19
|
+
|
|
20
|
+
structlog.configure(
|
|
21
|
+
processors=[
|
|
22
|
+
structlog.stdlib.filter_by_level,
|
|
23
|
+
structlog.stdlib.add_logger_name,
|
|
24
|
+
structlog.stdlib.add_log_level,
|
|
25
|
+
structlog.stdlib.PositionalArgumentsFormatter(),
|
|
26
|
+
structlog.processors.TimeStamper(fmt="iso"),
|
|
27
|
+
structlog.processors.StackInfoRenderer(),
|
|
28
|
+
structlog.processors.format_exc_info,
|
|
29
|
+
structlog.processors.UnicodeDecoder(),
|
|
30
|
+
structlog.processors.JSONRenderer()
|
|
31
|
+
],
|
|
32
|
+
context_class=dict,
|
|
33
|
+
logger_factory=structlog.stdlib.LoggerFactory(),
|
|
34
|
+
cache_logger_on_first_use=True,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
logger = structlog.get_logger()
|
|
38
|
+
|
|
39
|
+
# Usage
|
|
40
|
+
logger.info("user_created",
|
|
41
|
+
user_id=user.id,
|
|
42
|
+
email=user.email,
|
|
43
|
+
request_id=request.id
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
logger.error("payment_failed",
|
|
47
|
+
error=str(error),
|
|
48
|
+
order_id=order.id,
|
|
49
|
+
amount=order.total,
|
|
50
|
+
user_id=user.id
|
|
51
|
+
)
|
|
52
|
+
```
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
# TypeScript Logging Patterns
|
|
2
|
+
|
|
3
|
+
Language-specific patterns for the `logging-best-practices` skill. Read `SKILL.md` first for universal methodology.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Libraries
|
|
8
|
+
|
|
9
|
+
| Library | Use Case |
|
|
10
|
+
|---------|----------|
|
|
11
|
+
| **Winston** | Versatile, multi-transport, production-ready |
|
|
12
|
+
| **Pino** | High-performance JSON logger |
|
|
13
|
+
| **OpenTelemetry SDK** | Distributed tracing |
|
|
14
|
+
|
|
15
|
+
## Winston Setup
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
import winston from 'winston';
|
|
19
|
+
|
|
20
|
+
const logger = winston.createLogger({
|
|
21
|
+
level: process.env.LOG_LEVEL || 'info',
|
|
22
|
+
format: winston.format.combine(
|
|
23
|
+
winston.format.timestamp(),
|
|
24
|
+
winston.format.errors({ stack: true }),
|
|
25
|
+
winston.format.json()
|
|
26
|
+
),
|
|
27
|
+
defaultMeta: {
|
|
28
|
+
service: 'user-service',
|
|
29
|
+
environment: process.env.NODE_ENV
|
|
30
|
+
},
|
|
31
|
+
transports: [
|
|
32
|
+
new winston.transports.Console({
|
|
33
|
+
format: winston.format.combine(
|
|
34
|
+
winston.format.colorize(),
|
|
35
|
+
winston.format.simple()
|
|
36
|
+
)
|
|
37
|
+
}),
|
|
38
|
+
new winston.transports.File({
|
|
39
|
+
filename: 'logs/error.log',
|
|
40
|
+
level: 'error',
|
|
41
|
+
maxsize: 5242880, maxFiles: 5
|
|
42
|
+
}),
|
|
43
|
+
new winston.transports.File({
|
|
44
|
+
filename: 'logs/combined.log',
|
|
45
|
+
maxsize: 5242880, maxFiles: 5
|
|
46
|
+
})
|
|
47
|
+
]
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
logger.info('User created', { userId: user.id, requestId: req.id });
|
|
51
|
+
logger.error('Payment failed', { error: error.message, stack: error.stack, orderId: order.id });
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Request Context Middleware
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
58
|
+
import { AsyncLocalStorage } from 'async_hooks';
|
|
59
|
+
|
|
60
|
+
const asyncLocalStorage = new AsyncLocalStorage();
|
|
61
|
+
|
|
62
|
+
export function requestLogger(req, res, next) {
|
|
63
|
+
const requestId = req.headers['x-request-id'] || uuidv4();
|
|
64
|
+
const context = {
|
|
65
|
+
requestId, method: req.method, path: req.path,
|
|
66
|
+
ip: req.ip, userId: req.user?.id
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
asyncLocalStorage.run(context, () => {
|
|
70
|
+
logger.info('Request started', context);
|
|
71
|
+
res.on('finish', () => {
|
|
72
|
+
logger.info('Request completed', {
|
|
73
|
+
...context, statusCode: res.statusCode,
|
|
74
|
+
duration: Date.now() - req.startTime
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
req.startTime = Date.now();
|
|
78
|
+
next();
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export function getLogger() {
|
|
83
|
+
const context = asyncLocalStorage.getStore();
|
|
84
|
+
return {
|
|
85
|
+
info: (message: string, meta?: object) =>
|
|
86
|
+
logger.info(message, { ...context, ...meta }),
|
|
87
|
+
error: (message: string, error: Error, meta?: object) =>
|
|
88
|
+
logger.error(message, { ...context, error, ...meta }),
|
|
89
|
+
warn: (message: string, meta?: object) =>
|
|
90
|
+
logger.warn(message, { ...context, ...meta }),
|
|
91
|
+
debug: (message: string, meta?: object) =>
|
|
92
|
+
logger.debug(message, { ...context, ...meta })
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## PII Sanitization
|
|
98
|
+
|
|
99
|
+
```typescript
|
|
100
|
+
const SENSITIVE_FIELDS = ['password', 'token', 'apiKey', 'ssn', 'creditCard', 'email', 'phone'];
|
|
101
|
+
|
|
102
|
+
function sanitize(obj: any): any {
|
|
103
|
+
if (typeof obj !== 'object' || obj === null) return obj;
|
|
104
|
+
if (Array.isArray(obj)) return obj.map(sanitize);
|
|
105
|
+
|
|
106
|
+
const sanitized = {};
|
|
107
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
108
|
+
if (SENSITIVE_FIELDS.some(f => key.toLowerCase().includes(f.toLowerCase()))) {
|
|
109
|
+
sanitized[key] = '[REDACTED]';
|
|
110
|
+
} else if (typeof value === 'object') {
|
|
111
|
+
sanitized[key] = sanitize(value);
|
|
112
|
+
} else {
|
|
113
|
+
sanitized[key] = value;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return sanitized;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function maskEmail(email: string): string {
|
|
120
|
+
const [local, domain] = email.split('@');
|
|
121
|
+
return `${local[0]}${'*'.repeat(local.length - 2)}${local[local.length - 1]}@${domain}`;
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Performance Logger
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
class PerformanceLogger {
|
|
129
|
+
private timers = new Map<string, number>();
|
|
130
|
+
|
|
131
|
+
start(op: string) { this.timers.set(op, Date.now()); }
|
|
132
|
+
|
|
133
|
+
end(op: string, meta?: object) {
|
|
134
|
+
const start = this.timers.get(op);
|
|
135
|
+
if (!start) return;
|
|
136
|
+
const duration = Date.now() - start;
|
|
137
|
+
this.timers.delete(op);
|
|
138
|
+
logger.info(`Performance: ${op}`, { operation: op, durationMs: duration, ...meta });
|
|
139
|
+
if (duration > 1000) {
|
|
140
|
+
logger.warn(`Slow operation: ${op}`, { operation: op, durationMs: duration, threshold: 1000, ...meta });
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
async measure<T>(op: string, fn: () => Promise<T>, meta?: object): Promise<T> {
|
|
145
|
+
this.start(op);
|
|
146
|
+
try { return await fn(); } finally { this.end(op, meta); }
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## Distributed Tracing (OpenTelemetry)
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
import opentelemetry from '@opentelemetry/api';
|
|
155
|
+
import { NodeTracerProvider } from '@opentelemetry/node';
|
|
156
|
+
import { SimpleSpanProcessor } from '@opentelemetry/tracing';
|
|
157
|
+
import { JaegerExporter } from '@opentelemetry/exporter-jaeger';
|
|
158
|
+
|
|
159
|
+
const provider = new NodeTracerProvider();
|
|
160
|
+
provider.addSpanProcessor(
|
|
161
|
+
new SimpleSpanProcessor(new JaegerExporter({
|
|
162
|
+
serviceName: 'user-service',
|
|
163
|
+
endpoint: 'http://jaeger:14268/api/traces'
|
|
164
|
+
}))
|
|
165
|
+
);
|
|
166
|
+
provider.register();
|
|
167
|
+
|
|
168
|
+
const tracer = opentelemetry.trace.getTracer('user-service');
|
|
169
|
+
|
|
170
|
+
app.get('/api/users/:id', async (req, res) => {
|
|
171
|
+
const span = tracer.startSpan('get-user', {
|
|
172
|
+
attributes: { 'http.method': req.method, 'http.url': req.url }
|
|
173
|
+
});
|
|
174
|
+
try {
|
|
175
|
+
const user = await fetchUser(req.params.id);
|
|
176
|
+
span.setStatus({ code: opentelemetry.SpanStatusCode.OK });
|
|
177
|
+
res.json(user);
|
|
178
|
+
} catch (error) {
|
|
179
|
+
span.setStatus({ code: opentelemetry.SpanStatusCode.ERROR, message: error.message });
|
|
180
|
+
res.status(500).json({ error: 'Internal server error' });
|
|
181
|
+
} finally {
|
|
182
|
+
span.end();
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## Centralized Logging (ELK + Winston)
|
|
188
|
+
|
|
189
|
+
```typescript
|
|
190
|
+
import 'winston-logstash';
|
|
191
|
+
|
|
192
|
+
const elkLogger = winston.createLogger({
|
|
193
|
+
transports: [
|
|
194
|
+
new winston.transports.Logstash({
|
|
195
|
+
port: 5000, host: 'logstash',
|
|
196
|
+
node_name: 'user-service', max_connect_retries: -1
|
|
197
|
+
})
|
|
198
|
+
]
|
|
199
|
+
});
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
## Log Sampling
|
|
203
|
+
|
|
204
|
+
```typescript
|
|
205
|
+
class SamplingLogger {
|
|
206
|
+
constructor(private logger: Logger, private sampleRate = 0.1) {}
|
|
207
|
+
|
|
208
|
+
info(message: string, meta?: object) {
|
|
209
|
+
if (Math.random() < this.sampleRate) this.logger.info(message, meta);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
warn(message: string, meta?: object) { this.logger.warn(message, meta); }
|
|
213
|
+
error(message: string, error: Error, meta?: object) { this.logger.error(message, error, meta); }
|
|
214
|
+
}
|
|
215
|
+
```
|