opencode-skills-collection 3.0.45 → 3.0.47
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/bundled-skills/.antigravity-install-manifest.json +10 -1
- package/bundled-skills/2slides-ppt-generator/SKILL.md +1 -1
- package/bundled-skills/2slides-ppt-generator/scripts/create_pdf_slides.py +2 -1
- package/bundled-skills/2slides-ppt-generator/scripts/generate_narration.py +2 -1
- package/bundled-skills/2slides-ppt-generator/scripts/generate_slides.py +13 -7
- package/bundled-skills/android-dev/references/hybrid.md +7 -4
- package/bundled-skills/android-dev/references/react-native.md +5 -2
- package/bundled-skills/atlas-contract/SKILL.md +4 -4
- package/bundled-skills/atlas-ledger/SKILL.md +10 -7
- package/bundled-skills/bun-development/SKILL.md +1 -1
- package/bundled-skills/cloud-penetration-testing/SKILL.md +1 -1
- package/bundled-skills/codebase-to-wordpress-converter/SKILL.md +1 -0
- package/bundled-skills/docs/integrations/jetski-cortex.md +3 -3
- package/bundled-skills/docs/integrations/jetski-gemini-loader/README.md +1 -1
- package/bundled-skills/docs/maintainers/repo-growth-seo.md +3 -3
- package/bundled-skills/docs/maintainers/skills-update-guide.md +1 -1
- package/bundled-skills/docs/users/bundles.md +1 -1
- package/bundled-skills/docs/users/claude-code-skills.md +1 -1
- package/bundled-skills/docs/users/gemini-cli-skills.md +1 -1
- package/bundled-skills/docs/users/getting-started.md +1 -1
- package/bundled-skills/docs/users/kiro-integration.md +1 -1
- package/bundled-skills/docs/users/usage.md +4 -4
- package/bundled-skills/docs/users/visual-guide.md +4 -4
- package/bundled-skills/dos-verify-done-claims/SKILL.md +173 -0
- package/bundled-skills/ecl-harness-engineer/LICENSE +21 -0
- package/bundled-skills/ecl-harness-engineer/SKILL.md +714 -0
- package/bundled-skills/ecl-harness-engineer/agents/analyzer.md +119 -0
- package/bundled-skills/ecl-harness-engineer/agents/auditor.md +212 -0
- package/bundled-skills/ecl-harness-engineer/agents/creator-config.md +343 -0
- package/bundled-skills/ecl-harness-engineer/agents/creator-docs.md +201 -0
- package/bundled-skills/ecl-harness-engineer/agents/creator-linters.md +123 -0
- package/bundled-skills/ecl-harness-engineer/references/adapters/adapter-schema.md +204 -0
- package/bundled-skills/ecl-harness-engineer/references/adapters/generic.md +156 -0
- package/bundled-skills/ecl-harness-engineer/references/adapters/go.md +212 -0
- package/bundled-skills/ecl-harness-engineer/references/adapters/java.md +205 -0
- package/bundled-skills/ecl-harness-engineer/references/adapters/python.md +225 -0
- package/bundled-skills/ecl-harness-engineer/references/adapters/rust.md +220 -0
- package/bundled-skills/ecl-harness-engineer/references/adapters/typescript.md +245 -0
- package/bundled-skills/ecl-harness-engineer/references/architecture-diagrams.md +420 -0
- package/bundled-skills/ecl-harness-engineer/references/audit-templates.md +649 -0
- package/bundled-skills/ecl-harness-engineer/references/capability-registry.md +485 -0
- package/bundled-skills/ecl-harness-engineer/references/darwin-eval-prompts.md +373 -0
- package/bundled-skills/ecl-harness-engineer/references/documentation-templates.md +741 -0
- package/bundled-skills/ecl-harness-engineer/references/durability-patterns.md +423 -0
- package/bundled-skills/ecl-harness-engineer/references/ecl-harness.md +1431 -0
- package/bundled-skills/ecl-harness-engineer/references/environment-config-guide.md +534 -0
- package/bundled-skills/ecl-harness-engineer/references/environment-detection-guide.md +751 -0
- package/bundled-skills/ecl-harness-engineer/references/eval-templates.md +377 -0
- package/bundled-skills/ecl-harness-engineer/references/gc-templates.md +798 -0
- package/bundled-skills/ecl-harness-engineer/references/greenfield-templates.md +1385 -0
- package/bundled-skills/ecl-harness-engineer/references/linter-templates.md +448 -0
- package/bundled-skills/ecl-harness-engineer/references/observability-templates.md +315 -0
- package/bundled-skills/environment-setup-guide/SKILL.md +2 -2
- package/bundled-skills/evolution/SKILL.md +1 -1
- package/bundled-skills/gitops-workflow/SKILL.md +1 -1
- package/bundled-skills/linkerd-patterns/SKILL.md +1 -1
- package/bundled-skills/loki-mode/examples/todo-app-generated/frontend/package-lock.json +504 -1317
- package/bundled-skills/loki-mode/examples/todo-app-generated/frontend/package.json +2 -2
- package/bundled-skills/lovable-cleanup/SKILL.md +416 -0
- package/bundled-skills/monopoly/SKILL.md +397 -0
- package/bundled-skills/monopoly/patterns/SKILL.md +331 -0
- package/bundled-skills/monopoly/scale-benchmarks/SKILL.md +174 -0
- package/bundled-skills/monopoly/security-checklist/SKILL.md +69 -0
- package/bundled-skills/monopoly/tech-matrix/SKILL.md +268 -0
- package/bundled-skills/pagespeed-enhancer/SKILL.md +579 -0
- package/bundled-skills/polis-protocol/SKILL.md +6 -3
- package/bundled-skills/unship/SKILL.md +11 -5
- package/bundled-skills/uv-package-manager/resources/implementation-playbook.md +1 -1
- package/bundled-skills/varlock/SKILL.md +2 -2
- package/package.json +1 -1
- package/skills_index.json +204 -4
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
# Observability Templates
|
|
2
|
+
|
|
3
|
+
Templates for agent observability infrastructure.
|
|
4
|
+
|
|
5
|
+
Advanced profile only. Load this reference only when the user explicitly requests agent execution
|
|
6
|
+
traces, observability hooks, metrics, or debugging of long-running agent sessions. Do not create
|
|
7
|
+
`harness/trace` or observability hooks as part of the default core harness.
|
|
8
|
+
|
|
9
|
+
## Trace Format
|
|
10
|
+
|
|
11
|
+
Standard format for recording agent execution sessions.
|
|
12
|
+
|
|
13
|
+
```go
|
|
14
|
+
// harness/trace/format.go
|
|
15
|
+
package trace
|
|
16
|
+
|
|
17
|
+
import (
|
|
18
|
+
"encoding/json"
|
|
19
|
+
"os"
|
|
20
|
+
"time"
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
// AgentTrace captures a complete agent execution session
|
|
24
|
+
type AgentTrace struct {
|
|
25
|
+
SessionID string `json:"session_id"`
|
|
26
|
+
AgentType string `json:"agent_type"`
|
|
27
|
+
StartTime time.Time `json:"start_time"`
|
|
28
|
+
EndTime time.Time `json:"end_time"`
|
|
29
|
+
Prompt string `json:"prompt"`
|
|
30
|
+
SystemPrompt string `json:"system_prompt,omitempty"`
|
|
31
|
+
WorkingDir string `json:"working_dir"`
|
|
32
|
+
Messages []MessageTrace `json:"messages"`
|
|
33
|
+
ToolCalls []ToolTrace `json:"tool_calls"`
|
|
34
|
+
TokenUsage TokenUsage `json:"token_usage"`
|
|
35
|
+
Outcome Outcome `json:"outcome"`
|
|
36
|
+
Result string `json:"result,omitempty"`
|
|
37
|
+
Error string `json:"error,omitempty"`
|
|
38
|
+
Metadata map[string]any `json:"metadata,omitempty"`
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
type MessageTrace struct {
|
|
42
|
+
ID string `json:"id,omitempty"`
|
|
43
|
+
Role string `json:"role"`
|
|
44
|
+
Content string `json:"content"`
|
|
45
|
+
Timestamp time.Time `json:"timestamp"`
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
type ToolTrace struct {
|
|
49
|
+
ID string `json:"id"`
|
|
50
|
+
Tool string `json:"tool"`
|
|
51
|
+
Input json.RawMessage `json:"input"`
|
|
52
|
+
Output string `json:"output"`
|
|
53
|
+
Duration time.Duration `json:"duration"`
|
|
54
|
+
Timestamp time.Time `json:"timestamp"`
|
|
55
|
+
IsError bool `json:"is_error"`
|
|
56
|
+
ErrCode int `json:"err_code,omitempty"`
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
type TokenUsage struct {
|
|
60
|
+
InputTokens int64 `json:"input_tokens"`
|
|
61
|
+
OutputTokens int64 `json:"output_tokens"`
|
|
62
|
+
TotalTokens int64 `json:"total_tokens"`
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
type Outcome string
|
|
66
|
+
|
|
67
|
+
const (
|
|
68
|
+
OutcomeSuccess Outcome = "success"
|
|
69
|
+
OutcomeError Outcome = "error"
|
|
70
|
+
OutcomeTimeout Outcome = "timeout"
|
|
71
|
+
OutcomeCancelled Outcome = "cancelled"
|
|
72
|
+
OutcomeMaxTurns Outcome = "max_turns"
|
|
73
|
+
OutcomeMaxToolCalls Outcome = "max_tool_calls"
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
// TraceBuilder constructs traces incrementally
|
|
77
|
+
type TraceBuilder struct {
|
|
78
|
+
trace AgentTrace
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
func NewTraceBuilder(sessionID, agentType string) *TraceBuilder {
|
|
82
|
+
return &TraceBuilder{
|
|
83
|
+
trace: AgentTrace{
|
|
84
|
+
SessionID: sessionID,
|
|
85
|
+
AgentType: agentType,
|
|
86
|
+
StartTime: time.Now(),
|
|
87
|
+
Messages: make([]MessageTrace, 0),
|
|
88
|
+
ToolCalls: make([]ToolTrace, 0),
|
|
89
|
+
Metadata: make(map[string]any),
|
|
90
|
+
},
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
func (b *TraceBuilder) AddMessage(msg MessageTrace) { b.trace.Messages = append(b.trace.Messages, msg) }
|
|
95
|
+
func (b *TraceBuilder) AddToolCall(tc ToolTrace) { b.trace.ToolCalls = append(b.trace.ToolCalls, tc) }
|
|
96
|
+
|
|
97
|
+
func (b *TraceBuilder) Build() AgentTrace {
|
|
98
|
+
b.trace.EndTime = time.Now()
|
|
99
|
+
return b.trace
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
func (t *AgentTrace) Export(path string) error {
|
|
103
|
+
data, err := json.MarshalIndent(t, "", " ")
|
|
104
|
+
if err != nil {
|
|
105
|
+
return err
|
|
106
|
+
}
|
|
107
|
+
return os.WriteFile(path, data, 0644)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
func Load(path string) (*AgentTrace, error) {
|
|
111
|
+
data, err := os.ReadFile(path)
|
|
112
|
+
if err != nil {
|
|
113
|
+
return nil, err
|
|
114
|
+
}
|
|
115
|
+
var trace AgentTrace
|
|
116
|
+
return &trace, json.Unmarshal(data, &trace)
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## Self-Test Framework
|
|
121
|
+
|
|
122
|
+
Framework for testing agent behavior with validation.
|
|
123
|
+
|
|
124
|
+
```go
|
|
125
|
+
// harness/selftest/runner.go
|
|
126
|
+
package selftest
|
|
127
|
+
|
|
128
|
+
import (
|
|
129
|
+
"context"
|
|
130
|
+
"encoding/json"
|
|
131
|
+
"fmt"
|
|
132
|
+
"time"
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
// TestCase defines a single agent test
|
|
136
|
+
type TestCase struct {
|
|
137
|
+
Name string `json:"name"`
|
|
138
|
+
Category string `json:"category"`
|
|
139
|
+
Prompt string `json:"prompt"`
|
|
140
|
+
InitFiles map[string]string `json:"init_files,omitempty"`
|
|
141
|
+
Timeout time.Duration `json:"timeout"`
|
|
142
|
+
MaxTurns int `json:"max_turns,omitempty"`
|
|
143
|
+
Expected *Expectations `json:"expected,omitempty"`
|
|
144
|
+
Validators []Validator `json:"-"`
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
type Expectations struct {
|
|
148
|
+
Files map[string]FileExpectation `json:"files,omitempty"`
|
|
149
|
+
ToolCalls []ToolCallExpectation `json:"tool_calls,omitempty"`
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
type FileExpectation struct {
|
|
153
|
+
MustExist bool `json:"must_exist"`
|
|
154
|
+
MustContain []string `json:"must_contain,omitempty"`
|
|
155
|
+
MustNotContain []string `json:"must_not_contain,omitempty"`
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
type ToolCallExpectation struct {
|
|
159
|
+
Tool string `json:"tool"`
|
|
160
|
+
MustOccur bool `json:"must_occur,omitempty"`
|
|
161
|
+
MustNotOccur bool `json:"must_not_occur,omitempty"`
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
type Validator func(result *AgentResult) error
|
|
165
|
+
|
|
166
|
+
type AgentResult struct {
|
|
167
|
+
TestName string `json:"test_name"`
|
|
168
|
+
Success bool `json:"success"`
|
|
169
|
+
Error string `json:"error,omitempty"`
|
|
170
|
+
Duration time.Duration `json:"duration"`
|
|
171
|
+
ToolCalls []ToolCallRecord `json:"tool_calls"`
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
type ToolCallRecord struct {
|
|
175
|
+
Tool string `json:"tool"`
|
|
176
|
+
Input json.RawMessage `json:"input"`
|
|
177
|
+
Output string `json:"output"`
|
|
178
|
+
IsError bool `json:"is_error"`
|
|
179
|
+
Duration time.Duration `json:"duration"`
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
type Runner struct {
|
|
183
|
+
WorkDir string
|
|
184
|
+
DefaultTimeout time.Duration
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
func NewRunner(workDir string) *Runner {
|
|
188
|
+
return &Runner{WorkDir: workDir, DefaultTimeout: 2 * time.Minute}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
func (r *Runner) Run(ctx context.Context, tc TestCase) (*AgentResult, error) {
|
|
192
|
+
result := &AgentResult{
|
|
193
|
+
TestName: tc.Name,
|
|
194
|
+
ToolCalls: make([]ToolCallRecord, 0),
|
|
195
|
+
}
|
|
196
|
+
start := time.Now()
|
|
197
|
+
defer func() { result.Duration = time.Since(start) }()
|
|
198
|
+
|
|
199
|
+
// TODO: Integrate with actual agent execution
|
|
200
|
+
return result, fmt.Errorf("not yet integrated with agent")
|
|
201
|
+
}
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## Observability Hook
|
|
205
|
+
|
|
206
|
+
Hook that records tool calls for analysis and replay.
|
|
207
|
+
|
|
208
|
+
```go
|
|
209
|
+
// hooks/observability/observability.go
|
|
210
|
+
package observability
|
|
211
|
+
|
|
212
|
+
import (
|
|
213
|
+
"encoding/json"
|
|
214
|
+
"sync"
|
|
215
|
+
"time"
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
type ToolTrace struct {
|
|
219
|
+
Tool string `json:"tool"`
|
|
220
|
+
Input json.RawMessage `json:"input"`
|
|
221
|
+
Output string `json:"output"`
|
|
222
|
+
IsError bool `json:"is_error"`
|
|
223
|
+
Duration time.Duration `json:"duration"`
|
|
224
|
+
Timestamp time.Time `json:"timestamp"`
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// TraceRecorder collects tool traces
|
|
228
|
+
type TraceRecorder struct {
|
|
229
|
+
mu sync.RWMutex
|
|
230
|
+
traces []ToolTrace
|
|
231
|
+
sessionId string
|
|
232
|
+
startTime time.Time
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
func NewTraceRecorder(sessionId string) *TraceRecorder {
|
|
236
|
+
return &TraceRecorder{
|
|
237
|
+
traces: make([]ToolTrace, 0),
|
|
238
|
+
sessionId: sessionId,
|
|
239
|
+
startTime: time.Now(),
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
func (r *TraceRecorder) Record(trace ToolTrace) {
|
|
244
|
+
r.mu.Lock()
|
|
245
|
+
defer r.mu.Unlock()
|
|
246
|
+
r.traces = append(r.traces, trace)
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
func (r *TraceRecorder) GetTraces() []ToolTrace {
|
|
250
|
+
r.mu.RLock()
|
|
251
|
+
defer r.mu.RUnlock()
|
|
252
|
+
result := make([]ToolTrace, len(r.traces))
|
|
253
|
+
copy(result, r.traces)
|
|
254
|
+
return result
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
func (r *TraceRecorder) ExportJSON() ([]byte, error) {
|
|
258
|
+
r.mu.RLock()
|
|
259
|
+
defer r.mu.RUnlock()
|
|
260
|
+
return json.MarshalIndent(map[string]any{
|
|
261
|
+
"session_id": r.sessionId,
|
|
262
|
+
"start_time": r.startTime,
|
|
263
|
+
"end_time": time.Now(),
|
|
264
|
+
"traces": r.traces,
|
|
265
|
+
}, "", " ")
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// Summary returns aggregate statistics
|
|
269
|
+
func (r *TraceRecorder) Summary() TraceSummary {
|
|
270
|
+
r.mu.RLock()
|
|
271
|
+
defer r.mu.RUnlock()
|
|
272
|
+
|
|
273
|
+
summary := TraceSummary{
|
|
274
|
+
TotalCalls: len(r.traces),
|
|
275
|
+
ToolCounts: make(map[string]int),
|
|
276
|
+
}
|
|
277
|
+
for _, t := range r.traces {
|
|
278
|
+
summary.ToolCounts[t.Tool]++
|
|
279
|
+
if t.IsError {
|
|
280
|
+
summary.TotalErrors++
|
|
281
|
+
}
|
|
282
|
+
summary.TotalDuration += t.Duration
|
|
283
|
+
}
|
|
284
|
+
return summary
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
type TraceSummary struct {
|
|
288
|
+
TotalCalls int `json:"total_calls"`
|
|
289
|
+
TotalErrors int `json:"total_errors"`
|
|
290
|
+
TotalDuration time.Duration `json:"total_duration"`
|
|
291
|
+
ToolCounts map[string]int `json:"tool_counts"`
|
|
292
|
+
}
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
## Integration Pattern
|
|
296
|
+
|
|
297
|
+
To wire the observability hook into an existing agent:
|
|
298
|
+
|
|
299
|
+
```go
|
|
300
|
+
// In agent initialization:
|
|
301
|
+
recorder := observability.NewTraceRecorder(sessionId)
|
|
302
|
+
hook := observability.NewObservabilityHook(recorder)
|
|
303
|
+
|
|
304
|
+
// Register as PostToolUse hook
|
|
305
|
+
agent.AddPostToolUseHook(hook)
|
|
306
|
+
|
|
307
|
+
// After agent completes:
|
|
308
|
+
traces := recorder.GetTraces()
|
|
309
|
+
summary := recorder.Summary()
|
|
310
|
+
summary.Print()
|
|
311
|
+
|
|
312
|
+
// Export for analysis
|
|
313
|
+
data, _ := recorder.ExportJSON()
|
|
314
|
+
os.WriteFile("trace.json", data, 0644)
|
|
315
|
+
```
|
|
@@ -86,7 +86,7 @@ Provide verification steps to ensure everything works:
|
|
|
86
86
|
tmpdir="$(mktemp -d)"
|
|
87
87
|
trap 'rm -rf "$tmpdir"' EXIT
|
|
88
88
|
curl -fsSLo "$tmpdir/homebrew-install.sh" https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh
|
|
89
|
-
|
|
89
|
+
cat "$tmpdir/homebrew-install.sh" # review the full installer before executing
|
|
90
90
|
/bin/bash "$tmpdir/homebrew-install.sh"
|
|
91
91
|
|
|
92
92
|
# Install Node.js
|
|
@@ -102,7 +102,7 @@ sudo apt update
|
|
|
102
102
|
tmpdir="$(mktemp -d)"
|
|
103
103
|
trap 'rm -rf "$tmpdir"' EXIT
|
|
104
104
|
curl -fsSLo "$tmpdir/nodesource-setup.sh" https://deb.nodesource.com/setup_20.x
|
|
105
|
-
|
|
105
|
+
cat "$tmpdir/nodesource-setup.sh" # review the full installer before sudo
|
|
106
106
|
sudo -E bash "$tmpdir/nodesource-setup.sh"
|
|
107
107
|
sudo apt install -y nodejs
|
|
108
108
|
\`\`\`
|
|
@@ -37,7 +37,7 @@ For reliable automatic triggering, use Claude Code hooks. Install with `--with-h
|
|
|
37
37
|
tmpdir="$(mktemp -d)"
|
|
38
38
|
trap 'rm -rf "$tmpdir"' EXIT
|
|
39
39
|
curl -fsSLo "$tmpdir/makepad-skills-install.sh" https://raw.githubusercontent.com/ZhangHanDong/makepad-skills/main/install.sh
|
|
40
|
-
|
|
40
|
+
cat "$tmpdir/makepad-skills-install.sh" # review the full installer before executing
|
|
41
41
|
bash "$tmpdir/makepad-skills-install.sh" --with-hooks
|
|
42
42
|
```
|
|
43
43
|
|
|
@@ -144,7 +144,7 @@ brew install fluxcd/tap/flux
|
|
|
144
144
|
tmpdir="$(mktemp -d)"
|
|
145
145
|
trap 'rm -rf "$tmpdir"' EXIT
|
|
146
146
|
curl -fsSLo "$tmpdir/flux-install.sh" https://fluxcd.io/install.sh
|
|
147
|
-
|
|
147
|
+
cat "$tmpdir/flux-install.sh" # review the full installer before sudo
|
|
148
148
|
sudo bash "$tmpdir/flux-install.sh"
|
|
149
149
|
|
|
150
150
|
# Bootstrap Flux
|
|
@@ -76,7 +76,7 @@ brew install linkerd
|
|
|
76
76
|
tmpdir="$(mktemp -d)"
|
|
77
77
|
trap 'rm -rf "$tmpdir"' EXIT
|
|
78
78
|
curl --proto '=https' --tlsv1.2 -sSfL https://run.linkerd.io/install -o "$tmpdir/linkerd-install.sh"
|
|
79
|
-
|
|
79
|
+
cat "$tmpdir/linkerd-install.sh" # review the full installer before executing
|
|
80
80
|
sh "$tmpdir/linkerd-install.sh"
|
|
81
81
|
|
|
82
82
|
# Validate cluster
|