octocode-cli 1.2.6 → 1.2.7
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/LICENSE +21 -63
- package/README.md +85 -142
- package/out/octocode-cli.js +7026 -6945
- package/package.json +8 -6
- package/skills/README.md +97 -120
- package/skills/octocode-code-engineer/.claude/settings.local.json +18 -0
- package/skills/octocode-code-engineer/.octocode/rfc/RFC-code-engineer-weakness-fixes.md +255 -0
- package/skills/octocode-code-engineer/.plan/VALIDATED_PLAN.md +223 -0
- package/skills/octocode-code-engineer/README.md +178 -0
- package/skills/octocode-code-engineer/SKILL.md +418 -0
- package/skills/octocode-code-engineer/coverage/architecture.ts.html +7828 -0
- package/skills/octocode-code-engineer/coverage/ast-helpers.ts.html +211 -0
- package/skills/octocode-code-engineer/coverage/ast-search.ts.html +1795 -0
- package/skills/octocode-code-engineer/coverage/base.css +224 -0
- package/skills/octocode-code-engineer/coverage/block-navigation.js +87 -0
- package/skills/octocode-code-engineer/coverage/cache.ts.html +376 -0
- package/skills/octocode-code-engineer/coverage/cli.ts.html +982 -0
- package/skills/octocode-code-engineer/coverage/clover.xml +3217 -0
- package/skills/octocode-code-engineer/coverage/collect-effects.ts.html +664 -0
- package/skills/octocode-code-engineer/coverage/collect-input-sources.ts.html +577 -0
- package/skills/octocode-code-engineer/coverage/collect-performance.ts.html +331 -0
- package/skills/octocode-code-engineer/coverage/collect-prototype-pollution.ts.html +421 -0
- package/skills/octocode-code-engineer/coverage/collect-security.ts.html +604 -0
- package/skills/octocode-code-engineer/coverage/collect-test-profile.ts.html +589 -0
- package/skills/octocode-code-engineer/coverage/coverage-final.json +30 -0
- package/skills/octocode-code-engineer/coverage/dependencies.ts.html +997 -0
- package/skills/octocode-code-engineer/coverage/dependency-summary.ts.html +688 -0
- package/skills/octocode-code-engineer/coverage/discovery.ts.html +322 -0
- package/skills/octocode-code-engineer/coverage/favicon.png +0 -0
- package/skills/octocode-code-engineer/coverage/graph-analytics.ts.html +1510 -0
- package/skills/octocode-code-engineer/coverage/index.html +536 -0
- package/skills/octocode-code-engineer/coverage/index.ts.html +826 -0
- package/skills/octocode-code-engineer/coverage/metrics.ts.html +553 -0
- package/skills/octocode-code-engineer/coverage/pipeline.ts.html +2044 -0
- package/skills/octocode-code-engineer/coverage/prettify.css +1 -0
- package/skills/octocode-code-engineer/coverage/prettify.js +2 -0
- package/skills/octocode-code-engineer/coverage/report-analysis.ts.html +1570 -0
- package/skills/octocode-code-engineer/coverage/report-writer.ts.html +1102 -0
- package/skills/octocode-code-engineer/coverage/security-detectors.ts.html +1747 -0
- package/skills/octocode-code-engineer/coverage/semantic-detectors.ts.html +2152 -0
- package/skills/octocode-code-engineer/coverage/semantic.ts.html +1897 -0
- package/skills/octocode-code-engineer/coverage/sort-arrow-sprite.png +0 -0
- package/skills/octocode-code-engineer/coverage/sorter.js +210 -0
- package/skills/octocode-code-engineer/coverage/summary-md.ts.html +1222 -0
- package/skills/octocode-code-engineer/coverage/test-quality-detectors.ts.html +1039 -0
- package/skills/octocode-code-engineer/coverage/tree-sitter-analyzer.ts.html +955 -0
- package/skills/octocode-code-engineer/coverage/ts-analyzer.ts.html +1213 -0
- package/skills/octocode-code-engineer/coverage/types.ts.html +2473 -0
- package/skills/octocode-code-engineer/coverage/utils.ts.html +820 -0
- package/skills/octocode-code-engineer/eslint.config.mjs +54 -0
- package/skills/octocode-code-engineer/minify-scripts.mjs +32 -0
- package/skills/octocode-code-engineer/package.json +54 -0
- package/skills/octocode-code-engineer/references/agent-ast-reading-rfc.md +95 -0
- package/skills/octocode-code-engineer/references/architecture-techniques.md +121 -0
- package/skills/octocode-code-engineer/references/ast-search.md +210 -0
- package/skills/octocode-code-engineer/references/ast-tree-search.md +151 -0
- package/skills/octocode-code-engineer/references/cli-reference.md +167 -0
- package/skills/octocode-code-engineer/references/concepts.md +107 -0
- package/skills/octocode-code-engineer/references/finding-categories.md +128 -0
- package/skills/octocode-code-engineer/references/improvement-roadmap.md +304 -0
- package/skills/octocode-code-engineer/references/output-files.md +144 -0
- package/skills/octocode-code-engineer/references/playbooks.md +204 -0
- package/skills/octocode-code-engineer/references/present-results.md +136 -0
- package/skills/octocode-code-engineer/references/tool-workflows.md +566 -0
- package/skills/octocode-code-engineer/references/validate-investigate.md +225 -0
- package/skills/octocode-code-engineer/scripts/analysis/dependencies.js +1 -0
- package/skills/octocode-code-engineer/scripts/analysis/dependency-summary.js +1 -0
- package/skills/octocode-code-engineer/scripts/analysis/discovery.js +1 -0
- package/skills/octocode-code-engineer/scripts/analysis/graph-analytics.js +1 -0
- package/skills/octocode-code-engineer/scripts/analysis/semantic.js +1 -0
- package/skills/octocode-code-engineer/scripts/ast/helpers.js +1 -0
- package/skills/octocode-code-engineer/scripts/ast/metrics.js +1 -0
- package/skills/octocode-code-engineer/scripts/ast/search.js +2 -0
- package/skills/octocode-code-engineer/scripts/ast/tree-search.js +2 -0
- package/skills/octocode-code-engineer/scripts/ast/tree-sitter.js +1 -0
- package/skills/octocode-code-engineer/scripts/ast/ts-analyzer.js +1 -0
- package/skills/octocode-code-engineer/scripts/collectors/chains.js +1 -0
- package/skills/octocode-code-engineer/scripts/collectors/effects.js +1 -0
- package/skills/octocode-code-engineer/scripts/collectors/input-sources.js +1 -0
- package/skills/octocode-code-engineer/scripts/collectors/performance.js +1 -0
- package/skills/octocode-code-engineer/scripts/collectors/prototype-pollution.js +1 -0
- package/skills/octocode-code-engineer/scripts/collectors/security.js +1 -0
- package/skills/octocode-code-engineer/scripts/collectors/test-profile.js +1 -0
- package/skills/octocode-code-engineer/scripts/common/is-direct-run.js +1 -0
- package/skills/octocode-code-engineer/scripts/common/utils.js +1 -0
- package/skills/octocode-code-engineer/scripts/detectors/code-quality.js +1 -0
- package/skills/octocode-code-engineer/scripts/detectors/cohesion.js +1 -0
- package/skills/octocode-code-engineer/scripts/detectors/coupling.js +1 -0
- package/skills/octocode-code-engineer/scripts/detectors/cycle.js +1 -0
- package/skills/octocode-code-engineer/scripts/detectors/dead-code.js +1 -0
- package/skills/octocode-code-engineer/scripts/detectors/import-style.js +1 -0
- package/skills/octocode-code-engineer/scripts/detectors/index.js +1 -0
- package/skills/octocode-code-engineer/scripts/detectors/security.js +1 -0
- package/skills/octocode-code-engineer/scripts/detectors/semantic.js +1 -0
- package/skills/octocode-code-engineer/scripts/detectors/shared.js +1 -0
- package/skills/octocode-code-engineer/scripts/detectors/test-quality.js +1 -0
- package/skills/octocode-code-engineer/scripts/index.js +1 -0
- package/skills/octocode-code-engineer/scripts/pipeline/cache.js +1 -0
- package/skills/octocode-code-engineer/scripts/pipeline/cli.js +1 -0
- package/skills/octocode-code-engineer/scripts/pipeline/main.js +2 -0
- package/skills/octocode-code-engineer/scripts/reporting/analysis.js +1 -0
- package/skills/octocode-code-engineer/scripts/reporting/summary-md.js +1 -0
- package/skills/octocode-code-engineer/scripts/reporting/writer.js +1 -0
- package/skills/octocode-code-engineer/scripts/types/constants.js +1 -0
- package/skills/octocode-code-engineer/scripts/types/index.js +1 -0
- package/skills/octocode-code-engineer/scripts/types/interfaces.js +1 -0
- package/skills/octocode-code-engineer/src/analysis/dependencies.test.ts +545 -0
- package/skills/octocode-code-engineer/src/analysis/dependencies.ts +406 -0
- package/skills/octocode-code-engineer/src/analysis/dependency-summary.test.ts +566 -0
- package/skills/octocode-code-engineer/src/analysis/dependency-summary.ts +257 -0
- package/skills/octocode-code-engineer/src/analysis/discovery.test.ts +420 -0
- package/skills/octocode-code-engineer/src/analysis/discovery.ts +87 -0
- package/skills/octocode-code-engineer/src/analysis/graph-analytics.test.ts +449 -0
- package/skills/octocode-code-engineer/src/analysis/graph-analytics.ts +534 -0
- package/skills/octocode-code-engineer/src/analysis/semantic.test.ts +1533 -0
- package/skills/octocode-code-engineer/src/analysis/semantic.ts +830 -0
- package/skills/octocode-code-engineer/src/ast/helpers.test.ts +185 -0
- package/skills/octocode-code-engineer/src/ast/helpers.ts +62 -0
- package/skills/octocode-code-engineer/src/ast/metrics.test.ts +304 -0
- package/skills/octocode-code-engineer/src/ast/metrics.ts +204 -0
- package/skills/octocode-code-engineer/src/ast/search.test.ts +647 -0
- package/skills/octocode-code-engineer/src/ast/search.ts +648 -0
- package/skills/octocode-code-engineer/src/ast/tree-search.test.ts +199 -0
- package/skills/octocode-code-engineer/src/ast/tree-search.ts +392 -0
- package/skills/octocode-code-engineer/src/ast/tree-sitter.test.ts +407 -0
- package/skills/octocode-code-engineer/src/ast/tree-sitter.ts +402 -0
- package/skills/octocode-code-engineer/src/ast/ts-analyzer.test.ts +1864 -0
- package/skills/octocode-code-engineer/src/ast/ts-analyzer.ts +509 -0
- package/skills/octocode-code-engineer/src/collectors/chains.ts +74 -0
- package/skills/octocode-code-engineer/src/collectors/effects.test.ts +490 -0
- package/skills/octocode-code-engineer/src/collectors/effects.ts +332 -0
- package/skills/octocode-code-engineer/src/collectors/input-sources.test.ts +144 -0
- package/skills/octocode-code-engineer/src/collectors/input-sources.ts +196 -0
- package/skills/octocode-code-engineer/src/collectors/performance.test.ts +82 -0
- package/skills/octocode-code-engineer/src/collectors/performance.ts +141 -0
- package/skills/octocode-code-engineer/src/collectors/prototype-pollution.test.ts +55 -0
- package/skills/octocode-code-engineer/src/collectors/prototype-pollution.ts +162 -0
- package/skills/octocode-code-engineer/src/collectors/security.test.ts +124 -0
- package/skills/octocode-code-engineer/src/collectors/security.ts +309 -0
- package/skills/octocode-code-engineer/src/collectors/test-profile.test.ts +97 -0
- package/skills/octocode-code-engineer/src/collectors/test-profile.ts +269 -0
- package/skills/octocode-code-engineer/src/common/is-direct-run.test.ts +32 -0
- package/skills/octocode-code-engineer/src/common/is-direct-run.ts +13 -0
- package/skills/octocode-code-engineer/src/common/utils.test.ts +463 -0
- package/skills/octocode-code-engineer/src/common/utils.ts +304 -0
- package/skills/octocode-code-engineer/src/detectors/code-quality.ts +966 -0
- package/skills/octocode-code-engineer/src/detectors/cohesion.ts +539 -0
- package/skills/octocode-code-engineer/src/detectors/coupling.ts +323 -0
- package/skills/octocode-code-engineer/src/detectors/cycle.ts +349 -0
- package/skills/octocode-code-engineer/src/detectors/dead-code.ts +320 -0
- package/skills/octocode-code-engineer/src/detectors/import-style.ts +376 -0
- package/skills/octocode-code-engineer/src/detectors/index.test.ts +3061 -0
- package/skills/octocode-code-engineer/src/detectors/index.ts +88 -0
- package/skills/octocode-code-engineer/src/detectors/security.test.ts +882 -0
- package/skills/octocode-code-engineer/src/detectors/security.ts +821 -0
- package/skills/octocode-code-engineer/src/detectors/semantic.ts +758 -0
- package/skills/octocode-code-engineer/src/detectors/shared.ts +49 -0
- package/skills/octocode-code-engineer/src/detectors/test-quality.test.ts +388 -0
- package/skills/octocode-code-engineer/src/detectors/test-quality.ts +367 -0
- package/skills/octocode-code-engineer/src/index.test.ts +4425 -0
- package/skills/octocode-code-engineer/src/index.ts +403 -0
- package/skills/octocode-code-engineer/src/pipeline/cache.test.ts +199 -0
- package/skills/octocode-code-engineer/src/pipeline/cache.ts +130 -0
- package/skills/octocode-code-engineer/src/pipeline/cli.test.ts +493 -0
- package/skills/octocode-code-engineer/src/pipeline/cli.ts +344 -0
- package/skills/octocode-code-engineer/src/pipeline/main.test.ts +174 -0
- package/skills/octocode-code-engineer/src/pipeline/main.ts +1074 -0
- package/skills/octocode-code-engineer/src/pipeline.test.ts +84 -0
- package/skills/octocode-code-engineer/src/reporting/analysis.test.ts +782 -0
- package/skills/octocode-code-engineer/src/reporting/analysis.ts +688 -0
- package/skills/octocode-code-engineer/src/reporting/output-contract.test.ts +463 -0
- package/skills/octocode-code-engineer/src/reporting/summary-md.test.ts +421 -0
- package/skills/octocode-code-engineer/src/reporting/summary-md.ts +714 -0
- package/skills/octocode-code-engineer/src/reporting/writer.ts +430 -0
- package/skills/octocode-code-engineer/src/sanity.test.ts +47 -0
- package/skills/octocode-code-engineer/src/types/constants.ts +248 -0
- package/skills/octocode-code-engineer/src/types/index.ts +80 -0
- package/skills/octocode-code-engineer/src/types/interfaces.ts +682 -0
- package/skills/octocode-code-engineer/tsconfig.json +17 -0
- package/skills/octocode-code-engineer/vitest.config.ts +8 -0
- package/skills/octocode-documentation-writer/README.md +113 -0
- package/skills/octocode-documentation-writer/SKILL.md +886 -0
- package/skills/octocode-documentation-writer/references/agent-discovery-analysis.md +453 -0
- package/skills/octocode-documentation-writer/references/agent-documentation-writer.md +255 -0
- package/skills/octocode-documentation-writer/references/agent-engineer-questions.md +247 -0
- package/skills/octocode-documentation-writer/references/agent-orchestrator.md +370 -0
- package/skills/octocode-documentation-writer/references/agent-qa-validator.md +227 -0
- package/skills/octocode-documentation-writer/references/agent-researcher.md +250 -0
- package/skills/octocode-documentation-writer/schemas/analysis-schema.json +886 -0
- package/skills/octocode-documentation-writer/schemas/discovery-tasks.json +96 -0
- package/skills/octocode-documentation-writer/schemas/documentation-structure.json +373 -0
- package/skills/octocode-documentation-writer/schemas/partial-discovery-schema.json +102 -0
- package/skills/octocode-documentation-writer/schemas/partial-research-schema.json +98 -0
- package/skills/octocode-documentation-writer/schemas/qa-results-schema.json +113 -0
- package/skills/octocode-documentation-writer/schemas/questions-schema.json +228 -0
- package/skills/octocode-documentation-writer/schemas/research-schema.json +104 -0
- package/skills/octocode-documentation-writer/schemas/state-schema.json +222 -0
- package/skills/octocode-documentation-writer/schemas/work-assignments-schema.json +74 -0
- package/skills/octocode-plan/SKILL.md +122 -116
- package/skills/octocode-prompt-optimizer/SKILL.md +617 -0
- package/skills/octocode-pull-request-reviewer/README.md +249 -0
- package/skills/octocode-pull-request-reviewer/SKILL.md +479 -0
- package/skills/octocode-pull-request-reviewer/references/dependency-check.md +74 -0
- package/skills/octocode-pull-request-reviewer/references/domain-reviewers.md +24 -0
- package/skills/octocode-pull-request-reviewer/references/execution-lifecycle.md +441 -0
- package/skills/octocode-pull-request-reviewer/references/flow-analysis-protocol.md +64 -0
- package/skills/octocode-pull-request-reviewer/references/output-template.md +174 -0
- package/skills/octocode-pull-request-reviewer/references/parallel-agent-protocol.md +182 -0
- package/skills/octocode-pull-request-reviewer/references/review-guidelines.md +26 -0
- package/skills/octocode-pull-request-reviewer/references/verification-checklist.md +40 -0
- package/skills/octocode-research/.claude/settings.local.json +46 -0
- package/skills/octocode-research/.octocode/plan/code-review-fixes/plan.md +312 -0
- package/skills/octocode-research/.octocode/plan/code-review-fixes/research.md +212 -0
- package/skills/octocode-research/.octocode/plans/NODE_SERVER_START_PLAN.md +755 -0
- package/skills/octocode-research/.octocode/research/code-review/research.md +371 -0
- package/skills/octocode-research/.octocode/review/IMPROVEMENTS.md +391 -0
- package/skills/octocode-research/.octocode/review/REVIEW_PLAN.md +289 -0
- package/skills/octocode-research/.octocode/review/REVIEW_REPORT.md +356 -0
- package/skills/octocode-research/AGENTS.md +349 -0
- package/skills/octocode-research/README.md +494 -0
- package/skills/octocode-research/SKILL.md +652 -274
- package/skills/octocode-research/docs/API_REFERENCE.md +562 -0
- package/skills/octocode-research/docs/ARCHITECTURE.md +554 -0
- package/skills/octocode-research/docs/FLOWS.md +577 -0
- package/skills/octocode-research/docs/OVERVIEW.md +564 -0
- package/skills/octocode-research/docs/SERVER_FLOWS.md +631 -0
- package/skills/octocode-research/ecosystem.config.cjs +88 -0
- package/skills/octocode-research/eslint.config.mjs +27 -0
- package/skills/octocode-research/package.json +84 -0
- package/skills/octocode-research/references/GUARDRAILS.md +40 -0
- package/skills/octocode-research/references/PARALLEL_AGENT_PROTOCOL.md +178 -0
- package/skills/octocode-research/references/roast-prompt.md +149 -0
- package/skills/octocode-research/scripts/server-init.d.ts +2 -0
- package/skills/octocode-research/scripts/server-init.js +2 -0
- package/skills/octocode-research/scripts/server.d.ts +8 -0
- package/skills/octocode-research/scripts/server.js +445 -0
- package/skills/octocode-research/src/__tests__/integration/circuitBreaker.test.ts +205 -0
- package/skills/octocode-research/src/__tests__/integration/routes.test.ts +374 -0
- package/skills/octocode-research/src/__tests__/unit/circuitBreaker.test.ts +245 -0
- package/skills/octocode-research/src/__tests__/unit/errorHandler.test.ts +183 -0
- package/skills/octocode-research/src/__tests__/unit/httpPreprocess.test.ts +157 -0
- package/skills/octocode-research/src/__tests__/unit/logger.test.ts +143 -0
- package/skills/octocode-research/src/__tests__/unit/queryParser.test.ts +130 -0
- package/skills/octocode-research/src/__tests__/unit/responseBuilder.test.ts +469 -0
- package/skills/octocode-research/src/__tests__/unit/retry.test.ts +205 -0
- package/skills/octocode-research/src/index.ts +186 -0
- package/skills/octocode-research/src/mcpCache.ts +49 -0
- package/skills/octocode-research/src/middleware/errorHandler.ts +65 -0
- package/skills/octocode-research/src/middleware/logger.ts +61 -0
- package/skills/octocode-research/src/middleware/queryParser.ts +115 -0
- package/skills/octocode-research/src/middleware/readiness.ts +17 -0
- package/skills/octocode-research/src/routes/github.ts +197 -0
- package/skills/octocode-research/src/routes/local.ts +175 -0
- package/skills/octocode-research/src/routes/lsp.ts +177 -0
- package/skills/octocode-research/src/routes/package.ts +127 -0
- package/skills/octocode-research/src/routes/prompts.ts +138 -0
- package/skills/octocode-research/src/routes/tools.ts +677 -0
- package/skills/octocode-research/src/server-init.ts +363 -0
- package/skills/octocode-research/src/server.ts +285 -0
- package/skills/octocode-research/src/types/errorGuards.ts +151 -0
- package/skills/octocode-research/src/types/express.d.ts +76 -0
- package/skills/octocode-research/src/types/guards.ts +98 -0
- package/skills/octocode-research/src/types/mcp.ts +119 -0
- package/skills/octocode-research/src/types/responses.ts +199 -0
- package/skills/octocode-research/src/types/toolTypes.ts +33 -0
- package/skills/octocode-research/src/utils/asyncTimeout.ts +116 -0
- package/skills/octocode-research/src/utils/circuitBreaker.ts +492 -0
- package/skills/octocode-research/src/utils/colors.ts +53 -0
- package/skills/octocode-research/src/utils/errorQueue.ts +71 -0
- package/skills/octocode-research/src/utils/logEmoji.ts +103 -0
- package/skills/octocode-research/src/utils/logger.ts +413 -0
- package/skills/octocode-research/src/utils/resilience.ts +169 -0
- package/skills/octocode-research/src/utils/responseBuilder.ts +495 -0
- package/skills/octocode-research/src/utils/responseFactory.ts +100 -0
- package/skills/octocode-research/src/utils/responseParser.ts +272 -0
- package/skills/octocode-research/src/utils/retry.ts +280 -0
- package/skills/octocode-research/src/utils/routeFactory.ts +117 -0
- package/skills/octocode-research/src/utils/url.ts +20 -0
- package/skills/octocode-research/src/validation/httpPreprocess.ts +155 -0
- package/skills/octocode-research/src/validation/index.ts +2 -0
- package/skills/octocode-research/src/validation/schemas.ts +578 -0
- package/skills/octocode-research/src/validation/toolCallSchema.ts +132 -0
- package/skills/octocode-research/tsconfig.json +21 -0
- package/skills/octocode-research/tsdown.config.ts +42 -0
- package/skills/octocode-research/vitest.config.ts +20 -0
- package/skills/octocode-researcher/SKILL.md +461 -0
- package/skills/octocode-researcher/references/fallbacks.md +120 -0
- package/skills/{octocode-local-search → octocode-researcher}/references/tool-reference.md +132 -49
- package/skills/{octocode-local-search → octocode-researcher}/references/workflow-patterns.md +204 -4
- package/skills/octocode-rfc-generator/SKILL.md +223 -0
- package/skills/octocode-rfc-generator/references/rfc-template.md +193 -0
- package/skills/octocode-roast/SKILL.md +63 -21
- package/skills/octocode-implement/SKILL.md +0 -293
- package/skills/octocode-implement/references/execution-phases.md +0 -317
- package/skills/octocode-implement/references/tool-reference.md +0 -403
- package/skills/octocode-implement/references/workflow-patterns.md +0 -385
- package/skills/octocode-local-search/SKILL.md +0 -449
- package/skills/octocode-pr-review/SKILL.md +0 -391
- package/skills/octocode-pr-review/references/domain-reviewers.md +0 -105
- package/skills/octocode-pr-review/references/execution-lifecycle.md +0 -116
- package/skills/octocode-pr-review/references/research-flows.md +0 -75
- package/skills/octocode-research/references/tool-reference.md +0 -304
- package/skills/octocode-research/references/workflow-patterns.md +0 -325
|
@@ -0,0 +1,631 @@
|
|
|
1
|
+
# Server Flows - Octocode Research Server
|
|
2
|
+
|
|
3
|
+
> Comprehensive documentation of startup, restart, health, and shutdown flows.
|
|
4
|
+
> **v2.1.0**: Now powered by PM2 process manager.
|
|
5
|
+
|
|
6
|
+
## Table of Contents
|
|
7
|
+
|
|
8
|
+
- [Overview](#overview)
|
|
9
|
+
- [Architecture Diagram](#architecture-diagram)
|
|
10
|
+
- [1. Startup Flow](#1-startup-flow)
|
|
11
|
+
- [2. Request Flow](#2-request-flow)
|
|
12
|
+
- [3. Health Check Flow](#3-health-check-flow)
|
|
13
|
+
- [4. PM2 Restart Strategies](#4-pm2-restart-strategies)
|
|
14
|
+
- [5. Graceful Shutdown Flow](#5-graceful-shutdown-flow)
|
|
15
|
+
- [Component Reference](#component-reference)
|
|
16
|
+
- [PM2 Commands Reference](#pm2-commands-reference)
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Overview
|
|
21
|
+
|
|
22
|
+
| Attribute | Value |
|
|
23
|
+
|-----------|-------|
|
|
24
|
+
| **Port** | 1987 |
|
|
25
|
+
| **Version** | 2.1.0 |
|
|
26
|
+
| **Process Manager** | PM2 |
|
|
27
|
+
| **Restart Strategy** | Cron (hourly) + Memory threshold |
|
|
28
|
+
| **Max Memory** | 500MB |
|
|
29
|
+
| **Kill Timeout** | 10 seconds |
|
|
30
|
+
|
|
31
|
+
### Key Design Patterns
|
|
32
|
+
|
|
33
|
+
- **Warm Start**: Server accepts requests immediately, MCP initializes in background
|
|
34
|
+
- **PM2 Process Management**: Automatic restarts, monitoring, and log management
|
|
35
|
+
- **Cron Restart**: Server restarts hourly for memory hygiene (via PM2)
|
|
36
|
+
- **Memory Guard**: Auto-restart if memory exceeds 500MB (via PM2)
|
|
37
|
+
- **Circuit Breaker**: Protects external calls with failure thresholds
|
|
38
|
+
- **Fire-and-Forget**: Background telemetry doesn't block responses
|
|
39
|
+
- **Readiness Gate**: `/tools` and `/prompts` routes blocked until MCP ready
|
|
40
|
+
- **Ready Signal**: PM2 waits for `process.send('ready')` before considering app online
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Architecture Diagram
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
┌─────────────────────────────────────────────────────────────────────────────┐
|
|
48
|
+
│ SERVER LIFECYCLE (PM2) │
|
|
49
|
+
├─────────────────────────────────────────────────────────────────────────────┤
|
|
50
|
+
│ │
|
|
51
|
+
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
|
52
|
+
│ │ STARTUP │───▶│ RUNNING │───▶│ SHUTDOWN │ │
|
|
53
|
+
│ └──────────────┘ └──────────────┘ └──────────────┘ │
|
|
54
|
+
│ │ │ ▲ │
|
|
55
|
+
│ │ │ │ │
|
|
56
|
+
│ ▼ ▼ │ │
|
|
57
|
+
│ ┌──────────────┐ ┌──────────────┐ ┌─────┴────────┐ │
|
|
58
|
+
│ │ INITIALIZING │ │ PM2 CRON │───▶│ CRON_RESTART │ │
|
|
59
|
+
│ │ wait_ready │ │ (every hour) │ │ (hourly) │ │
|
|
60
|
+
│ └──────────────┘ └──────────────┘ └──────────────┘ │
|
|
61
|
+
│ │ │ │
|
|
62
|
+
│ │ │ │
|
|
63
|
+
│ │ ┌──────────────┐ │ │
|
|
64
|
+
│ │ │ MEMORY CHECK │───────────┤ │
|
|
65
|
+
│ │ │ (> 500MB) │ │ │
|
|
66
|
+
│ │ └──────────────┘ │ │
|
|
67
|
+
│ │ │ │
|
|
68
|
+
│ └────────── process.send('ready') ─────▶│ │
|
|
69
|
+
│ │
|
|
70
|
+
└─────────────────────────────────────────────────────────────────────────────┘
|
|
71
|
+
|
|
72
|
+
┌─────────────────────────────────────────────────────────────────────────────┐
|
|
73
|
+
│ REQUEST FLOW │
|
|
74
|
+
├─────────────────────────────────────────────────────────────────────────────┤
|
|
75
|
+
│ │
|
|
76
|
+
│ Request ──▶ [requestLogger] ──▶ [Route Handler] │
|
|
77
|
+
│ │ │
|
|
78
|
+
│ ┌────────────────┴───────┐ │
|
|
79
|
+
│ ▼ ▼ │
|
|
80
|
+
│ /health /tools, /prompts │
|
|
81
|
+
│ (always) [checkReadiness] │
|
|
82
|
+
│ │ │ │
|
|
83
|
+
│ ▼ ▼ │
|
|
84
|
+
│ JSON Response 503 if !initialized │
|
|
85
|
+
│ 200 if ready │
|
|
86
|
+
│ │
|
|
87
|
+
└─────────────────────────────────────────────────────────────────────────────┘
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## 1. Startup Flow
|
|
93
|
+
|
|
94
|
+
### Sequence Diagram
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
┌──────────┐ ┌───────────┐ ┌────────────┐ ┌──────────────┐ ┌───────────┐
|
|
98
|
+
│ PM2 │ │ createSvr │ │ startSvr │ │ Background │ │ Ready │
|
|
99
|
+
└────┬─────┘ └─────┬─────┘ └─────┬──────┘ └──────┬───────┘ └─────┬─────┘
|
|
100
|
+
│ │ │ │ │
|
|
101
|
+
│ pm2 start │ │ │ │
|
|
102
|
+
│─────────────▶│ │ │ │
|
|
103
|
+
│ │ │ │ │
|
|
104
|
+
│ │ createServer() │ │
|
|
105
|
+
│ │─────────────▶│ │ │
|
|
106
|
+
│ │ │ │ │
|
|
107
|
+
│ │ ┌────────────┴────────────┐ │ │
|
|
108
|
+
│ │ │ 1. initializeLogger() │ │ │
|
|
109
|
+
│ │ │ 2. initializeSession() │ │ │
|
|
110
|
+
│ │ │ 3. Setup middleware │ │ │
|
|
111
|
+
│ │ │ 4. Mount routes │ │ │
|
|
112
|
+
│ │ │ 5. Error handlers │ │ │
|
|
113
|
+
│ │ └────────────┬────────────┘ │ │
|
|
114
|
+
│ │ │ │ │
|
|
115
|
+
│ │◀─────────────│ │ │
|
|
116
|
+
│ │ app │ │ │
|
|
117
|
+
│ │ │ │ │
|
|
118
|
+
│ │ │ app.listen(1987) │
|
|
119
|
+
│ │ │───────────────▶│ │
|
|
120
|
+
│ │ │ │ │
|
|
121
|
+
│ │ │ 'listening' │ │
|
|
122
|
+
│ │ │◀───────────────│ │
|
|
123
|
+
│ │ │ │ │
|
|
124
|
+
│ │ │ ┌──────────────┴──────────────┐ │
|
|
125
|
+
│ │ │ │ BACKGROUND (async): │ │
|
|
126
|
+
│ │ │ │ 1. initializeMcpContent() │ │
|
|
127
|
+
│ │ │ │ 2. initializeProviders() │ │
|
|
128
|
+
│ │ │ │ 3. process.send('ready') │ │
|
|
129
|
+
│ │ │ │ 4. logSessionInit() │ │
|
|
130
|
+
│ │ │ └──────────────┬──────────────┘ │
|
|
131
|
+
│ │ │ │ │
|
|
132
|
+
│◀──────────── process.send('ready') ─────────│ │
|
|
133
|
+
│ (PM2 marks app 'online') │ │ MCP Ready! │
|
|
134
|
+
│ │ │ │───────────────▶│
|
|
135
|
+
│ │ │ │ │
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Phase 1: Synchronous Setup (`createServer`)
|
|
139
|
+
|
|
140
|
+
```typescript
|
|
141
|
+
// Order matters! These run synchronously before server accepts requests
|
|
142
|
+
|
|
143
|
+
1. initializeLogger() // Creates log directory, sets up file logging
|
|
144
|
+
2. initializeSession() // Generates session ID for telemetry
|
|
145
|
+
3. Express middleware stack:
|
|
146
|
+
├── express.json() // Parse JSON bodies
|
|
147
|
+
└── requestLogger // Log all requests with timing
|
|
148
|
+
4. Route mounting:
|
|
149
|
+
├── GET /health // Always available (no readiness check)
|
|
150
|
+
├── /tools/* // checkReadiness middleware applied
|
|
151
|
+
└── /prompts/* // checkReadiness middleware applied
|
|
152
|
+
5. Error handlers:
|
|
153
|
+
├── 404 handler // Unknown routes
|
|
154
|
+
└── errorHandler middleware // Catch-all error formatting
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### Phase 2: HTTP Server Start (`startServer`)
|
|
158
|
+
|
|
159
|
+
```typescript
|
|
160
|
+
app.listen(PORT)
|
|
161
|
+
.on('listening', () => {
|
|
162
|
+
// Server is now accepting connections
|
|
163
|
+
// Status: 'initializing' (health check returns this)
|
|
164
|
+
});
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Phase 3: Background Initialization (Warm Start)
|
|
168
|
+
|
|
169
|
+
```typescript
|
|
170
|
+
// These run async AFTER server is listening
|
|
171
|
+
// Requests to /tools/* return 503 until complete
|
|
172
|
+
|
|
173
|
+
1. initializeMcpContent() // Load MCP tools, schemas, prompts from octocode-mcp
|
|
174
|
+
├── await initialize() // Core MCP initialization
|
|
175
|
+
└── await loadToolContent() // Cache tool metadata
|
|
176
|
+
|
|
177
|
+
2. initializeProviders() // Initialize GitHub token, providers
|
|
178
|
+
└── Resolves token from env/keychain/CLI
|
|
179
|
+
|
|
180
|
+
3. process.send('ready') // Signal PM2 that app is ready
|
|
181
|
+
└── PM2 marks process as 'online'
|
|
182
|
+
|
|
183
|
+
4. logSessionInit() // Fire-and-forget telemetry
|
|
184
|
+
└── 5s timeout, errors queued
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### State Transitions
|
|
188
|
+
|
|
189
|
+
| State | Health Status | `/tools` Available | PM2 Status | Duration |
|
|
190
|
+
|-------|---------------|-------------------|------------|----------|
|
|
191
|
+
| Starting | N/A | No | starting | ~100ms |
|
|
192
|
+
| Listening | `'initializing'` | 503 | waiting ready | ~1-3s |
|
|
193
|
+
| Ready | `'ok'` | Yes | online | Until shutdown |
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## 2. Request Flow
|
|
198
|
+
|
|
199
|
+
### Middleware Chain
|
|
200
|
+
|
|
201
|
+
```
|
|
202
|
+
┌─────────────────────────────────────────────────────────────────────────────┐
|
|
203
|
+
│ REQUEST MIDDLEWARE CHAIN │
|
|
204
|
+
├─────────────────────────────────────────────────────────────────────────────┤
|
|
205
|
+
│ │
|
|
206
|
+
│ Incoming Request │
|
|
207
|
+
│ │ │
|
|
208
|
+
│ ▼ │
|
|
209
|
+
│ ┌──────────────────┐ │
|
|
210
|
+
│ │ express.json() │ Parse JSON body │
|
|
211
|
+
│ └────────┬─────────┘ │
|
|
212
|
+
│ │ │
|
|
213
|
+
│ ▼ │
|
|
214
|
+
│ ┌──────────────────┐ │
|
|
215
|
+
│ │ requestLogger │ Log request, attach x-request-id │
|
|
216
|
+
│ └────────┬─────────┘ │
|
|
217
|
+
│ │ │
|
|
218
|
+
│ ├───────────────────────────────────┐ │
|
|
219
|
+
│ │ │ │
|
|
220
|
+
│ ▼ ▼ │
|
|
221
|
+
│ ┌─────────────┐ ┌────────────────┐ │
|
|
222
|
+
│ │ /health │ │ /tools, /prompts│ │
|
|
223
|
+
│ │ (direct) │ │ checkReadiness │ │
|
|
224
|
+
│ └──────┬──────┘ └───────┬────────┘ │
|
|
225
|
+
│ │ │ │
|
|
226
|
+
│ │ ┌────────────┴────────────┐ │
|
|
227
|
+
│ │ │ │ │
|
|
228
|
+
│ │ ▼ ▼ │
|
|
229
|
+
│ │ MCP Initialized? Not Initialized │
|
|
230
|
+
│ │ YES NO │
|
|
231
|
+
│ │ │ │ │
|
|
232
|
+
│ │ ▼ ▼ │
|
|
233
|
+
│ │ Route Handler 503 + retry hint │
|
|
234
|
+
│ │ │ │
|
|
235
|
+
│ ▼ ▼ │
|
|
236
|
+
│ ┌─────────────────────────────────────────────────────┐ │
|
|
237
|
+
│ │ Response │ │
|
|
238
|
+
│ │ - requestLogger logs on 'finish' event │ │
|
|
239
|
+
│ │ - logToolCall() fired async (non-blocking) │ │
|
|
240
|
+
│ └─────────────────────────────────────────────────────┘ │
|
|
241
|
+
│ │
|
|
242
|
+
└─────────────────────────────────────────────────────────────────────────────┘
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### Request Logger Details
|
|
246
|
+
|
|
247
|
+
```typescript
|
|
248
|
+
// Attaches to response 'finish' event
|
|
249
|
+
res.on('finish', () => {
|
|
250
|
+
const duration = Date.now() - start;
|
|
251
|
+
const status = res.statusCode;
|
|
252
|
+
|
|
253
|
+
// Console log (colored)
|
|
254
|
+
console.log(status >= 400 ? errorLog(...) : resultLog(...));
|
|
255
|
+
|
|
256
|
+
// File log (async, non-blocking)
|
|
257
|
+
if (req.path !== '/health') {
|
|
258
|
+
logToolCall({ tool, route, duration, success, requestId });
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### Readiness Check Middleware
|
|
264
|
+
|
|
265
|
+
```typescript
|
|
266
|
+
// Applied to /tools/* and /prompts/* routes
|
|
267
|
+
export const checkReadiness = (_req, res, next) => {
|
|
268
|
+
if (!isMcpInitialized()) {
|
|
269
|
+
res.status(503).json({
|
|
270
|
+
success: false,
|
|
271
|
+
error: {
|
|
272
|
+
message: 'Server is initializing',
|
|
273
|
+
code: 'SERVER_INITIALIZING',
|
|
274
|
+
hint: 'Please retry in a few seconds',
|
|
275
|
+
},
|
|
276
|
+
});
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
next();
|
|
280
|
+
};
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
---
|
|
284
|
+
|
|
285
|
+
## 3. Health Check Flow
|
|
286
|
+
|
|
287
|
+
### Endpoint: `GET /health`
|
|
288
|
+
|
|
289
|
+
```
|
|
290
|
+
┌─────────────────────────────────────────────────────────────────────────────┐
|
|
291
|
+
│ HEALTH CHECK FLOW │
|
|
292
|
+
├─────────────────────────────────────────────────────────────────────────────┤
|
|
293
|
+
│ │
|
|
294
|
+
│ GET /health │
|
|
295
|
+
│ │ │
|
|
296
|
+
│ ├──▶ process.memoryUsage() // Heap, RSS stats │
|
|
297
|
+
│ │ │
|
|
298
|
+
│ ├──▶ errorQueue.getRecent(5) // Last 5 queued errors │
|
|
299
|
+
│ │ │
|
|
300
|
+
│ ├──▶ isMcpInitialized() // true = 'ok', false = 'init' │
|
|
301
|
+
│ │ │
|
|
302
|
+
│ ├──▶ getAllCircuitStates() // Circuit breaker health │
|
|
303
|
+
│ │ │
|
|
304
|
+
│ └──▶ Response │
|
|
305
|
+
│ │
|
|
306
|
+
└─────────────────────────────────────────────────────────────────────────────┘
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
### Response Schema
|
|
310
|
+
|
|
311
|
+
```typescript
|
|
312
|
+
{
|
|
313
|
+
status: 'ok' | 'initializing',
|
|
314
|
+
port: 1987,
|
|
315
|
+
version: '2.1.0',
|
|
316
|
+
uptime: number, // seconds since process start
|
|
317
|
+
processManager: 'pm2',
|
|
318
|
+
memory: {
|
|
319
|
+
heapUsed: number, // MB
|
|
320
|
+
heapTotal: number, // MB
|
|
321
|
+
rss: number, // MB (Resident Set Size)
|
|
322
|
+
},
|
|
323
|
+
circuits: {
|
|
324
|
+
[circuitName]: {
|
|
325
|
+
state: 'closed' | 'open' | 'half-open',
|
|
326
|
+
failures: number,
|
|
327
|
+
lastFailure: Date | null,
|
|
328
|
+
}
|
|
329
|
+
},
|
|
330
|
+
errors: {
|
|
331
|
+
queueSize: number,
|
|
332
|
+
recentErrors: [{
|
|
333
|
+
timestamp: string, // ISO 8601
|
|
334
|
+
context: string,
|
|
335
|
+
message: string,
|
|
336
|
+
}]
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
### Health Check Behavior
|
|
342
|
+
|
|
343
|
+
| Condition | Status | Notes |
|
|
344
|
+
|-----------|--------|-------|
|
|
345
|
+
| MCP not initialized | `'initializing'` | Background init in progress |
|
|
346
|
+
| MCP initialized | `'ok'` | All routes available |
|
|
347
|
+
| Circuit open | `'ok'` | Degraded but functional |
|
|
348
|
+
| Errors in queue | `'ok'` | Errors are informational |
|
|
349
|
+
|
|
350
|
+
---
|
|
351
|
+
|
|
352
|
+
## 4. PM2 Restart Strategies
|
|
353
|
+
|
|
354
|
+
### Overview
|
|
355
|
+
|
|
356
|
+
PM2 manages all restart logic via `ecosystem.config.cjs`:
|
|
357
|
+
|
|
358
|
+
```
|
|
359
|
+
┌─────────────────────────────────────────────────────────────────────────────┐
|
|
360
|
+
│ PM2 RESTART STRATEGIES │
|
|
361
|
+
├─────────────────────────────────────────────────────────────────────────────┤
|
|
362
|
+
│ │
|
|
363
|
+
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
|
364
|
+
│ │ CRON RESTART │ │MEMORY RESTART│ │CRASH RESTART │ │
|
|
365
|
+
│ │ (hourly) │ │ (> 500MB) │ │ (on error) │ │
|
|
366
|
+
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
|
|
367
|
+
│ │ │ │ │
|
|
368
|
+
│ ▼ ▼ ▼ │
|
|
369
|
+
│ ┌─────────────────────────────────────────────────────────────┐ │
|
|
370
|
+
│ │ SIGINT → gracefulShutdown() │ │
|
|
371
|
+
│ │ │ │
|
|
372
|
+
│ │ 1. stopCircuitCleanup() ✅ Intervals cleared │ │
|
|
373
|
+
│ │ 2. clearAllCircuits() ✅ Circuit breakers reset │ │
|
|
374
|
+
│ │ 3. server.close() ✅ HTTP connections drained │ │
|
|
375
|
+
│ │ 4. process.exit(0) ✅ Clean exit │ │
|
|
376
|
+
│ │ │ │
|
|
377
|
+
│ └─────────────────────────────────────────────────────────────┘ │
|
|
378
|
+
│ │ │
|
|
379
|
+
│ ▼ │
|
|
380
|
+
│ ┌─────────────────────────────────────────────────────────────┐ │
|
|
381
|
+
│ │ PM2 Auto-Restart │ │
|
|
382
|
+
│ │ │ │
|
|
383
|
+
│ │ - restart_delay: 1000ms │ │
|
|
384
|
+
│ │ - exp_backoff_restart_delay: 100ms (on crashes) │ │
|
|
385
|
+
│ │ - max_restarts: 10 (before stopping) │ │
|
|
386
|
+
│ │ │ │
|
|
387
|
+
│ └─────────────────────────────────────────────────────────────┘ │
|
|
388
|
+
│ │
|
|
389
|
+
└─────────────────────────────────────────────────────────────────────────────┘
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
### Restart Triggers
|
|
393
|
+
|
|
394
|
+
| Trigger | Condition | Behavior |
|
|
395
|
+
|---------|-----------|----------|
|
|
396
|
+
| **Cron** | Every hour (`0 * * * *`) | Graceful restart for memory hygiene |
|
|
397
|
+
| **Memory** | RSS > 500MB | Automatic restart when threshold exceeded |
|
|
398
|
+
| **Crash** | `process.exit(1)` | Restart with exponential backoff |
|
|
399
|
+
| **Manual** | `pm2 restart` | Graceful reload |
|
|
400
|
+
|
|
401
|
+
### Ecosystem Configuration
|
|
402
|
+
|
|
403
|
+
```javascript
|
|
404
|
+
// ecosystem.config.cjs
|
|
405
|
+
module.exports = {
|
|
406
|
+
apps: [{
|
|
407
|
+
name: 'octocode-research',
|
|
408
|
+
script: './scripts/server.js',
|
|
409
|
+
|
|
410
|
+
// Restart strategies
|
|
411
|
+
cron_restart: '0 * * * *', // Every hour
|
|
412
|
+
max_memory_restart: '500M', // Memory threshold
|
|
413
|
+
|
|
414
|
+
// Graceful shutdown
|
|
415
|
+
kill_timeout: 10000, // 10s before SIGKILL
|
|
416
|
+
wait_ready: true, // Wait for process.send('ready')
|
|
417
|
+
listen_timeout: 15000, // Timeout for ready signal
|
|
418
|
+
|
|
419
|
+
// Restart behavior
|
|
420
|
+
autorestart: true,
|
|
421
|
+
max_restarts: 10,
|
|
422
|
+
restart_delay: 1000,
|
|
423
|
+
exp_backoff_restart_delay: 100,
|
|
424
|
+
}]
|
|
425
|
+
};
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
---
|
|
429
|
+
|
|
430
|
+
## 5. Graceful Shutdown Flow
|
|
431
|
+
|
|
432
|
+
### Triggers
|
|
433
|
+
|
|
434
|
+
| Signal | Source |
|
|
435
|
+
|--------|--------|
|
|
436
|
+
| `SIGTERM` | `pm2 stop`, `pm2 restart`, `kill <pid>` |
|
|
437
|
+
| `SIGINT` | Ctrl+C in terminal, PM2 graceful reload |
|
|
438
|
+
|
|
439
|
+
### Sequence Diagram
|
|
440
|
+
|
|
441
|
+
```
|
|
442
|
+
┌─────────────────────────────────────────────────────────────────────────────┐
|
|
443
|
+
│ GRACEFUL SHUTDOWN FLOW │
|
|
444
|
+
├─────────────────────────────────────────────────────────────────────────────┤
|
|
445
|
+
│ │
|
|
446
|
+
│ PM2 sends SIGINT (graceful) or SIGTERM │
|
|
447
|
+
│ │ │
|
|
448
|
+
│ ▼ │
|
|
449
|
+
│ ┌──────────────────┐ │
|
|
450
|
+
│ │ gracefulShutdown │ │
|
|
451
|
+
│ │ (signal) │ │
|
|
452
|
+
│ └────────┬─────────┘ │
|
|
453
|
+
│ │ │
|
|
454
|
+
│ ├──▶ stopCircuitCleanup() // Clear circuit cleanup interval │
|
|
455
|
+
│ │ │ │
|
|
456
|
+
│ │ └──▶ clearInterval(cleanupIntervalId) │
|
|
457
|
+
│ │ │
|
|
458
|
+
│ ├──▶ clearAllCircuits() // Reset all circuit breakers │
|
|
459
|
+
│ │ │ │
|
|
460
|
+
│ │ └──▶ circuits.clear(), configs.clear() │
|
|
461
|
+
│ │ │
|
|
462
|
+
│ └──▶ server.close() // Stop accepting new connections │
|
|
463
|
+
│ │ │
|
|
464
|
+
│ ┌─────────┴─────────┐ │
|
|
465
|
+
│ │ │ │
|
|
466
|
+
│ ▼ ▼ │
|
|
467
|
+
│ Success (< 10s) Timeout (10s) │
|
|
468
|
+
│ │ │ │
|
|
469
|
+
│ ▼ ▼ │
|
|
470
|
+
│ process.exit(0) PM2 sends SIGKILL │
|
|
471
|
+
│ │ │ │
|
|
472
|
+
│ └─────────┬─────────┘ │
|
|
473
|
+
│ │ │
|
|
474
|
+
│ ▼ │
|
|
475
|
+
│ PM2 Auto-Restart │
|
|
476
|
+
│ │
|
|
477
|
+
└─────────────────────────────────────────────────────────────────────────────┘
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
### Cleanup Order
|
|
481
|
+
|
|
482
|
+
```typescript
|
|
483
|
+
function gracefulShutdown(signal: string): void {
|
|
484
|
+
console.log(`🛑 Received ${signal}. Starting graceful shutdown...`);
|
|
485
|
+
|
|
486
|
+
// 1. Stop periodic cleanup interval
|
|
487
|
+
stopCircuitCleanup(); // ✅ Circuit cleanup interval stopped
|
|
488
|
+
|
|
489
|
+
// 2. Clear circuit breaker state
|
|
490
|
+
clearAllCircuits(); // ✅ Circuit breakers cleared
|
|
491
|
+
|
|
492
|
+
// 3. Close HTTP server (drain existing connections)
|
|
493
|
+
if (server) {
|
|
494
|
+
server.close((err) => {
|
|
495
|
+
if (err) {
|
|
496
|
+
console.error('❌ Error closing server:', err);
|
|
497
|
+
process.exit(1);
|
|
498
|
+
}
|
|
499
|
+
console.log('✅ HTTP server closed');
|
|
500
|
+
process.exit(0); // PM2 handles restart
|
|
501
|
+
});
|
|
502
|
+
} else {
|
|
503
|
+
process.exit(0);
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
### Exit Codes
|
|
509
|
+
|
|
510
|
+
| Code | Meaning | PM2 Behavior |
|
|
511
|
+
|------|---------|--------------|
|
|
512
|
+
| 0 | Clean shutdown | Restart (unless `autorestart: false`) |
|
|
513
|
+
| 1 | Error during shutdown | Restart with backoff |
|
|
514
|
+
|
|
515
|
+
---
|
|
516
|
+
|
|
517
|
+
## Component Reference
|
|
518
|
+
|
|
519
|
+
### Files & Responsibilities
|
|
520
|
+
|
|
521
|
+
| File | Purpose |
|
|
522
|
+
|------|---------|
|
|
523
|
+
| `ecosystem.config.cjs` | PM2 process configuration |
|
|
524
|
+
| `server.ts` | Main entry, lifecycle management |
|
|
525
|
+
| `mcpCache.ts` | MCP content singleton, initialization |
|
|
526
|
+
| `index.ts` | Re-exports from octocode-mcp |
|
|
527
|
+
| `middleware/readiness.ts` | Blocks routes until MCP ready |
|
|
528
|
+
| `middleware/logger.ts` | Request/response logging |
|
|
529
|
+
| `middleware/errorHandler.ts` | Error response formatting |
|
|
530
|
+
| `utils/circuitBreaker.ts` | External call protection |
|
|
531
|
+
| `utils/asyncTimeout.ts` | Fire-and-forget with timeout |
|
|
532
|
+
| `utils/errorQueue.ts` | Error tracking for health |
|
|
533
|
+
| `utils/logger.ts` | File-based logging |
|
|
534
|
+
| `routes/tools.ts` | Tool execution endpoints |
|
|
535
|
+
| `routes/prompts.ts` | Prompt discovery endpoints |
|
|
536
|
+
|
|
537
|
+
### State Variables
|
|
538
|
+
|
|
539
|
+
| Variable | Type | Purpose |
|
|
540
|
+
|----------|------|---------|
|
|
541
|
+
| `server` | `Server \| null` | HTTP server instance |
|
|
542
|
+
| `mcpContent` | `CompleteMetadata \| null` | Cached MCP tool metadata |
|
|
543
|
+
|
|
544
|
+
### Configuration (ecosystem.config.cjs)
|
|
545
|
+
|
|
546
|
+
| Option | Value | Purpose |
|
|
547
|
+
|--------|-------|---------|
|
|
548
|
+
| `cron_restart` | `'0 * * * *'` | Hourly restart for memory hygiene |
|
|
549
|
+
| `max_memory_restart` | `'500M'` | Memory threshold for restart |
|
|
550
|
+
| `kill_timeout` | 10000 | Graceful shutdown timeout (ms) |
|
|
551
|
+
| `wait_ready` | true | Wait for ready signal |
|
|
552
|
+
| `listen_timeout` | 15000 | Ready signal timeout (ms) |
|
|
553
|
+
| `max_restarts` | 10 | Max consecutive restarts |
|
|
554
|
+
| `restart_delay` | 1000 | Delay between restarts (ms) |
|
|
555
|
+
|
|
556
|
+
---
|
|
557
|
+
|
|
558
|
+
## PM2 Commands Reference
|
|
559
|
+
|
|
560
|
+
### NPM Scripts
|
|
561
|
+
|
|
562
|
+
```bash
|
|
563
|
+
# Start/Stop/Restart
|
|
564
|
+
npm run pm2:start # Start with PM2
|
|
565
|
+
npm run pm2:stop # Stop gracefully
|
|
566
|
+
npm run pm2:restart # Restart (full)
|
|
567
|
+
npm run pm2:reload # Reload (zero-downtime)
|
|
568
|
+
npm run pm2:delete # Remove from PM2
|
|
569
|
+
|
|
570
|
+
# Monitoring
|
|
571
|
+
npm run pm2:logs # View logs (tail -f)
|
|
572
|
+
npm run pm2:monit # TUI dashboard
|
|
573
|
+
```
|
|
574
|
+
|
|
575
|
+
### Direct PM2 Commands
|
|
576
|
+
|
|
577
|
+
```bash
|
|
578
|
+
# Process management
|
|
579
|
+
pm2 start ecosystem.config.cjs # Start
|
|
580
|
+
pm2 stop octocode-research # Stop
|
|
581
|
+
pm2 restart octocode-research # Restart
|
|
582
|
+
pm2 reload octocode-research # Zero-downtime reload
|
|
583
|
+
pm2 delete octocode-research # Remove
|
|
584
|
+
|
|
585
|
+
# Monitoring
|
|
586
|
+
pm2 status # List all processes
|
|
587
|
+
pm2 logs octocode-research # View logs
|
|
588
|
+
pm2 logs octocode-research --lines 100 # View last 100 lines
|
|
589
|
+
pm2 monit # Interactive dashboard
|
|
590
|
+
|
|
591
|
+
# Debugging
|
|
592
|
+
pm2 describe octocode-research # Detailed process info
|
|
593
|
+
pm2 env octocode-research # Environment variables
|
|
594
|
+
pm2 reset octocode-research # Reset restart counter
|
|
595
|
+
|
|
596
|
+
# Log management
|
|
597
|
+
pm2 flush # Clear all logs
|
|
598
|
+
pm2 reloadLogs # Reload log files
|
|
599
|
+
```
|
|
600
|
+
|
|
601
|
+
### Development vs Production
|
|
602
|
+
|
|
603
|
+
```bash
|
|
604
|
+
# Development (direct Node, with watch)
|
|
605
|
+
npm run dev # tsx watch src/server.ts
|
|
606
|
+
|
|
607
|
+
# Production (PM2 managed)
|
|
608
|
+
npm run build # Build TypeScript
|
|
609
|
+
npm run pm2:start # Start with PM2
|
|
610
|
+
```
|
|
611
|
+
|
|
612
|
+
---
|
|
613
|
+
|
|
614
|
+
## Migration from v2.0.0
|
|
615
|
+
|
|
616
|
+
### Removed Features (Handled by PM2)
|
|
617
|
+
|
|
618
|
+
| Feature | Old Implementation | PM2 Equivalent |
|
|
619
|
+
|---------|-------------------|----------------|
|
|
620
|
+
| Idle restart | `checkIdleRestart()` | `cron_restart: '0 * * * *'` |
|
|
621
|
+
| Idle timer | `lastRequestTime` | N/A |
|
|
622
|
+
| Idle check interval | `setInterval(..., 300000)` | N/A |
|
|
623
|
+
| Shutdown timeout | Manual `setTimeout` | `kill_timeout: 10000` |
|
|
624
|
+
|
|
625
|
+
### New Features
|
|
626
|
+
|
|
627
|
+
- **Ready Signal**: `process.send('ready')` for accurate startup tracking
|
|
628
|
+
- **Memory Guard**: `max_memory_restart: '500M'`
|
|
629
|
+
- **Exponential Backoff**: `exp_backoff_restart_delay: 100`
|
|
630
|
+
- **PM2 Logs**: Disabled (app handles logging in `~/.octocode/logs/`)
|
|
631
|
+
- **PM2 Monitoring**: `pm2 monit` dashboard
|