prjct-cli 1.22.0 → 1.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +230 -0
- package/bin/prjct +30 -13
- package/dist/bin/prjct-core.mjs +1748 -0
- package/dist/bin/prjct.mjs +17 -36672
- package/dist/cli/linear.mjs +14 -0
- package/dist/daemon/entry.mjs +1429 -0
- package/dist/templates.json +1 -0
- package/package.json +4 -5
- package/bin/prjct.ts +0 -342
- package/core/__tests__/agentic/analysis-injection.test.ts +0 -377
- package/core/__tests__/agentic/cache-eviction.test.ts +0 -294
- package/core/__tests__/agentic/command-context.test.ts +0 -281
- package/core/__tests__/agentic/command-executor.test.ts +0 -659
- package/core/__tests__/agentic/domain-classifier.test.ts +0 -330
- package/core/__tests__/agentic/injection-validator.test.ts +0 -255
- package/core/__tests__/agentic/memory-system.test.ts +0 -281
- package/core/__tests__/agentic/plan-mode.test.ts +0 -386
- package/core/__tests__/agentic/prompt-assembly.test.ts +0 -298
- package/core/__tests__/agentic/prompt-builder.test.ts +0 -243
- package/core/__tests__/agentic/response-validator.test.ts +0 -263
- package/core/__tests__/agentic/semantic-matching.test.ts +0 -131
- package/core/__tests__/agentic/smart-context.test.ts +0 -372
- package/core/__tests__/agentic/tech-normalizer.test.ts +0 -136
- package/core/__tests__/agentic/token-budget.test.ts +0 -294
- package/core/__tests__/ai-tools/formatters.test.ts +0 -476
- package/core/__tests__/domain/bm25.test.ts +0 -225
- package/core/__tests__/domain/change-propagator.test.ts +0 -100
- package/core/__tests__/domain/fibonacci.test.ts +0 -113
- package/core/__tests__/domain/file-hasher.test.ts +0 -146
- package/core/__tests__/domain/file-ranker.test.ts +0 -169
- package/core/__tests__/domain/git-cochange.test.ts +0 -121
- package/core/__tests__/domain/import-graph.test.ts +0 -156
- package/core/__tests__/domain/velocity.test.ts +0 -623
- package/core/__tests__/infrastructure/performance-tracker.test.ts +0 -328
- package/core/__tests__/schemas/model.test.ts +0 -272
- package/core/__tests__/services/dependency-validator.test.ts +0 -175
- package/core/__tests__/services/hierarchical-agent-resolver.test.ts +0 -359
- package/core/__tests__/services/nested-context-resolver.test.ts +0 -443
- package/core/__tests__/services/project-index.test.ts +0 -355
- package/core/__tests__/services/staleness-checker.test.ts +0 -204
- package/core/__tests__/storage/analysis-storage.test.ts +0 -641
- package/core/__tests__/storage/archive-storage.test.ts +0 -455
- package/core/__tests__/storage/safe-reader.test.ts +0 -262
- package/core/__tests__/storage/sqlite-migration.test.ts +0 -1016
- package/core/__tests__/storage/state-storage-feedback.test.ts +0 -463
- package/core/__tests__/storage/state-storage-history.test.ts +0 -469
- package/core/__tests__/storage/storage-manager.test.ts +0 -383
- package/core/__tests__/storage/subtask-handoff.test.ts +0 -237
- package/core/__tests__/types/fs.test.ts +0 -125
- package/core/__tests__/utils/date-helper.test.ts +0 -449
- package/core/__tests__/utils/output.test.ts +0 -278
- package/core/__tests__/utils/preserve-sections.test.ts +0 -216
- package/core/__tests__/utils/project-commands.test.ts +0 -71
- package/core/__tests__/utils/retry.test.ts +0 -381
- package/core/__tests__/workflow/state-machine.test.ts +0 -216
- package/core/agentic/agent-router.ts +0 -150
- package/core/agentic/anti-hallucination.ts +0 -141
- package/core/agentic/chain-of-thought.ts +0 -234
- package/core/agentic/command-classifier.ts +0 -141
- package/core/agentic/command-context.ts +0 -168
- package/core/agentic/command-executor.ts +0 -471
- package/core/agentic/context-builder.ts +0 -285
- package/core/agentic/domain-classifier.ts +0 -525
- package/core/agentic/environment-block.ts +0 -102
- package/core/agentic/ground-truth.ts +0 -706
- package/core/agentic/index.ts +0 -193
- package/core/agentic/injection-validator.ts +0 -208
- package/core/agentic/loop-detector.ts +0 -451
- package/core/agentic/memory-system.ts +0 -1547
- package/core/agentic/orchestrator-executor.ts +0 -579
- package/core/agentic/plan-mode.ts +0 -525
- package/core/agentic/prompt-builder.ts +0 -1069
- package/core/agentic/response-validator.ts +0 -98
- package/core/agentic/services.ts +0 -167
- package/core/agentic/skill-loader.ts +0 -106
- package/core/agentic/smart-context.ts +0 -393
- package/core/agentic/tech-normalizer.ts +0 -167
- package/core/agentic/template-executor.ts +0 -272
- package/core/agentic/template-loader.ts +0 -109
- package/core/agentic/token-budget.ts +0 -226
- package/core/agentic/tool-registry.ts +0 -146
- package/core/agents/index.ts +0 -28
- package/core/agents/performance.ts +0 -429
- package/core/ai-tools/formatters.ts +0 -341
- package/core/ai-tools/generator.ts +0 -144
- package/core/ai-tools/index.ts +0 -15
- package/core/ai-tools/registry.ts +0 -201
- package/core/bus/bus.ts +0 -314
- package/core/bus/index.ts +0 -8
- package/core/cli/linear.ts +0 -500
- package/core/cli/lint-meta-commentary.ts +0 -177
- package/core/cli/start.ts +0 -386
- package/core/commands/analysis.ts +0 -1274
- package/core/commands/analytics.ts +0 -342
- package/core/commands/base.ts +0 -118
- package/core/commands/cleanup.ts +0 -157
- package/core/commands/command-data.ts +0 -463
- package/core/commands/commands.ts +0 -306
- package/core/commands/context.ts +0 -238
- package/core/commands/design.ts +0 -77
- package/core/commands/index.ts +0 -19
- package/core/commands/maintenance.ts +0 -77
- package/core/commands/performance.ts +0 -114
- package/core/commands/planning.ts +0 -662
- package/core/commands/register.ts +0 -127
- package/core/commands/registry.ts +0 -444
- package/core/commands/setup.ts +0 -280
- package/core/commands/shipping.ts +0 -267
- package/core/commands/snapshots.ts +0 -297
- package/core/commands/uninstall.ts +0 -542
- package/core/commands/velocity.ts +0 -149
- package/core/commands/workflow.ts +0 -505
- package/core/config/command-context.config.json +0 -66
- package/core/constants/index.ts +0 -379
- package/core/context/generator.ts +0 -368
- package/core/context-tools/files-tool.ts +0 -577
- package/core/context-tools/imports-tool.ts +0 -400
- package/core/context-tools/index.ts +0 -434
- package/core/context-tools/recent-tool.ts +0 -301
- package/core/context-tools/signatures-tool.ts +0 -495
- package/core/context-tools/summary-tool.ts +0 -301
- package/core/context-tools/token-counter.ts +0 -273
- package/core/context-tools/types.ts +0 -253
- package/core/domain/agent-generator.ts +0 -186
- package/core/domain/agent-loader.ts +0 -419
- package/core/domain/analyzer.ts +0 -387
- package/core/domain/architecture-generator.ts +0 -108
- package/core/domain/bm25.ts +0 -525
- package/core/domain/change-propagator.ts +0 -162
- package/core/domain/context-estimator.ts +0 -175
- package/core/domain/fibonacci.ts +0 -128
- package/core/domain/file-hasher.ts +0 -296
- package/core/domain/file-ranker.ts +0 -151
- package/core/domain/git-cochange.ts +0 -250
- package/core/domain/import-graph.ts +0 -315
- package/core/domain/snapshot-manager.ts +0 -415
- package/core/domain/task-stack.ts +0 -578
- package/core/domain/velocity.ts +0 -470
- package/core/errors.ts +0 -335
- package/core/events/events.ts +0 -85
- package/core/events/index.ts +0 -8
- package/core/index.ts +0 -481
- package/core/infrastructure/agent-detector.ts +0 -135
- package/core/infrastructure/ai-provider.ts +0 -578
- package/core/infrastructure/author-detector.ts +0 -133
- package/core/infrastructure/capability-installer.ts +0 -76
- package/core/infrastructure/claude-agent.ts +0 -297
- package/core/infrastructure/command-installer.ts +0 -752
- package/core/infrastructure/config-manager.ts +0 -364
- package/core/infrastructure/editors-config.ts +0 -172
- package/core/infrastructure/path-manager.ts +0 -571
- package/core/infrastructure/performance-tracker.ts +0 -326
- package/core/infrastructure/permission-manager.ts +0 -289
- package/core/infrastructure/setup.ts +0 -1061
- package/core/infrastructure/update-checker.ts +0 -246
- package/core/integrations/issue-tracker/enricher.ts +0 -271
- package/core/integrations/issue-tracker/index.ts +0 -8
- package/core/integrations/issue-tracker/manager.ts +0 -286
- package/core/integrations/issue-tracker/types.ts +0 -310
- package/core/integrations/jira/cache.ts +0 -57
- package/core/integrations/jira/client.ts +0 -688
- package/core/integrations/jira/index.ts +0 -23
- package/core/integrations/jira/service.ts +0 -244
- package/core/integrations/linear/cache.ts +0 -68
- package/core/integrations/linear/client.ts +0 -436
- package/core/integrations/linear/index.ts +0 -20
- package/core/integrations/linear/service.ts +0 -260
- package/core/integrations/linear/sync.ts +0 -314
- package/core/outcomes/analyzer.ts +0 -286
- package/core/outcomes/index.ts +0 -34
- package/core/outcomes/recorder.ts +0 -195
- package/core/plugin/builtin/webhook.ts +0 -148
- package/core/plugin/hooks.ts +0 -315
- package/core/plugin/index.ts +0 -50
- package/core/plugin/loader.ts +0 -354
- package/core/plugin/registry.ts +0 -326
- package/core/schemas/agents.ts +0 -27
- package/core/schemas/analysis.ts +0 -530
- package/core/schemas/classification.ts +0 -91
- package/core/schemas/command-context.ts +0 -29
- package/core/schemas/enriched-task.ts +0 -291
- package/core/schemas/ideas.ts +0 -114
- package/core/schemas/index.ts +0 -53
- package/core/schemas/issues.ts +0 -159
- package/core/schemas/llm-output.ts +0 -170
- package/core/schemas/metrics.ts +0 -143
- package/core/schemas/model.ts +0 -153
- package/core/schemas/outcomes.ts +0 -487
- package/core/schemas/performance.ts +0 -128
- package/core/schemas/permissions.ts +0 -180
- package/core/schemas/prd.ts +0 -450
- package/core/schemas/project.ts +0 -57
- package/core/schemas/roadmap.ts +0 -322
- package/core/schemas/schemas.ts +0 -38
- package/core/schemas/shipped.ts +0 -109
- package/core/schemas/state.ts +0 -284
- package/core/schemas/velocity.ts +0 -103
- package/core/server/index.ts +0 -21
- package/core/server/routes-extended.ts +0 -566
- package/core/server/routes.ts +0 -176
- package/core/server/server.ts +0 -149
- package/core/server/sse.ts +0 -192
- package/core/services/agent-generator.ts +0 -385
- package/core/services/agent-service.ts +0 -168
- package/core/services/breakdown-service.ts +0 -124
- package/core/services/context-generator.ts +0 -445
- package/core/services/context-selector.ts +0 -429
- package/core/services/dependency-validator.ts +0 -318
- package/core/services/diff-generator.ts +0 -313
- package/core/services/doctor-service.ts +0 -423
- package/core/services/file-categorizer.ts +0 -448
- package/core/services/file-scorer.ts +0 -270
- package/core/services/git-analyzer.ts +0 -293
- package/core/services/hierarchical-agent-resolver.ts +0 -236
- package/core/services/hooks-service.ts +0 -685
- package/core/services/index.ts +0 -46
- package/core/services/local-state-generator.ts +0 -158
- package/core/services/memory-service.ts +0 -181
- package/core/services/nested-context-resolver.ts +0 -842
- package/core/services/project-index.ts +0 -911
- package/core/services/project-service.ts +0 -155
- package/core/services/session-tracker.ts +0 -287
- package/core/services/skill-installer.ts +0 -447
- package/core/services/skill-lock.ts +0 -132
- package/core/services/skill-service.ts +0 -306
- package/core/services/stack-detector.ts +0 -229
- package/core/services/staleness-checker.ts +0 -327
- package/core/services/sync-service.ts +0 -1515
- package/core/services/sync-verifier.ts +0 -253
- package/core/services/watch-service.ts +0 -312
- package/core/session/compaction.ts +0 -248
- package/core/session/index.ts +0 -35
- package/core/session/log-migration.ts +0 -88
- package/core/session/metrics.ts +0 -323
- package/core/session/session-log-manager.ts +0 -307
- package/core/session/task-session-manager.ts +0 -404
- package/core/session/utils.ts +0 -51
- package/core/storage/analysis-storage.ts +0 -373
- package/core/storage/archive-storage.ts +0 -205
- package/core/storage/database.ts +0 -575
- package/core/storage/ideas-storage.ts +0 -298
- package/core/storage/index-storage.ts +0 -523
- package/core/storage/index.ts +0 -79
- package/core/storage/metrics-storage.ts +0 -321
- package/core/storage/migrate-json.ts +0 -720
- package/core/storage/queue-storage.ts +0 -336
- package/core/storage/safe-reader.ts +0 -105
- package/core/storage/shipped-storage.ts +0 -253
- package/core/storage/state-storage.ts +0 -1035
- package/core/storage/storage-manager.ts +0 -205
- package/core/storage/storage.ts +0 -177
- package/core/storage/velocity-storage.ts +0 -149
- package/core/sync/auth-config.ts +0 -138
- package/core/sync/index.ts +0 -31
- package/core/sync/oauth-handler.ts +0 -143
- package/core/sync/sync-client.ts +0 -251
- package/core/sync/sync-manager.ts +0 -327
- package/core/tsconfig.json +0 -22
- package/core/types/agentic.ts +0 -760
- package/core/types/agents.ts +0 -150
- package/core/types/bus.ts +0 -193
- package/core/types/citations.ts +0 -22
- package/core/types/commands.ts +0 -399
- package/core/types/config.ts +0 -92
- package/core/types/core.ts +0 -96
- package/core/types/diff.ts +0 -41
- package/core/types/domain.ts +0 -71
- package/core/types/errors.ts +0 -111
- package/core/types/events.ts +0 -42
- package/core/types/fs.ts +0 -72
- package/core/types/index.ts +0 -510
- package/core/types/infrastructure.ts +0 -210
- package/core/types/integrations.ts +0 -31
- package/core/types/jira.ts +0 -51
- package/core/types/logger.ts +0 -17
- package/core/types/memory.ts +0 -313
- package/core/types/outcomes.ts +0 -190
- package/core/types/output.ts +0 -47
- package/core/types/plugin.ts +0 -25
- package/core/types/project-sync.ts +0 -129
- package/core/types/provider.ts +0 -163
- package/core/types/server.ts +0 -71
- package/core/types/services.ts +0 -84
- package/core/types/session.ts +0 -135
- package/core/types/stack.ts +0 -19
- package/core/types/storage.ts +0 -318
- package/core/types/sync-verifier.ts +0 -33
- package/core/types/sync.ts +0 -121
- package/core/types/task.ts +0 -72
- package/core/types/template.ts +0 -24
- package/core/types/utils.ts +0 -92
- package/core/types/workflow.ts +0 -23
- package/core/utils/agent-stream.ts +0 -140
- package/core/utils/animations.ts +0 -251
- package/core/utils/branding.ts +0 -88
- package/core/utils/cache.ts +0 -187
- package/core/utils/citations.ts +0 -39
- package/core/utils/collection-filters.ts +0 -209
- package/core/utils/date-helper.ts +0 -176
- package/core/utils/error-messages.ts +0 -38
- package/core/utils/file-helper.ts +0 -277
- package/core/utils/fs-helpers.ts +0 -14
- package/core/utils/help.ts +0 -314
- package/core/utils/jsonl-helper.ts +0 -290
- package/core/utils/keychain.ts +0 -127
- package/core/utils/logger.ts +0 -77
- package/core/utils/markdown-builder.ts +0 -280
- package/core/utils/next-steps.ts +0 -95
- package/core/utils/output.ts +0 -403
- package/core/utils/preserve-sections.ts +0 -218
- package/core/utils/project-commands.ts +0 -126
- package/core/utils/project-credentials.ts +0 -143
- package/core/utils/provider-cache.ts +0 -49
- package/core/utils/retry.ts +0 -318
- package/core/utils/runtime.ts +0 -108
- package/core/utils/session-helper.ts +0 -278
- package/core/utils/subtask-table.ts +0 -227
- package/core/utils/version.ts +0 -128
- package/core/wizard/index.ts +0 -13
- package/core/wizard/onboarding.ts +0 -633
- package/core/workflow/index.ts +0 -7
- package/core/workflow/state-machine.ts +0 -198
- package/core/workflow/workflow-preferences.ts +0 -294
- package/dist/core/infrastructure/command-installer.js +0 -1141
- package/dist/core/infrastructure/editors-config.js +0 -177
- package/dist/core/infrastructure/setup.js +0 -2244
- package/dist/core/utils/version.js +0 -141
- package/templates/agentic/agent-routing.md +0 -45
- package/templates/agentic/agents/uxui.md +0 -63
- package/templates/agentic/checklist-routing.md +0 -98
- package/templates/agentic/orchestrator.md +0 -68
- package/templates/agentic/task-fragmentation.md +0 -89
- package/templates/agents/AGENTS.md +0 -68
- package/templates/analysis/analyze.md +0 -84
- package/templates/analysis/patterns.md +0 -60
- package/templates/antigravity/SKILL.md +0 -39
- package/templates/architect/discovery.md +0 -67
- package/templates/architect/phases.md +0 -59
- package/templates/checklists/architecture.md +0 -28
- package/templates/checklists/code-quality.md +0 -28
- package/templates/checklists/data.md +0 -33
- package/templates/checklists/documentation.md +0 -33
- package/templates/checklists/infrastructure.md +0 -33
- package/templates/checklists/performance.md +0 -33
- package/templates/checklists/security.md +0 -33
- package/templates/checklists/testing.md +0 -33
- package/templates/checklists/ux-ui.md +0 -37
- package/templates/commands/analyze.md +0 -56
- package/templates/commands/auth.md +0 -234
- package/templates/commands/bug.md +0 -163
- package/templates/commands/cleanup.md +0 -19
- package/templates/commands/dash.md +0 -99
- package/templates/commands/design.md +0 -15
- package/templates/commands/done.md +0 -291
- package/templates/commands/enrich.md +0 -174
- package/templates/commands/git.md +0 -295
- package/templates/commands/history.md +0 -389
- package/templates/commands/idea.md +0 -88
- package/templates/commands/impact.md +0 -864
- package/templates/commands/init.md +0 -54
- package/templates/commands/jira.md +0 -278
- package/templates/commands/linear.md +0 -288
- package/templates/commands/merge.md +0 -206
- package/templates/commands/next.md +0 -80
- package/templates/commands/p.md +0 -67
- package/templates/commands/p.toml +0 -37
- package/templates/commands/pause.md +0 -136
- package/templates/commands/plan.md +0 -696
- package/templates/commands/prd.md +0 -356
- package/templates/commands/resume.md +0 -171
- package/templates/commands/review.md +0 -276
- package/templates/commands/serve.md +0 -118
- package/templates/commands/setup.md +0 -91
- package/templates/commands/ship.md +0 -475
- package/templates/commands/skill.md +0 -259
- package/templates/commands/spec.md +0 -218
- package/templates/commands/status.md +0 -207
- package/templates/commands/sync.md +0 -104
- package/templates/commands/task.md +0 -312
- package/templates/commands/test.md +0 -93
- package/templates/commands/update.md +0 -63
- package/templates/commands/verify.md +0 -204
- package/templates/commands/workflow.md +0 -150
- package/templates/config/skill-mappings.json +0 -82
- package/templates/context/dashboard.md +0 -256
- package/templates/context/roadmap.md +0 -221
- package/templates/cursor/commands/bug.md +0 -8
- package/templates/cursor/commands/done.md +0 -4
- package/templates/cursor/commands/pause.md +0 -6
- package/templates/cursor/commands/resume.md +0 -4
- package/templates/cursor/commands/ship.md +0 -8
- package/templates/cursor/commands/sync.md +0 -4
- package/templates/cursor/commands/task.md +0 -8
- package/templates/cursor/p.md +0 -29
- package/templates/cursor/router.mdc +0 -28
- package/templates/design/api.md +0 -95
- package/templates/design/architecture.md +0 -77
- package/templates/design/component.md +0 -89
- package/templates/design/database.md +0 -78
- package/templates/design/flow.md +0 -94
- package/templates/global/ANTIGRAVITY.md +0 -254
- package/templates/global/CLAUDE.md +0 -497
- package/templates/global/CURSOR.mdc +0 -266
- package/templates/global/GEMINI.md +0 -293
- package/templates/global/STORAGE-SPEC.md +0 -391
- package/templates/global/WINDSURF.md +0 -266
- package/templates/global/modules/CLAUDE-commands.md +0 -70
- package/templates/global/modules/CLAUDE-core.md +0 -105
- package/templates/global/modules/CLAUDE-git.md +0 -50
- package/templates/global/modules/CLAUDE-intelligence.md +0 -92
- package/templates/global/modules/CLAUDE-storage.md +0 -50
- package/templates/global/modules/module-config.json +0 -36
- package/templates/mcp-config.json +0 -19
- package/templates/permissions/default.jsonc +0 -60
- package/templates/permissions/permissive.jsonc +0 -49
- package/templates/permissions/strict.jsonc +0 -58
- package/templates/planning-methodology.md +0 -195
- package/templates/skills/code-review.md +0 -47
- package/templates/skills/debug.md +0 -61
- package/templates/skills/refactor.md +0 -47
- package/templates/subagents/agent-base.md +0 -20
- package/templates/subagents/domain/backend.md +0 -109
- package/templates/subagents/domain/database.md +0 -121
- package/templates/subagents/domain/devops.md +0 -152
- package/templates/subagents/domain/frontend.md +0 -103
- package/templates/subagents/domain/testing.md +0 -169
- package/templates/subagents/pm-expert.md +0 -366
- package/templates/subagents/workflow/chief-architect.md +0 -657
- package/templates/subagents/workflow/prjct-planner.md +0 -159
- package/templates/subagents/workflow/prjct-shipper.md +0 -188
- package/templates/subagents/workflow/prjct-workflow.md +0 -98
- package/templates/tools/bash.txt +0 -22
- package/templates/tools/edit.txt +0 -18
- package/templates/tools/glob.txt +0 -19
- package/templates/tools/grep.txt +0 -21
- package/templates/tools/read.txt +0 -14
- package/templates/tools/task.txt +0 -20
- package/templates/tools/webfetch.txt +0 -16
- package/templates/tools/websearch.txt +0 -18
- package/templates/tools/write.txt +0 -17
- package/templates/windsurf/router.md +0 -28
- package/templates/windsurf/workflows/bug.md +0 -8
- package/templates/windsurf/workflows/done.md +0 -4
- package/templates/windsurf/workflows/pause.md +0 -4
- package/templates/windsurf/workflows/resume.md +0 -4
- package/templates/windsurf/workflows/ship.md +0 -8
- package/templates/windsurf/workflows/sync.md +0 -4
- package/templates/windsurf/workflows/task.md +0 -8
|
@@ -1,364 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ConfigManager - Manages prjct.config.json files
|
|
3
|
-
*
|
|
4
|
-
* Key responsibilities:
|
|
5
|
-
* - Read and write prjct.config.json (supports .jsonc with comments)
|
|
6
|
-
* - Validate configuration structure
|
|
7
|
-
* - Create new configurations
|
|
8
|
-
* - Update existing configurations
|
|
9
|
-
*
|
|
10
|
-
* @version 0.3.0
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import fs from 'node:fs/promises'
|
|
14
|
-
import path from 'node:path'
|
|
15
|
-
import * as jsonc from 'jsonc-parser'
|
|
16
|
-
import { getErrorMessage } from '../errors'
|
|
17
|
-
import type { Author, GlobalConfig, LocalConfig } from '../types'
|
|
18
|
-
import { isNotFoundError } from '../types/fs'
|
|
19
|
-
import { getTimestamp } from '../utils/date-helper'
|
|
20
|
-
import { VERSION } from '../utils/version'
|
|
21
|
-
import * as authorDetector from './author-detector'
|
|
22
|
-
import pathManager from './path-manager'
|
|
23
|
-
|
|
24
|
-
// Re-export types for convenience
|
|
25
|
-
export type { Author, GlobalConfig, LocalConfig } from '../types'
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Parse JSON or JSONC content safely
|
|
29
|
-
* Supports comments (line and block style) in config files
|
|
30
|
-
*/
|
|
31
|
-
function parseJsonc<T>(content: string): T {
|
|
32
|
-
const errors: jsonc.ParseError[] = []
|
|
33
|
-
const result = jsonc.parse(content, errors, {
|
|
34
|
-
allowTrailingComma: true,
|
|
35
|
-
disallowComments: false,
|
|
36
|
-
})
|
|
37
|
-
if (errors.length > 0) {
|
|
38
|
-
const firstError = errors[0]
|
|
39
|
-
throw new SyntaxError(
|
|
40
|
-
`JSON parse error at offset ${firstError.offset}: ${jsonc.printParseErrorCode(firstError.error)}`
|
|
41
|
-
)
|
|
42
|
-
}
|
|
43
|
-
return result
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
class ConfigManager {
|
|
47
|
-
/**
|
|
48
|
-
* Read the project configuration file
|
|
49
|
-
* Supports both .json and .jsonc formats (with comments)
|
|
50
|
-
*/
|
|
51
|
-
async readConfig(projectPath: string): Promise<LocalConfig | null> {
|
|
52
|
-
try {
|
|
53
|
-
const configPath = pathManager.getLocalConfigPath(projectPath)
|
|
54
|
-
const content = await fs.readFile(configPath, 'utf-8')
|
|
55
|
-
return parseJsonc<LocalConfig>(content)
|
|
56
|
-
} catch (error) {
|
|
57
|
-
// File not found is expected - return null
|
|
58
|
-
if (isNotFoundError(error)) {
|
|
59
|
-
return null
|
|
60
|
-
}
|
|
61
|
-
// JSON parse errors or other issues - log and return null
|
|
62
|
-
console.warn(`Warning: Could not read config at ${projectPath}: ${getErrorMessage(error)}`)
|
|
63
|
-
return null
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Write the project configuration file
|
|
69
|
-
*/
|
|
70
|
-
async writeConfig(projectPath: string, config: LocalConfig): Promise<void> {
|
|
71
|
-
const configPath = pathManager.getLocalConfigPath(projectPath)
|
|
72
|
-
const configDir = pathManager.getLegacyPrjctPath(projectPath)
|
|
73
|
-
|
|
74
|
-
await fs.mkdir(configDir, { recursive: true })
|
|
75
|
-
|
|
76
|
-
const content = JSON.stringify(config, null, 2)
|
|
77
|
-
await fs.writeFile(configPath, `${content}\n`, 'utf-8')
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Read the global project configuration file
|
|
82
|
-
* Contains authors array and other system data
|
|
83
|
-
* Supports both .json and .jsonc formats (with comments)
|
|
84
|
-
*/
|
|
85
|
-
async readGlobalConfig(projectId: string): Promise<GlobalConfig | null> {
|
|
86
|
-
try {
|
|
87
|
-
const configPath = pathManager.getGlobalProjectConfigPath(projectId)
|
|
88
|
-
const content = await fs.readFile(configPath, 'utf-8')
|
|
89
|
-
return parseJsonc<GlobalConfig>(content)
|
|
90
|
-
} catch (error) {
|
|
91
|
-
// File not found is expected for new projects
|
|
92
|
-
if (isNotFoundError(error)) {
|
|
93
|
-
return null
|
|
94
|
-
}
|
|
95
|
-
// Log other errors for debugging
|
|
96
|
-
console.warn(
|
|
97
|
-
`Warning: Could not read global config for ${projectId}: ${getErrorMessage(error)}`
|
|
98
|
-
)
|
|
99
|
-
return null
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* Write the global project configuration file
|
|
105
|
-
*/
|
|
106
|
-
async writeGlobalConfig(projectId: string, config: GlobalConfig): Promise<void> {
|
|
107
|
-
const configPath = pathManager.getGlobalProjectConfigPath(projectId)
|
|
108
|
-
const configDir = pathManager.getGlobalProjectPath(projectId)
|
|
109
|
-
|
|
110
|
-
await fs.mkdir(configDir, { recursive: true })
|
|
111
|
-
|
|
112
|
-
const content = JSON.stringify(config, null, 2)
|
|
113
|
-
await fs.writeFile(configPath, `${content}\n`, 'utf-8')
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Ensure global config exists, create if not
|
|
118
|
-
*/
|
|
119
|
-
async ensureGlobalConfig(projectId: string): Promise<GlobalConfig> {
|
|
120
|
-
let globalConfig = await this.readGlobalConfig(projectId)
|
|
121
|
-
|
|
122
|
-
if (!globalConfig) {
|
|
123
|
-
const now = getTimestamp()
|
|
124
|
-
globalConfig = {
|
|
125
|
-
projectId,
|
|
126
|
-
authors: [],
|
|
127
|
-
version: VERSION,
|
|
128
|
-
lastSync: now,
|
|
129
|
-
}
|
|
130
|
-
await this.writeGlobalConfig(projectId, globalConfig)
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
return globalConfig
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
* Create a new project configuration
|
|
138
|
-
*/
|
|
139
|
-
async createConfig(
|
|
140
|
-
projectPath: string,
|
|
141
|
-
author: { name?: string; email?: string; github?: string }
|
|
142
|
-
): Promise<LocalConfig> {
|
|
143
|
-
const projectId = pathManager.generateProjectId(projectPath)
|
|
144
|
-
const globalPath = pathManager.getGlobalProjectPath(projectId)
|
|
145
|
-
const displayPath = pathManager.getDisplayPath(globalPath)
|
|
146
|
-
const now = getTimestamp()
|
|
147
|
-
|
|
148
|
-
const localConfig: LocalConfig = {
|
|
149
|
-
projectId,
|
|
150
|
-
dataPath: displayPath,
|
|
151
|
-
showMetrics: true, // PRJ-70: default to true for new projects
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
await this.writeConfig(projectPath, localConfig)
|
|
155
|
-
|
|
156
|
-
const globalConfig: GlobalConfig = {
|
|
157
|
-
projectId,
|
|
158
|
-
authors: [
|
|
159
|
-
{
|
|
160
|
-
name: author.name || 'Unknown',
|
|
161
|
-
email: author.email || '',
|
|
162
|
-
github: author.github || '',
|
|
163
|
-
firstContribution: now,
|
|
164
|
-
lastActivity: now,
|
|
165
|
-
},
|
|
166
|
-
],
|
|
167
|
-
version: VERSION,
|
|
168
|
-
created: now,
|
|
169
|
-
lastSync: now,
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
await this.writeGlobalConfig(projectId, globalConfig)
|
|
173
|
-
|
|
174
|
-
return localConfig
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
/**
|
|
178
|
-
* Update the lastSync timestamp in global config
|
|
179
|
-
*/
|
|
180
|
-
async updateLastSync(projectPath: string): Promise<void> {
|
|
181
|
-
const projectId = await this.getProjectId(projectPath)
|
|
182
|
-
const globalConfig = await this.readGlobalConfig(projectId)
|
|
183
|
-
if (globalConfig) {
|
|
184
|
-
globalConfig.lastSync = getTimestamp()
|
|
185
|
-
await this.writeGlobalConfig(projectId, globalConfig)
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* Validate a local configuration object
|
|
191
|
-
* Local config only contains project metadata (projectId, dataPath)
|
|
192
|
-
* All system data (version, created, lastSync, authors) is in global config
|
|
193
|
-
*/
|
|
194
|
-
validateConfig(config: LocalConfig | null): boolean {
|
|
195
|
-
if (!config) return false
|
|
196
|
-
if (!config.projectId) return false
|
|
197
|
-
if (!config.dataPath) return false
|
|
198
|
-
|
|
199
|
-
return true
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
/**
|
|
203
|
-
* Check if a project needs migration
|
|
204
|
-
* Migration is needed if:
|
|
205
|
-
* - Has legacy .prjct/ structure
|
|
206
|
-
* - AND either no config exists OR files not yet in global location
|
|
207
|
-
*/
|
|
208
|
-
async needsMigration(projectPath: string): Promise<boolean> {
|
|
209
|
-
const hasLegacy = await pathManager.hasLegacyStructure(projectPath)
|
|
210
|
-
if (!hasLegacy) return false
|
|
211
|
-
|
|
212
|
-
const hasConfig = await pathManager.hasConfig(projectPath)
|
|
213
|
-
|
|
214
|
-
if (!hasConfig) return true
|
|
215
|
-
|
|
216
|
-
const config = await this.readConfig(projectPath)
|
|
217
|
-
if (!config || !config.projectId) return true
|
|
218
|
-
|
|
219
|
-
const globalPath = pathManager.getGlobalProjectPath(config.projectId)
|
|
220
|
-
|
|
221
|
-
try {
|
|
222
|
-
const coreFiles = await fs.readdir(path.join(globalPath, 'core'))
|
|
223
|
-
return coreFiles.length === 0
|
|
224
|
-
} catch (error) {
|
|
225
|
-
// Directory not found means migration needed
|
|
226
|
-
if (isNotFoundError(error)) {
|
|
227
|
-
return true
|
|
228
|
-
}
|
|
229
|
-
// Permission errors or other issues - assume migration needed
|
|
230
|
-
return true
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
/**
|
|
235
|
-
* Get the project ID from config, or generate it if config doesn't exist
|
|
236
|
-
*/
|
|
237
|
-
async getProjectId(projectPath: string): Promise<string> {
|
|
238
|
-
const config = await this.readConfig(projectPath)
|
|
239
|
-
if (config?.projectId) {
|
|
240
|
-
return config.projectId
|
|
241
|
-
}
|
|
242
|
-
return pathManager.generateProjectId(projectPath)
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
/**
|
|
246
|
-
* Find an author in the authors array by github username
|
|
247
|
-
* Reads from GLOBAL config
|
|
248
|
-
*/
|
|
249
|
-
async findAuthor(projectId: string, githubUsername: string): Promise<Author | null> {
|
|
250
|
-
const globalConfig = await this.readGlobalConfig(projectId)
|
|
251
|
-
if (!globalConfig || !globalConfig.authors) return null
|
|
252
|
-
|
|
253
|
-
return globalConfig.authors.find((a) => a.github === githubUsername) || null
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
/**
|
|
257
|
-
* Add a new author to the authors array
|
|
258
|
-
* Writes to GLOBAL config
|
|
259
|
-
*/
|
|
260
|
-
async addAuthor(
|
|
261
|
-
projectId: string,
|
|
262
|
-
author: { name?: string; email?: string; github?: string }
|
|
263
|
-
): Promise<void> {
|
|
264
|
-
const globalConfig = await this.ensureGlobalConfig(projectId)
|
|
265
|
-
|
|
266
|
-
const exists = globalConfig.authors.some((a) => a.github === author.github)
|
|
267
|
-
if (exists) return
|
|
268
|
-
|
|
269
|
-
const now = getTimestamp()
|
|
270
|
-
globalConfig.authors.push({
|
|
271
|
-
name: author.name || 'Unknown',
|
|
272
|
-
email: author.email || '',
|
|
273
|
-
github: author.github || '',
|
|
274
|
-
firstContribution: now,
|
|
275
|
-
lastActivity: now,
|
|
276
|
-
})
|
|
277
|
-
|
|
278
|
-
globalConfig.lastSync = now
|
|
279
|
-
await this.writeGlobalConfig(projectId, globalConfig)
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
/**
|
|
283
|
-
* Update author's last activity timestamp
|
|
284
|
-
* Updates GLOBAL config
|
|
285
|
-
*/
|
|
286
|
-
async updateAuthorActivity(projectId: string, githubUsername: string): Promise<void> {
|
|
287
|
-
const globalConfig = await this.readGlobalConfig(projectId)
|
|
288
|
-
if (!globalConfig || !globalConfig.authors) return
|
|
289
|
-
|
|
290
|
-
const author = globalConfig.authors.find((a) => a.github === githubUsername)
|
|
291
|
-
if (author) {
|
|
292
|
-
author.lastActivity = getTimestamp()
|
|
293
|
-
globalConfig.lastSync = author.lastActivity
|
|
294
|
-
await this.writeGlobalConfig(projectId, globalConfig)
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
/**
|
|
299
|
-
* Get current author for session (detect or get from global config)
|
|
300
|
-
*/
|
|
301
|
-
async getCurrentAuthor(projectPath: string): Promise<string> {
|
|
302
|
-
const author = await authorDetector.detect()
|
|
303
|
-
|
|
304
|
-
const projectId = await this.getProjectId(projectPath)
|
|
305
|
-
await this.addAuthor(projectId, {
|
|
306
|
-
name: author.name ?? undefined,
|
|
307
|
-
email: author.email ?? undefined,
|
|
308
|
-
github: author.github ?? undefined,
|
|
309
|
-
})
|
|
310
|
-
|
|
311
|
-
return author.github || author.name || 'Unknown'
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
/**
|
|
315
|
-
* Check if config exists and is valid
|
|
316
|
-
*/
|
|
317
|
-
async isConfigured(projectPath: string): Promise<boolean> {
|
|
318
|
-
const config = await this.readConfig(projectPath)
|
|
319
|
-
return this.validateConfig(config)
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
/**
|
|
323
|
-
* Get showMetrics setting from config.
|
|
324
|
-
* Defaults to true for new or existing projects without the setting.
|
|
325
|
-
* @see PRJ-70
|
|
326
|
-
*/
|
|
327
|
-
async getShowMetrics(projectPath: string): Promise<boolean> {
|
|
328
|
-
const config = await this.readConfig(projectPath)
|
|
329
|
-
// Default to true if not set
|
|
330
|
-
return config?.showMetrics ?? true
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
/**
|
|
334
|
-
* Set showMetrics setting in config.
|
|
335
|
-
* @see PRJ-70
|
|
336
|
-
*/
|
|
337
|
-
async setShowMetrics(projectPath: string, showMetrics: boolean): Promise<void> {
|
|
338
|
-
const config = await this.readConfig(projectPath)
|
|
339
|
-
if (config) {
|
|
340
|
-
config.showMetrics = showMetrics
|
|
341
|
-
await this.writeConfig(projectPath, config)
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
/**
|
|
346
|
-
* Get configuration with defaults
|
|
347
|
-
* Returns LOCAL config only (projectId, dataPath)
|
|
348
|
-
*/
|
|
349
|
-
async getConfigWithDefaults(projectPath: string): Promise<LocalConfig> {
|
|
350
|
-
const config = await this.readConfig(projectPath)
|
|
351
|
-
if (config) {
|
|
352
|
-
return config
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
const projectId = pathManager.generateProjectId(projectPath)
|
|
356
|
-
return {
|
|
357
|
-
projectId,
|
|
358
|
-
dataPath: pathManager.getDisplayPath(pathManager.getGlobalProjectPath(projectId)),
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
const configManager = new ConfigManager()
|
|
364
|
-
export default configManager
|
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* EditorsConfig - Manages AI CLI installation tracking
|
|
3
|
-
*
|
|
4
|
-
* Tracks prjct commands installation in AI CLIs (Claude Code, Gemini CLI),
|
|
5
|
-
* enabling automatic updates when npm package is updated.
|
|
6
|
-
*
|
|
7
|
-
* Config location: ~/.prjct-cli/config/installed-editors.json
|
|
8
|
-
*
|
|
9
|
-
* @version 0.6.0
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import fs from 'node:fs/promises'
|
|
13
|
-
import os from 'node:os'
|
|
14
|
-
import path from 'node:path'
|
|
15
|
-
import { getErrorMessage } from '../types/fs'
|
|
16
|
-
import type { AIProviderName } from '../types/provider'
|
|
17
|
-
|
|
18
|
-
interface EditorConfig {
|
|
19
|
-
version: string
|
|
20
|
-
/** @deprecated Use 'provider' instead */
|
|
21
|
-
editor: string
|
|
22
|
-
/** AI provider name (claude or gemini) */
|
|
23
|
-
provider: AIProviderName
|
|
24
|
-
lastInstall: string
|
|
25
|
-
path: string
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
class EditorsConfig {
|
|
29
|
-
homeDir: string
|
|
30
|
-
configDir: string
|
|
31
|
-
configFile: string
|
|
32
|
-
|
|
33
|
-
constructor() {
|
|
34
|
-
this.homeDir = os.homedir()
|
|
35
|
-
this.configDir = path.join(this.homeDir, '.prjct-cli', 'config')
|
|
36
|
-
this.configFile = path.join(this.configDir, 'installed-editors.json')
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Ensure config directory exists
|
|
41
|
-
*/
|
|
42
|
-
async ensureConfigDir(): Promise<void> {
|
|
43
|
-
try {
|
|
44
|
-
await fs.mkdir(this.configDir, { recursive: true })
|
|
45
|
-
} catch (error) {
|
|
46
|
-
console.error('[editors-config] Error creating config directory:', getErrorMessage(error))
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Load installation configuration
|
|
52
|
-
*/
|
|
53
|
-
async loadConfig(): Promise<EditorConfig | null> {
|
|
54
|
-
try {
|
|
55
|
-
const content = await fs.readFile(this.configFile, 'utf-8')
|
|
56
|
-
return JSON.parse(content)
|
|
57
|
-
} catch (error) {
|
|
58
|
-
if ((error as NodeJS.ErrnoException).code === 'ENOENT') {
|
|
59
|
-
return null
|
|
60
|
-
}
|
|
61
|
-
console.error('[editors-config] Error loading config:', getErrorMessage(error))
|
|
62
|
-
return null
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Save installation configuration
|
|
68
|
-
*/
|
|
69
|
-
async saveConfig(
|
|
70
|
-
version: string,
|
|
71
|
-
installPath: string,
|
|
72
|
-
provider: AIProviderName = 'claude'
|
|
73
|
-
): Promise<boolean> {
|
|
74
|
-
try {
|
|
75
|
-
await this.ensureConfigDir()
|
|
76
|
-
|
|
77
|
-
const config: EditorConfig = {
|
|
78
|
-
version,
|
|
79
|
-
editor: provider, // deprecated, kept for backward compatibility
|
|
80
|
-
provider,
|
|
81
|
-
lastInstall: new Date().toISOString(),
|
|
82
|
-
path: installPath,
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
await fs.writeFile(this.configFile, JSON.stringify(config, null, 2), 'utf-8')
|
|
86
|
-
|
|
87
|
-
return true
|
|
88
|
-
} catch (error) {
|
|
89
|
-
console.error('[editors-config] Error saving config:', getErrorMessage(error))
|
|
90
|
-
return false
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Get the configured provider
|
|
96
|
-
*/
|
|
97
|
-
async getProvider(): Promise<AIProviderName | null> {
|
|
98
|
-
const config = await this.loadConfig()
|
|
99
|
-
if (!config) return null
|
|
100
|
-
return config.provider || (config.editor as AIProviderName) || 'claude'
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* Get last installed version
|
|
105
|
-
*/
|
|
106
|
-
async getLastVersion(): Promise<string | null> {
|
|
107
|
-
const config = await this.loadConfig()
|
|
108
|
-
return config ? config.version : null
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* Check if version has changed since last install
|
|
113
|
-
*/
|
|
114
|
-
async hasVersionChanged(currentVersion: string): Promise<boolean> {
|
|
115
|
-
const lastVersion = await this.getLastVersion()
|
|
116
|
-
return lastVersion !== null && lastVersion !== currentVersion
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* Update version in configuration
|
|
121
|
-
*/
|
|
122
|
-
async updateVersion(version: string): Promise<boolean> {
|
|
123
|
-
try {
|
|
124
|
-
const config = await this.loadConfig()
|
|
125
|
-
if (!config) {
|
|
126
|
-
return false
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
config.version = version
|
|
130
|
-
config.lastInstall = new Date().toISOString()
|
|
131
|
-
|
|
132
|
-
await fs.writeFile(this.configFile, JSON.stringify(config, null, 2), 'utf-8')
|
|
133
|
-
|
|
134
|
-
return true
|
|
135
|
-
} catch (error) {
|
|
136
|
-
console.error('[editors-config] Error updating version:', getErrorMessage(error))
|
|
137
|
-
return false
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* Check if config file exists
|
|
143
|
-
*/
|
|
144
|
-
async configExists(): Promise<boolean> {
|
|
145
|
-
try {
|
|
146
|
-
await fs.access(this.configFile)
|
|
147
|
-
return true
|
|
148
|
-
} catch (_error) {
|
|
149
|
-
return false
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
/**
|
|
154
|
-
* Delete configuration file
|
|
155
|
-
* Used during uninstallation to clean up tracking data
|
|
156
|
-
*/
|
|
157
|
-
async deleteConfig(): Promise<boolean> {
|
|
158
|
-
try {
|
|
159
|
-
const exists = await this.configExists()
|
|
160
|
-
if (exists) {
|
|
161
|
-
await fs.unlink(this.configFile)
|
|
162
|
-
}
|
|
163
|
-
return true
|
|
164
|
-
} catch (error) {
|
|
165
|
-
console.error('[editors-config] Error deleting config:', getErrorMessage(error))
|
|
166
|
-
return false
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
const editorsConfig = new EditorsConfig()
|
|
172
|
-
export default editorsConfig
|