opencode-swarm-plugin 0.44.0 → 0.44.1
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/bin/swarm.serve.test.ts +6 -4
- package/bin/swarm.ts +16 -10
- package/dist/compaction-prompt-scoring.js +139 -0
- package/dist/eval-capture.js +12811 -0
- package/dist/hive.d.ts.map +1 -1
- package/dist/index.js +7644 -62599
- package/dist/plugin.js +23766 -78721
- package/dist/swarm-orchestrate.d.ts.map +1 -1
- package/dist/swarm-prompts.d.ts.map +1 -1
- package/dist/swarm-review.d.ts.map +1 -1
- package/package.json +17 -5
- package/.changeset/swarm-insights-data-layer.md +0 -63
- package/.hive/analysis/eval-failure-analysis-2025-12-25.md +0 -331
- package/.hive/analysis/session-data-quality-audit.md +0 -320
- package/.hive/eval-results.json +0 -483
- package/.hive/issues.jsonl +0 -138
- package/.hive/memories.jsonl +0 -729
- package/.opencode/eval-history.jsonl +0 -327
- package/.turbo/turbo-build.log +0 -9
- package/CHANGELOG.md +0 -2286
- package/SCORER-ANALYSIS.md +0 -598
- package/docs/analysis/subagent-coordination-patterns.md +0 -902
- package/docs/analysis-socratic-planner-pattern.md +0 -504
- package/docs/planning/ADR-001-monorepo-structure.md +0 -171
- package/docs/planning/ADR-002-package-extraction.md +0 -393
- package/docs/planning/ADR-003-performance-improvements.md +0 -451
- package/docs/planning/ADR-004-message-queue-features.md +0 -187
- package/docs/planning/ADR-005-devtools-observability.md +0 -202
- package/docs/planning/ADR-007-swarm-enhancements-worktree-review.md +0 -168
- package/docs/planning/ADR-008-worker-handoff-protocol.md +0 -293
- package/docs/planning/ADR-009-oh-my-opencode-patterns.md +0 -353
- package/docs/planning/ADR-010-cass-inhousing.md +0 -1215
- package/docs/planning/ROADMAP.md +0 -368
- package/docs/semantic-memory-cli-syntax.md +0 -123
- package/docs/swarm-mail-architecture.md +0 -1147
- package/docs/testing/context-recovery-test.md +0 -470
- package/evals/ARCHITECTURE.md +0 -1189
- package/evals/README.md +0 -768
- package/evals/compaction-prompt.eval.ts +0 -149
- package/evals/compaction-resumption.eval.ts +0 -289
- package/evals/coordinator-behavior.eval.ts +0 -307
- package/evals/coordinator-session.eval.ts +0 -154
- package/evals/evalite.config.ts.bak +0 -15
- package/evals/example.eval.ts +0 -31
- package/evals/fixtures/cass-baseline.ts +0 -217
- package/evals/fixtures/compaction-cases.ts +0 -350
- package/evals/fixtures/compaction-prompt-cases.ts +0 -311
- package/evals/fixtures/coordinator-sessions.ts +0 -328
- package/evals/fixtures/decomposition-cases.ts +0 -105
- package/evals/lib/compaction-loader.test.ts +0 -248
- package/evals/lib/compaction-loader.ts +0 -320
- package/evals/lib/data-loader.evalite-test.ts +0 -289
- package/evals/lib/data-loader.test.ts +0 -345
- package/evals/lib/data-loader.ts +0 -281
- package/evals/lib/llm.ts +0 -115
- package/evals/scorers/compaction-prompt-scorers.ts +0 -145
- package/evals/scorers/compaction-scorers.ts +0 -305
- package/evals/scorers/coordinator-discipline.evalite-test.ts +0 -539
- package/evals/scorers/coordinator-discipline.ts +0 -325
- package/evals/scorers/index.test.ts +0 -146
- package/evals/scorers/index.ts +0 -328
- package/evals/scorers/outcome-scorers.evalite-test.ts +0 -27
- package/evals/scorers/outcome-scorers.ts +0 -349
- package/evals/swarm-decomposition.eval.ts +0 -121
- package/examples/commands/swarm.md +0 -745
- package/examples/plugin-wrapper-template.ts +0 -2515
- package/examples/skills/hive-workflow/SKILL.md +0 -212
- package/examples/skills/skill-creator/SKILL.md +0 -223
- package/examples/skills/swarm-coordination/SKILL.md +0 -292
- package/global-skills/cli-builder/SKILL.md +0 -344
- package/global-skills/cli-builder/references/advanced-patterns.md +0 -244
- package/global-skills/learning-systems/SKILL.md +0 -644
- package/global-skills/skill-creator/LICENSE.txt +0 -202
- package/global-skills/skill-creator/SKILL.md +0 -352
- package/global-skills/skill-creator/references/output-patterns.md +0 -82
- package/global-skills/skill-creator/references/workflows.md +0 -28
- package/global-skills/swarm-coordination/SKILL.md +0 -995
- package/global-skills/swarm-coordination/references/coordinator-patterns.md +0 -235
- package/global-skills/swarm-coordination/references/strategies.md +0 -138
- package/global-skills/system-design/SKILL.md +0 -213
- package/global-skills/testing-patterns/SKILL.md +0 -430
- package/global-skills/testing-patterns/references/dependency-breaking-catalog.md +0 -586
- package/opencode-swarm-plugin-0.30.7.tgz +0 -0
- package/opencode-swarm-plugin-0.31.0.tgz +0 -0
- package/scripts/cleanup-test-memories.ts +0 -346
- package/scripts/init-skill.ts +0 -222
- package/scripts/migrate-unknown-sessions.ts +0 -349
- package/scripts/validate-skill.ts +0 -204
- package/src/agent-mail.ts +0 -1724
- package/src/anti-patterns.test.ts +0 -1167
- package/src/anti-patterns.ts +0 -448
- package/src/compaction-capture.integration.test.ts +0 -257
- package/src/compaction-hook.test.ts +0 -838
- package/src/compaction-hook.ts +0 -1204
- package/src/compaction-observability.integration.test.ts +0 -139
- package/src/compaction-observability.test.ts +0 -187
- package/src/compaction-observability.ts +0 -324
- package/src/compaction-prompt-scorers.test.ts +0 -475
- package/src/compaction-prompt-scoring.ts +0 -300
- package/src/contributor-tools.test.ts +0 -133
- package/src/contributor-tools.ts +0 -201
- package/src/dashboard.test.ts +0 -611
- package/src/dashboard.ts +0 -462
- package/src/error-enrichment.test.ts +0 -403
- package/src/error-enrichment.ts +0 -219
- package/src/eval-capture.test.ts +0 -1015
- package/src/eval-capture.ts +0 -929
- package/src/eval-gates.test.ts +0 -306
- package/src/eval-gates.ts +0 -218
- package/src/eval-history.test.ts +0 -508
- package/src/eval-history.ts +0 -214
- package/src/eval-learning.test.ts +0 -378
- package/src/eval-learning.ts +0 -360
- package/src/eval-runner.test.ts +0 -223
- package/src/eval-runner.ts +0 -402
- package/src/export-tools.test.ts +0 -476
- package/src/export-tools.ts +0 -257
- package/src/hive.integration.test.ts +0 -2241
- package/src/hive.ts +0 -1628
- package/src/index.ts +0 -940
- package/src/learning.integration.test.ts +0 -1815
- package/src/learning.ts +0 -1079
- package/src/logger.test.ts +0 -189
- package/src/logger.ts +0 -135
- package/src/mandate-promotion.test.ts +0 -473
- package/src/mandate-promotion.ts +0 -239
- package/src/mandate-storage.integration.test.ts +0 -601
- package/src/mandate-storage.test.ts +0 -578
- package/src/mandate-storage.ts +0 -794
- package/src/mandates.ts +0 -540
- package/src/memory-tools.test.ts +0 -195
- package/src/memory-tools.ts +0 -344
- package/src/memory.integration.test.ts +0 -334
- package/src/memory.test.ts +0 -158
- package/src/memory.ts +0 -527
- package/src/model-selection.test.ts +0 -188
- package/src/model-selection.ts +0 -68
- package/src/observability-tools.test.ts +0 -359
- package/src/observability-tools.ts +0 -871
- package/src/output-guardrails.test.ts +0 -438
- package/src/output-guardrails.ts +0 -381
- package/src/pattern-maturity.test.ts +0 -1160
- package/src/pattern-maturity.ts +0 -525
- package/src/planning-guardrails.test.ts +0 -491
- package/src/planning-guardrails.ts +0 -438
- package/src/plugin.ts +0 -23
- package/src/post-compaction-tracker.test.ts +0 -251
- package/src/post-compaction-tracker.ts +0 -237
- package/src/query-tools.test.ts +0 -636
- package/src/query-tools.ts +0 -324
- package/src/rate-limiter.integration.test.ts +0 -466
- package/src/rate-limiter.ts +0 -774
- package/src/replay-tools.test.ts +0 -496
- package/src/replay-tools.ts +0 -240
- package/src/repo-crawl.integration.test.ts +0 -441
- package/src/repo-crawl.ts +0 -610
- package/src/schemas/cell-events.test.ts +0 -347
- package/src/schemas/cell-events.ts +0 -807
- package/src/schemas/cell.ts +0 -257
- package/src/schemas/evaluation.ts +0 -166
- package/src/schemas/index.test.ts +0 -199
- package/src/schemas/index.ts +0 -286
- package/src/schemas/mandate.ts +0 -232
- package/src/schemas/swarm-context.ts +0 -115
- package/src/schemas/task.ts +0 -161
- package/src/schemas/worker-handoff.test.ts +0 -302
- package/src/schemas/worker-handoff.ts +0 -131
- package/src/sessions/agent-discovery.test.ts +0 -137
- package/src/sessions/agent-discovery.ts +0 -112
- package/src/sessions/index.ts +0 -15
- package/src/skills.integration.test.ts +0 -1192
- package/src/skills.test.ts +0 -643
- package/src/skills.ts +0 -1549
- package/src/storage.integration.test.ts +0 -341
- package/src/storage.ts +0 -884
- package/src/structured.integration.test.ts +0 -817
- package/src/structured.test.ts +0 -1046
- package/src/structured.ts +0 -762
- package/src/swarm-decompose.test.ts +0 -188
- package/src/swarm-decompose.ts +0 -1302
- package/src/swarm-deferred.integration.test.ts +0 -157
- package/src/swarm-deferred.test.ts +0 -38
- package/src/swarm-insights.test.ts +0 -214
- package/src/swarm-insights.ts +0 -459
- package/src/swarm-mail.integration.test.ts +0 -970
- package/src/swarm-mail.ts +0 -739
- package/src/swarm-orchestrate.integration.test.ts +0 -282
- package/src/swarm-orchestrate.test.ts +0 -548
- package/src/swarm-orchestrate.ts +0 -3084
- package/src/swarm-prompts.test.ts +0 -1270
- package/src/swarm-prompts.ts +0 -2077
- package/src/swarm-research.integration.test.ts +0 -701
- package/src/swarm-research.test.ts +0 -698
- package/src/swarm-research.ts +0 -472
- package/src/swarm-review.integration.test.ts +0 -285
- package/src/swarm-review.test.ts +0 -879
- package/src/swarm-review.ts +0 -709
- package/src/swarm-strategies.ts +0 -407
- package/src/swarm-worktree.test.ts +0 -501
- package/src/swarm-worktree.ts +0 -575
- package/src/swarm.integration.test.ts +0 -2377
- package/src/swarm.ts +0 -38
- package/src/tool-adapter.integration.test.ts +0 -1221
- package/src/tool-availability.ts +0 -461
- package/tsconfig.json +0 -28
package/src/logger.test.ts
DELETED
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
import { describe, test, expect, beforeEach, afterEach } from "bun:test";
|
|
2
|
-
import { mkdir, rm, readdir } from "node:fs/promises";
|
|
3
|
-
import { existsSync } from "node:fs";
|
|
4
|
-
import { join } from "node:path";
|
|
5
|
-
import { homedir } from "node:os";
|
|
6
|
-
|
|
7
|
-
describe("Logger Infrastructure", () => {
|
|
8
|
-
const testLogDir = join(homedir(), ".config", "swarm-tools", "logs-test");
|
|
9
|
-
let originalEnv: string | undefined;
|
|
10
|
-
|
|
11
|
-
beforeEach(async () => {
|
|
12
|
-
// Clean up test log directory
|
|
13
|
-
if (existsSync(testLogDir)) {
|
|
14
|
-
await rm(testLogDir, { recursive: true, force: true });
|
|
15
|
-
}
|
|
16
|
-
await mkdir(testLogDir, { recursive: true });
|
|
17
|
-
originalEnv = process.env.SWARM_LOG_PRETTY;
|
|
18
|
-
|
|
19
|
-
// Clear module cache to reset logger instances
|
|
20
|
-
delete require.cache[require.resolve("./logger")];
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
afterEach(async () => {
|
|
24
|
-
// Restore environment
|
|
25
|
-
if (originalEnv !== undefined) {
|
|
26
|
-
process.env.SWARM_LOG_PRETTY = originalEnv;
|
|
27
|
-
} else {
|
|
28
|
-
delete process.env.SWARM_LOG_PRETTY;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// Clean up test directory
|
|
32
|
-
if (existsSync(testLogDir)) {
|
|
33
|
-
await rm(testLogDir, { recursive: true, force: true });
|
|
34
|
-
}
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
describe("getLogger", () => {
|
|
38
|
-
test("returns a valid Pino logger instance", async () => {
|
|
39
|
-
const { getLogger } = await import("./logger");
|
|
40
|
-
const logger = getLogger(testLogDir);
|
|
41
|
-
|
|
42
|
-
expect(logger).toBeDefined();
|
|
43
|
-
expect(typeof logger.info).toBe("function");
|
|
44
|
-
expect(typeof logger.error).toBe("function");
|
|
45
|
-
expect(typeof logger.debug).toBe("function");
|
|
46
|
-
expect(typeof logger.warn).toBe("function");
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
test("creates log directory if it doesn't exist", async () => {
|
|
50
|
-
const newDir = join(testLogDir, "nested", "path");
|
|
51
|
-
const { getLogger } = await import("./logger");
|
|
52
|
-
|
|
53
|
-
getLogger(newDir);
|
|
54
|
-
|
|
55
|
-
expect(existsSync(newDir)).toBe(true);
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
test("creates log file with numeric rotation pattern", async () => {
|
|
59
|
-
const { getLogger } = await import("./logger");
|
|
60
|
-
const logger = getLogger(testLogDir);
|
|
61
|
-
|
|
62
|
-
// Write a log to force file creation
|
|
63
|
-
logger.info("test message");
|
|
64
|
-
|
|
65
|
-
// Wait for async file creation (pino-roll is async)
|
|
66
|
-
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
67
|
-
|
|
68
|
-
const files = await readdir(testLogDir);
|
|
69
|
-
// pino-roll format: {filename}.{number}log (e.g., swarm.1log)
|
|
70
|
-
const logFile = files.find((f) => f.match(/^swarm\.\d+log$/));
|
|
71
|
-
|
|
72
|
-
expect(logFile).toBeDefined();
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
test("writes log entries to file", async () => {
|
|
76
|
-
const { getLogger } = await import("./logger");
|
|
77
|
-
const logger = getLogger(testLogDir);
|
|
78
|
-
|
|
79
|
-
logger.info("test log entry");
|
|
80
|
-
logger.error("test error entry");
|
|
81
|
-
|
|
82
|
-
// Wait for async file writes
|
|
83
|
-
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
84
|
-
|
|
85
|
-
const files = await readdir(testLogDir);
|
|
86
|
-
expect(files.length).toBeGreaterThan(0);
|
|
87
|
-
});
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
describe("createChildLogger", () => {
|
|
91
|
-
test("creates child logger with module namespace", async () => {
|
|
92
|
-
const { getLogger, createChildLogger } = await import("./logger");
|
|
93
|
-
getLogger(testLogDir); // Initialize main logger
|
|
94
|
-
|
|
95
|
-
const childLogger = createChildLogger("compaction", testLogDir);
|
|
96
|
-
|
|
97
|
-
expect(childLogger).toBeDefined();
|
|
98
|
-
expect(typeof childLogger.info).toBe("function");
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
test("child logger writes to module-specific file", async () => {
|
|
102
|
-
const { getLogger, createChildLogger } = await import("./logger");
|
|
103
|
-
getLogger(testLogDir);
|
|
104
|
-
|
|
105
|
-
const childLogger = createChildLogger("compaction", testLogDir);
|
|
106
|
-
childLogger.info("compaction test message");
|
|
107
|
-
|
|
108
|
-
// Wait for async file writes
|
|
109
|
-
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
110
|
-
|
|
111
|
-
const files = await readdir(testLogDir);
|
|
112
|
-
// pino-roll format: {module}.{number}log (e.g., compaction.1log)
|
|
113
|
-
const compactionLog = files.find((f) => f.match(/^compaction\.\d+log$/));
|
|
114
|
-
|
|
115
|
-
expect(compactionLog).toBeDefined();
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
test("multiple child loggers write to separate files", async () => {
|
|
119
|
-
const { getLogger, createChildLogger } = await import("./logger");
|
|
120
|
-
getLogger(testLogDir);
|
|
121
|
-
|
|
122
|
-
const compactionLogger = createChildLogger("compaction", testLogDir);
|
|
123
|
-
const cliLogger = createChildLogger("cli", testLogDir);
|
|
124
|
-
|
|
125
|
-
compactionLogger.info("compaction message");
|
|
126
|
-
cliLogger.info("cli message");
|
|
127
|
-
|
|
128
|
-
// Wait for async file writes
|
|
129
|
-
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
130
|
-
|
|
131
|
-
const files = await readdir(testLogDir);
|
|
132
|
-
// pino-roll format: {module}.{number}log
|
|
133
|
-
const compactionLog = files.find((f) => f.match(/^compaction\.\d+log$/));
|
|
134
|
-
const cliLog = files.find((f) => f.match(/^cli\.\d+log$/));
|
|
135
|
-
|
|
136
|
-
expect(compactionLog).toBeDefined();
|
|
137
|
-
expect(cliLog).toBeDefined();
|
|
138
|
-
});
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
describe("Pretty mode", () => {
|
|
142
|
-
test("respects SWARM_LOG_PRETTY=1 environment variable", async () => {
|
|
143
|
-
process.env.SWARM_LOG_PRETTY = "1";
|
|
144
|
-
|
|
145
|
-
// Force reimport to pick up env var
|
|
146
|
-
delete require.cache[require.resolve("./logger")];
|
|
147
|
-
const { getLogger } = await import("./logger");
|
|
148
|
-
|
|
149
|
-
const logger = getLogger(testLogDir);
|
|
150
|
-
|
|
151
|
-
// If pretty mode is enabled, logger should have prettyPrint config
|
|
152
|
-
// We can't easily inspect Pino internals, but we can verify it doesn't throw
|
|
153
|
-
expect(logger).toBeDefined();
|
|
154
|
-
expect(typeof logger.info).toBe("function");
|
|
155
|
-
|
|
156
|
-
logger.info("pretty test message");
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
test("works without pretty mode by default", async () => {
|
|
160
|
-
delete process.env.SWARM_LOG_PRETTY;
|
|
161
|
-
|
|
162
|
-
// Force reimport
|
|
163
|
-
delete require.cache[require.resolve("./logger")];
|
|
164
|
-
const { getLogger } = await import("./logger");
|
|
165
|
-
|
|
166
|
-
const logger = getLogger(testLogDir);
|
|
167
|
-
|
|
168
|
-
expect(logger).toBeDefined();
|
|
169
|
-
logger.info("normal mode message");
|
|
170
|
-
});
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
describe("Log rotation", () => {
|
|
174
|
-
test("sets up daily rotation with 14-day retention", async () => {
|
|
175
|
-
const { getLogger } = await import("./logger");
|
|
176
|
-
const logger = getLogger(testLogDir);
|
|
177
|
-
|
|
178
|
-
// Write logs to trigger rotation setup
|
|
179
|
-
logger.info("rotation test");
|
|
180
|
-
|
|
181
|
-
// Wait for async file creation
|
|
182
|
-
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
183
|
-
|
|
184
|
-
// Verify log file exists (rotation config is internal to pino-roll)
|
|
185
|
-
const files = await readdir(testLogDir);
|
|
186
|
-
expect(files.length).toBeGreaterThan(0);
|
|
187
|
-
});
|
|
188
|
-
});
|
|
189
|
-
});
|
package/src/logger.ts
DELETED
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Logger infrastructure using Pino with daily rotation
|
|
3
|
-
*
|
|
4
|
-
* Features:
|
|
5
|
-
* - Daily log rotation via pino-roll (numeric format: swarm.1log, swarm.2log, etc.)
|
|
6
|
-
* - 14-day retention (14 files max in addition to current file)
|
|
7
|
-
* - Module-specific child loggers with separate log files
|
|
8
|
-
* - Pretty mode for development (SWARM_LOG_PRETTY=1 env var)
|
|
9
|
-
* - Logs to ~/.config/swarm-tools/logs/ by default
|
|
10
|
-
*
|
|
11
|
-
* Note: pino-roll uses numeric rotation (e.g., swarm.1log, swarm.2log) not date-based names.
|
|
12
|
-
* Files rotate daily based on frequency='daily', with a maximum of 14 retained files.
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
import { mkdirSync, existsSync } from "node:fs";
|
|
16
|
-
import { join } from "node:path";
|
|
17
|
-
import { homedir } from "node:os";
|
|
18
|
-
import type { Logger } from "pino";
|
|
19
|
-
import pino from "pino";
|
|
20
|
-
|
|
21
|
-
const DEFAULT_LOG_DIR = join(homedir(), ".config", "swarm-tools", "logs");
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Creates the log directory if it doesn't exist
|
|
25
|
-
*/
|
|
26
|
-
function ensureLogDir(logDir: string): void {
|
|
27
|
-
if (!existsSync(logDir)) {
|
|
28
|
-
mkdirSync(logDir, { recursive: true });
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Creates a Pino transport with file rotation
|
|
34
|
-
*
|
|
35
|
-
* @param filename - Log file base name (e.g., "swarm" becomes swarm.1log, swarm.2log, etc.)
|
|
36
|
-
* @param logDir - Directory to store logs
|
|
37
|
-
*/
|
|
38
|
-
function createTransport(
|
|
39
|
-
filename: string,
|
|
40
|
-
logDir: string,
|
|
41
|
-
): pino.TransportTargetOptions {
|
|
42
|
-
const isPretty = process.env.SWARM_LOG_PRETTY === "1";
|
|
43
|
-
|
|
44
|
-
if (isPretty) {
|
|
45
|
-
// Pretty mode - output to console with pino-pretty
|
|
46
|
-
return {
|
|
47
|
-
target: "pino-pretty",
|
|
48
|
-
options: {
|
|
49
|
-
colorize: true,
|
|
50
|
-
translateTime: "HH:MM:ss",
|
|
51
|
-
ignore: "pid,hostname",
|
|
52
|
-
},
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
// Production mode - file rotation with pino-roll
|
|
57
|
-
// pino-roll format: {file}.{number}{extension}
|
|
58
|
-
// So "swarm" becomes "swarm.1log", "swarm.2log", etc.
|
|
59
|
-
return {
|
|
60
|
-
target: "pino-roll",
|
|
61
|
-
options: {
|
|
62
|
-
file: join(logDir, filename),
|
|
63
|
-
frequency: "daily",
|
|
64
|
-
extension: "log",
|
|
65
|
-
limit: { count: 14 },
|
|
66
|
-
mkdir: true,
|
|
67
|
-
},
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
const loggerCache = new Map<string, Logger>();
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Gets or creates the main logger instance
|
|
75
|
-
*
|
|
76
|
-
* @param logDir - Optional log directory (defaults to ~/.config/swarm-tools/logs)
|
|
77
|
-
* @returns Pino logger instance
|
|
78
|
-
*/
|
|
79
|
-
export function getLogger(logDir: string = DEFAULT_LOG_DIR): Logger {
|
|
80
|
-
const cacheKey = `swarm:${logDir}`;
|
|
81
|
-
|
|
82
|
-
if (loggerCache.has(cacheKey)) {
|
|
83
|
-
return loggerCache.get(cacheKey)!;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
ensureLogDir(logDir);
|
|
87
|
-
|
|
88
|
-
const logger = pino(
|
|
89
|
-
{
|
|
90
|
-
level: process.env.LOG_LEVEL || "info",
|
|
91
|
-
timestamp: pino.stdTimeFunctions.isoTime,
|
|
92
|
-
},
|
|
93
|
-
pino.transport(createTransport("swarm", logDir)),
|
|
94
|
-
);
|
|
95
|
-
|
|
96
|
-
loggerCache.set(cacheKey, logger);
|
|
97
|
-
return logger;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Creates a child logger for a specific module with its own log file
|
|
102
|
-
*
|
|
103
|
-
* @param module - Module name (e.g., "compaction", "cli")
|
|
104
|
-
* @param logDir - Optional log directory (defaults to ~/.config/swarm-tools/logs)
|
|
105
|
-
* @returns Child logger instance
|
|
106
|
-
*/
|
|
107
|
-
export function createChildLogger(
|
|
108
|
-
module: string,
|
|
109
|
-
logDir: string = DEFAULT_LOG_DIR,
|
|
110
|
-
): Logger {
|
|
111
|
-
const cacheKey = `${module}:${logDir}`;
|
|
112
|
-
|
|
113
|
-
if (loggerCache.has(cacheKey)) {
|
|
114
|
-
return loggerCache.get(cacheKey)!;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
ensureLogDir(logDir);
|
|
118
|
-
|
|
119
|
-
const childLogger = pino(
|
|
120
|
-
{
|
|
121
|
-
level: process.env.LOG_LEVEL || "info",
|
|
122
|
-
timestamp: pino.stdTimeFunctions.isoTime,
|
|
123
|
-
},
|
|
124
|
-
pino.transport(createTransport(module, logDir)),
|
|
125
|
-
);
|
|
126
|
-
|
|
127
|
-
const logger = childLogger.child({ module });
|
|
128
|
-
loggerCache.set(cacheKey, logger);
|
|
129
|
-
return logger;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* Default logger instance for immediate use
|
|
134
|
-
*/
|
|
135
|
-
export const logger = getLogger();
|