@ginkoai/cli 1.0.0 ā 1.4.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 +19 -0
- package/dist/analysis/project-analyzer.d.ts.map +1 -1
- package/dist/analysis/project-analyzer.js +68 -4
- package/dist/analysis/project-analyzer.js.map +1 -1
- package/dist/commands/architecture/architecture-pipeline-enhanced.d.ts.map +1 -1
- package/dist/commands/architecture/architecture-pipeline-enhanced.js +10 -6
- package/dist/commands/architecture/architecture-pipeline-enhanced.js.map +1 -1
- package/dist/commands/backlog/base.d.ts.map +1 -1
- package/dist/commands/backlog/base.js +3 -0
- package/dist/commands/backlog/base.js.map +1 -1
- package/dist/commands/backlog/create.js +20 -20
- package/dist/commands/backlog/create.js.map +1 -1
- package/dist/commands/backlog/index.d.ts.map +1 -1
- package/dist/commands/backlog/index.js +6 -1
- package/dist/commands/backlog/index.js.map +1 -1
- package/dist/commands/changelog/changelog-reflection.d.ts.map +1 -1
- package/dist/commands/changelog/changelog-reflection.js +7 -3
- package/dist/commands/changelog/changelog-reflection.js.map +1 -1
- package/dist/commands/charter.d.ts +28 -0
- package/dist/commands/charter.d.ts.map +1 -0
- package/dist/commands/charter.js +434 -0
- package/dist/commands/charter.js.map +1 -0
- package/dist/commands/documentation/documentation-pipeline.d.ts.map +1 -1
- package/dist/commands/documentation/documentation-pipeline.js +15 -7
- package/dist/commands/documentation/documentation-pipeline.js.map +1 -1
- package/dist/commands/git/git-pipeline.d.ts.map +1 -1
- package/dist/commands/git/git-pipeline.js +3 -2
- package/dist/commands/git/git-pipeline.js.map +1 -1
- package/dist/commands/graph/api-client.d.ts +212 -0
- package/dist/commands/graph/api-client.d.ts.map +1 -0
- package/dist/commands/graph/api-client.js +143 -0
- package/dist/commands/graph/api-client.js.map +1 -0
- package/dist/commands/graph/config.d.ts +82 -0
- package/dist/commands/graph/config.d.ts.map +1 -0
- package/dist/commands/graph/config.js +113 -0
- package/dist/commands/graph/config.js.map +1 -0
- package/dist/commands/graph/explore.d.ts +19 -0
- package/dist/commands/graph/explore.d.ts.map +1 -0
- package/dist/commands/graph/explore.js +117 -0
- package/dist/commands/graph/explore.js.map +1 -0
- package/dist/commands/graph/index.d.ts +17 -0
- package/dist/commands/graph/index.d.ts.map +1 -0
- package/dist/commands/graph/index.js +104 -0
- package/dist/commands/graph/index.js.map +1 -0
- package/dist/commands/graph/init.d.ts +21 -0
- package/dist/commands/graph/init.d.ts.map +1 -0
- package/dist/commands/graph/init.js +173 -0
- package/dist/commands/graph/init.js.map +1 -0
- package/dist/commands/graph/load.d.ts +21 -0
- package/dist/commands/graph/load.d.ts.map +1 -0
- package/dist/commands/graph/load.js +224 -0
- package/dist/commands/graph/load.js.map +1 -0
- package/dist/commands/graph/query.d.ts +23 -0
- package/dist/commands/graph/query.d.ts.map +1 -0
- package/dist/commands/graph/query.js +145 -0
- package/dist/commands/graph/query.js.map +1 -0
- package/dist/commands/graph/status.d.ts +15 -0
- package/dist/commands/graph/status.d.ts.map +1 -0
- package/dist/commands/graph/status.js +88 -0
- package/dist/commands/graph/status.js.map +1 -0
- package/dist/commands/handoff.d.ts +14 -5
- package/dist/commands/handoff.d.ts.map +1 -1
- package/dist/commands/handoff.js +84 -142
- package/dist/commands/handoff.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +88 -41
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/knowledge/create.d.ts +24 -0
- package/dist/commands/knowledge/create.d.ts.map +1 -0
- package/dist/commands/knowledge/create.js +180 -0
- package/dist/commands/knowledge/create.js.map +1 -0
- package/dist/commands/knowledge/graph.d.ts +21 -0
- package/dist/commands/knowledge/graph.d.ts.map +1 -0
- package/dist/commands/knowledge/graph.js +199 -0
- package/dist/commands/knowledge/graph.js.map +1 -0
- package/dist/commands/knowledge/index.d.ts +25 -0
- package/dist/commands/knowledge/index.d.ts.map +1 -0
- package/dist/commands/knowledge/index.js +121 -0
- package/dist/commands/knowledge/index.js.map +1 -0
- package/dist/commands/knowledge/search.d.ts +23 -0
- package/dist/commands/knowledge/search.d.ts.map +1 -0
- package/dist/commands/knowledge/search.js +157 -0
- package/dist/commands/knowledge/search.js.map +1 -0
- package/dist/commands/knowledge/sync.d.ts +28 -0
- package/dist/commands/knowledge/sync.d.ts.map +1 -0
- package/dist/commands/knowledge/sync.js +251 -0
- package/dist/commands/knowledge/sync.js.map +1 -0
- package/dist/commands/log.d.ts +32 -0
- package/dist/commands/log.d.ts.map +1 -0
- package/dist/commands/log.js +632 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/login.d.ts +27 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +177 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +15 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +31 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/project/create.d.ts +22 -0
- package/dist/commands/project/create.d.ts.map +1 -0
- package/dist/commands/project/create.js +69 -0
- package/dist/commands/project/create.js.map +1 -0
- package/dist/commands/project/delete.d.ts +19 -0
- package/dist/commands/project/delete.d.ts.map +1 -0
- package/dist/commands/project/delete.js +73 -0
- package/dist/commands/project/delete.js.map +1 -0
- package/dist/commands/project/index.d.ts +22 -0
- package/dist/commands/project/index.d.ts.map +1 -0
- package/dist/commands/project/index.js +134 -0
- package/dist/commands/project/index.js.map +1 -0
- package/dist/commands/project/info.d.ts +15 -0
- package/dist/commands/project/info.d.ts.map +1 -0
- package/dist/commands/project/info.js +92 -0
- package/dist/commands/project/info.js.map +1 -0
- package/dist/commands/project/list.d.ts +20 -0
- package/dist/commands/project/list.d.ts.map +1 -0
- package/dist/commands/project/list.js +82 -0
- package/dist/commands/project/list.js.map +1 -0
- package/dist/commands/project/members.d.ts +27 -0
- package/dist/commands/project/members.d.ts.map +1 -0
- package/dist/commands/project/members.js +140 -0
- package/dist/commands/project/members.js.map +1 -0
- package/dist/commands/project/update.d.ts +24 -0
- package/dist/commands/project/update.d.ts.map +1 -0
- package/dist/commands/project/update.js +83 -0
- package/dist/commands/project/update.js.map +1 -0
- package/dist/commands/reflect.js +0 -3
- package/dist/commands/reflect.js.map +1 -1
- package/dist/commands/ship.d.ts +3 -1
- package/dist/commands/ship.d.ts.map +1 -1
- package/dist/commands/ship.js +100 -9
- package/dist/commands/ship.js.map +1 -1
- package/dist/commands/start/index.d.ts.map +1 -1
- package/dist/commands/start/index.js +5 -3
- package/dist/commands/start/index.js.map +1 -1
- package/dist/commands/start/start-reflection.d.ts +2 -1
- package/dist/commands/start/start-reflection.d.ts.map +1 -1
- package/dist/commands/start/start-reflection.js +265 -43
- package/dist/commands/start/start-reflection.js.map +1 -1
- package/dist/commands/status.d.ts +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +41 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/team/create.d.ts +15 -0
- package/dist/commands/team/create.d.ts.map +1 -0
- package/dist/commands/team/create.js +48 -0
- package/dist/commands/team/create.js.map +1 -0
- package/dist/commands/team/index.d.ts +22 -0
- package/dist/commands/team/index.d.ts.map +1 -0
- package/dist/commands/team/index.js +109 -0
- package/dist/commands/team/index.js.map +1 -0
- package/dist/commands/team/list.d.ts +15 -0
- package/dist/commands/team/list.d.ts.map +1 -0
- package/dist/commands/team/list.js +67 -0
- package/dist/commands/team/list.js.map +1 -0
- package/dist/commands/team/members.d.ts +27 -0
- package/dist/commands/team/members.d.ts.map +1 -0
- package/dist/commands/team/members.js +135 -0
- package/dist/commands/team/members.js.map +1 -0
- package/dist/commands/team/projects.d.ts +19 -0
- package/dist/commands/team/projects.d.ts.map +1 -0
- package/dist/commands/team/projects.js +107 -0
- package/dist/commands/team/projects.js.map +1 -0
- package/dist/commands/team.d.ts +22 -0
- package/dist/commands/team.d.ts.map +1 -0
- package/dist/commands/team.js +238 -0
- package/dist/commands/team.js.map +1 -0
- package/dist/commands/testing/testing-pipeline-enhanced.d.ts.map +1 -1
- package/dist/commands/testing/testing-pipeline-enhanced.js +5 -3
- package/dist/commands/testing/testing-pipeline-enhanced.js.map +1 -1
- package/dist/commands/testing/testing-pipeline.d.ts.map +1 -1
- package/dist/commands/testing/testing-pipeline.js +5 -3
- package/dist/commands/testing/testing-pipeline.js.map +1 -1
- package/dist/commands/whoami.d.ts +15 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +38 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/core/reflection-pattern.d.ts +1 -1
- package/dist/core/reflection-pattern.d.ts.map +1 -1
- package/dist/core/reflection-pattern.js +2 -12
- package/dist/core/reflection-pattern.js.map +1 -1
- package/dist/core/session-log-manager.d.ts +44 -4
- package/dist/core/session-log-manager.d.ts.map +1 -1
- package/dist/core/session-log-manager.js +132 -31
- package/dist/core/session-log-manager.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +116 -17
- package/dist/index.js.map +1 -1
- package/dist/lib/api/projects-client.d.ts +119 -0
- package/dist/lib/api/projects-client.d.ts.map +1 -0
- package/dist/lib/api/projects-client.js +125 -0
- package/dist/lib/api/projects-client.js.map +1 -0
- package/dist/lib/api/teams-client.d.ts +73 -0
- package/dist/lib/api/teams-client.d.ts.map +1 -0
- package/dist/lib/api/teams-client.js +68 -0
- package/dist/lib/api/teams-client.js.map +1 -0
- package/dist/lib/charter/charter-editor.d.ts +60 -0
- package/dist/lib/charter/charter-editor.d.ts.map +1 -0
- package/dist/lib/charter/charter-editor.js +559 -0
- package/dist/lib/charter/charter-editor.js.map +1 -0
- package/dist/lib/charter/charter-storage.d.ts +92 -0
- package/dist/lib/charter/charter-storage.d.ts.map +1 -0
- package/dist/lib/charter/charter-storage.js +501 -0
- package/dist/lib/charter/charter-storage.js.map +1 -0
- package/dist/lib/charter/charter-synthesizer.d.ts +94 -0
- package/dist/lib/charter/charter-synthesizer.d.ts.map +1 -0
- package/dist/lib/charter/charter-synthesizer.js +521 -0
- package/dist/lib/charter/charter-synthesizer.js.map +1 -0
- package/dist/lib/charter/charter-versioning.d.ts +57 -0
- package/dist/lib/charter/charter-versioning.d.ts.map +1 -0
- package/dist/lib/charter/charter-versioning.js +283 -0
- package/dist/lib/charter/charter-versioning.js.map +1 -0
- package/dist/lib/charter/confidence-scorer.d.ts +263 -0
- package/dist/lib/charter/confidence-scorer.d.ts.map +1 -0
- package/dist/lib/charter/confidence-scorer.js +737 -0
- package/dist/lib/charter/confidence-scorer.js.map +1 -0
- package/dist/lib/charter/conversation-context.d.ts +99 -0
- package/dist/lib/charter/conversation-context.d.ts.map +1 -0
- package/dist/lib/charter/conversation-context.js +297 -0
- package/dist/lib/charter/conversation-context.js.map +1 -0
- package/dist/lib/charter/conversation-facilitator.d.ts +117 -0
- package/dist/lib/charter/conversation-facilitator.d.ts.map +1 -0
- package/dist/lib/charter/conversation-facilitator.js +360 -0
- package/dist/lib/charter/conversation-facilitator.js.map +1 -0
- package/dist/lib/charter/question-templates.d.ts +82 -0
- package/dist/lib/charter/question-templates.d.ts.map +1 -0
- package/dist/lib/charter/question-templates.js +355 -0
- package/dist/lib/charter/question-templates.js.map +1 -0
- package/dist/lib/charter/signal-detection.d.ts +49 -0
- package/dist/lib/charter/signal-detection.d.ts.map +1 -0
- package/dist/lib/charter/signal-detection.js +338 -0
- package/dist/lib/charter/signal-detection.js.map +1 -0
- package/dist/lib/context-loader-events.d.ts +111 -0
- package/dist/lib/context-loader-events.d.ts.map +1 -0
- package/dist/lib/context-loader-events.js +475 -0
- package/dist/lib/context-loader-events.js.map +1 -0
- package/dist/lib/event-logger.d.ts +64 -0
- package/dist/lib/event-logger.d.ts.map +1 -0
- package/dist/lib/event-logger.js +197 -0
- package/dist/lib/event-logger.js.map +1 -0
- package/dist/lib/event-queue.d.ts +104 -0
- package/dist/lib/event-queue.d.ts.map +1 -0
- package/dist/lib/event-queue.js +274 -0
- package/dist/lib/event-queue.js.map +1 -0
- package/dist/lib/session-cursor.d.ts +80 -0
- package/dist/lib/session-cursor.d.ts.map +1 -0
- package/dist/lib/session-cursor.js +250 -0
- package/dist/lib/session-cursor.js.map +1 -0
- package/dist/lib/sync/conflict-detector.d.ts +41 -0
- package/dist/lib/sync/conflict-detector.d.ts.map +1 -0
- package/dist/lib/sync/conflict-detector.js +124 -0
- package/dist/lib/sync/conflict-detector.js.map +1 -0
- package/dist/lib/sync/logger.d.ts +89 -0
- package/dist/lib/sync/logger.d.ts.map +1 -0
- package/dist/lib/sync/logger.js +202 -0
- package/dist/lib/sync/logger.js.map +1 -0
- package/dist/lib/sync/parser.d.ts +32 -0
- package/dist/lib/sync/parser.d.ts.map +1 -0
- package/dist/lib/sync/parser.js +180 -0
- package/dist/lib/sync/parser.js.map +1 -0
- package/dist/lib/sync/scanner.d.ts +34 -0
- package/dist/lib/sync/scanner.d.ts.map +1 -0
- package/dist/lib/sync/scanner.js +97 -0
- package/dist/lib/sync/scanner.js.map +1 -0
- package/dist/lib/sync/uploader.d.ts +33 -0
- package/dist/lib/sync/uploader.d.ts.map +1 -0
- package/dist/lib/sync/uploader.js +188 -0
- package/dist/lib/sync/uploader.js.map +1 -0
- package/dist/lib/write-dispatcher/adapters/graph-adapter.d.ts +77 -0
- package/dist/lib/write-dispatcher/adapters/graph-adapter.d.ts.map +1 -0
- package/dist/lib/write-dispatcher/adapters/graph-adapter.js +178 -0
- package/dist/lib/write-dispatcher/adapters/graph-adapter.js.map +1 -0
- package/dist/lib/write-dispatcher/adapters/local-adapter.d.ts +133 -0
- package/dist/lib/write-dispatcher/adapters/local-adapter.d.ts.map +1 -0
- package/dist/lib/write-dispatcher/adapters/local-adapter.js +324 -0
- package/dist/lib/write-dispatcher/adapters/local-adapter.js.map +1 -0
- package/dist/lib/write-dispatcher/write-dispatcher.d.ts +151 -0
- package/dist/lib/write-dispatcher/write-dispatcher.d.ts.map +1 -0
- package/dist/lib/write-dispatcher/write-dispatcher.js +197 -0
- package/dist/lib/write-dispatcher/write-dispatcher.js.map +1 -0
- package/dist/types/charter.d.ts +330 -0
- package/dist/types/charter.d.ts.map +1 -0
- package/dist/types/charter.js +76 -0
- package/dist/types/charter.js.map +1 -0
- package/dist/types/config.d.ts +65 -17
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +50 -21
- package/dist/types/config.js.map +1 -1
- package/dist/utils/api-client.d.ts +36 -0
- package/dist/utils/api-client.d.ts.map +1 -0
- package/dist/utils/api-client.js +97 -0
- package/dist/utils/api-client.js.map +1 -0
- package/dist/utils/auth-storage.d.ts +56 -0
- package/dist/utils/auth-storage.d.ts.map +1 -0
- package/dist/utils/auth-storage.js +133 -0
- package/dist/utils/auth-storage.js.map +1 -0
- package/dist/utils/cleanup.d.ts +21 -0
- package/dist/utils/cleanup.d.ts.map +1 -0
- package/dist/utils/cleanup.js +122 -0
- package/dist/utils/cleanup.js.map +1 -0
- package/dist/utils/config-loader.d.ts +76 -0
- package/dist/utils/config-loader.d.ts.map +1 -0
- package/dist/utils/config-loader.js +269 -0
- package/dist/utils/config-loader.js.map +1 -0
- package/dist/utils/context-loader.d.ts +154 -0
- package/dist/utils/context-loader.d.ts.map +1 -0
- package/dist/utils/context-loader.js +411 -0
- package/dist/utils/context-loader.js.map +1 -0
- package/dist/utils/dispatcher-logger.d.ts +30 -0
- package/dist/utils/dispatcher-logger.d.ts.map +1 -0
- package/dist/utils/dispatcher-logger.js +128 -0
- package/dist/utils/dispatcher-logger.js.map +1 -0
- package/dist/utils/ginko-root.d.ts +3 -2
- package/dist/utils/ginko-root.d.ts.map +1 -1
- package/dist/utils/ginko-root.js +35 -2
- package/dist/utils/ginko-root.js.map +1 -1
- package/dist/utils/helpers.d.ts +1 -0
- package/dist/utils/helpers.d.ts.map +1 -1
- package/dist/utils/helpers.js +3 -0
- package/dist/utils/helpers.js.map +1 -1
- package/dist/utils/log-quality.d.ts +55 -0
- package/dist/utils/log-quality.d.ts.map +1 -0
- package/dist/utils/log-quality.js +297 -0
- package/dist/utils/log-quality.js.map +1 -0
- package/dist/utils/reference-parser.d.ts +164 -0
- package/dist/utils/reference-parser.d.ts.map +1 -0
- package/dist/utils/reference-parser.js +363 -0
- package/dist/utils/reference-parser.js.map +1 -0
- package/dist/utils/synthesis.d.ts +180 -0
- package/dist/utils/synthesis.d.ts.map +1 -0
- package/dist/utils/synthesis.js +724 -0
- package/dist/utils/synthesis.js.map +1 -0
- package/dist/utils/team-awareness.d.ts +127 -0
- package/dist/utils/team-awareness.d.ts.map +1 -0
- package/dist/utils/team-awareness.js +385 -0
- package/dist/utils/team-awareness.js.map +1 -0
- package/package.json +6 -4
- package/dist/commands/handoff/handoff-reflection-pipeline.d.ts +0 -106
- package/dist/commands/handoff/handoff-reflection-pipeline.d.ts.map +0 -1
- package/dist/commands/handoff/handoff-reflection-pipeline.js +0 -534
- package/dist/commands/handoff/handoff-reflection-pipeline.js.map +0 -1
- package/dist/commands/handoff/handoff-save.d.ts +0 -16
- package/dist/commands/handoff/handoff-save.d.ts.map +0 -1
- package/dist/commands/handoff/handoff-save.js +0 -72
- package/dist/commands/handoff/handoff-save.js.map +0 -1
- package/dist/commands/handoff/index.d.ts +0 -19
- package/dist/commands/handoff/index.d.ts.map +0 -1
- package/dist/commands/handoff/index.js +0 -55
- package/dist/commands/handoff/index.js.map +0 -1
- package/dist/commands/handoff-ai-orig.d.ts +0 -27
- package/dist/commands/handoff-ai-orig.d.ts.map +0 -1
- package/dist/commands/handoff-ai-orig.js +0 -405
- package/dist/commands/handoff-ai-orig.js.map +0 -1
- package/dist/commands/handoff-ai.d.ts +0 -27
- package/dist/commands/handoff-ai.d.ts.map +0 -1
- package/dist/commands/handoff-ai.js +0 -405
- package/dist/commands/handoff-ai.js.map +0 -1
- package/dist/commands/handoff-enhanced-orig.d.ts +0 -25
- package/dist/commands/handoff-enhanced-orig.d.ts.map +0 -1
- package/dist/commands/handoff-enhanced-orig.js +0 -349
- package/dist/commands/handoff-enhanced-orig.js.map +0 -1
- package/dist/commands/handoff-enhanced.d.ts +0 -25
- package/dist/commands/handoff-enhanced.d.ts.map +0 -1
- package/dist/commands/handoff-enhanced.js +0 -349
- package/dist/commands/handoff-enhanced.js.map +0 -1
- package/dist/commands/handoff-orig.d.ts +0 -10
- package/dist/commands/handoff-orig.d.ts.map +0 -1
- package/dist/commands/handoff-orig.js +0 -167
- package/dist/commands/handoff-orig.js.map +0 -1
- package/dist/commands/init-enhanced.d.ts +0 -20
- package/dist/commands/init-enhanced.d.ts.map +0 -1
- package/dist/commands/init-enhanced.js +0 -430
- package/dist/commands/init-enhanced.js.map +0 -1
- package/dist/commands/prd/prd-reflection-enhanced.d.ts +0 -63
- package/dist/commands/prd/prd-reflection-enhanced.d.ts.map +0 -1
- package/dist/commands/prd/prd-reflection-enhanced.js +0 -310
- package/dist/commands/prd/prd-reflection-enhanced.js.map +0 -1
- package/dist/commands/start-enhanced.d.ts +0 -19
- package/dist/commands/start-enhanced.d.ts.map +0 -1
- package/dist/commands/start-enhanced.js +0 -434
- package/dist/commands/start-enhanced.js.map +0 -1
- package/dist/commands/start.d.ts +0 -10
- package/dist/commands/start.d.ts.map +0 -1
- package/dist/commands/start.js +0 -119
- package/dist/commands/start.js.map +0 -1
- package/dist/core/config/config-aware-reflection.d.ts +0 -37
- package/dist/core/config/config-aware-reflection.d.ts.map +0 -1
- package/dist/core/config/config-aware-reflection.js +0 -97
- package/dist/core/config/config-aware-reflection.js.map +0 -1
- package/dist/core/config/config-loader.d.ts +0 -154
- package/dist/core/config/config-loader.d.ts.map +0 -1
- package/dist/core/config/config-loader.js +0 -424
- package/dist/core/config/config-loader.js.map +0 -1
- package/dist/core/config/config-migrator.d.ts +0 -150
- package/dist/core/config/config-migrator.d.ts.map +0 -1
- package/dist/core/config/config-migrator.js +0 -423
- package/dist/core/config/config-migrator.js.map +0 -1
- package/dist/core/config/config-schema.d.ts +0 -276
- package/dist/core/config/config-schema.d.ts.map +0 -1
- package/dist/core/config/config-schema.js +0 -277
- package/dist/core/config/config-schema.js.map +0 -1
- package/dist/core/config/index.d.ts +0 -260
- package/dist/core/config/index.d.ts.map +0 -1
- package/dist/core/config/index.js +0 -283
- package/dist/core/config/index.js.map +0 -1
- package/dist/core/config/interactive-config.d.ts +0 -76
- package/dist/core/config/interactive-config.d.ts.map +0 -1
- package/dist/core/config/interactive-config.js +0 -315
- package/dist/core/config/interactive-config.js.map +0 -1
- package/dist/core/config/path-config.d.ts +0 -121
- package/dist/core/config/path-config.d.ts.map +0 -1
- package/dist/core/config/path-config.js +0 -210
- package/dist/core/config/path-config.js.map +0 -1
- package/dist/core/config/path-resolver.d.ts +0 -151
- package/dist/core/config/path-resolver.d.ts.map +0 -1
- package/dist/core/config/path-resolver.js +0 -343
- package/dist/core/config/path-resolver.js.map +0 -1
- package/dist/core/config/project-detector.d.ts +0 -58
- package/dist/core/config/project-detector.d.ts.map +0 -1
- package/dist/core/config/project-detector.js +0 -310
- package/dist/core/config/project-detector.js.map +0 -1
- package/dist/core/config-backup/config-aware-reflection.d.ts +0 -37
- package/dist/core/config-backup/config-aware-reflection.d.ts.map +0 -1
- package/dist/core/config-backup/config-aware-reflection.js +0 -97
- package/dist/core/config-backup/config-aware-reflection.js.map +0 -1
- package/dist/core/config-backup/config-loader.d.ts +0 -71
- package/dist/core/config-backup/config-loader.d.ts.map +0 -1
- package/dist/core/config-backup/config-loader.js +0 -288
- package/dist/core/config-backup/config-loader.js.map +0 -1
- package/dist/core/config-backup/interactive-config.d.ts +0 -76
- package/dist/core/config-backup/interactive-config.d.ts.map +0 -1
- package/dist/core/config-backup/interactive-config.js +0 -315
- package/dist/core/config-backup/interactive-config.js.map +0 -1
- package/dist/core/config-backup/path-config.d.ts +0 -121
- package/dist/core/config-backup/path-config.d.ts.map +0 -1
- package/dist/core/config-backup/path-config.js +0 -210
- package/dist/core/config-backup/path-config.js.map +0 -1
- package/dist/core/config-backup/project-detector.d.ts +0 -58
- package/dist/core/config-backup/project-detector.d.ts.map +0 -1
- package/dist/core/config-backup/project-detector.js +0 -310
- package/dist/core/config-backup/project-detector.js.map +0 -1
- package/dist/core/documents/document-manager.d.ts +0 -97
- package/dist/core/documents/document-manager.d.ts.map +0 -1
- package/dist/core/documents/document-manager.js +0 -441
- package/dist/core/documents/document-manager.js.map +0 -1
- package/dist/core/documents/document-migrator.d.ts +0 -138
- package/dist/core/documents/document-migrator.d.ts.map +0 -1
- package/dist/core/documents/document-migrator.js +0 -349
- package/dist/core/documents/document-migrator.js.map +0 -1
- package/dist/core/documents/document-namer.d.ts +0 -111
- package/dist/core/documents/document-namer.d.ts.map +0 -1
- package/dist/core/documents/document-namer.js +0 -225
- package/dist/core/documents/document-namer.js.map +0 -1
- package/dist/core/documents/examples.d.ts +0 -74
- package/dist/core/documents/examples.d.ts.map +0 -1
- package/dist/core/documents/examples.js +0 -273
- package/dist/core/documents/examples.js.map +0 -1
- package/dist/core/documents/file-system.d.ts +0 -93
- package/dist/core/documents/file-system.d.ts.map +0 -1
- package/dist/core/documents/file-system.js +0 -432
- package/dist/core/documents/file-system.js.map +0 -1
- package/dist/core/documents/index.d.ts +0 -97
- package/dist/core/documents/index.d.ts.map +0 -1
- package/dist/core/documents/index.js +0 -119
- package/dist/core/documents/index.js.map +0 -1
- package/dist/core/documents/markdown-processor.d.ts +0 -84
- package/dist/core/documents/markdown-processor.d.ts.map +0 -1
- package/dist/core/documents/markdown-processor.js +0 -302
- package/dist/core/documents/markdown-processor.js.map +0 -1
- package/dist/core/documents/sequence-manager.d.ts +0 -107
- package/dist/core/documents/sequence-manager.d.ts.map +0 -1
- package/dist/core/documents/sequence-manager.js +0 -246
- package/dist/core/documents/sequence-manager.js.map +0 -1
- package/dist/core/documents/template-engine.d.ts +0 -101
- package/dist/core/documents/template-engine.d.ts.map +0 -1
- package/dist/core/documents/template-engine.js +0 -440
- package/dist/core/documents/template-engine.js.map +0 -1
- package/dist/core/platform/hook-migration.d.ts +0 -73
- package/dist/core/platform/hook-migration.d.ts.map +0 -1
- package/dist/core/platform/hook-migration.js +0 -339
- package/dist/core/platform/hook-migration.js.map +0 -1
- package/dist/core/platform/hook-migrator.d.ts +0 -49
- package/dist/core/platform/hook-migrator.d.ts.map +0 -1
- package/dist/core/platform/hook-migrator.js +0 -305
- package/dist/core/platform/hook-migrator.js.map +0 -1
- package/dist/core/platform/path-resolver.d.ts +0 -120
- package/dist/core/platform/path-resolver.d.ts.map +0 -1
- package/dist/core/platform/path-resolver.js +0 -339
- package/dist/core/platform/path-resolver.js.map +0 -1
- package/dist/core/platform/platform-templates.d.ts +0 -62
- package/dist/core/platform/platform-templates.d.ts.map +0 -1
- package/dist/core/platform/platform-templates.js +0 -364
- package/dist/core/platform/platform-templates.js.map +0 -1
- package/dist/core/pressure-monitor.d.ts +0 -76
- package/dist/core/pressure-monitor.d.ts.map +0 -1
- package/dist/core/pressure-monitor.js +0 -156
- package/dist/core/pressure-monitor.js.map +0 -1
- package/dist/core/validators/git-validator.test.d.ts +0 -12
- package/dist/core/validators/git-validator.test.d.ts.map +0 -1
- package/dist/core/validators/git-validator.test.js +0 -40
- package/dist/core/validators/git-validator.test.js.map +0 -1
- package/dist/core/validators/temp_index.d.ts +0 -56
- package/dist/core/validators/temp_index.d.ts.map +0 -1
- package/dist/core/validators/temp_index.js +0 -94
- package/dist/core/validators/temp_index.js.map +0 -1
|
@@ -0,0 +1,632 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: command
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2025-10-22
|
|
5
|
+
* @tags: [session-logging, defensive-logging, adr-033, references, task-010]
|
|
6
|
+
* @related: [../core/session-log-manager.ts, start/start-reflection.ts, ../utils/reference-parser.ts]
|
|
7
|
+
* @priority: critical
|
|
8
|
+
* @complexity: low
|
|
9
|
+
* @dependencies: [chalk, commander, session-log-manager, reference-parser]
|
|
10
|
+
*/
|
|
11
|
+
import chalk from 'chalk';
|
|
12
|
+
import prompts from 'prompts';
|
|
13
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
14
|
+
import { SessionLogManager } from '../core/session-log-manager.js';
|
|
15
|
+
import { getGinkoDir, getUserEmail } from '../utils/helpers.js';
|
|
16
|
+
import { detectGitContext, autoDetectFiles, validateEntry, scoreSessionLog, suggestInsights } from '../utils/log-quality.js';
|
|
17
|
+
import { extractReferences, validateReferences, formatReferenceChain, getReferenceChain } from '../utils/reference-parser.js';
|
|
18
|
+
import { ModuleGenerator } from '../services/module-generator.js';
|
|
19
|
+
import { initializeWriteDispatcher, appendLogEntry } from '../utils/dispatcher-logger.js';
|
|
20
|
+
import { logEvent as logEventToStream } from '../lib/event-logger.js';
|
|
21
|
+
import * as path from 'path';
|
|
22
|
+
import { requireAuth } from '../utils/auth-storage.js';
|
|
23
|
+
/**
|
|
24
|
+
* Log an event to the current session
|
|
25
|
+
* Part of ADR-033 defensive logging strategy
|
|
26
|
+
*/
|
|
27
|
+
export async function logCommand(description, options) {
|
|
28
|
+
try {
|
|
29
|
+
// Require authentication
|
|
30
|
+
await requireAuth('log');
|
|
31
|
+
// Get session directory
|
|
32
|
+
const ginkoDir = await getGinkoDir();
|
|
33
|
+
const userEmail = await getUserEmail();
|
|
34
|
+
const userSlug = userEmail.replace('@', '-at-').replace(/\./g, '-');
|
|
35
|
+
const sessionDir = path.join(ginkoDir, 'sessions', userSlug);
|
|
36
|
+
// Check if session log exists
|
|
37
|
+
const hasLog = await SessionLogManager.hasSessionLog(sessionDir);
|
|
38
|
+
if (!hasLog) {
|
|
39
|
+
console.error(chalk.red('ā No active session log found.'));
|
|
40
|
+
console.error(chalk.dim(' Run `ginko start` first to create a session.'));
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
// Initialize WriteDispatcher for graph writes (if enabled)
|
|
44
|
+
await initializeWriteDispatcher(ginkoDir);
|
|
45
|
+
// Handle --validate flag: check log quality
|
|
46
|
+
if (options.validate) {
|
|
47
|
+
await validateSessionLog(sessionDir);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
// Handle --show flag: display current session log
|
|
51
|
+
if (options.show) {
|
|
52
|
+
await showSessionLog(sessionDir);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
// Handle --refs flag: show all references in session
|
|
56
|
+
if (options.refs) {
|
|
57
|
+
await showSessionReferences(sessionDir);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
// Parse and validate category
|
|
61
|
+
let category = (options.category || 'feature');
|
|
62
|
+
const validCategories = ['fix', 'feature', 'decision', 'insight', 'git', 'achievement'];
|
|
63
|
+
if (!validCategories.includes(category)) {
|
|
64
|
+
console.error(chalk.red(`ā Invalid category: ${category}`));
|
|
65
|
+
console.error(chalk.dim(` Valid categories: ${validCategories.join(', ')}`));
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
// Parse and validate impact
|
|
69
|
+
let impact = (options.impact || 'medium');
|
|
70
|
+
const validImpacts = ['high', 'medium', 'low'];
|
|
71
|
+
if (!validImpacts.includes(impact)) {
|
|
72
|
+
console.error(chalk.red(`ā Invalid impact: ${impact}`));
|
|
73
|
+
console.error(chalk.dim(` Valid impacts: ${validImpacts.join(', ')}`));
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
// Enhanced description with interactive prompts (unless --quick mode)
|
|
77
|
+
let enhancedDescription = description;
|
|
78
|
+
if (!options.quick) {
|
|
79
|
+
// Prompt for WHY on features
|
|
80
|
+
if (category === 'feature' && options.why !== false) {
|
|
81
|
+
console.log(chalk.cyan('\nš” Quality Tip: Feature entries should explain WHY (what problem it solves)\n'));
|
|
82
|
+
const answer = await prompts({
|
|
83
|
+
type: 'text',
|
|
84
|
+
name: 'why',
|
|
85
|
+
message: 'What problem does this feature solve?',
|
|
86
|
+
initial: ''
|
|
87
|
+
});
|
|
88
|
+
if (answer.why && answer.why.trim()) {
|
|
89
|
+
enhancedDescription += `\nProblem: ${answer.why.trim()}`;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Prompt for alternatives on decisions
|
|
93
|
+
if (category === 'decision') {
|
|
94
|
+
console.log(chalk.cyan('\nš” Quality Tip: Decision entries should mention alternatives considered\n'));
|
|
95
|
+
const answer = await prompts({
|
|
96
|
+
type: 'text',
|
|
97
|
+
name: 'alternatives',
|
|
98
|
+
message: 'What alternatives were considered?',
|
|
99
|
+
initial: ''
|
|
100
|
+
});
|
|
101
|
+
if (answer.alternatives && answer.alternatives.trim()) {
|
|
102
|
+
enhancedDescription += `\nAlternatives: ${answer.alternatives.trim()}`;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Prompt for root cause on fixes
|
|
106
|
+
if (category === 'fix') {
|
|
107
|
+
console.log(chalk.cyan('\nš” Quality Tip: Fix entries should include root cause\n'));
|
|
108
|
+
const answer = await prompts({
|
|
109
|
+
type: 'text',
|
|
110
|
+
name: 'rootCause',
|
|
111
|
+
message: 'What was the root cause?',
|
|
112
|
+
initial: ''
|
|
113
|
+
});
|
|
114
|
+
if (answer.rootCause && answer.rootCause.trim()) {
|
|
115
|
+
enhancedDescription += `\nRoot cause: ${answer.rootCause.trim()}`;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Auto-detect files from git if not provided
|
|
120
|
+
let files = options.files
|
|
121
|
+
? options.files.split(',').map(f => f.trim())
|
|
122
|
+
: undefined;
|
|
123
|
+
if (!files || files.length === 0) {
|
|
124
|
+
const detectedFiles = await autoDetectFiles();
|
|
125
|
+
if (detectedFiles.length > 0 && !options.quick) {
|
|
126
|
+
console.log(chalk.cyan(`\nš Detected ${detectedFiles.length} modified files from git\n`));
|
|
127
|
+
const answer = await prompts({
|
|
128
|
+
type: 'confirm',
|
|
129
|
+
name: 'useDetected',
|
|
130
|
+
message: 'Include these files in the log entry?',
|
|
131
|
+
initial: true
|
|
132
|
+
});
|
|
133
|
+
if (answer.useDetected) {
|
|
134
|
+
files = detectedFiles.slice(0, 5); // Limit to 5 most relevant
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Auto-detect references from description (TASK-010)
|
|
139
|
+
const references = extractReferences(enhancedDescription);
|
|
140
|
+
if (references.length > 0 && !options.quick) {
|
|
141
|
+
console.log(chalk.cyan(`\nš Detected ${references.length} reference(s): ${references.map(r => r.rawText).join(', ')}\n`));
|
|
142
|
+
// Validate references asynchronously (non-blocking)
|
|
143
|
+
const refValidation = await validateReferences(references);
|
|
144
|
+
if (refValidation.broken.length > 0) {
|
|
145
|
+
console.log(chalk.yellow('ā ļø Some references could not be resolved:'));
|
|
146
|
+
for (const brokenRef of refValidation.broken) {
|
|
147
|
+
console.log(chalk.dim(` - ${brokenRef.rawText} (target not found)`));
|
|
148
|
+
}
|
|
149
|
+
console.log(chalk.dim('\n This is just a warning - logging will continue.\n'));
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// Create log entry
|
|
153
|
+
const entry = {
|
|
154
|
+
timestamp: new Date().toISOString(),
|
|
155
|
+
category,
|
|
156
|
+
description: enhancedDescription,
|
|
157
|
+
files,
|
|
158
|
+
impact
|
|
159
|
+
};
|
|
160
|
+
// Validate entry quality
|
|
161
|
+
const validation = validateEntry(entry);
|
|
162
|
+
if (validation.warnings.length > 0 && !options.quick) {
|
|
163
|
+
console.log(chalk.yellow('\nā ļø Quality Warnings:'));
|
|
164
|
+
for (const warning of validation.warnings) {
|
|
165
|
+
console.log(chalk.dim(` - ${warning}`));
|
|
166
|
+
}
|
|
167
|
+
const answer = await prompts({
|
|
168
|
+
type: 'confirm',
|
|
169
|
+
name: 'continue',
|
|
170
|
+
message: 'Continue with this entry?',
|
|
171
|
+
initial: true
|
|
172
|
+
});
|
|
173
|
+
if (!answer.continue) {
|
|
174
|
+
console.log(chalk.yellow('Entry cancelled.'));
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// Append to session log (via dispatcher if enabled, local fallback)
|
|
179
|
+
await appendLogEntry(sessionDir, entry, userEmail);
|
|
180
|
+
// ALSO log to event stream (ADR-043 dual-write)
|
|
181
|
+
try {
|
|
182
|
+
const eventEntry = {
|
|
183
|
+
category,
|
|
184
|
+
description: enhancedDescription,
|
|
185
|
+
files,
|
|
186
|
+
impact,
|
|
187
|
+
shared: options.shared || false
|
|
188
|
+
};
|
|
189
|
+
await logEventToStream(eventEntry);
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
// Event stream logging is non-critical, don't block on failure
|
|
193
|
+
console.warn(chalk.yellow('ā Event stream logging failed (session log preserved)'));
|
|
194
|
+
console.warn(chalk.dim(` ${error instanceof Error ? error.message : String(error)}`));
|
|
195
|
+
}
|
|
196
|
+
console.log(chalk.green(`\nā Logged ${category} event`));
|
|
197
|
+
if (files && files.length > 0) {
|
|
198
|
+
console.log(chalk.dim(` Files: ${files.join(', ')}`));
|
|
199
|
+
}
|
|
200
|
+
console.log(chalk.dim(` Impact: ${impact}`));
|
|
201
|
+
// Show reference chains if detected
|
|
202
|
+
if (references.length > 0) {
|
|
203
|
+
console.log(chalk.dim(` References: ${references.map(r => r.rawText).join(', ')}`));
|
|
204
|
+
}
|
|
205
|
+
// Check if this entry should be promoted to a context module
|
|
206
|
+
if (!options.quick) {
|
|
207
|
+
await promptForContextModule(entry, ginkoDir, sessionDir);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
console.error(chalk.red('Error logging event:'), error instanceof Error ? error.message : String(error));
|
|
212
|
+
process.exit(1);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Prompt user to create a context module from high-value log entry
|
|
217
|
+
*/
|
|
218
|
+
async function promptForContextModule(entry, ginkoDir, sessionDir) {
|
|
219
|
+
// Step 1: Detect if entry qualifies for promotion
|
|
220
|
+
const shouldPrompt = detectInsightPromotion(entry);
|
|
221
|
+
if (!shouldPrompt) {
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
console.log(chalk.cyan('\nš¦ This looks like valuable team knowledge!'));
|
|
225
|
+
const confirmAnswer = await prompts({
|
|
226
|
+
type: 'confirm',
|
|
227
|
+
name: 'create',
|
|
228
|
+
message: 'Create context module?',
|
|
229
|
+
initial: true
|
|
230
|
+
});
|
|
231
|
+
if (!confirmAnswer.create) {
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
// Step 2: Gather additional context from user
|
|
235
|
+
const answers = await prompts([
|
|
236
|
+
{
|
|
237
|
+
type: 'text',
|
|
238
|
+
name: 'title',
|
|
239
|
+
message: 'Module title (brief, descriptive):',
|
|
240
|
+
initial: extractTitle(entry.description),
|
|
241
|
+
validate: (input) => input.length > 0 || 'Title is required'
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
type: 'text',
|
|
245
|
+
name: 'problem',
|
|
246
|
+
message: 'What problem does this solve?',
|
|
247
|
+
validate: (input) => input.length > 0 || 'Problem description is required'
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
type: 'text',
|
|
251
|
+
name: 'solution',
|
|
252
|
+
message: 'What is the solution/approach?',
|
|
253
|
+
validate: (input) => input.length > 0 || 'Solution description is required'
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
type: 'number',
|
|
257
|
+
name: 'timeSaving',
|
|
258
|
+
message: 'Estimated time saving for future use (minutes):',
|
|
259
|
+
initial: 60,
|
|
260
|
+
validate: (input) => input > 0 || 'Time saving must be positive'
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
type: 'text',
|
|
264
|
+
name: 'tags',
|
|
265
|
+
message: 'Tags (comma-separated):',
|
|
266
|
+
initial: extractTags(entry)
|
|
267
|
+
}
|
|
268
|
+
]);
|
|
269
|
+
// Process tags manually since prompts doesn't have a filter option
|
|
270
|
+
const tags = typeof answers.tags === 'string'
|
|
271
|
+
? answers.tags.split(',').map(t => t.trim()).filter(t => t.length > 0)
|
|
272
|
+
: answers.tags;
|
|
273
|
+
// Step 3: Convert LogEntry to SessionInsight
|
|
274
|
+
const insight = {
|
|
275
|
+
id: uuidv4(),
|
|
276
|
+
type: mapCategoryToInsightType(entry.category),
|
|
277
|
+
title: answers.title,
|
|
278
|
+
problem: answers.problem,
|
|
279
|
+
solution: answers.solution,
|
|
280
|
+
impact: entry.description,
|
|
281
|
+
reusabilityScore: entry.impact === 'high' ? 0.85 : 0.75,
|
|
282
|
+
timeSavingPotential: answers.timeSaving,
|
|
283
|
+
relevanceScore: 0.9,
|
|
284
|
+
tags: tags,
|
|
285
|
+
relatedFiles: entry.files,
|
|
286
|
+
sessionId: await getSessionId(sessionDir),
|
|
287
|
+
timestamp: new Date(entry.timestamp)
|
|
288
|
+
};
|
|
289
|
+
// Step 4: Generate module using ModuleGenerator
|
|
290
|
+
try {
|
|
291
|
+
const generator = new ModuleGenerator(ginkoDir);
|
|
292
|
+
await generator.initialize();
|
|
293
|
+
const result = await generator.generateModules([insight]);
|
|
294
|
+
if (result.created.length > 0) {
|
|
295
|
+
const module = result.created[0];
|
|
296
|
+
console.log(chalk.green(`\nā Context module created: ${module.filename}`));
|
|
297
|
+
console.log(chalk.dim('š Available to all team members in next session\n'));
|
|
298
|
+
}
|
|
299
|
+
else if (result.skipped.length > 0) {
|
|
300
|
+
const skip = result.skipped[0];
|
|
301
|
+
console.log(chalk.yellow(`\nā ļø Module creation skipped: ${skip.reason}`));
|
|
302
|
+
if (skip.existingModule) {
|
|
303
|
+
console.log(chalk.dim(` Similar module exists: ${skip.existingModule}\n`));
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
catch (error) {
|
|
308
|
+
console.error(chalk.red('Error creating context module:'), error instanceof Error ? error.message : String(error));
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Detect if log entry should trigger context module promotion
|
|
313
|
+
*/
|
|
314
|
+
function detectInsightPromotion(entry) {
|
|
315
|
+
// Detect by category
|
|
316
|
+
const promotionCategories = ['insight', 'decision'];
|
|
317
|
+
if (promotionCategories.includes(entry.category)) {
|
|
318
|
+
return true;
|
|
319
|
+
}
|
|
320
|
+
// Detect by impact level
|
|
321
|
+
if (entry.impact === 'high') {
|
|
322
|
+
return true;
|
|
323
|
+
}
|
|
324
|
+
// Detect by keywords in description
|
|
325
|
+
const keywords = [
|
|
326
|
+
'discovered',
|
|
327
|
+
'pattern',
|
|
328
|
+
'breakthrough',
|
|
329
|
+
'game changer',
|
|
330
|
+
'significant',
|
|
331
|
+
'profound',
|
|
332
|
+
'brilliant',
|
|
333
|
+
'critical insight',
|
|
334
|
+
'key learning',
|
|
335
|
+
'important finding'
|
|
336
|
+
];
|
|
337
|
+
const lowerDesc = entry.description.toLowerCase();
|
|
338
|
+
return keywords.some(keyword => lowerDesc.includes(keyword));
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Extract a title from description (first sentence or key phrase)
|
|
342
|
+
*/
|
|
343
|
+
function extractTitle(description) {
|
|
344
|
+
// Try to extract first sentence
|
|
345
|
+
const firstSentence = description.split(/[.!?]/)[0];
|
|
346
|
+
// Truncate if too long
|
|
347
|
+
if (firstSentence.length > 60) {
|
|
348
|
+
return firstSentence.substring(0, 57) + '...';
|
|
349
|
+
}
|
|
350
|
+
return firstSentence;
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Extract tags from log entry context
|
|
354
|
+
*/
|
|
355
|
+
function extractTags(entry) {
|
|
356
|
+
const tags = [entry.category];
|
|
357
|
+
// Add impact as tag
|
|
358
|
+
if (entry.impact !== 'medium') {
|
|
359
|
+
tags.push(entry.impact);
|
|
360
|
+
}
|
|
361
|
+
// Extract technology keywords from description
|
|
362
|
+
const techKeywords = [
|
|
363
|
+
'typescript', 'javascript', 'react', 'nextjs', 'vercel',
|
|
364
|
+
'supabase', 'postgres', 'api', 'cli', 'git', 'auth',
|
|
365
|
+
'testing', 'performance', 'security', 'database'
|
|
366
|
+
];
|
|
367
|
+
const lowerDesc = entry.description.toLowerCase();
|
|
368
|
+
for (const keyword of techKeywords) {
|
|
369
|
+
if (lowerDesc.includes(keyword)) {
|
|
370
|
+
tags.push(keyword);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
return tags.slice(0, 5).join(', '); // Limit to 5 tags
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Map log category to insight type
|
|
377
|
+
*/
|
|
378
|
+
function mapCategoryToInsightType(category) {
|
|
379
|
+
const mapping = {
|
|
380
|
+
insight: 'discovery',
|
|
381
|
+
decision: 'decision',
|
|
382
|
+
fix: 'gotcha',
|
|
383
|
+
feature: 'pattern',
|
|
384
|
+
git: 'configuration',
|
|
385
|
+
achievement: 'discovery'
|
|
386
|
+
};
|
|
387
|
+
return mapping[category] || 'discovery';
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Get current session ID from session directory
|
|
391
|
+
*/
|
|
392
|
+
async function getSessionId(sessionDir) {
|
|
393
|
+
try {
|
|
394
|
+
const logContent = await SessionLogManager.loadSessionLog(sessionDir);
|
|
395
|
+
const sessionIdMatch = logContent.match(/Session ID: `([^`]+)`/);
|
|
396
|
+
if (sessionIdMatch) {
|
|
397
|
+
return sessionIdMatch[1];
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
catch {
|
|
401
|
+
// Fall back to generating from directory
|
|
402
|
+
}
|
|
403
|
+
// Generate from directory path
|
|
404
|
+
const sessionName = path.basename(sessionDir);
|
|
405
|
+
return `session-${sessionName}-${Date.now()}`;
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Show current session log with quality score
|
|
409
|
+
*/
|
|
410
|
+
async function showSessionLog(sessionDir) {
|
|
411
|
+
const logContent = await SessionLogManager.loadSessionLog(sessionDir);
|
|
412
|
+
if (!logContent || logContent.length < 100) {
|
|
413
|
+
console.log(chalk.yellow('ā ļø Session log is empty'));
|
|
414
|
+
console.log(chalk.dim(' No events logged yet in this session.'));
|
|
415
|
+
return;
|
|
416
|
+
}
|
|
417
|
+
console.log(chalk.cyan('\nš Current Session Log:\n'));
|
|
418
|
+
console.log(logContent);
|
|
419
|
+
console.log('');
|
|
420
|
+
// Show summary statistics
|
|
421
|
+
const summary = SessionLogManager.getSummary(logContent);
|
|
422
|
+
console.log(chalk.cyan('š Summary:'));
|
|
423
|
+
console.log(chalk.dim(` Total entries: ${summary.totalEntries}`));
|
|
424
|
+
console.log(chalk.dim(` Files affected: ${summary.filesAffected}`));
|
|
425
|
+
if (Object.keys(summary.byCategory).length > 0) {
|
|
426
|
+
console.log(chalk.dim(' By category:'));
|
|
427
|
+
for (const [cat, count] of Object.entries(summary.byCategory)) {
|
|
428
|
+
console.log(chalk.dim(` - ${cat}: ${count}`));
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
// Show quality score
|
|
432
|
+
const quality = scoreSessionLog(logContent);
|
|
433
|
+
const scoreColor = quality.score >= 9 ? chalk.green : quality.score >= 7 ? chalk.yellow : chalk.red;
|
|
434
|
+
console.log(chalk.cyan('\nšÆ Quality Score:'));
|
|
435
|
+
console.log(scoreColor(` ${quality.score.toFixed(1)}/10`));
|
|
436
|
+
// Show quality breakdown
|
|
437
|
+
console.log(chalk.dim('\n Quality Checks:'));
|
|
438
|
+
console.log(quality.hasRootCauses ? chalk.green(' ā Fix entries have root causes') : chalk.yellow(' ā Some fixes missing root causes'));
|
|
439
|
+
console.log(quality.hasWhyForFeatures ? chalk.green(' ā Features explain WHY') : chalk.yellow(' ā Some features missing WHY'));
|
|
440
|
+
console.log(quality.hasAlternatives ? chalk.green(' ā Decisions include alternatives') : chalk.yellow(' ā Some decisions missing alternatives'));
|
|
441
|
+
console.log(quality.hasInsights ? chalk.green(' ā Insights documented') : chalk.dim(' - No insights yet (optional)'));
|
|
442
|
+
console.log(quality.hasGitOps ? chalk.green(' ā Git operations logged') : chalk.dim(' - No git operations yet (optional)'));
|
|
443
|
+
if (quality.terseEntries > 0) {
|
|
444
|
+
console.log(chalk.yellow(` ā ${quality.terseEntries} terse entries (<15 words)`));
|
|
445
|
+
}
|
|
446
|
+
// Show suggestions
|
|
447
|
+
const insights = suggestInsights(logContent);
|
|
448
|
+
if (insights.length > 0) {
|
|
449
|
+
console.log(chalk.cyan('\nš” Suggestions:'));
|
|
450
|
+
for (const insight of insights) {
|
|
451
|
+
console.log(chalk.dim(` ⢠${insight}`));
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
console.log('');
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* Validate current session log quality
|
|
458
|
+
*/
|
|
459
|
+
async function validateSessionLog(sessionDir) {
|
|
460
|
+
const logContent = await SessionLogManager.loadSessionLog(sessionDir);
|
|
461
|
+
if (!logContent || logContent.length < 100) {
|
|
462
|
+
console.log(chalk.yellow('ā ļø Session log is empty'));
|
|
463
|
+
console.log(chalk.dim(' No events logged yet in this session.'));
|
|
464
|
+
return;
|
|
465
|
+
}
|
|
466
|
+
console.log(chalk.cyan('\nš Validating Session Log Quality...\n'));
|
|
467
|
+
const quality = scoreSessionLog(logContent);
|
|
468
|
+
const scoreColor = quality.score >= 9 ? chalk.green : quality.score >= 7 ? chalk.yellow : chalk.red;
|
|
469
|
+
console.log(chalk.cyan('Quality Score:'));
|
|
470
|
+
console.log(scoreColor(` ${quality.score.toFixed(1)}/10\n`));
|
|
471
|
+
// Show detailed breakdown
|
|
472
|
+
console.log(chalk.cyan('Quality Breakdown:'));
|
|
473
|
+
const summary = SessionLogManager.getSummary(logContent);
|
|
474
|
+
console.log(quality.hasRootCauses ? chalk.green(' ā Fix entries have root causes') : chalk.red(' ā Some fixes missing root causes'));
|
|
475
|
+
console.log(quality.hasWhyForFeatures ? chalk.green(' ā Features explain WHY (problem solved)') : chalk.red(' ā Some features missing WHY'));
|
|
476
|
+
console.log(quality.hasAlternatives ? chalk.green(' ā Decisions include alternatives') : chalk.red(' ā Some decisions missing alternatives'));
|
|
477
|
+
console.log(quality.hasInsights ? chalk.green(' ā Insights documented') : chalk.yellow(' - No insights captured (consider documenting learnings)'));
|
|
478
|
+
console.log(quality.hasGitOps ? chalk.green(' ā Git operations logged') : chalk.yellow(' - No git operations logged (optional)'));
|
|
479
|
+
if (quality.terseEntries > 0) {
|
|
480
|
+
console.log(chalk.yellow(` ā ${quality.terseEntries} terse entries (<15 words)`));
|
|
481
|
+
}
|
|
482
|
+
// Show suggestions
|
|
483
|
+
if (quality.suggestions.length > 0) {
|
|
484
|
+
console.log(chalk.cyan('\nš Recommendations:'));
|
|
485
|
+
for (const suggestion of quality.suggestions) {
|
|
486
|
+
console.log(chalk.dim(` ⢠${suggestion}`));
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
// Suggest insights from patterns
|
|
490
|
+
const insightSuggestions = suggestInsights(logContent);
|
|
491
|
+
if (insightSuggestions.length > 0) {
|
|
492
|
+
console.log(chalk.cyan('\nš” Insight Opportunities:'));
|
|
493
|
+
for (const insight of insightSuggestions) {
|
|
494
|
+
console.log(chalk.dim(` ⢠${insight}`));
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
// Show git context
|
|
498
|
+
const gitContext = await detectGitContext();
|
|
499
|
+
if (gitContext.recentCommits.length > 0) {
|
|
500
|
+
console.log(chalk.cyan('\nš Recent Git Activity (not yet logged):'));
|
|
501
|
+
for (const commit of gitContext.recentCommits.slice(0, 3)) {
|
|
502
|
+
console.log(chalk.dim(` ⢠${commit}`));
|
|
503
|
+
}
|
|
504
|
+
console.log(chalk.dim('\n Tip: Log significant commits with --category=git'));
|
|
505
|
+
}
|
|
506
|
+
console.log('');
|
|
507
|
+
}
|
|
508
|
+
/**
|
|
509
|
+
* Show all references in current session log (TASK-010)
|
|
510
|
+
*/
|
|
511
|
+
async function showSessionReferences(sessionDir) {
|
|
512
|
+
const logContent = await SessionLogManager.loadSessionLog(sessionDir);
|
|
513
|
+
if (!logContent || logContent.length < 100) {
|
|
514
|
+
console.log(chalk.yellow('ā ļø Session log is empty'));
|
|
515
|
+
console.log(chalk.dim(' No events logged yet in this session.'));
|
|
516
|
+
return;
|
|
517
|
+
}
|
|
518
|
+
console.log(chalk.cyan('\nš Session References:\n'));
|
|
519
|
+
// Extract all references from session log
|
|
520
|
+
const references = extractReferences(logContent);
|
|
521
|
+
if (references.length === 0) {
|
|
522
|
+
console.log(chalk.dim(' No references found in this session.'));
|
|
523
|
+
console.log(chalk.dim('\n Tip: Use reference syntax like TASK-006, PRD-009, ADR-033 in log descriptions\n'));
|
|
524
|
+
return;
|
|
525
|
+
}
|
|
526
|
+
console.log(chalk.dim(` Found ${references.length} reference(s):\n`));
|
|
527
|
+
// Group by type
|
|
528
|
+
const byType = {};
|
|
529
|
+
for (const ref of references) {
|
|
530
|
+
if (!byType[ref.type])
|
|
531
|
+
byType[ref.type] = [];
|
|
532
|
+
if (!byType[ref.type].includes(ref.rawText)) {
|
|
533
|
+
byType[ref.type].push(ref.rawText);
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
// Display grouped references
|
|
537
|
+
for (const [type, refs] of Object.entries(byType)) {
|
|
538
|
+
console.log(chalk.cyan(` ${type.toUpperCase()}:`));
|
|
539
|
+
for (const ref of refs) {
|
|
540
|
+
console.log(chalk.dim(` - ${ref}`));
|
|
541
|
+
}
|
|
542
|
+
console.log('');
|
|
543
|
+
}
|
|
544
|
+
// Validate all references
|
|
545
|
+
console.log(chalk.cyan(' Validating references...\n'));
|
|
546
|
+
const validation = await validateReferences(references);
|
|
547
|
+
if (validation.valid.length > 0) {
|
|
548
|
+
console.log(chalk.green(` ā ${validation.valid.length} valid reference(s)`));
|
|
549
|
+
}
|
|
550
|
+
if (validation.broken.length > 0) {
|
|
551
|
+
console.log(chalk.yellow(` ā ${validation.broken.length} broken reference(s):`));
|
|
552
|
+
for (const brokenRef of validation.broken) {
|
|
553
|
+
console.log(chalk.dim(` - ${brokenRef.rawText} (target not found)`));
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
// Show reference chains for key references
|
|
557
|
+
if (validation.valid.length > 0) {
|
|
558
|
+
console.log(chalk.cyan('\n Reference Chains:\n'));
|
|
559
|
+
// Show chains for first 3 valid references
|
|
560
|
+
for (const validRef of validation.valid.slice(0, 3)) {
|
|
561
|
+
try {
|
|
562
|
+
const chain = await getReferenceChain(validRef, 2);
|
|
563
|
+
const formatted = formatReferenceChain(chain);
|
|
564
|
+
console.log(chalk.dim(` ${formatted}`));
|
|
565
|
+
}
|
|
566
|
+
catch {
|
|
567
|
+
// Skip if chain extraction fails
|
|
568
|
+
continue;
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
if (validation.valid.length > 3) {
|
|
572
|
+
console.log(chalk.dim(` ... and ${validation.valid.length - 3} more`));
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
console.log('');
|
|
576
|
+
}
|
|
577
|
+
/**
|
|
578
|
+
* Show examples of logging events
|
|
579
|
+
*/
|
|
580
|
+
export function logExamples() {
|
|
581
|
+
console.log(chalk.cyan('\nSession Logging Examples:\n'));
|
|
582
|
+
console.log(chalk.white('# Interactive mode (prompts for WHY, alternatives, etc.)'));
|
|
583
|
+
console.log(chalk.dim(' ginko log "Implemented --show flag" --category=feature\n'));
|
|
584
|
+
console.log(chalk.white('# Quick mode (skip prompts for speed)'));
|
|
585
|
+
console.log(chalk.dim(' ginko log "Fixed timeout" --category=fix --quick\n'));
|
|
586
|
+
console.log(chalk.white('# Validate session log quality'));
|
|
587
|
+
console.log(chalk.dim(' ginko log --validate\n'));
|
|
588
|
+
console.log(chalk.white('# Show current log with quality score'));
|
|
589
|
+
console.log(chalk.dim(' ginko log --show\n'));
|
|
590
|
+
console.log(chalk.white('# Show all references in session'));
|
|
591
|
+
console.log(chalk.dim(' ginko log --refs\n'));
|
|
592
|
+
console.log(chalk.cyan('Quality-Focused Examples:\n'));
|
|
593
|
+
console.log(chalk.green('GOOD') + chalk.white(' - Fix with root cause:'));
|
|
594
|
+
console.log(chalk.dim(' ginko log "Fixed auth timeout. Root cause: bcrypt rounds too high" --category=fix\n'));
|
|
595
|
+
console.log(chalk.red('BAD') + chalk.white(' - Fix without root cause:'));
|
|
596
|
+
console.log(chalk.dim(' ginko log "Fixed auth timeout" --category=fix\n'));
|
|
597
|
+
console.log(chalk.green('GOOD') + chalk.white(' - Feature with WHY:'));
|
|
598
|
+
console.log(chalk.dim(' ginko log "Added --validate flag to check log quality for better handoffs" --category=feature\n'));
|
|
599
|
+
console.log(chalk.red('BAD') + chalk.white(' - Feature without WHY:'));
|
|
600
|
+
console.log(chalk.dim(' ginko log "Added --validate flag" --category=feature\n'));
|
|
601
|
+
console.log(chalk.green('GOOD') + chalk.white(' - Decision with alternatives:'));
|
|
602
|
+
console.log(chalk.dim(' ginko log "Chose JWT over sessions. Alternatives: server sessions (harder to scale), OAuth (vendor lock-in)" --category=decision\n'));
|
|
603
|
+
console.log(chalk.red('BAD') + chalk.white(' - Decision without alternatives:'));
|
|
604
|
+
console.log(chalk.dim(' ginko log "Chose JWT for auth" --category=decision\n'));
|
|
605
|
+
console.log(chalk.cyan('Categories:'));
|
|
606
|
+
console.log(chalk.dim(' fix - Bug fixes and error resolution (include root cause)'));
|
|
607
|
+
console.log(chalk.dim(' feature - New functionality (explain WHY/problem solved)'));
|
|
608
|
+
console.log(chalk.dim(' decision - Key decisions (mention alternatives considered)'));
|
|
609
|
+
console.log(chalk.dim(' insight - Patterns, gotchas, learnings discovered'));
|
|
610
|
+
console.log(chalk.dim(' git - Git operations and version control'));
|
|
611
|
+
console.log(chalk.dim(' achievement - Milestones and completions\n'));
|
|
612
|
+
console.log(chalk.cyan('Flags:'));
|
|
613
|
+
console.log(chalk.dim(' --category - Entry category (default: feature)'));
|
|
614
|
+
console.log(chalk.dim(' --impact - Impact level: high, medium, low (default: medium)'));
|
|
615
|
+
console.log(chalk.dim(' --files - Comma-separated file paths (or auto-detected)'));
|
|
616
|
+
console.log(chalk.dim(' --quick - Skip interactive prompts for speed'));
|
|
617
|
+
console.log(chalk.dim(' --why - Force WHY prompt (useful for features)'));
|
|
618
|
+
console.log(chalk.dim(' --shared - Mark event for team visibility (synced to graph)'));
|
|
619
|
+
console.log(chalk.dim(' --show - Display current log with quality score'));
|
|
620
|
+
console.log(chalk.dim(' --validate - Check log quality and get suggestions'));
|
|
621
|
+
console.log(chalk.dim(' --refs - Show all references in session with validation\n'));
|
|
622
|
+
console.log(chalk.cyan('Reference Linking (TASK-010):\n'));
|
|
623
|
+
console.log(chalk.dim(' Use reference syntax in descriptions to link to other documents:'));
|
|
624
|
+
console.log(chalk.dim(' - TASK-XXX ā backlog/items/TASK-XXX.md'));
|
|
625
|
+
console.log(chalk.dim(' - PRD-YYY ā docs/PRD/PRD-YYY-*.md'));
|
|
626
|
+
console.log(chalk.dim(' - ADR-ZZZ ā docs/adr/ADR-ZZZ-*.md'));
|
|
627
|
+
console.log(chalk.dim(' - FEATURE-NNN ā backlog/items/FEATURE-NNN-*.md'));
|
|
628
|
+
console.log(chalk.dim(' - SPRINT-* ā docs/sprints/SPRINT-*.md\n'));
|
|
629
|
+
console.log(chalk.green(' Example with references:'));
|
|
630
|
+
console.log(chalk.dim(' ginko log "Fixed TASK-006 per PRD-009 and ADR-033" --category=fix\n'));
|
|
631
|
+
}
|
|
632
|
+
//# sourceMappingURL=log.js.map
|