@aiwg/cli 0.0.0-bootstrap.0 → 2026.7.18
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 -0
- package/README.md +22 -1
- package/bin/aiwg.mjs +349 -0
- package/dist/src/a2a/agent-card.js +145 -0
- package/dist/src/a2a/client.js +411 -0
- package/dist/src/a2a/hitl-cli.js +171 -0
- package/dist/src/a2a/hitl-driver.js +370 -0
- package/dist/src/a2a/hitl.js +181 -0
- package/dist/src/a2a/http.js +193 -0
- package/dist/src/a2a/jcs.js +128 -0
- package/dist/src/a2a/jws.js +187 -0
- package/dist/src/a2a/types.js +24 -0
- package/dist/src/a2a/webhook.js +240 -0
- package/dist/src/activity-log/cli.js +348 -0
- package/dist/src/activity-log/parser.js +81 -0
- package/dist/src/activity-log/types.js +50 -0
- package/dist/src/agents/agent-deployer.js +367 -0
- package/dist/src/agents/agent-packager.js +271 -0
- package/dist/src/agents/agent-validator.js +271 -0
- package/dist/src/agents/grounding/knowledge-base.js +161 -0
- package/dist/src/agents/grounding/types.js +12 -0
- package/dist/src/agents/index.js +10 -0
- package/dist/src/agents/packaged-agent-inventory.js +75 -0
- package/dist/src/agents/types.js +7 -0
- package/dist/src/api/index.d.ts +10 -0
- package/dist/src/api/index.js +10 -0
- package/dist/src/artifacts/address-parser.js +73 -0
- package/dist/src/artifacts/audit/cli.js +183 -0
- package/dist/src/artifacts/audit/drift.js +122 -0
- package/dist/src/artifacts/audit/types.js +12 -0
- package/dist/src/artifacts/backends/graphology-backend.js +160 -0
- package/dist/src/artifacts/backends/json-backend.js +129 -0
- package/dist/src/artifacts/backends/sqlite-backend.js +199 -0
- package/dist/src/artifacts/browser-export.js +622 -0
- package/dist/src/artifacts/capability-resolver.js +94 -0
- package/dist/src/artifacts/checksum-manifest.js +91 -0
- package/dist/src/artifacts/citation-parser.js +162 -0
- package/dist/src/artifacts/cli.js +1486 -0
- package/dist/src/artifacts/corpus-tools/citation-densify.js +311 -0
- package/dist/src/artifacts/corpus-tools/cli.js +393 -0
- package/dist/src/artifacts/corpus-tools/corpus-graph.js +225 -0
- package/dist/src/artifacts/corpus-tools/curator.js +186 -0
- package/dist/src/artifacts/corpus-tools/discovery-log.js +70 -0
- package/dist/src/artifacts/corpus-tools/funder-network.js +141 -0
- package/dist/src/artifacts/corpus-tools/induction-audit.js +233 -0
- package/dist/src/artifacts/corpus-tools/integrity-scan.js +202 -0
- package/dist/src/artifacts/corpus-tools/profile-communities.js +166 -0
- package/dist/src/artifacts/corpus-tools/profile-edges.js +72 -0
- package/dist/src/artifacts/corpus-tools/profile-embed.js +113 -0
- package/dist/src/artifacts/corpus-tools/profile-generate-fm.js +167 -0
- package/dist/src/artifacts/corpus-tools/profile-generate.js +181 -0
- package/dist/src/artifacts/corpus-tools/profile-metrics.js +98 -0
- package/dist/src/artifacts/corpus-tools/profile-status.js +86 -0
- package/dist/src/artifacts/corpus-tools/profile-temporal.js +139 -0
- package/dist/src/artifacts/corpus-tools/radar-init.js +93 -0
- package/dist/src/artifacts/corpus-tools/radar-report.js +118 -0
- package/dist/src/artifacts/corpus-tools/radar-shared.js +189 -0
- package/dist/src/artifacts/corpus-tools/radar-status.js +68 -0
- package/dist/src/artifacts/corpus-tools/sidecar-lint.js +233 -0
- package/dist/src/artifacts/corpus-tools/sidecar-repair.js +277 -0
- package/dist/src/artifacts/corpus-tools/snapshot.js +591 -0
- package/dist/src/artifacts/corpus-tools/source-types.js +164 -0
- package/dist/src/artifacts/corpus-tools/vision-extract.js +243 -0
- package/dist/src/artifacts/corpus-views/build.js +126 -0
- package/dist/src/artifacts/corpus-views/corpus-config.js +124 -0
- package/dist/src/artifacts/corpus-views/ref-parser.js +437 -0
- package/dist/src/artifacts/corpus-views/renderers.js +353 -0
- package/dist/src/artifacts/corpus-views/taxonomies.js +131 -0
- package/dist/src/artifacts/dep-graph.js +173 -0
- package/dist/src/artifacts/discover-facets.js +375 -0
- package/dist/src/artifacts/embedding-index.js +354 -0
- package/dist/src/artifacts/enrichment/cli.js +240 -0
- package/dist/src/artifacts/enrichment/prompt.js +47 -0
- package/dist/src/artifacts/enrichment/store.js +90 -0
- package/dist/src/artifacts/enrichment/types.js +12 -0
- package/dist/src/artifacts/fortemi-core-query-adapter.js +475 -0
- package/dist/src/artifacts/fortemi-core-sync.js +251 -0
- package/dist/src/artifacts/fortemi-shard-export.js +44 -0
- package/dist/src/artifacts/fulltext.js +108 -0
- package/dist/src/artifacts/graph-backend.js +51 -0
- package/dist/src/artifacts/graph-query.js +247 -0
- package/dist/src/artifacts/hybrid-query.js +225 -0
- package/dist/src/artifacts/index-builder.js +1089 -0
- package/dist/src/artifacts/index-reader.js +112 -0
- package/dist/src/artifacts/index-status.js +193 -0
- package/dist/src/artifacts/legacy-index-migration.js +169 -0
- package/dist/src/artifacts/move.js +154 -0
- package/dist/src/artifacts/operational-state.js +239 -0
- package/dist/src/artifacts/prebuilt-build-lock.js +49 -0
- package/dist/src/artifacts/query-engine.js +1955 -0
- package/dist/src/artifacts/source-graph.js +529 -0
- package/dist/src/artifacts/stats.js +169 -0
- package/dist/src/artifacts/types.js +606 -0
- package/dist/src/artifacts/views/cli.js +293 -0
- package/dist/src/artifacts/views/definition.js +170 -0
- package/dist/src/artifacts/views/store.js +149 -0
- package/dist/src/artifacts/views/types.js +8 -0
- package/dist/src/artifacts/watcher.js +255 -0
- package/dist/src/catalog/builtin-models.json +636 -0
- package/dist/src/catalog/cli.js +228 -0
- package/dist/src/catalog/cli.mjs +289 -0
- package/dist/src/catalog/index.js +15 -0
- package/dist/src/catalog/loader.js +217 -0
- package/dist/src/catalog/loader.mjs +251 -0
- package/dist/src/catalog/sources.json +41 -0
- package/dist/src/catalog/types.js +8 -0
- package/dist/src/channel/manager.mjs +504 -0
- package/dist/src/cli/agent-spawn.js +178 -0
- package/dist/src/cli/cli-extension-loader.js +245 -0
- package/dist/src/cli/command-log.js +275 -0
- package/dist/src/cli/config-loader.js +232 -0
- package/dist/src/cli/env.js +82 -0
- package/dist/src/cli/errors.js +150 -0
- package/dist/src/cli/find-package-root.js +40 -0
- package/dist/src/cli/git-hooks.js +250 -0
- package/dist/src/cli/handlers/agentcard.js +206 -0
- package/dist/src/cli/handlers/artifacts.js +76 -0
- package/dist/src/cli/handlers/best-practices-audit.js +280 -0
- package/dist/src/cli/handlers/cockpit.js +137 -0
- package/dist/src/cli/handlers/command-log.js +37 -0
- package/dist/src/cli/handlers/daemon.js +59 -0
- package/dist/src/cli/handlers/diagnose.js +300 -0
- package/dist/src/cli/handlers/execution-mode.js +105 -0
- package/dist/src/cli/handlers/feedback.js +341 -0
- package/dist/src/cli/handlers/help.js +147 -0
- package/dist/src/cli/handlers/index.js +302 -0
- package/dist/src/cli/handlers/init.js +179 -0
- package/dist/src/cli/handlers/install.js +129 -0
- package/dist/src/cli/handlers/issues.js +46 -0
- package/dist/src/cli/handlers/lint.js +42 -0
- package/dist/src/cli/handlers/local-executor.js +315 -0
- package/dist/src/cli/handlers/marketplace.js +168 -0
- package/dist/src/cli/handlers/mc.js +1010 -0
- package/dist/src/cli/handlers/models.js +352 -0
- package/dist/src/cli/handlers/packages.js +155 -0
- package/dist/src/cli/handlers/ralph-launcher.js +717 -0
- package/dist/src/cli/handlers/ralph.js +575 -0
- package/dist/src/cli/handlers/refresh.js +432 -0
- package/dist/src/cli/handlers/regenerate.js +336 -0
- package/dist/src/cli/handlers/repo-access.js +109 -0
- package/dist/src/cli/handlers/run.js +165 -0
- package/dist/src/cli/handlers/runtime-info.js +301 -0
- package/dist/src/cli/handlers/sandbox.js +197 -0
- package/dist/src/cli/handlers/scaffolding.js +149 -0
- package/dist/src/cli/handlers/script-runner.js +121 -0
- package/dist/src/cli/handlers/sdlc-accelerate.js +148 -0
- package/dist/src/cli/handlers/serve.js +1835 -0
- package/dist/src/cli/handlers/session.js +348 -0
- package/dist/src/cli/handlers/setup.js +440 -0
- package/dist/src/cli/handlers/skill-lint.js +367 -0
- package/dist/src/cli/handlers/skill-usage.js +74 -0
- package/dist/src/cli/handlers/steward.js +567 -0
- package/dist/src/cli/handlers/subcommands.js +1702 -0
- package/dist/src/cli/handlers/team.js +337 -0
- package/dist/src/cli/handlers/types.js +11 -0
- package/dist/src/cli/handlers/use.js +2772 -0
- package/dist/src/cli/handlers/utilities.js +703 -0
- package/dist/src/cli/handlers/version.js +134 -0
- package/dist/src/cli/handlers/workspace-context.js +93 -0
- package/dist/src/cli/handlers/workspace.js +126 -0
- package/dist/src/cli/help-generator.js +178 -0
- package/dist/src/cli/hooks/builtin/activity-log-hook.js +126 -0
- package/dist/src/cli/hooks/executor.js +96 -0
- package/dist/src/cli/hooks/index.js +15 -0
- package/dist/src/cli/hooks/registry.js +143 -0
- package/dist/src/cli/hooks/types.js +13 -0
- package/dist/src/cli/log.js +492 -0
- package/dist/src/cli/project-isolation/detect.js +70 -0
- package/dist/src/cli/project-isolation/index.js +7 -0
- package/dist/src/cli/project-isolation/signals.js +17 -0
- package/dist/src/cli/project-isolation/warning.js +102 -0
- package/dist/src/cli/prompt-utils.js +155 -0
- package/dist/src/cli/provider-deployment-plan.js +126 -0
- package/dist/src/cli/provider-resolution.js +119 -0
- package/dist/src/cli/router.js +305 -0
- package/dist/src/cli/scope-resolver.js +392 -0
- package/dist/src/cli/skill-usage.js +616 -0
- package/dist/src/cli/ui.js +224 -0
- package/dist/src/cli/watch-service.js +203 -0
- package/dist/src/cli/workflow-orchestrator.js +478 -0
- package/dist/src/cli/workspace-signals.js +321 -0
- package/dist/src/community/footer.js +14 -0
- package/dist/src/community/links.js +123 -0
- package/dist/src/community/milestones.js +46 -0
- package/dist/src/community/nudge-policy.js +93 -0
- package/dist/src/config/aiwg-config.js +883 -0
- package/dist/src/config/cli.js +703 -0
- package/dist/src/config/gitignore.js +156 -0
- package/dist/src/config/project-artifacts.js +76 -0
- package/dist/src/config/user-config.js +428 -0
- package/dist/src/config/user-registry.js +127 -0
- package/dist/src/config/workspace.js +276 -0
- package/dist/src/contributors/detect.js +39 -0
- package/dist/src/contributors/discover.js +172 -0
- package/dist/src/contributors/heuristic.js +186 -0
- package/dist/src/contributors/index.js +11 -0
- package/dist/src/contributors/types.js +13 -0
- package/dist/src/contributors/validation.js +116 -0
- package/dist/src/data/community.schema.json +43 -0
- package/dist/src/data/community.yaml +16 -0
- package/dist/src/extensions/capability-index.js +270 -0
- package/dist/src/extensions/claude-hooks-installer.js +268 -0
- package/dist/src/extensions/commands/definitions.js +3485 -0
- package/dist/src/extensions/deployment-registration.js +463 -0
- package/dist/src/extensions/index.js +22 -0
- package/dist/src/extensions/loader.js +132 -0
- package/dist/src/extensions/managed-marker.js +100 -0
- package/dist/src/extensions/manifest.js +196 -0
- package/dist/src/extensions/project-local-activity.js +114 -0
- package/dist/src/extensions/project-local-discovery.js +261 -0
- package/dist/src/extensions/project-local-doctor.js +281 -0
- package/dist/src/extensions/project-local-gitignore.js +176 -0
- package/dist/src/extensions/project-local-paths.js +121 -0
- package/dist/src/extensions/project-local-promote.js +218 -0
- package/dist/src/extensions/project-local-remove.js +373 -0
- package/dist/src/extensions/project-local-scaffold.js +252 -0
- package/dist/src/extensions/project-quickref.js +291 -0
- package/dist/src/extensions/registry.js +368 -0
- package/dist/src/extensions/shadow-resolver.js +271 -0
- package/dist/src/extensions/types.js +86 -0
- package/dist/src/extensions/upstream-registry.js +195 -0
- package/dist/src/extensions/validation.js +631 -0
- package/dist/src/features/catalog.js +88 -0
- package/dist/src/features/cli.js +197 -0
- package/dist/src/features/installer.js +57 -0
- package/dist/src/features/paths.js +14 -0
- package/dist/src/features/runtime.js +21 -0
- package/dist/src/features/status.js +134 -0
- package/dist/src/hooks/laziness-detection.js +532 -0
- package/dist/src/intake/git-history-analyzer.js +486 -0
- package/dist/src/intake/index.js +9 -0
- package/dist/src/issues/cli.js +327 -0
- package/dist/src/issues/index.js +5 -0
- package/dist/src/issues/live.js +154 -0
- package/dist/src/issues/local.js +666 -0
- package/dist/src/issues/sync.js +143 -0
- package/dist/src/issues/types.js +2 -0
- package/dist/src/issues/workflows.js +164 -0
- package/dist/src/kb/cli.js +173 -0
- package/dist/src/lint/cli.js +171 -0
- package/dist/src/lint/loader.js +225 -0
- package/dist/src/lint/reporters.js +141 -0
- package/dist/src/lint/runner.js +364 -0
- package/dist/src/lint/types.js +10 -0
- package/dist/src/marketplace/cache.js +110 -0
- package/dist/src/marketplace/identifier.js +63 -0
- package/dist/src/marketplace/registry.js +36 -0
- package/dist/src/marketplace/sources/clawhub.js +53 -0
- package/dist/src/marketplace/sources/git.js +45 -0
- package/dist/src/marketplace/types.js +9 -0
- package/dist/src/mcp/adapters/codex-runtime.js +224 -0
- package/dist/src/mcp/cli.mjs +1197 -0
- package/dist/src/mcp/elicitation.mjs +149 -0
- package/dist/src/mcp/helpers.mjs +287 -0
- package/dist/src/mcp/index.mjs +11 -0
- package/dist/src/mcp/profiles.js +263 -0
- package/dist/src/mcp/profiles.mjs +360 -0
- package/dist/src/mcp/registry.js +376 -0
- package/dist/src/mcp/registry.mjs +387 -0
- package/dist/src/mcp/server.mjs +633 -0
- package/dist/src/mcp/test-simple.mjs +271 -0
- package/dist/src/mcp/tools/command-run.mjs +101 -0
- package/dist/src/mcp/tools/discovery.mjs +291 -0
- package/dist/src/mcp/tools/interaction.mjs +87 -0
- package/dist/src/mcp/tools/orchestration.mjs +320 -0
- package/dist/src/mcp/tools/subsystems.mjs +640 -0
- package/dist/src/memory/cli.js +166 -0
- package/dist/src/memory/project-registry.js +282 -0
- package/dist/src/metrics/artifact-metrics.js +184 -0
- package/dist/src/metrics/context-budget.js +174 -0
- package/dist/src/metrics/token-counter.js +133 -0
- package/dist/src/models/config-loader.js +228 -0
- package/dist/src/models/index.js +22 -0
- package/dist/src/models/model-capabilities.v1.json +120 -0
- package/dist/src/models/model-catalog.v1.json +96 -0
- package/dist/src/models/model-discovery.js +521 -0
- package/dist/src/models/provider-models.js +73 -0
- package/dist/src/models/provider-policy.js +273 -0
- package/dist/src/models/resolver.js +245 -0
- package/dist/src/models/router.js +70 -0
- package/dist/src/models/types.js +8 -0
- package/dist/src/models/wrapper-deployment.js +178 -0
- package/dist/src/models/wrapper-route.js +54 -0
- package/dist/src/ops/cli.js +268 -0
- package/dist/src/ops/registry.js +623 -0
- package/dist/src/packages/adapters/clawhub.js +113 -0
- package/dist/src/packages/adapters/git.js +153 -0
- package/dist/src/packages/adapters/gitea.js +93 -0
- package/dist/src/packages/adapters/github.js +69 -0
- package/dist/src/packages/adapters/local-cache.js +89 -0
- package/dist/src/packages/package-registry.js +143 -0
- package/dist/src/packages/registry.js +238 -0
- package/dist/src/packages/types.js +11 -0
- package/dist/src/plugin/cross-framework-ops.js +475 -0
- package/dist/src/plugin/framework-config-loader.js +235 -0
- package/dist/src/plugin/framework-detector.js +186 -0
- package/dist/src/plugin/framework-isolator.js +341 -0
- package/dist/src/plugin/framework-migration.js +371 -0
- package/dist/src/plugin/metadata-validator.js +906 -0
- package/dist/src/plugin/plugin-installer.js +436 -0
- package/dist/src/plugin/plugin-status.js +369 -0
- package/dist/src/plugin/plugin-uninstaller.js +473 -0
- package/dist/src/plugin/registry-validator.js +344 -0
- package/dist/src/plugin/skill-command-translator.js +415 -0
- package/dist/src/plugin/workspace-creator.js +189 -0
- package/dist/src/plugin/workspace-migrator.js +821 -0
- package/dist/src/policy/authorization.js +390 -0
- package/dist/src/policy/repo-access.js +215 -0
- package/dist/src/provenance/cli.js +16 -0
- package/dist/src/providers/capability-matrix.js +300 -0
- package/dist/src/providers/capability-matrix.yaml +514 -0
- package/dist/src/providers/provider-definitions.js +977 -0
- package/dist/src/providers/provider-definitions.mjs +159 -0
- package/dist/src/providers/provider-inventory.js +169 -0
- package/dist/src/quality/feedback-ab.js +174 -0
- package/dist/src/quality/feedback-collector.js +176 -0
- package/dist/src/quality/feedback-tracker.js +123 -0
- package/dist/src/quality/patterns/adr.json +24 -0
- package/dist/src/quality/patterns/sad.json +24 -0
- package/dist/src/quality/patterns/test-plan.json +24 -0
- package/dist/src/quality/patterns/use-case.json +24 -0
- package/dist/src/quality/scoring.js +157 -0
- package/dist/src/reflections/cli.js +15 -0
- package/dist/src/release/plan.js +139 -0
- package/dist/src/research/cache/manager.js +227 -0
- package/dist/src/research/clients/arxiv.js +156 -0
- package/dist/src/research/clients/base.js +197 -0
- package/dist/src/research/clients/crossref.js +112 -0
- package/dist/src/research/clients/semantic-scholar.js +126 -0
- package/dist/src/research/clients/unpaywall.js +87 -0
- package/dist/src/research/index.js +14 -0
- package/dist/src/research/query-cli.js +336 -0
- package/dist/src/research/services/acquisition.js +313 -0
- package/dist/src/research/services/archival.js +225 -0
- package/dist/src/research/services/citation.js +279 -0
- package/dist/src/research/services/discovery.js +243 -0
- package/dist/src/research/services/documentation.js +269 -0
- package/dist/src/research/services/index.js +14 -0
- package/dist/src/research/services/provenance.js +279 -0
- package/dist/src/research/services/quality.js +370 -0
- package/dist/src/research/services/types.js +7 -0
- package/dist/src/research/storage-cli.js +20 -0
- package/dist/src/research/types.js +47 -0
- package/dist/src/resources/index.d.ts +2 -0
- package/dist/src/resources/index.js +2 -0
- package/dist/src/resources/web-release.d.ts +89 -0
- package/dist/src/resources/web-release.js +886 -0
- package/dist/src/rlm/cache/cli.js +162 -0
- package/dist/src/rlm/cache/hash.js +35 -0
- package/dist/src/rlm/cache/store.js +170 -0
- package/dist/src/rlm/cache/types.js +8 -0
- package/dist/src/rlm/cli.js +650 -0
- package/dist/src/serve/a2a-terminal-observer.js +120 -0
- package/dist/src/serve/agent-router.js +205 -0
- package/dist/src/serve/dispatch-router.js +171 -0
- package/dist/src/serve/executor-registry.js +715 -0
- package/dist/src/serve/mission-conductor.js +177 -0
- package/dist/src/serve/orchestrator-adapter.js +113 -0
- package/dist/src/serve/orchestrator-override.js +94 -0
- package/dist/src/serve/orchestrator-pty.js +133 -0
- package/dist/src/serve/pty-bridge.js +799 -0
- package/dist/src/serve/sandbox-registry.js +832 -0
- package/dist/src/serve/screen-reader.js +228 -0
- package/dist/src/serve/stack-adapters.js +68 -0
- package/dist/src/serve/telemetry.js +143 -0
- package/dist/src/skills/adapters/clawhub.js +250 -0
- package/dist/src/skills/adapters/local.js +335 -0
- package/dist/src/skills/adapters/openclaw.js +316 -0
- package/dist/src/skills/cli.js +334 -0
- package/dist/src/skills/registry.js +117 -0
- package/dist/src/skills/run.js +259 -0
- package/dist/src/skills/runtime.js +94 -0
- package/dist/src/skills/types.js +10 -0
- package/dist/src/smiths/agentsmith/demo.js +116 -0
- package/dist/src/smiths/agentsmith/examples.js +300 -0
- package/dist/src/smiths/agentsmith/generator.js +503 -0
- package/dist/src/smiths/agentsmith/index.js +11 -0
- package/dist/src/smiths/agentsmith/types.js +8 -0
- package/dist/src/smiths/commandsmith/example.js +220 -0
- package/dist/src/smiths/commandsmith/generator.js +288 -0
- package/dist/src/smiths/commandsmith/index.js +41 -0
- package/dist/src/smiths/commandsmith/templates.js +296 -0
- package/dist/src/smiths/commandsmith/types.js +7 -0
- package/dist/src/smiths/context-pipeline/aiwg-md.js +104 -0
- package/dist/src/smiths/context-pipeline/allowlist.js +195 -0
- package/dist/src/smiths/context-pipeline/claude-hook.js +127 -0
- package/dist/src/smiths/context-pipeline/discovery.js +187 -0
- package/dist/src/smiths/context-pipeline/external-links-section.js +49 -0
- package/dist/src/smiths/context-pipeline/finalization.js +147 -0
- package/dist/src/smiths/context-pipeline/generator.js +477 -0
- package/dist/src/smiths/context-pipeline/index.js +30 -0
- package/dist/src/smiths/context-pipeline/legacy-inject.js +103 -0
- package/dist/src/smiths/context-pipeline/managed-hook.js +95 -0
- package/dist/src/smiths/context-pipeline/overflow.js +212 -0
- package/dist/src/smiths/context-pipeline/parallelism-section.js +94 -0
- package/dist/src/smiths/context-pipeline/provider-policy.js +64 -0
- package/dist/src/smiths/context-pipeline/sanitizer.js +93 -0
- package/dist/src/smiths/context-pipeline/types.js +23 -0
- package/dist/src/smiths/context-pipeline/workspace-context.js +988 -0
- package/dist/src/smiths/hook-bridge/codex-translator.js +129 -0
- package/dist/src/smiths/hook-bridge/copilot-translator.js +64 -0
- package/dist/src/smiths/hook-bridge/factory-translator.js +43 -0
- package/dist/src/smiths/hook-bridge/hermes-translator.js +88 -0
- package/dist/src/smiths/hook-bridge/index.js +79 -0
- package/dist/src/smiths/hook-bridge/loader.js +116 -0
- package/dist/src/smiths/hook-bridge/shim.js +89 -0
- package/dist/src/smiths/hook-bridge/types.js +31 -0
- package/dist/src/smiths/index.js +39 -0
- package/dist/src/smiths/mcpsmith/analyzers/cli-analyzer.js +390 -0
- package/dist/src/smiths/mcpsmith/example.js +119 -0
- package/dist/src/smiths/mcpsmith/generator.js +236 -0
- package/dist/src/smiths/mcpsmith/index.js +17 -0
- package/dist/src/smiths/mcpsmith/types.js +10 -0
- package/dist/src/smiths/platform-paths.js +101 -0
- package/dist/src/smiths/skillsmith/codex-sidecar.js +85 -0
- package/dist/src/smiths/skillsmith/collision-detector.js +249 -0
- package/dist/src/smiths/skillsmith/demo.js +83 -0
- package/dist/src/smiths/skillsmith/examples.js +161 -0
- package/dist/src/smiths/skillsmith/generator.js +316 -0
- package/dist/src/smiths/skillsmith/index.js +12 -0
- package/dist/src/smiths/skillsmith/namespace-adapter.js +180 -0
- package/dist/src/smiths/skillsmith/platform-resolver.js +157 -0
- package/dist/src/smiths/skillsmith/types.js +9 -0
- package/dist/src/smiths/toolsmith/index.js +10 -0
- package/dist/src/smiths/toolsmith/runtime-discovery.mjs +710 -0
- package/dist/src/smiths/toolsmith/types.js +8 -0
- package/dist/src/storage/backends/fortemi.js +227 -0
- package/dist/src/storage/backends/fs.js +134 -0
- package/dist/src/storage/backends/logseq.js +309 -0
- package/dist/src/storage/backends/obsidian.js +233 -0
- package/dist/src/storage/cli.js +468 -0
- package/dist/src/storage/config.js +272 -0
- package/dist/src/storage/index.js +108 -0
- package/dist/src/storage/subsystem-cli.js +201 -0
- package/dist/src/storage/types.js +33 -0
- package/dist/src/testing/corpus/corpus-builder.js +383 -0
- package/dist/src/testing/corpus/ground-truth-manager.js +460 -0
- package/dist/src/testing/corpus/index.js +10 -0
- package/dist/src/testing/fixtures/index.js +9 -0
- package/dist/src/testing/fixtures/test-data-factory.js +472 -0
- package/dist/src/testing/generators/index.js +11 -0
- package/dist/src/testing/generators/test-case-generator.js +393 -0
- package/dist/src/testing/generators/test-code-generator.js +384 -0
- package/dist/src/testing/generators/use-case-parser.js +325 -0
- package/dist/src/testing/index.js +11 -0
- package/dist/src/tracker/capability-protocol.js +118 -0
- package/dist/src/update/checker.mjs +396 -0
- package/dist/src/update/notifier.mjs +235 -0
- package/dist/src/writing/content-diversifier.js +804 -0
- package/dist/src/writing/example-generator.js +959 -0
- package/dist/src/writing/example-templates.js +99 -0
- package/dist/src/writing/pattern-library.js +486 -0
- package/dist/src/writing/patterns/banned-phrases.json +4413 -0
- package/dist/src/writing/patterns/formulaic-structures.json +1300 -0
- package/dist/src/writing/patterns/generic-adjectives.json +1510 -0
- package/dist/src/writing/patterns/hedging-language.json +2096 -0
- package/dist/src/writing/patterns/transition-words.json +1285 -0
- package/dist/src/writing/patterns/weak-verbs.json +1112 -0
- package/dist/src/writing/prompt-optimizer.js +660 -0
- package/dist/src/writing/prompt-templates.js +583 -0
- package/dist/src/writing/scoring-config-loader.js +168 -0
- package/dist/src/writing/validation-engine.js +595 -0
- package/dist/src/writing/validation-rules.js +380 -0
- package/dist/src/writing/voice-analyzer.js +439 -0
- package/dist/src/writing/voice-calibration.js +661 -0
- package/dist/src/writing/voice-profiles.json +588 -0
- package/package.json +65 -9
|
@@ -0,0 +1,486 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git History Analyzer
|
|
3
|
+
*
|
|
4
|
+
* Analyzes Git repository history to extract project metadata including
|
|
5
|
+
* velocity metrics, team composition, and project maturity for automated intake.
|
|
6
|
+
*
|
|
7
|
+
* @module src/intake/git-history-analyzer
|
|
8
|
+
* @implements @.aiwg/requirements/use-cases/UC-003-generate-intake-from-codebase.md
|
|
9
|
+
* @architecture @.aiwg/architecture/software-architecture-doc.md - Section 5.2 Intake Coordinator
|
|
10
|
+
* @tests @test/unit/intake/git-history-analyzer.test.ts
|
|
11
|
+
* @command @.claude/commands/intake-from-codebase.md
|
|
12
|
+
* @agent @agentic/code/frameworks/sdlc-complete/agents/intake-coordinator.md
|
|
13
|
+
*/
|
|
14
|
+
import { exec } from 'child_process';
|
|
15
|
+
import { promisify } from 'util';
|
|
16
|
+
import { existsSync } from 'fs';
|
|
17
|
+
import { join } from 'path';
|
|
18
|
+
const execAsync = promisify(exec);
|
|
19
|
+
const DEFAULT_OPTIONS = {
|
|
20
|
+
maxCommits: 10000,
|
|
21
|
+
sinceMonths: 12,
|
|
22
|
+
includeAllBranches: false,
|
|
23
|
+
excludeAuthors: [],
|
|
24
|
+
excludePatterns: []
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Git History Analyzer
|
|
28
|
+
*
|
|
29
|
+
* Extracts project metadata from Git commit history for automated intake generation.
|
|
30
|
+
*/
|
|
31
|
+
export class GitHistoryAnalyzer {
|
|
32
|
+
repoPath;
|
|
33
|
+
options;
|
|
34
|
+
constructor(repoPath, options = {}) {
|
|
35
|
+
this.repoPath = repoPath;
|
|
36
|
+
this.options = { ...DEFAULT_OPTIONS, ...options };
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Run comprehensive Git history analysis
|
|
40
|
+
*/
|
|
41
|
+
async analyze() {
|
|
42
|
+
const startTime = Date.now();
|
|
43
|
+
// Validate repository
|
|
44
|
+
await this.validateRepository();
|
|
45
|
+
// Gather data in parallel where possible
|
|
46
|
+
const [commits, repository, branches] = await Promise.all([
|
|
47
|
+
this.getCommitHistory(),
|
|
48
|
+
this.getRepositoryMetadata(),
|
|
49
|
+
this.getBranches()
|
|
50
|
+
]);
|
|
51
|
+
// Calculate derived metrics
|
|
52
|
+
const velocity = this.calculateVelocity(commits);
|
|
53
|
+
const maturity = this.classifyMaturity(commits, repository);
|
|
54
|
+
const team = this.extractTeamInfo(commits);
|
|
55
|
+
// Update repository with branch info
|
|
56
|
+
repository.branches = branches;
|
|
57
|
+
const analysisTimeMs = Date.now() - startTime;
|
|
58
|
+
return {
|
|
59
|
+
repository,
|
|
60
|
+
velocity,
|
|
61
|
+
maturity,
|
|
62
|
+
team,
|
|
63
|
+
commits: commits.slice(0, 100), // Return only last 100 commits
|
|
64
|
+
analysisTimeMs,
|
|
65
|
+
analyzedAt: new Date().toISOString()
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Validate that the path is a Git repository
|
|
70
|
+
*/
|
|
71
|
+
async validateRepository() {
|
|
72
|
+
const gitDir = join(this.repoPath, '.git');
|
|
73
|
+
if (!existsSync(gitDir)) {
|
|
74
|
+
throw new Error(`Not a Git repository: ${this.repoPath}`);
|
|
75
|
+
}
|
|
76
|
+
// Check Git is available
|
|
77
|
+
try {
|
|
78
|
+
await this.executeGitCommand('--version');
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
throw new Error('Git is not installed or not in PATH');
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Execute a Git command in the repository
|
|
86
|
+
*/
|
|
87
|
+
async executeGitCommand(args) {
|
|
88
|
+
try {
|
|
89
|
+
const { stdout, stderr } = await execAsync(`git ${args}`, {
|
|
90
|
+
cwd: this.repoPath,
|
|
91
|
+
maxBuffer: 50 * 1024 * 1024 // 50MB buffer for large repos
|
|
92
|
+
});
|
|
93
|
+
if (stderr && !stderr.includes('warning:')) {
|
|
94
|
+
console.warn('Git warning:', stderr);
|
|
95
|
+
}
|
|
96
|
+
return stdout.trim();
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
const err = error;
|
|
100
|
+
throw new Error(`Git command failed: ${err.message}${err.stderr ? ` (${err.stderr})` : ''}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Get commit history from Git log
|
|
105
|
+
*/
|
|
106
|
+
async getCommitHistory() {
|
|
107
|
+
const sinceDate = new Date();
|
|
108
|
+
sinceDate.setMonth(sinceDate.getMonth() - this.options.sinceMonths);
|
|
109
|
+
const sinceStr = sinceDate.toISOString().split('T')[0];
|
|
110
|
+
const branchFlag = this.options.includeAllBranches ? '--all' : '';
|
|
111
|
+
const format = '%H|%an|%ae|%at|%s';
|
|
112
|
+
const output = await this.executeGitCommand(`log ${branchFlag} --since="${sinceStr}" --pretty=format:"${format}" -n ${this.options.maxCommits}`);
|
|
113
|
+
if (!output) {
|
|
114
|
+
return [];
|
|
115
|
+
}
|
|
116
|
+
return this.parseCommitLog(output);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Parse Git log output into CommitInfo objects
|
|
120
|
+
*/
|
|
121
|
+
parseCommitLog(logOutput) {
|
|
122
|
+
const commits = [];
|
|
123
|
+
const lines = logOutput.split('\n').filter(line => line.trim());
|
|
124
|
+
for (const line of lines) {
|
|
125
|
+
const parts = line.split('|');
|
|
126
|
+
if (parts.length < 5)
|
|
127
|
+
continue;
|
|
128
|
+
const [hash, author, email, timestampStr, ...messageParts] = parts;
|
|
129
|
+
const timestamp = parseInt(timestampStr, 10);
|
|
130
|
+
const message = messageParts.join('|');
|
|
131
|
+
// Apply exclusion filters
|
|
132
|
+
if (this.options.excludeAuthors.includes(author))
|
|
133
|
+
continue;
|
|
134
|
+
if (this.options.excludePatterns.some(p => p.test(message)))
|
|
135
|
+
continue;
|
|
136
|
+
commits.push({
|
|
137
|
+
hash,
|
|
138
|
+
author,
|
|
139
|
+
email,
|
|
140
|
+
timestamp,
|
|
141
|
+
message,
|
|
142
|
+
date: new Date(timestamp * 1000)
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
return commits;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Get repository metadata
|
|
149
|
+
*/
|
|
150
|
+
async getRepositoryMetadata() {
|
|
151
|
+
// Get first commit date
|
|
152
|
+
const firstCommitTimestamp = await this.executeGitCommand('log --reverse --pretty=format:"%at" | head -1').catch(() => '');
|
|
153
|
+
// Get last commit date
|
|
154
|
+
const lastCommitTimestamp = await this.executeGitCommand('log -1 --pretty=format:"%at"').catch(() => '');
|
|
155
|
+
// Get total commit count
|
|
156
|
+
const commitCountStr = await this.executeGitCommand('rev-list --count HEAD').catch(() => '0');
|
|
157
|
+
// Get default branch
|
|
158
|
+
const defaultBranch = await this.executeGitCommand('symbolic-ref --short HEAD').catch(() => 'main');
|
|
159
|
+
// Get remote URL
|
|
160
|
+
const remoteUrl = await this.executeGitCommand('remote get-url origin').catch(() => '');
|
|
161
|
+
// Extract repo name from path or remote
|
|
162
|
+
const name = this.extractRepoName(this.repoPath, remoteUrl);
|
|
163
|
+
return {
|
|
164
|
+
path: this.repoPath,
|
|
165
|
+
name,
|
|
166
|
+
firstCommitDate: firstCommitTimestamp
|
|
167
|
+
? new Date(parseInt(firstCommitTimestamp, 10) * 1000)
|
|
168
|
+
: new Date(),
|
|
169
|
+
lastCommitDate: lastCommitTimestamp
|
|
170
|
+
? new Date(parseInt(lastCommitTimestamp, 10) * 1000)
|
|
171
|
+
: new Date(),
|
|
172
|
+
totalCommits: parseInt(commitCountStr, 10) || 0,
|
|
173
|
+
branches: [],
|
|
174
|
+
defaultBranch,
|
|
175
|
+
hasRemote: !!remoteUrl,
|
|
176
|
+
remoteUrl: remoteUrl || undefined
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Get branch information
|
|
181
|
+
*/
|
|
182
|
+
async getBranches() {
|
|
183
|
+
const output = await this.executeGitCommand('for-each-ref --format="%(refname:short)|%(committerdate:unix)|%(objectname:short)" refs/heads/').catch(() => '');
|
|
184
|
+
if (!output) {
|
|
185
|
+
return [];
|
|
186
|
+
}
|
|
187
|
+
const defaultBranch = await this.executeGitCommand('symbolic-ref --short HEAD').catch(() => 'main');
|
|
188
|
+
const branches = [];
|
|
189
|
+
const lines = output.split('\n').filter(l => l.trim());
|
|
190
|
+
for (const line of lines) {
|
|
191
|
+
const [name, timestampStr] = line.split('|');
|
|
192
|
+
if (!name)
|
|
193
|
+
continue;
|
|
194
|
+
const commitCount = parseInt(await this.executeGitCommand(`rev-list --count ${name}`).catch(() => '0'), 10);
|
|
195
|
+
branches.push({
|
|
196
|
+
name,
|
|
197
|
+
isDefault: name === defaultBranch,
|
|
198
|
+
commitCount,
|
|
199
|
+
lastActivity: new Date(parseInt(timestampStr, 10) * 1000)
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
return branches.sort((a, b) => b.lastActivity.getTime() - a.lastActivity.getTime());
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Calculate velocity metrics from commit history
|
|
206
|
+
*/
|
|
207
|
+
calculateVelocity(commits) {
|
|
208
|
+
if (commits.length === 0) {
|
|
209
|
+
return {
|
|
210
|
+
commitsPerDay: 0,
|
|
211
|
+
commitsPerWeek: 0,
|
|
212
|
+
commitsPerMonth: 0,
|
|
213
|
+
activeDaysRatio: 0,
|
|
214
|
+
teamVelocity: 0,
|
|
215
|
+
averageCommitsPerAuthor: 0,
|
|
216
|
+
peakDay: '',
|
|
217
|
+
peakWeekCommits: 0
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
// Sort commits by date
|
|
221
|
+
const sortedCommits = [...commits].sort((a, b) => a.timestamp - b.timestamp);
|
|
222
|
+
const firstCommit = sortedCommits[0];
|
|
223
|
+
const lastCommit = sortedCommits[sortedCommits.length - 1];
|
|
224
|
+
// Calculate time range
|
|
225
|
+
const msPerDay = 24 * 60 * 60 * 1000;
|
|
226
|
+
const totalDays = Math.max(1, (lastCommit.timestamp - firstCommit.timestamp) * 1000 / msPerDay);
|
|
227
|
+
const totalWeeks = Math.max(1, totalDays / 7);
|
|
228
|
+
const totalMonths = Math.max(1, totalDays / 30);
|
|
229
|
+
// Count active days
|
|
230
|
+
const activeDays = new Set(commits.map(c => new Date(c.timestamp * 1000).toISOString().split('T')[0]));
|
|
231
|
+
// Count commits by day and week
|
|
232
|
+
const commitsByDay = new Map();
|
|
233
|
+
const commitsByWeek = new Map();
|
|
234
|
+
for (const commit of commits) {
|
|
235
|
+
const date = new Date(commit.timestamp * 1000);
|
|
236
|
+
const dayKey = date.toISOString().split('T')[0];
|
|
237
|
+
const weekKey = this.getWeekKey(date);
|
|
238
|
+
commitsByDay.set(dayKey, (commitsByDay.get(dayKey) || 0) + 1);
|
|
239
|
+
commitsByWeek.set(weekKey, (commitsByWeek.get(weekKey) || 0) + 1);
|
|
240
|
+
}
|
|
241
|
+
// Find peak day and week
|
|
242
|
+
let peakDay = '';
|
|
243
|
+
let peakDayCommits = 0;
|
|
244
|
+
commitsByDay.forEach((count, day) => {
|
|
245
|
+
if (count > peakDayCommits) {
|
|
246
|
+
peakDayCommits = count;
|
|
247
|
+
peakDay = day;
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
let peakWeekCommits = 0;
|
|
251
|
+
commitsByWeek.forEach((count) => {
|
|
252
|
+
if (count > peakWeekCommits) {
|
|
253
|
+
peakWeekCommits = count;
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
// Count unique authors
|
|
257
|
+
const uniqueAuthors = new Set(commits.map(c => c.author)).size;
|
|
258
|
+
return {
|
|
259
|
+
commitsPerDay: commits.length / totalDays,
|
|
260
|
+
commitsPerWeek: commits.length / totalWeeks,
|
|
261
|
+
commitsPerMonth: commits.length / totalMonths,
|
|
262
|
+
activeDaysRatio: activeDays.size / totalDays,
|
|
263
|
+
teamVelocity: uniqueAuthors > 0 ? commits.length / totalDays / uniqueAuthors : 0,
|
|
264
|
+
averageCommitsPerAuthor: uniqueAuthors > 0 ? commits.length / uniqueAuthors : 0,
|
|
265
|
+
peakDay,
|
|
266
|
+
peakWeekCommits
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Classify project maturity based on age and activity
|
|
271
|
+
*/
|
|
272
|
+
classifyMaturity(commits, repository) {
|
|
273
|
+
const now = new Date();
|
|
274
|
+
const ageMs = now.getTime() - repository.firstCommitDate.getTime();
|
|
275
|
+
const ageMonths = ageMs / (30 * 24 * 60 * 60 * 1000);
|
|
276
|
+
const totalCommits = repository.totalCommits;
|
|
277
|
+
const indicators = [];
|
|
278
|
+
let level;
|
|
279
|
+
let confidence = 0.8;
|
|
280
|
+
// Classify based on age and commit count
|
|
281
|
+
if (ageMonths < 3 && totalCommits < 50) {
|
|
282
|
+
level = 'nascent';
|
|
283
|
+
indicators.push(`Project age: ${ageMonths.toFixed(1)} months`);
|
|
284
|
+
indicators.push(`Total commits: ${totalCommits}`);
|
|
285
|
+
indicators.push('Early development phase');
|
|
286
|
+
}
|
|
287
|
+
else if (ageMonths < 6 || totalCommits < 200) {
|
|
288
|
+
level = 'mvp';
|
|
289
|
+
indicators.push(`Project age: ${ageMonths.toFixed(1)} months`);
|
|
290
|
+
indicators.push(`Total commits: ${totalCommits}`);
|
|
291
|
+
indicators.push('MVP/prototype phase');
|
|
292
|
+
// Adjust confidence if mixed signals
|
|
293
|
+
if (ageMonths >= 6 && totalCommits < 200) {
|
|
294
|
+
confidence = 0.6;
|
|
295
|
+
indicators.push('Low activity for age - may be maintenance mode');
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
else if (ageMonths < 12 || totalCommits < 1000) {
|
|
299
|
+
level = 'production';
|
|
300
|
+
indicators.push(`Project age: ${ageMonths.toFixed(1)} months`);
|
|
301
|
+
indicators.push(`Total commits: ${totalCommits}`);
|
|
302
|
+
indicators.push('Active production development');
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
level = 'mature';
|
|
306
|
+
indicators.push(`Project age: ${ageMonths.toFixed(1)} months`);
|
|
307
|
+
indicators.push(`Total commits: ${totalCommits}`);
|
|
308
|
+
indicators.push('Mature project with established history');
|
|
309
|
+
}
|
|
310
|
+
// Additional indicators
|
|
311
|
+
if (commits.length > 0) {
|
|
312
|
+
const recentCommits = commits.filter(c => {
|
|
313
|
+
const commitAge = (now.getTime() - c.date.getTime()) / (30 * 24 * 60 * 60 * 1000);
|
|
314
|
+
return commitAge < 1;
|
|
315
|
+
});
|
|
316
|
+
if (recentCommits.length === 0) {
|
|
317
|
+
indicators.push('No commits in last 30 days - may be maintenance mode');
|
|
318
|
+
confidence *= 0.9;
|
|
319
|
+
}
|
|
320
|
+
else if (recentCommits.length > 10) {
|
|
321
|
+
indicators.push('Active development in last 30 days');
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
return {
|
|
325
|
+
level,
|
|
326
|
+
ageMonths,
|
|
327
|
+
totalCommits,
|
|
328
|
+
confidence,
|
|
329
|
+
indicators
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Extract team information from commits
|
|
334
|
+
*/
|
|
335
|
+
extractTeamInfo(commits) {
|
|
336
|
+
const authorMap = new Map();
|
|
337
|
+
const now = new Date();
|
|
338
|
+
const threeMonthsAgo = new Date(now.getTime() - 90 * 24 * 60 * 60 * 1000);
|
|
339
|
+
for (const commit of commits) {
|
|
340
|
+
const key = commit.email;
|
|
341
|
+
const existing = authorMap.get(key);
|
|
342
|
+
if (existing) {
|
|
343
|
+
existing.commitCount++;
|
|
344
|
+
if (commit.date < existing.firstCommit) {
|
|
345
|
+
existing.firstCommit = commit.date;
|
|
346
|
+
}
|
|
347
|
+
if (commit.date > existing.lastCommit) {
|
|
348
|
+
existing.lastCommit = commit.date;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
authorMap.set(key, {
|
|
353
|
+
name: commit.author,
|
|
354
|
+
email: commit.email,
|
|
355
|
+
commitCount: 1,
|
|
356
|
+
firstCommit: commit.date,
|
|
357
|
+
lastCommit: commit.date,
|
|
358
|
+
activeDays: 0
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
// Calculate active days per author
|
|
363
|
+
const authorDays = new Map();
|
|
364
|
+
for (const commit of commits) {
|
|
365
|
+
const key = commit.email;
|
|
366
|
+
const dayKey = commit.date.toISOString().split('T')[0];
|
|
367
|
+
if (!authorDays.has(key)) {
|
|
368
|
+
authorDays.set(key, new Set());
|
|
369
|
+
}
|
|
370
|
+
authorDays.get(key).add(dayKey);
|
|
371
|
+
}
|
|
372
|
+
authorDays.forEach((days, email) => {
|
|
373
|
+
const author = authorMap.get(email);
|
|
374
|
+
if (author) {
|
|
375
|
+
author.activeDays = days.size;
|
|
376
|
+
}
|
|
377
|
+
});
|
|
378
|
+
// Sort authors by commit count
|
|
379
|
+
const sortedAuthors = Array.from(authorMap.values())
|
|
380
|
+
.sort((a, b) => b.commitCount - a.commitCount);
|
|
381
|
+
// Count active authors (committed in last 3 months)
|
|
382
|
+
const activeAuthors = sortedAuthors.filter(a => a.lastCommit >= threeMonthsAgo);
|
|
383
|
+
// Create distribution map
|
|
384
|
+
const authorDistribution = new Map();
|
|
385
|
+
sortedAuthors.forEach(a => authorDistribution.set(a.name, a.commitCount));
|
|
386
|
+
// Determine team size category
|
|
387
|
+
let teamSize;
|
|
388
|
+
const totalAuthors = sortedAuthors.length;
|
|
389
|
+
if (totalAuthors <= 1) {
|
|
390
|
+
teamSize = 'solo';
|
|
391
|
+
}
|
|
392
|
+
else if (totalAuthors <= 5) {
|
|
393
|
+
teamSize = 'small';
|
|
394
|
+
}
|
|
395
|
+
else if (totalAuthors <= 15) {
|
|
396
|
+
teamSize = 'medium';
|
|
397
|
+
}
|
|
398
|
+
else {
|
|
399
|
+
teamSize = 'large';
|
|
400
|
+
}
|
|
401
|
+
return {
|
|
402
|
+
totalAuthors,
|
|
403
|
+
activeAuthors: activeAuthors.length,
|
|
404
|
+
topContributors: sortedAuthors.slice(0, 10),
|
|
405
|
+
authorDistribution,
|
|
406
|
+
issoloProject: totalAuthors <= 1,
|
|
407
|
+
teamSize
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Get author statistics using git shortlog
|
|
412
|
+
*/
|
|
413
|
+
async getAuthorStats() {
|
|
414
|
+
const sinceDate = new Date();
|
|
415
|
+
sinceDate.setMonth(sinceDate.getMonth() - this.options.sinceMonths);
|
|
416
|
+
const sinceStr = sinceDate.toISOString().split('T')[0];
|
|
417
|
+
const output = await this.executeGitCommand(`shortlog -sne --since="${sinceStr}"`).catch(() => '');
|
|
418
|
+
if (!output) {
|
|
419
|
+
return [];
|
|
420
|
+
}
|
|
421
|
+
const stats = [];
|
|
422
|
+
const lines = output.split('\n').filter(l => l.trim());
|
|
423
|
+
for (const line of lines) {
|
|
424
|
+
const match = line.match(/^\s*(\d+)\s+(.+)\s+<(.+)>$/);
|
|
425
|
+
if (match) {
|
|
426
|
+
stats.push({
|
|
427
|
+
name: match[2].trim(),
|
|
428
|
+
email: match[3].trim(),
|
|
429
|
+
commitCount: parseInt(match[1], 10),
|
|
430
|
+
firstCommit: new Date(),
|
|
431
|
+
lastCommit: new Date(),
|
|
432
|
+
activeDays: 0
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
return stats;
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* Helper to get week key for a date
|
|
440
|
+
*/
|
|
441
|
+
getWeekKey(date) {
|
|
442
|
+
const startOfYear = new Date(date.getFullYear(), 0, 1);
|
|
443
|
+
const days = Math.floor((date.getTime() - startOfYear.getTime()) / (24 * 60 * 60 * 1000));
|
|
444
|
+
const weekNumber = Math.ceil((days + 1) / 7);
|
|
445
|
+
return `${date.getFullYear()}-W${weekNumber.toString().padStart(2, '0')}`;
|
|
446
|
+
}
|
|
447
|
+
/**
|
|
448
|
+
* Extract repository name from path or remote URL
|
|
449
|
+
*/
|
|
450
|
+
extractRepoName(path, remoteUrl) {
|
|
451
|
+
// Try to extract from remote URL first
|
|
452
|
+
if (remoteUrl) {
|
|
453
|
+
const match = remoteUrl.match(/\/([^\/]+?)(\.git)?$/);
|
|
454
|
+
if (match) {
|
|
455
|
+
return match[1];
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
// Fall back to directory name
|
|
459
|
+
const parts = path.replace(/\\/g, '/').split('/').filter(p => p);
|
|
460
|
+
return parts[parts.length - 1] || 'unknown';
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Quick analysis function for simple use cases
|
|
465
|
+
*/
|
|
466
|
+
export async function analyzeGitHistory(repoPath, options) {
|
|
467
|
+
const analyzer = new GitHistoryAnalyzer(repoPath, options);
|
|
468
|
+
return analyzer.analyze();
|
|
469
|
+
}
|
|
470
|
+
/**
|
|
471
|
+
* Get project maturity classification
|
|
472
|
+
*/
|
|
473
|
+
export async function getProjectMaturity(repoPath) {
|
|
474
|
+
const analyzer = new GitHistoryAnalyzer(repoPath, { maxCommits: 1000 });
|
|
475
|
+
const result = await analyzer.analyze();
|
|
476
|
+
return result.maturity;
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* Get team composition from Git history
|
|
480
|
+
*/
|
|
481
|
+
export async function getTeamComposition(repoPath) {
|
|
482
|
+
const analyzer = new GitHistoryAnalyzer(repoPath, { sinceMonths: 12 });
|
|
483
|
+
const result = await analyzer.analyze();
|
|
484
|
+
return result.team;
|
|
485
|
+
}
|
|
486
|
+
//# sourceMappingURL=git-history-analyzer.js.map
|