memory-journal-mcp 6.1.2 → 6.2.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/README.md +44 -28
- package/dist/{chunk-X4SWFATC.js → chunk-BI4ZNSKA.js} +38 -24
- package/dist/{chunk-HCEWINSB.js → chunk-N6EBIDN7.js} +99 -102
- package/dist/cli.js +2 -2
- package/dist/index.js +2 -2
- package/dist/tools-WPRY5MJ6.js +2 -0
- package/package.json +10 -1
- package/skills/github-commander/SKILL.md +151 -0
- package/skills/github-commander/config/project-config.example.md +125 -0
- package/skills/github-commander/workflows/code-quality-audit.md +80 -0
- package/skills/github-commander/workflows/full-audit.md +134 -0
- package/skills/github-commander/workflows/issue-triage.md +239 -0
- package/skills/github-commander/workflows/milestone-sprint.md +81 -0
- package/skills/github-commander/workflows/perf-audit.md +142 -0
- package/skills/github-commander/workflows/pr-review.md +123 -0
- package/skills/github-commander/workflows/security-audit.md +170 -0
- package/skills/github-commander/workflows/update-deps.md +109 -0
- package/.dockerignore +0 -139
- package/.gitattributes +0 -20
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -95
- package/.github/ISSUE_TEMPLATE/config.yml +0 -11
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -110
- package/.github/ISSUE_TEMPLATE/question.md +0 -78
- package/.github/aw/actions-lock.json +0 -14
- package/.github/copilot-instructions.md +0 -122
- package/.github/dependabot.yml +0 -93
- package/.github/pull_request_template.md +0 -135
- package/.github/workflows/README.md +0 -133
- package/.github/workflows/agentics-maintenance.yml +0 -141
- package/.github/workflows/auto-release.yml +0 -68
- package/.github/workflows/ci-health-monitor.lock.yml +0 -1121
- package/.github/workflows/ci-health-monitor.md +0 -87
- package/.github/workflows/codeql.yml +0 -41
- package/.github/workflows/dependabot-auto-merge.yml +0 -42
- package/.github/workflows/dependency-maintenance.lock.yml +0 -1182
- package/.github/workflows/dependency-maintenance.md +0 -147
- package/.github/workflows/docker-publish.yml +0 -254
- package/.github/workflows/docs-drift-detector.lock.yml +0 -1142
- package/.github/workflows/docs-drift-detector.md +0 -115
- package/.github/workflows/lint-and-test.yml +0 -60
- package/.github/workflows/publish-npm.yml +0 -85
- package/.github/workflows/secrets-scanning.yml +0 -32
- package/.github/workflows/security-update.yml +0 -127
- package/.gitleaks.toml +0 -9
- package/.prettierignore +0 -21
- package/.prettierrc +0 -33
- package/.scout-ignore +0 -12
- package/.trivyignore +0 -21
- package/CHANGELOG.md +0 -1814
- package/CODE_OF_CONDUCT.md +0 -133
- package/CONTRIBUTING.md +0 -263
- package/DOCKER_README.md +0 -331
- package/Dockerfile +0 -128
- package/SECURITY.md +0 -227
- package/UNRELEASED.md +0 -1
- package/dist/tools-T4U5A3X4.js +0 -2
- package/docker-compose.yml +0 -71
- package/docs/README.md +0 -18
- package/docs/agentic-journal-synergy.md +0 -175
- package/docs/copilot-setup.md +0 -72
- package/eslint.config.js +0 -110
- package/mcp-config-example.json +0 -21
- package/playwright.config.ts +0 -35
- package/releases/v2.1.0.md +0 -220
- package/releases/v2.2.0.md +0 -168
- package/releases/v3.0.0.md +0 -237
- package/releases/v3.1.0.md +0 -104
- package/releases/v3.1.1.md +0 -42
- package/releases/v3.1.2.md +0 -40
- package/releases/v3.1.3.md +0 -64
- package/releases/v3.1.4.md +0 -32
- package/releases/v3.1.5.md +0 -44
- package/releases/v4.0.0.md +0 -71
- package/releases/v4.1.0.md +0 -88
- package/releases/v4.2.0.md +0 -90
- package/releases/v4.3.0.md +0 -92
- package/releases/v4.3.1.md +0 -69
- package/releases/v4.4.0.md +0 -120
- package/releases/v4.4.1.md +0 -33
- package/releases/v4.4.2.md +0 -31
- package/releases/v4.5.0.md +0 -116
- package/releases/v5.0.0.md +0 -105
- package/releases/v5.0.1.md +0 -25
- package/releases/v5.1.0.md +0 -83
- package/releases/v5.1.1.md +0 -10
- package/releases/v6.0.0.md +0 -48
- package/releases/v6.0.1.md +0 -36
- package/releases/v6.1.0.md +0 -68
- package/releases/v6.1.1.md +0 -30
- package/releases/v6.1.2.md +0 -23
- package/scripts/generate-server-instructions.ts +0 -306
- package/scripts/server-instructions-function-body.ts +0 -107
- package/scripts/server-instructions-gotchas.ts +0 -45
- package/server.json +0 -42
- package/social-preview.png +0 -0
- package/src/auth/auth-context.ts +0 -78
- package/src/auth/authorization-server-discovery.ts +0 -263
- package/src/auth/errors.ts +0 -215
- package/src/auth/index.ts +0 -58
- package/src/auth/middleware.ts +0 -392
- package/src/auth/oauth-resource-server.ts +0 -170
- package/src/auth/scope-map.ts +0 -46
- package/src/auth/scopes.ts +0 -256
- package/src/auth/token-validator.ts +0 -293
- package/src/auth/transport-agnostic.ts +0 -164
- package/src/auth/types.ts +0 -372
- package/src/cli.ts +0 -279
- package/src/codemode/api-constants.ts +0 -263
- package/src/codemode/api.ts +0 -302
- package/src/codemode/auto-return.ts +0 -65
- package/src/codemode/index.ts +0 -47
- package/src/codemode/sandbox-factory.ts +0 -144
- package/src/codemode/sandbox.ts +0 -220
- package/src/codemode/security.ts +0 -155
- package/src/codemode/types.ts +0 -228
- package/src/codemode/worker-sandbox.ts +0 -277
- package/src/codemode/worker-script.ts +0 -239
- package/src/constants/icons.ts +0 -183
- package/src/constants/server-instructions.md +0 -166
- package/src/constants/server-instructions.ts +0 -514
- package/src/database/adapter-factory.ts +0 -16
- package/src/database/core/entry-columns.ts +0 -10
- package/src/database/core/interfaces.ts +0 -188
- package/src/database/core/schema.ts +0 -152
- package/src/database/sqlite-adapter/backup.ts +0 -167
- package/src/database/sqlite-adapter/entries/crud.ts +0 -233
- package/src/database/sqlite-adapter/entries/importance.ts +0 -76
- package/src/database/sqlite-adapter/entries/index.ts +0 -142
- package/src/database/sqlite-adapter/entries/search.ts +0 -294
- package/src/database/sqlite-adapter/entries/shared.ts +0 -102
- package/src/database/sqlite-adapter/entries/statistics.ts +0 -162
- package/src/database/sqlite-adapter/index.ts +0 -265
- package/src/database/sqlite-adapter/native-connection.ts +0 -301
- package/src/database/sqlite-adapter/relationships.ts +0 -70
- package/src/database/sqlite-adapter/tags.ts +0 -182
- package/src/filtering/tool-filter.ts +0 -312
- package/src/github/github-integration/client.ts +0 -114
- package/src/github/github-integration/index.ts +0 -297
- package/src/github/github-integration/insights.ts +0 -155
- package/src/github/github-integration/issues.ts +0 -213
- package/src/github/github-integration/milestones.ts +0 -262
- package/src/github/github-integration/projects.ts +0 -414
- package/src/github/github-integration/pull-requests.ts +0 -235
- package/src/github/github-integration/repository.ts +0 -110
- package/src/github/github-integration/types.ts +0 -43
- package/src/handlers/prompts/github.ts +0 -210
- package/src/handlers/prompts/index.ts +0 -97
- package/src/handlers/prompts/workflow.ts +0 -361
- package/src/handlers/resources/core/briefing/context-section.ts +0 -182
- package/src/handlers/resources/core/briefing/github-section.ts +0 -354
- package/src/handlers/resources/core/briefing/index.ts +0 -106
- package/src/handlers/resources/core/briefing/user-message.ts +0 -114
- package/src/handlers/resources/core/health.ts +0 -75
- package/src/handlers/resources/core/index.ts +0 -31
- package/src/handlers/resources/core/instructions.ts +0 -45
- package/src/handlers/resources/core/utilities.ts +0 -310
- package/src/handlers/resources/github.ts +0 -340
- package/src/handlers/resources/graph.ts +0 -218
- package/src/handlers/resources/help.ts +0 -410
- package/src/handlers/resources/index.ts +0 -143
- package/src/handlers/resources/shared.ts +0 -219
- package/src/handlers/resources/team.ts +0 -134
- package/src/handlers/resources/templates.ts +0 -334
- package/src/handlers/tools/admin.ts +0 -351
- package/src/handlers/tools/analytics.ts +0 -346
- package/src/handlers/tools/backup.ts +0 -272
- package/src/handlers/tools/codemode.ts +0 -188
- package/src/handlers/tools/core.ts +0 -359
- package/src/handlers/tools/error-fields-mixin.ts +0 -10
- package/src/handlers/tools/export.ts +0 -150
- package/src/handlers/tools/github/copilot-tools.ts +0 -72
- package/src/handlers/tools/github/helpers.ts +0 -125
- package/src/handlers/tools/github/insights-tools.ts +0 -112
- package/src/handlers/tools/github/issue-tools.ts +0 -442
- package/src/handlers/tools/github/kanban-tools.ts +0 -153
- package/src/handlers/tools/github/milestone-tools.ts +0 -371
- package/src/handlers/tools/github/mutation-tools.ts +0 -17
- package/src/handlers/tools/github/read-tools.ts +0 -302
- package/src/handlers/tools/github/schemas.ts +0 -435
- package/src/handlers/tools/github.ts +0 -39
- package/src/handlers/tools/index.ts +0 -255
- package/src/handlers/tools/relationships.ts +0 -390
- package/src/handlers/tools/schemas.ts +0 -165
- package/src/handlers/tools/search.ts +0 -448
- package/src/handlers/tools/team/admin-tools.ts +0 -164
- package/src/handlers/tools/team/analytics-tools.ts +0 -233
- package/src/handlers/tools/team/backup-tools.ts +0 -83
- package/src/handlers/tools/team/core-tools.ts +0 -197
- package/src/handlers/tools/team/export-tools.ts +0 -130
- package/src/handlers/tools/team/helpers.ts +0 -66
- package/src/handlers/tools/team/index.ts +0 -45
- package/src/handlers/tools/team/relationship-tools.ts +0 -219
- package/src/handlers/tools/team/schemas.ts +0 -558
- package/src/handlers/tools/team/search-tools.ts +0 -145
- package/src/handlers/tools/team/vector-tools.ts +0 -261
- package/src/index.ts +0 -57
- package/src/server/mcp-server.ts +0 -446
- package/src/server/registration.ts +0 -141
- package/src/server/scheduler.ts +0 -283
- package/src/transports/http/handlers.ts +0 -78
- package/src/transports/http/index.ts +0 -8
- package/src/transports/http/security.ts +0 -147
- package/src/transports/http/server/index.ts +0 -397
- package/src/transports/http/server/legacy-sse.ts +0 -87
- package/src/transports/http/server/stateful.ts +0 -222
- package/src/transports/http/server/stateless.ts +0 -42
- package/src/transports/http/types.ts +0 -132
- package/src/types/entities.ts +0 -145
- package/src/types/error-types.ts +0 -92
- package/src/types/errors.ts +0 -200
- package/src/types/filtering.ts +0 -55
- package/src/types/github.ts +0 -216
- package/src/types/index.ts +0 -348
- package/src/utils/error-helpers.ts +0 -78
- package/src/utils/errors/error-response-fields.ts +0 -29
- package/src/utils/errors/suggestions.ts +0 -94
- package/src/utils/github-helpers.ts +0 -33
- package/src/utils/logger.ts +0 -107
- package/src/utils/mcp-logger.ts +0 -155
- package/src/utils/progress-utils.ts +0 -100
- package/src/utils/query-helpers.ts +0 -78
- package/src/utils/resource-annotations.ts +0 -75
- package/src/utils/security-utils.ts +0 -198
- package/src/utils/vector-index-helpers.ts +0 -24
- package/src/vector/vector-search-manager.ts +0 -409
- package/src/version.ts +0 -15
- package/test-server/README.md +0 -193
- package/test-server/code-map.md +0 -399
- package/test-server/test-agent-experience.md +0 -213
- package/test-server/test-filter-instructions.mjs +0 -295
- package/test-server/test-instruction-levels.mjs +0 -102
- package/test-server/test-preflight.md +0 -55
- package/test-server/test-prompts.mjs +0 -185
- package/test-server/test-scheduler.mjs +0 -174
- package/test-server/test-tool-annotations.mjs +0 -115
- package/test-server/test-tools-codemode.md +0 -632
- package/test-server/test-tools-codemode2.md +0 -1218
- package/test-server/test-tools-team.md +0 -215
- package/test-server/test-tools.md +0 -429
- package/test-server/test-tools2.md +0 -361
- package/test-server/test-tools3.md +0 -396
- package/test-server/tool-reference.md +0 -231
- package/tests/README.md +0 -54
- package/tests/auth/auth-context.test.ts +0 -162
- package/tests/auth/authorization-server-discovery.test.ts +0 -265
- package/tests/auth/errors.test.ts +0 -170
- package/tests/auth/middleware.test.ts +0 -585
- package/tests/auth/oauth-resource-server.test.ts +0 -173
- package/tests/auth/scope-map.test.ts +0 -66
- package/tests/auth/scopes.test.ts +0 -347
- package/tests/auth/token-validator.test.ts +0 -271
- package/tests/codemode/api.test.ts +0 -396
- package/tests/codemode/auto-return.test.ts +0 -167
- package/tests/codemode/codemode-tool-handlers.test.ts +0 -197
- package/tests/codemode/sandbox-factory.test.ts +0 -152
- package/tests/codemode/sandbox.test.ts +0 -190
- package/tests/codemode/security.test.ts +0 -242
- package/tests/codemode/worker-sandbox.test.ts +0 -106
- package/tests/constants/icons.test.ts +0 -101
- package/tests/constants/server-instructions.test.ts +0 -514
- package/tests/database/crud-workflow-branches.test.ts +0 -418
- package/tests/database/database-branches.test.ts +0 -132
- package/tests/database/entries-auth-branches.test.ts +0 -390
- package/tests/database/native-connection.test.ts +0 -249
- package/tests/database/shared-helpers.test.ts +0 -103
- package/tests/database/sqlite-adapter.bench.ts +0 -63
- package/tests/database/sqlite-adapter.test.ts +0 -690
- package/tests/database/tags.test.ts +0 -134
- package/tests/e2e/README.md +0 -39
- package/tests/e2e/auth.spec.ts +0 -106
- package/tests/e2e/codemode-abuse.spec.ts +0 -75
- package/tests/e2e/health.spec.ts +0 -63
- package/tests/e2e/helpers.ts +0 -139
- package/tests/e2e/oauth-discovery.spec.ts +0 -102
- package/tests/e2e/oauth-scopes.spec.ts +0 -222
- package/tests/e2e/payloads-admin.spec.ts +0 -76
- package/tests/e2e/payloads-analytics.spec.ts +0 -37
- package/tests/e2e/payloads-backup-restore.spec.ts +0 -102
- package/tests/e2e/payloads-backup.spec.ts +0 -44
- package/tests/e2e/payloads-codemode-api.spec.ts +0 -131
- package/tests/e2e/payloads-codemode-readonly.spec.ts +0 -116
- package/tests/e2e/payloads-codemode.spec.ts +0 -116
- package/tests/e2e/payloads-core.spec.ts +0 -82
- package/tests/e2e/payloads-error-contracts.spec.ts +0 -159
- package/tests/e2e/payloads-export.spec.ts +0 -46
- package/tests/e2e/payloads-github-degradation.spec.ts +0 -73
- package/tests/e2e/payloads-github.spec.ts +0 -176
- package/tests/e2e/payloads-relationships.spec.ts +0 -56
- package/tests/e2e/payloads-search.spec.ts +0 -64
- package/tests/e2e/payloads-team-happy.spec.ts +0 -231
- package/tests/e2e/payloads-team.spec.ts +0 -174
- package/tests/e2e/prompts-expanded.spec.ts +0 -137
- package/tests/e2e/prompts.spec.ts +0 -62
- package/tests/e2e/protocols.spec.ts +0 -134
- package/tests/e2e/rate-limiting.spec.ts +0 -291
- package/tests/e2e/resources-briefing-env.spec.ts +0 -106
- package/tests/e2e/resources-complete.spec.ts +0 -180
- package/tests/e2e/resources-expanded.spec.ts +0 -83
- package/tests/e2e/resources-instructions-levels.spec.ts +0 -145
- package/tests/e2e/resources-templates.spec.ts +0 -123
- package/tests/e2e/resources.spec.ts +0 -103
- package/tests/e2e/scheduler.spec.ts +0 -79
- package/tests/e2e/security.spec.ts +0 -112
- package/tests/e2e/session-advanced.spec.ts +0 -152
- package/tests/e2e/sessions.spec.ts +0 -95
- package/tests/e2e/stateless.spec.ts +0 -79
- package/tests/e2e/streaming.spec.ts +0 -176
- package/tests/e2e/tool-filtering-presets.spec.ts +0 -192
- package/tests/e2e/tool-filtering.spec.ts +0 -77
- package/tests/e2e/tools.spec.ts +0 -111
- package/tests/filtering/tool-filter.test.ts +0 -314
- package/tests/github/client-issues-errors.test.ts +0 -433
- package/tests/github/github-integration-branches.test.ts +0 -490
- package/tests/github/github-integration.test.ts +0 -1015
- package/tests/github/github-managers-branches.test.ts +0 -907
- package/tests/github/pull-requests.test.ts +0 -334
- package/tests/handlers/analytics-branches.test.ts +0 -222
- package/tests/handlers/backup-branches.test.ts +0 -270
- package/tests/handlers/briefing-context-section.test.ts +0 -388
- package/tests/handlers/briefing-github-section.test.ts +0 -392
- package/tests/handlers/briefing-user-message.test.ts +0 -405
- package/tests/handlers/codemode-tools.test.ts +0 -85
- package/tests/handlers/copilot-tools.test.ts +0 -126
- package/tests/handlers/error-path-coverage.test.ts +0 -324
- package/tests/handlers/export-tools.test.ts +0 -203
- package/tests/handlers/github-resource-handlers.test.ts +0 -929
- package/tests/handlers/github-tool-handlers.test.ts +0 -1452
- package/tests/handlers/handler-error-branches.test.ts +0 -346
- package/tests/handlers/help-resource.test.ts +0 -92
- package/tests/handlers/prompt-handler-coverage.test.ts +0 -108
- package/tests/handlers/prompt-handlers.test.ts +0 -131
- package/tests/handlers/resource-handler-coverage.test.ts +0 -281
- package/tests/handlers/resource-handlers.test.ts +0 -357
- package/tests/handlers/resource-prompt-branches.test.ts +0 -495
- package/tests/handlers/search-tool-handlers.test.ts +0 -379
- package/tests/handlers/targeted-gap-closure.test.ts +0 -387
- package/tests/handlers/team-admin.test.ts +0 -291
- package/tests/handlers/team-analytics.test.ts +0 -220
- package/tests/handlers/team-core.test.ts +0 -148
- package/tests/handlers/team-data.test.ts +0 -198
- package/tests/handlers/team-relationships.test.ts +0 -271
- package/tests/handlers/team-resource-handlers.test.ts +0 -161
- package/tests/handlers/team-search.test.ts +0 -134
- package/tests/handlers/team-tool-handlers.test.ts +0 -301
- package/tests/handlers/team-vector.test.ts +0 -213
- package/tests/handlers/template-github-branches.test.ts +0 -676
- package/tests/handlers/tool-annotations.test.ts +0 -90
- package/tests/handlers/tool-handler-coverage.test.ts +0 -514
- package/tests/handlers/tool-handlers.test.ts +0 -510
- package/tests/handlers/tool-output-schemas.test.ts +0 -116
- package/tests/handlers/vector-tool-handlers.test.ts +0 -238
- package/tests/security/sql-injection.test.ts +0 -284
- package/tests/server/mcp-server.bench.ts +0 -55
- package/tests/server/mcp-server.test.ts +0 -1326
- package/tests/server/scheduler.test.ts +0 -400
- package/tests/transports/http-legacy-sse.test.ts +0 -275
- package/tests/transports/http-security.test.ts +0 -322
- package/tests/transports/http-stateful.test.ts +0 -487
- package/tests/transports/http-transport-server.test.ts +0 -301
- package/tests/transports/http-transport.test.ts +0 -771
- package/tests/utils/github-helpers.test.ts +0 -58
- package/tests/utils/logger.test.ts +0 -180
- package/tests/utils/mcp-logger.test.ts +0 -211
- package/tests/utils/progress-utils.test.ts +0 -156
- package/tests/utils/query-helpers.test.ts +0 -80
- package/tests/utils/security-utils.test.ts +0 -82
- package/tests/vector/vector-search-branches.test.ts +0 -111
- package/tests/vector/vector-search-manager.test.ts +0 -375
- package/tests/vector/vector-search.bench.ts +0 -48
- package/tsconfig.json +0 -42
- package/tsup.config.ts +0 -19
- package/vitest.config.ts +0 -25
|
@@ -1,361 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Memory Journal MCP Server - Workflow Prompt Definitions
|
|
3
|
-
*
|
|
4
|
-
* Prompts: find-related, prepare-standup, prepare-retro, weekly-digest,
|
|
5
|
-
* analyze-period, goal-tracker, get-context-bundle, get-recent-entries, confirm-briefing,
|
|
6
|
-
* session-summary
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import type { IDatabaseAdapter } from '../../database/core/interfaces.js'
|
|
10
|
-
import { RAW_ENTRY_COLUMNS as ENTRY_COLUMNS } from '../../database/core/entry-columns.js'
|
|
11
|
-
import { ICON_PROMPT } from '../../constants/icons.js'
|
|
12
|
-
import { execQuery, type InternalPromptDef } from './index.js'
|
|
13
|
-
|
|
14
|
-
/** Milliseconds in one day */
|
|
15
|
-
const MS_PER_DAY = 86_400_000
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Get workflow prompt definitions
|
|
19
|
-
*/
|
|
20
|
-
export function getWorkflowPromptDefinitions(): InternalPromptDef[] {
|
|
21
|
-
return [
|
|
22
|
-
{
|
|
23
|
-
name: 'find-related',
|
|
24
|
-
description: 'Discover connected entries via semantic similarity',
|
|
25
|
-
icons: [ICON_PROMPT],
|
|
26
|
-
arguments: [
|
|
27
|
-
{
|
|
28
|
-
name: 'query',
|
|
29
|
-
description: 'Search query for finding related entries',
|
|
30
|
-
required: true,
|
|
31
|
-
},
|
|
32
|
-
],
|
|
33
|
-
handler: (args: Record<string, string>, db: IDatabaseAdapter) => {
|
|
34
|
-
const query = args['query'] ?? ''
|
|
35
|
-
const entries = db.searchEntries(query, { limit: 5 })
|
|
36
|
-
|
|
37
|
-
return {
|
|
38
|
-
messages: [
|
|
39
|
-
{
|
|
40
|
-
role: 'user',
|
|
41
|
-
content: {
|
|
42
|
-
type: 'text',
|
|
43
|
-
text: `Find entries related to: "${query}"\n\nRecent matching entries:\n${entries.map((e) => `- [${String(e.id)}] ${e.content.slice(0, 100)}...`).join('\n')}`,
|
|
44
|
-
},
|
|
45
|
-
},
|
|
46
|
-
],
|
|
47
|
-
}
|
|
48
|
-
},
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
name: 'prepare-standup',
|
|
52
|
-
description: 'Daily standup summaries',
|
|
53
|
-
icons: [ICON_PROMPT],
|
|
54
|
-
arguments: [],
|
|
55
|
-
handler: (_args: Record<string, string>, db: IDatabaseAdapter) => {
|
|
56
|
-
const today = new Date().toISOString().split('T')[0] ?? ''
|
|
57
|
-
const yesterday =
|
|
58
|
-
new Date(Date.now() - MS_PER_DAY).toISOString().split('T')[0] ?? ''
|
|
59
|
-
|
|
60
|
-
const entries = db.searchByDateRange(yesterday, today)
|
|
61
|
-
|
|
62
|
-
return {
|
|
63
|
-
messages: [
|
|
64
|
-
{
|
|
65
|
-
role: 'user',
|
|
66
|
-
content: {
|
|
67
|
-
type: 'text',
|
|
68
|
-
text: `Prepare a standup summary based on these recent entries:\n\n${entries.map((e) => `[${e.timestamp}] ${e.entryType}: ${e.content}`).join('\n\n')}\n\nFormat as:\n- Yesterday: <summary>\n- Today: <planned work>\n- Blockers: <any blockers>`,
|
|
69
|
-
},
|
|
70
|
-
},
|
|
71
|
-
],
|
|
72
|
-
}
|
|
73
|
-
},
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
name: 'prepare-retro',
|
|
77
|
-
description: 'Sprint retrospectives',
|
|
78
|
-
icons: [ICON_PROMPT],
|
|
79
|
-
arguments: [
|
|
80
|
-
{
|
|
81
|
-
name: 'days',
|
|
82
|
-
description: 'Number of days to include (default: 14)',
|
|
83
|
-
required: false,
|
|
84
|
-
},
|
|
85
|
-
],
|
|
86
|
-
handler: (args: Record<string, string>, db: IDatabaseAdapter) => {
|
|
87
|
-
const days = parseInt(args['days'] ?? '14', 10)
|
|
88
|
-
const endDate = new Date().toISOString().split('T')[0] ?? ''
|
|
89
|
-
const startDate =
|
|
90
|
-
new Date(Date.now() - days * MS_PER_DAY).toISOString().split('T')[0] ?? ''
|
|
91
|
-
|
|
92
|
-
const entries = db.searchByDateRange(startDate, endDate)
|
|
93
|
-
|
|
94
|
-
return {
|
|
95
|
-
messages: [
|
|
96
|
-
{
|
|
97
|
-
role: 'user',
|
|
98
|
-
content: {
|
|
99
|
-
type: 'text',
|
|
100
|
-
text: `Prepare a retrospective for the last ${String(days)} days based on these entries:\n\n${entries
|
|
101
|
-
.slice(0, 20)
|
|
102
|
-
.map(
|
|
103
|
-
(e) =>
|
|
104
|
-
`[${e.timestamp}] ${e.entryType}: ${e.content.slice(0, 200)}`
|
|
105
|
-
)
|
|
106
|
-
.join(
|
|
107
|
-
'\n\n'
|
|
108
|
-
)}\n\nFormat as:\n- What went well\n- What could improve\n- Action items`,
|
|
109
|
-
},
|
|
110
|
-
},
|
|
111
|
-
],
|
|
112
|
-
}
|
|
113
|
-
},
|
|
114
|
-
},
|
|
115
|
-
{
|
|
116
|
-
name: 'weekly-digest',
|
|
117
|
-
description: 'Day-by-day weekly summaries',
|
|
118
|
-
icons: [ICON_PROMPT],
|
|
119
|
-
arguments: [],
|
|
120
|
-
handler: (_args: Record<string, string>, db: IDatabaseAdapter) => {
|
|
121
|
-
const endDate = new Date().toISOString().split('T')[0] ?? ''
|
|
122
|
-
const startDate =
|
|
123
|
-
new Date(Date.now() - 7 * MS_PER_DAY).toISOString().split('T')[0] ?? ''
|
|
124
|
-
|
|
125
|
-
const entries = db.searchByDateRange(startDate, endDate)
|
|
126
|
-
|
|
127
|
-
return {
|
|
128
|
-
messages: [
|
|
129
|
-
{
|
|
130
|
-
role: 'user',
|
|
131
|
-
content: {
|
|
132
|
-
type: 'text',
|
|
133
|
-
text: `Create a weekly digest from these entries:\n\n${entries.map((e) => `[${e.timestamp}] ${e.entryType}: ${e.content.slice(0, 150)}`).join('\n\n')}\n\nFormat as day-by-day summary with highlights.`,
|
|
134
|
-
},
|
|
135
|
-
},
|
|
136
|
-
],
|
|
137
|
-
}
|
|
138
|
-
},
|
|
139
|
-
},
|
|
140
|
-
{
|
|
141
|
-
name: 'analyze-period',
|
|
142
|
-
description: 'Deep period analysis with insights',
|
|
143
|
-
icons: [ICON_PROMPT],
|
|
144
|
-
arguments: [
|
|
145
|
-
{ name: 'start_date', description: 'Start date (YYYY-MM-DD)', required: true },
|
|
146
|
-
{ name: 'end_date', description: 'End date (YYYY-MM-DD)', required: true },
|
|
147
|
-
],
|
|
148
|
-
handler: (args: Record<string, string>, db: IDatabaseAdapter) => {
|
|
149
|
-
const startDate = args['start_date'] ?? ''
|
|
150
|
-
const endDate = args['end_date'] ?? ''
|
|
151
|
-
|
|
152
|
-
const entries = db.searchByDateRange(startDate, endDate)
|
|
153
|
-
const stats = db.getStatistics('day')
|
|
154
|
-
|
|
155
|
-
return {
|
|
156
|
-
messages: [
|
|
157
|
-
{
|
|
158
|
-
role: 'user',
|
|
159
|
-
content: {
|
|
160
|
-
type: 'text',
|
|
161
|
-
text: `Analyze the period ${startDate} to ${endDate}:\n\nStatistics: ${JSON.stringify(stats, null, 2)}\n\nEntries (${String(entries.length)} total):\n${entries
|
|
162
|
-
.slice(0, 15)
|
|
163
|
-
.map(
|
|
164
|
-
(e) =>
|
|
165
|
-
`[${e.timestamp}] ${e.entryType}: ${e.content.slice(0, 100)}`
|
|
166
|
-
)
|
|
167
|
-
.join(
|
|
168
|
-
'\n'
|
|
169
|
-
)}\n\nProvide insights on patterns, productivity, and recommendations.`,
|
|
170
|
-
},
|
|
171
|
-
},
|
|
172
|
-
],
|
|
173
|
-
}
|
|
174
|
-
},
|
|
175
|
-
},
|
|
176
|
-
{
|
|
177
|
-
name: 'goal-tracker',
|
|
178
|
-
description: 'Milestone and achievement tracking',
|
|
179
|
-
icons: [ICON_PROMPT],
|
|
180
|
-
arguments: [],
|
|
181
|
-
handler: (_args: Record<string, string>, db: IDatabaseAdapter) => {
|
|
182
|
-
const entries = execQuery(
|
|
183
|
-
db,
|
|
184
|
-
`
|
|
185
|
-
SELECT ${ENTRY_COLUMNS} FROM memory_journal
|
|
186
|
-
WHERE significance_type IS NOT NULL
|
|
187
|
-
AND deleted_at IS NULL
|
|
188
|
-
ORDER BY timestamp DESC
|
|
189
|
-
LIMIT 20
|
|
190
|
-
`
|
|
191
|
-
)
|
|
192
|
-
|
|
193
|
-
return {
|
|
194
|
-
messages: [
|
|
195
|
-
{
|
|
196
|
-
role: 'user',
|
|
197
|
-
content: {
|
|
198
|
-
type: 'text',
|
|
199
|
-
text: `Track goals and milestones based on significant entries:\n\n${JSON.stringify(entries, null, 2)}\n\nSummarize progress toward goals and highlight achievements.`,
|
|
200
|
-
},
|
|
201
|
-
},
|
|
202
|
-
],
|
|
203
|
-
}
|
|
204
|
-
},
|
|
205
|
-
},
|
|
206
|
-
{
|
|
207
|
-
name: 'get-context-bundle',
|
|
208
|
-
description: 'Project context with recent entries, statistics, and GitHub status hints',
|
|
209
|
-
icons: [ICON_PROMPT],
|
|
210
|
-
arguments: [],
|
|
211
|
-
handler: (_args: Record<string, string>, db: IDatabaseAdapter) => {
|
|
212
|
-
const recent = db.getRecentEntries(5)
|
|
213
|
-
const stats = db.getStatistics('week')
|
|
214
|
-
|
|
215
|
-
const entrySummaries = recent.map((e) => ({
|
|
216
|
-
id: e.id,
|
|
217
|
-
type: e.entryType,
|
|
218
|
-
timestamp: e.timestamp,
|
|
219
|
-
preview: e.content.slice(0, 60) + (e.content.length > 60 ? '...' : ''),
|
|
220
|
-
}))
|
|
221
|
-
|
|
222
|
-
return {
|
|
223
|
-
messages: [
|
|
224
|
-
{
|
|
225
|
-
role: 'user',
|
|
226
|
-
content: {
|
|
227
|
-
type: 'text',
|
|
228
|
-
text: `Project context bundle:
|
|
229
|
-
|
|
230
|
-
**Recent Entries (${String(recent.length)}):**
|
|
231
|
-
${entrySummaries.map((e) => `- #${String(e.id)} (${e.type}) ${e.preview}`).join('\n')}
|
|
232
|
-
|
|
233
|
-
**Statistics:** ${JSON.stringify(stats)}
|
|
234
|
-
|
|
235
|
-
**For full GitHub status:** Fetch \`memory://github/status\`
|
|
236
|
-
**For full entry details:** Use \`get_entry_by_id\` with entry ID`,
|
|
237
|
-
},
|
|
238
|
-
},
|
|
239
|
-
],
|
|
240
|
-
}
|
|
241
|
-
},
|
|
242
|
-
},
|
|
243
|
-
{
|
|
244
|
-
name: 'get-recent-entries',
|
|
245
|
-
description: 'Formatted recent entries',
|
|
246
|
-
icons: [ICON_PROMPT],
|
|
247
|
-
arguments: [
|
|
248
|
-
{ name: 'limit', description: 'Number of entries (default: 10)', required: false },
|
|
249
|
-
],
|
|
250
|
-
handler: (args: Record<string, string>, db: IDatabaseAdapter) => {
|
|
251
|
-
const limit = parseInt(args['limit'] ?? '10', 10)
|
|
252
|
-
const entries = db.getRecentEntries(limit)
|
|
253
|
-
|
|
254
|
-
return {
|
|
255
|
-
messages: [
|
|
256
|
-
{
|
|
257
|
-
role: 'user',
|
|
258
|
-
content: {
|
|
259
|
-
type: 'text',
|
|
260
|
-
text: `Recent ${String(limit)} entries:\n\n${entries.map((e) => `## ${e.timestamp} (${e.entryType})\n\n${e.content}\n\nTags: ${e.tags.join(', ') || 'none'}`).join('\n\n---\n\n')}`,
|
|
261
|
-
},
|
|
262
|
-
},
|
|
263
|
-
],
|
|
264
|
-
}
|
|
265
|
-
},
|
|
266
|
-
},
|
|
267
|
-
{
|
|
268
|
-
name: 'confirm-briefing',
|
|
269
|
-
description:
|
|
270
|
-
'Acknowledge session context received from memory://briefing to inform the user',
|
|
271
|
-
icons: [ICON_PROMPT],
|
|
272
|
-
arguments: [],
|
|
273
|
-
handler: (_args: Record<string, string>, db: IDatabaseAdapter) => {
|
|
274
|
-
const recent = db.getRecentEntries(3)
|
|
275
|
-
const stats = db.getStatistics('week')
|
|
276
|
-
const totalEntries = (stats as { totalEntries?: number }).totalEntries ?? 0
|
|
277
|
-
|
|
278
|
-
const entrySummary =
|
|
279
|
-
recent.length > 0
|
|
280
|
-
? recent
|
|
281
|
-
.map(
|
|
282
|
-
(e) =>
|
|
283
|
-
` - #${String(e.id)} (${e.entryType}) ${e.content.slice(0, 40)}...`
|
|
284
|
-
)
|
|
285
|
-
.join('\n')
|
|
286
|
-
: ' - No entries yet'
|
|
287
|
-
|
|
288
|
-
return {
|
|
289
|
-
messages: [
|
|
290
|
-
{
|
|
291
|
-
role: 'user',
|
|
292
|
-
content: {
|
|
293
|
-
type: 'text',
|
|
294
|
-
text: `Generate a briefing acknowledgment for the user with this context:
|
|
295
|
-
|
|
296
|
-
**Session Context Received:**
|
|
297
|
-
- **Journal**: ${String(totalEntries)} total entries
|
|
298
|
-
- **Latest Entries**:
|
|
299
|
-
${entrySummary}
|
|
300
|
-
|
|
301
|
-
**My Behaviors:**
|
|
302
|
-
- Create entries for: implementations, decisions, bug fixes, milestones
|
|
303
|
-
- Search before: major decisions, referencing prior work
|
|
304
|
-
- Link entries: implementation→spec, bugfix→issue
|
|
305
|
-
|
|
306
|
-
**For More Context:**
|
|
307
|
-
- Full entries: \`memory://recent\` or \`get_entry_by_id(ID)\`
|
|
308
|
-
- GitHub status: \`memory://github/status\`
|
|
309
|
-
- Repo insights: \`memory://github/insights\` (stars, traffic, clones)
|
|
310
|
-
- Full health: \`memory://health\`
|
|
311
|
-
|
|
312
|
-
Please confirm this context to the user in a concise, friendly format. Use a table if helpful.`,
|
|
313
|
-
},
|
|
314
|
-
},
|
|
315
|
-
],
|
|
316
|
-
}
|
|
317
|
-
},
|
|
318
|
-
},
|
|
319
|
-
{
|
|
320
|
-
name: 'session-summary',
|
|
321
|
-
description:
|
|
322
|
-
'Create a session summary entry capturing what was accomplished, pending items, and context for the next session',
|
|
323
|
-
icons: [ICON_PROMPT],
|
|
324
|
-
arguments: [],
|
|
325
|
-
handler: (_args: Record<string, string>, db: IDatabaseAdapter) => {
|
|
326
|
-
const recent = db.getRecentEntries(5)
|
|
327
|
-
|
|
328
|
-
const entrySummary =
|
|
329
|
-
recent.length > 0
|
|
330
|
-
? recent
|
|
331
|
-
.map(
|
|
332
|
-
(e) =>
|
|
333
|
-
`- #${String(e.id)} (${e.entryType}) ${e.content.slice(0, 80)}${e.content.length > 80 ? '...' : ''}`
|
|
334
|
-
)
|
|
335
|
-
.join('\n')
|
|
336
|
-
: '- No entries yet'
|
|
337
|
-
|
|
338
|
-
return {
|
|
339
|
-
messages: [
|
|
340
|
-
{
|
|
341
|
-
role: 'user',
|
|
342
|
-
content: {
|
|
343
|
-
type: 'text',
|
|
344
|
-
text: `Create a session summary journal entry based on this context:
|
|
345
|
-
|
|
346
|
-
**Recent Entries:**
|
|
347
|
-
${entrySummary}
|
|
348
|
-
|
|
349
|
-
**Instructions:**
|
|
350
|
-
1. Summarize what was accomplished in this session (key changes, decisions, files modified)
|
|
351
|
-
2. Note what's unfinished or blocked (pending items, open questions)
|
|
352
|
-
3. Include context for the next session (relevant entry IDs, branch names, PR numbers)
|
|
353
|
-
4. Use \`entry_type: "retrospective"\` and tag with \`session-summary\``,
|
|
354
|
-
},
|
|
355
|
-
},
|
|
356
|
-
],
|
|
357
|
-
}
|
|
358
|
-
},
|
|
359
|
-
},
|
|
360
|
-
]
|
|
361
|
-
}
|
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Briefing — Context Section Builders
|
|
3
|
-
*
|
|
4
|
-
* Builds the journal, team, rules-file, and skills-directory
|
|
5
|
-
* context sections for the briefing resource.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import * as fs from 'node:fs'
|
|
9
|
-
import * as path from 'node:path'
|
|
10
|
-
import type { BriefingConfig, ResourceContext } from '../../shared.js'
|
|
11
|
-
import { logger } from '../../../../utils/logger.js'
|
|
12
|
-
|
|
13
|
-
// ============================================================================
|
|
14
|
-
// Journal Context
|
|
15
|
-
// ============================================================================
|
|
16
|
-
|
|
17
|
-
/** Content preview length for briefing entry summaries */
|
|
18
|
-
const PREVIEW_LENGTH = 80
|
|
19
|
-
|
|
20
|
-
export interface JournalContext {
|
|
21
|
-
totalEntries: number
|
|
22
|
-
latestEntries: { id: number; timestamp: string; type: string; preview: string }[]
|
|
23
|
-
lastModified: string
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export function buildJournalContext(
|
|
27
|
-
context: ResourceContext,
|
|
28
|
-
config: BriefingConfig
|
|
29
|
-
): JournalContext {
|
|
30
|
-
const recentEntries = context.db.getRecentEntries(config.entryCount)
|
|
31
|
-
const latestEntries = recentEntries.map((e) => {
|
|
32
|
-
const content = e.content ?? ''
|
|
33
|
-
return {
|
|
34
|
-
id: e.id,
|
|
35
|
-
timestamp: e.timestamp,
|
|
36
|
-
type: e.entryType,
|
|
37
|
-
preview:
|
|
38
|
-
content.slice(0, PREVIEW_LENGTH) + (content.length > PREVIEW_LENGTH ? '...' : ''),
|
|
39
|
-
}
|
|
40
|
-
})
|
|
41
|
-
|
|
42
|
-
const totalEntries = context.db.getActiveEntryCount()
|
|
43
|
-
const lastModified = recentEntries[0]?.timestamp ?? new Date().toISOString()
|
|
44
|
-
|
|
45
|
-
return { totalEntries, latestEntries, lastModified }
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// ============================================================================
|
|
49
|
-
// Team Context
|
|
50
|
-
// ============================================================================
|
|
51
|
-
|
|
52
|
-
/** Team DB preview length */
|
|
53
|
-
const TEAM_PREVIEW_LENGTH = 60
|
|
54
|
-
|
|
55
|
-
export interface TeamContext {
|
|
56
|
-
teamInfo: { totalEntries: number; latestPreview: string | null }
|
|
57
|
-
teamLatestEntries?: { id: number; timestamp: string; type: string; preview: string }[]
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export function buildTeamContext(
|
|
61
|
-
context: ResourceContext,
|
|
62
|
-
config: BriefingConfig
|
|
63
|
-
): TeamContext | undefined {
|
|
64
|
-
if (!context.teamDb) return undefined
|
|
65
|
-
|
|
66
|
-
try {
|
|
67
|
-
const teamTotalEntries = context.teamDb.getActiveEntryCount()
|
|
68
|
-
const teamRecent = context.teamDb.getRecentEntries(1)
|
|
69
|
-
const teamLatestEntry = teamRecent[0] as Record<string, unknown> | undefined
|
|
70
|
-
const teamContent = teamLatestEntry
|
|
71
|
-
? ((teamLatestEntry['content'] as string | undefined) ?? '')
|
|
72
|
-
: ''
|
|
73
|
-
const teamLatest = teamLatestEntry
|
|
74
|
-
? `#${String(teamLatestEntry['id'])}: ${teamContent.slice(0, TEAM_PREVIEW_LENGTH)}${teamContent.length > TEAM_PREVIEW_LENGTH ? '...' : ''}`
|
|
75
|
-
: null
|
|
76
|
-
const teamInfo = {
|
|
77
|
-
totalEntries: teamTotalEntries,
|
|
78
|
-
latestPreview: teamLatest,
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
let teamLatestEntries:
|
|
82
|
-
| { id: number; timestamp: string; type: string; preview: string }[]
|
|
83
|
-
| undefined = undefined
|
|
84
|
-
|
|
85
|
-
if (config.includeTeam) {
|
|
86
|
-
const teamEntries = context.teamDb.getRecentEntries(config.entryCount)
|
|
87
|
-
teamLatestEntries = teamEntries.map((e) => {
|
|
88
|
-
const content = e.content ?? ''
|
|
89
|
-
return {
|
|
90
|
-
id: e.id,
|
|
91
|
-
timestamp: e.timestamp,
|
|
92
|
-
type: e.entryType,
|
|
93
|
-
preview:
|
|
94
|
-
content.slice(0, TEAM_PREVIEW_LENGTH) +
|
|
95
|
-
(content.length > TEAM_PREVIEW_LENGTH ? '...' : ''),
|
|
96
|
-
}
|
|
97
|
-
})
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
return { teamInfo, teamLatestEntries }
|
|
101
|
-
} catch (error) {
|
|
102
|
-
logger.debug('Failed to build team context', {
|
|
103
|
-
module: 'BRIEFING',
|
|
104
|
-
operation: 'team-context',
|
|
105
|
-
error: error instanceof Error ? error.message : String(error),
|
|
106
|
-
})
|
|
107
|
-
return undefined
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// ============================================================================
|
|
112
|
-
// Rules & Skills Awareness
|
|
113
|
-
// ============================================================================
|
|
114
|
-
|
|
115
|
-
export interface RulesFile {
|
|
116
|
-
path: string
|
|
117
|
-
name: string
|
|
118
|
-
sizeKB: number
|
|
119
|
-
lastModified: string
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
export interface SkillsDir {
|
|
123
|
-
path: string
|
|
124
|
-
count: number
|
|
125
|
-
names: string[]
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/** Milliseconds per hour / per day for age formatting */
|
|
129
|
-
const MS_PER_HOUR = 3_600_000
|
|
130
|
-
const MS_PER_DAY = 86_400_000
|
|
131
|
-
|
|
132
|
-
export function buildRulesFileInfo(rulesFilePath: string | undefined): RulesFile | undefined {
|
|
133
|
-
if (!rulesFilePath) return undefined
|
|
134
|
-
|
|
135
|
-
try {
|
|
136
|
-
const stat = fs.statSync(rulesFilePath)
|
|
137
|
-
const ageMs = Date.now() - stat.mtimeMs
|
|
138
|
-
const ageHours = Math.floor(ageMs / MS_PER_HOUR)
|
|
139
|
-
const ageDays = Math.floor(ageMs / MS_PER_DAY)
|
|
140
|
-
const agoStr =
|
|
141
|
-
ageDays > 0
|
|
142
|
-
? `${String(ageDays)}d ago`
|
|
143
|
-
: ageHours > 0
|
|
144
|
-
? `${String(ageHours)}h ago`
|
|
145
|
-
: 'just now'
|
|
146
|
-
|
|
147
|
-
return {
|
|
148
|
-
path: rulesFilePath,
|
|
149
|
-
name: path.basename(rulesFilePath),
|
|
150
|
-
sizeKB: Math.round(stat.size / 1024),
|
|
151
|
-
lastModified: agoStr,
|
|
152
|
-
}
|
|
153
|
-
} catch (error) {
|
|
154
|
-
logger.debug('Failed to read rules file', {
|
|
155
|
-
module: 'BRIEFING',
|
|
156
|
-
operation: 'rules-file',
|
|
157
|
-
error: error instanceof Error ? error.message : String(error),
|
|
158
|
-
})
|
|
159
|
-
return undefined
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
export function buildSkillsDirInfo(skillsDirPath: string | undefined): SkillsDir | undefined {
|
|
164
|
-
if (!skillsDirPath) return undefined
|
|
165
|
-
|
|
166
|
-
try {
|
|
167
|
-
const entries = fs.readdirSync(skillsDirPath, { withFileTypes: true })
|
|
168
|
-
const skillDirs = entries.filter((e) => e.isDirectory())
|
|
169
|
-
return {
|
|
170
|
-
path: skillsDirPath,
|
|
171
|
-
count: skillDirs.length,
|
|
172
|
-
names: skillDirs.map((d) => d.name),
|
|
173
|
-
}
|
|
174
|
-
} catch (error) {
|
|
175
|
-
logger.debug('Failed to read skills directory', {
|
|
176
|
-
module: 'BRIEFING',
|
|
177
|
-
operation: 'skills-dir',
|
|
178
|
-
error: error instanceof Error ? error.message : String(error),
|
|
179
|
-
})
|
|
180
|
-
return undefined
|
|
181
|
-
}
|
|
182
|
-
}
|