@aiwg/cli 0.0.0-bootstrap.0 → 2026.7.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -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 +1462 -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 +882 -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 +64 -9
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
import fs from 'fs/promises';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { projectAiwgPath } from '../config/project-artifacts.js';
|
|
4
|
+
const FRAMEWORKS = [
|
|
5
|
+
'sdlc',
|
|
6
|
+
'marketing',
|
|
7
|
+
'media-curator',
|
|
8
|
+
'research',
|
|
9
|
+
'forensics',
|
|
10
|
+
'security-engineering',
|
|
11
|
+
'ops',
|
|
12
|
+
'knowledge-base',
|
|
13
|
+
];
|
|
14
|
+
const ADDONS = [
|
|
15
|
+
'aiwg-utils',
|
|
16
|
+
];
|
|
17
|
+
const EXTENSIONS = [
|
|
18
|
+
'dev',
|
|
19
|
+
'it',
|
|
20
|
+
'net',
|
|
21
|
+
'sec',
|
|
22
|
+
'stream',
|
|
23
|
+
'sys',
|
|
24
|
+
];
|
|
25
|
+
const PROFILE_FRAMEWORKS = {
|
|
26
|
+
sdlc: ['sdlc'],
|
|
27
|
+
default: ['sdlc'],
|
|
28
|
+
marketing: ['marketing'],
|
|
29
|
+
'media-marketing': ['marketing'],
|
|
30
|
+
'media-curator': ['media-curator'],
|
|
31
|
+
research: ['research'],
|
|
32
|
+
forensics: ['forensics'],
|
|
33
|
+
'security-engineering': ['security-engineering'],
|
|
34
|
+
security: ['security-engineering'],
|
|
35
|
+
ops: ['ops'],
|
|
36
|
+
'knowledge-base': ['knowledge-base'],
|
|
37
|
+
kb: ['knowledge-base'],
|
|
38
|
+
};
|
|
39
|
+
async function exists(filePath) {
|
|
40
|
+
try {
|
|
41
|
+
await fs.access(filePath);
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async function readJsonIfPresent(filePath) {
|
|
49
|
+
try {
|
|
50
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
51
|
+
return JSON.parse(content);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function stringArray(value) {
|
|
58
|
+
return Array.isArray(value) ? value.filter((v) => typeof v === 'string') : [];
|
|
59
|
+
}
|
|
60
|
+
function addReason(included, id, reason) {
|
|
61
|
+
const reasons = included.get(id) ?? [];
|
|
62
|
+
if (!reasons.includes(reason))
|
|
63
|
+
reasons.push(reason);
|
|
64
|
+
included.set(id, reasons);
|
|
65
|
+
}
|
|
66
|
+
function includeProfile(included, profile, reason) {
|
|
67
|
+
const normalized = profile.toLowerCase();
|
|
68
|
+
if (normalized === 'all') {
|
|
69
|
+
for (const framework of FRAMEWORKS)
|
|
70
|
+
addReason(included, framework, reason);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
for (const framework of PROFILE_FRAMEWORKS[normalized] ?? []) {
|
|
74
|
+
addReason(included, framework, reason);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function extractConfigHints(config) {
|
|
78
|
+
if (!config)
|
|
79
|
+
return { bundles: [] };
|
|
80
|
+
const skillLoading = typeof config.skillLoading === 'object' && config.skillLoading
|
|
81
|
+
? config.skillLoading
|
|
82
|
+
: {};
|
|
83
|
+
const profile = typeof config.workspaceProfile === 'string' ? config.workspaceProfile :
|
|
84
|
+
typeof config.profile === 'string' ? config.profile :
|
|
85
|
+
typeof skillLoading.profile === 'string' ? skillLoading.profile :
|
|
86
|
+
undefined;
|
|
87
|
+
const bundles = [
|
|
88
|
+
...stringArray(config.enabledBundles),
|
|
89
|
+
...stringArray(config.enabledSkills),
|
|
90
|
+
...stringArray(skillLoading.include),
|
|
91
|
+
...stringArray(skillLoading.bundles),
|
|
92
|
+
];
|
|
93
|
+
return { profile, bundles };
|
|
94
|
+
}
|
|
95
|
+
async function detectIntakeProfiles(projectDir) {
|
|
96
|
+
const intakePath = projectAiwgPath(projectDir, 'intake', 'solution-profile.md');
|
|
97
|
+
try {
|
|
98
|
+
const content = (await fs.readFile(intakePath, 'utf-8')).toLowerCase();
|
|
99
|
+
const profiles = [];
|
|
100
|
+
if (content.includes('forensic') || content.includes('incident response'))
|
|
101
|
+
profiles.push('forensics');
|
|
102
|
+
if (content.includes('research') || content.includes('citation') || content.includes('literature'))
|
|
103
|
+
profiles.push('research');
|
|
104
|
+
if (content.includes('marketing') || content.includes('campaign') || content.includes('brand'))
|
|
105
|
+
profiles.push('marketing');
|
|
106
|
+
if (content.includes('media curator') || content.includes('discography') || content.includes('archive'))
|
|
107
|
+
profiles.push('media-curator');
|
|
108
|
+
if (content.includes('security') || content.includes('cryptograph') || content.includes('threat model'))
|
|
109
|
+
profiles.push('security-engineering');
|
|
110
|
+
if (content.includes('ops') || content.includes('runbook') || content.includes('infrastructure'))
|
|
111
|
+
profiles.push('ops');
|
|
112
|
+
if (content.includes('knowledge base') || content.includes('wiki') || content.includes('semantic memory'))
|
|
113
|
+
profiles.push('knowledge-base');
|
|
114
|
+
return profiles;
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return [];
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
export async function resolveWorkspaceSignalPlan(projectDir, opts = {}) {
|
|
121
|
+
const included = new Map();
|
|
122
|
+
const signals = [];
|
|
123
|
+
const missedSignals = [];
|
|
124
|
+
const notes = [];
|
|
125
|
+
addReason(included, 'sdlc', 'always included as core lifecycle support');
|
|
126
|
+
addReason(included, 'aiwg-utils', 'always included as core AIWG utilities');
|
|
127
|
+
let profile = opts.profile;
|
|
128
|
+
let profileSource = profile ? 'flag' : 'auto';
|
|
129
|
+
const config = await readJsonIfPresent(projectAiwgPath(projectDir, 'aiwg.config'));
|
|
130
|
+
const configHints = extractConfigHints(config);
|
|
131
|
+
if (!profile && configHints.profile) {
|
|
132
|
+
profile = configHints.profile;
|
|
133
|
+
profileSource = 'config';
|
|
134
|
+
}
|
|
135
|
+
const requestedTarget = opts.requestedTarget;
|
|
136
|
+
if (!profile && requestedTarget && requestedTarget !== 'all' && !requestedTarget.startsWith('-')) {
|
|
137
|
+
profile = requestedTarget;
|
|
138
|
+
profileSource = 'requested-target';
|
|
139
|
+
}
|
|
140
|
+
if (profile) {
|
|
141
|
+
includeProfile(included, profile, `${profileSource} profile "${profile}"`);
|
|
142
|
+
}
|
|
143
|
+
for (const bundle of configHints.bundles) {
|
|
144
|
+
addReason(included, bundle, 'explicitly enabled in .aiwg/aiwg.config');
|
|
145
|
+
}
|
|
146
|
+
const domainSignals = [
|
|
147
|
+
['forensics', '.aiwg/forensics/', 'forensics'],
|
|
148
|
+
['research', '.aiwg/research/', 'research'],
|
|
149
|
+
['marketing', '.aiwg/marketing/', 'marketing'],
|
|
150
|
+
['media-curator', '.aiwg/media-curator/', 'media-curator'],
|
|
151
|
+
['ops', '.aiwg/ops/', 'ops'],
|
|
152
|
+
['knowledge-base', '.aiwg/knowledge-base/', 'knowledge-base'],
|
|
153
|
+
['security-engineering', '.aiwg/security-engineering/', 'security-engineering'],
|
|
154
|
+
];
|
|
155
|
+
for (const [framework, relPath, reasonPath] of domainSignals) {
|
|
156
|
+
const artifactPath = relPath.startsWith('.aiwg/')
|
|
157
|
+
? projectAiwgPath(projectDir, relPath.slice('.aiwg/'.length))
|
|
158
|
+
: path.join(projectDir, relPath);
|
|
159
|
+
if (await exists(artifactPath)) {
|
|
160
|
+
signals.push(relPath);
|
|
161
|
+
addReason(included, framework, `matched ${reasonPath} workspace signal`);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
missedSignals.push(relPath);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
if (await exists(path.join(projectDir, 'package.json')) && await exists(path.join(projectDir, 'src'))) {
|
|
168
|
+
signals.push('package.json + src/');
|
|
169
|
+
addReason(included, 'sdlc', 'matched application source workspace signal');
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
missedSignals.push('package.json + src/');
|
|
173
|
+
}
|
|
174
|
+
const containerFiles = ['Dockerfile', 'compose.yaml', 'compose.yml', 'docker-compose.yaml', 'docker-compose.yml'];
|
|
175
|
+
const matchedContainer = [];
|
|
176
|
+
for (const file of containerFiles) {
|
|
177
|
+
if (await exists(path.join(projectDir, file)))
|
|
178
|
+
matchedContainer.push(file);
|
|
179
|
+
}
|
|
180
|
+
if (matchedContainer.length > 0) {
|
|
181
|
+
signals.push(matchedContainer.join(', '));
|
|
182
|
+
addReason(included, 'forensics', 'matched container workspace signal');
|
|
183
|
+
notes.push('Container signals currently map to the forensics framework; a narrower container skill subset can be layered on this plan later.');
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
missedSignals.push('Dockerfile / compose.yaml');
|
|
187
|
+
}
|
|
188
|
+
const intakeProfiles = await detectIntakeProfiles(projectDir);
|
|
189
|
+
for (const intakeProfile of intakeProfiles) {
|
|
190
|
+
signals.push(`.aiwg/intake/solution-profile.md:${intakeProfile}`);
|
|
191
|
+
includeProfile(included, intakeProfile, `matched intake purpose "${intakeProfile}"`);
|
|
192
|
+
}
|
|
193
|
+
if (intakeProfiles.length === 0) {
|
|
194
|
+
missedSignals.push('.aiwg/intake/solution-profile.md');
|
|
195
|
+
}
|
|
196
|
+
if (included.has('security-engineering')) {
|
|
197
|
+
addReason(included, 'sdlc', 'dependency of security-engineering');
|
|
198
|
+
}
|
|
199
|
+
const bundles = [
|
|
200
|
+
...FRAMEWORKS.map((id) => ({
|
|
201
|
+
type: 'framework',
|
|
202
|
+
id,
|
|
203
|
+
included: included.has(id),
|
|
204
|
+
reasons: included.get(id) ?? ['no matching workspace signal'],
|
|
205
|
+
})),
|
|
206
|
+
...ADDONS.map((id) => ({
|
|
207
|
+
type: 'addon',
|
|
208
|
+
id,
|
|
209
|
+
included: included.has(id),
|
|
210
|
+
reasons: included.get(id) ?? ['no matching workspace signal'],
|
|
211
|
+
})),
|
|
212
|
+
...EXTENSIONS.map((id) => ({
|
|
213
|
+
type: 'extension',
|
|
214
|
+
id,
|
|
215
|
+
included: included.has(id),
|
|
216
|
+
reasons: included.get(id) ?? ['no matching workspace signal'],
|
|
217
|
+
})),
|
|
218
|
+
];
|
|
219
|
+
return {
|
|
220
|
+
projectDir,
|
|
221
|
+
generatedAt: new Date().toISOString(),
|
|
222
|
+
profile: profile ?? 'auto',
|
|
223
|
+
profileSource,
|
|
224
|
+
requestedTarget,
|
|
225
|
+
signals,
|
|
226
|
+
missedSignals,
|
|
227
|
+
bundles,
|
|
228
|
+
notes,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
export async function writeWorkspaceSignalPlan(projectDir, plan) {
|
|
232
|
+
const planPath = projectAiwgPath(projectDir, 'workspace-skill-plan.json');
|
|
233
|
+
await fs.mkdir(path.dirname(planPath), { recursive: true });
|
|
234
|
+
await fs.writeFile(planPath, JSON.stringify(plan, null, 2) + '\n', 'utf-8');
|
|
235
|
+
return planPath;
|
|
236
|
+
}
|
|
237
|
+
export async function readWorkspaceSignalPlan(projectDir) {
|
|
238
|
+
try {
|
|
239
|
+
const content = await fs.readFile(projectAiwgPath(projectDir, 'workspace-skill-plan.json'), 'utf-8');
|
|
240
|
+
return JSON.parse(content);
|
|
241
|
+
}
|
|
242
|
+
catch {
|
|
243
|
+
return null;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
export function includedBundleIds(plan, type) {
|
|
247
|
+
return plan.bundles
|
|
248
|
+
.filter((bundle) => bundle.type === type && bundle.included)
|
|
249
|
+
.map((bundle) => bundle.id);
|
|
250
|
+
}
|
|
251
|
+
function formatBundleGroup(plan, included, type) {
|
|
252
|
+
return plan.bundles
|
|
253
|
+
.filter((bundle) => bundle.type === type && bundle.included === included)
|
|
254
|
+
.map((bundle) => ` - ${bundle.id}: ${bundle.reasons.join('; ')}`);
|
|
255
|
+
}
|
|
256
|
+
export function formatWorkspaceSignalPlan(plan) {
|
|
257
|
+
const lines = [];
|
|
258
|
+
lines.push('Workspace skill loading plan (dry run)');
|
|
259
|
+
lines.push(`Project: ${plan.projectDir}`);
|
|
260
|
+
lines.push(`Profile: ${plan.profile} (${plan.profileSource})`);
|
|
261
|
+
if (plan.requestedTarget)
|
|
262
|
+
lines.push(`Requested target: ${plan.requestedTarget}`);
|
|
263
|
+
lines.push('');
|
|
264
|
+
lines.push('Included');
|
|
265
|
+
for (const type of ['framework', 'addon', 'extension']) {
|
|
266
|
+
const rows = formatBundleGroup(plan, true, type);
|
|
267
|
+
if (rows.length > 0) {
|
|
268
|
+
lines.push(`${type}s:`);
|
|
269
|
+
lines.push(...rows);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
lines.push('');
|
|
273
|
+
lines.push('Excluded');
|
|
274
|
+
for (const type of ['framework', 'addon', 'extension']) {
|
|
275
|
+
const rows = formatBundleGroup(plan, false, type);
|
|
276
|
+
if (rows.length > 0) {
|
|
277
|
+
lines.push(`${type}s:`);
|
|
278
|
+
lines.push(...rows);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
lines.push('');
|
|
282
|
+
lines.push('Signals matched:');
|
|
283
|
+
if (plan.signals.length === 0) {
|
|
284
|
+
lines.push(' - none');
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
for (const signal of plan.signals)
|
|
288
|
+
lines.push(` - ${signal}`);
|
|
289
|
+
}
|
|
290
|
+
lines.push('');
|
|
291
|
+
lines.push('Signals not present:');
|
|
292
|
+
for (const signal of plan.missedSignals)
|
|
293
|
+
lines.push(` - ${signal}`);
|
|
294
|
+
if (plan.notes.length > 0) {
|
|
295
|
+
lines.push('');
|
|
296
|
+
lines.push('Notes:');
|
|
297
|
+
for (const note of plan.notes)
|
|
298
|
+
lines.push(` - ${note}`);
|
|
299
|
+
}
|
|
300
|
+
lines.push('');
|
|
301
|
+
lines.push('No files were changed. Run `aiwg use --profile <name>` to deploy a workspace-aware subset, or `aiwg use all` for the full deployment.');
|
|
302
|
+
return lines.join('\n');
|
|
303
|
+
}
|
|
304
|
+
export function formatDeployedWorkspaceSignalPlan(plan) {
|
|
305
|
+
const lines = [];
|
|
306
|
+
lines.push(`\nWorkspace skill filter: ${plan.profile} (${plan.profileSource})`);
|
|
307
|
+
if (plan.generatedAt)
|
|
308
|
+
lines.push(`Resolved: ${plan.generatedAt}`);
|
|
309
|
+
lines.push('Included:');
|
|
310
|
+
const included = plan.bundles.filter((bundle) => bundle.included);
|
|
311
|
+
for (const bundle of included) {
|
|
312
|
+
lines.push(` ${bundle.type}/${bundle.id}: ${bundle.reasons.join('; ')}`);
|
|
313
|
+
}
|
|
314
|
+
lines.push('Filtered out:');
|
|
315
|
+
const excluded = plan.bundles.filter((bundle) => !bundle.included);
|
|
316
|
+
for (const bundle of excluded) {
|
|
317
|
+
lines.push(` ${bundle.type}/${bundle.id}: ${bundle.reasons.join('; ')}`);
|
|
318
|
+
}
|
|
319
|
+
return lines.join('\n') + '\n';
|
|
320
|
+
}
|
|
321
|
+
//# sourceMappingURL=workspace-signals.js.map
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { formatCommunityFooter } from './links.js';
|
|
2
|
+
import { markNudgeShown, shouldShowNudge } from './nudge-policy.js';
|
|
3
|
+
export function maybePrintCommunityFooter() {
|
|
4
|
+
if (!shouldShowNudge('discovery-footer'))
|
|
5
|
+
return false;
|
|
6
|
+
const footer = formatCommunityFooter();
|
|
7
|
+
if (!footer)
|
|
8
|
+
return false;
|
|
9
|
+
console.log('');
|
|
10
|
+
console.log(footer);
|
|
11
|
+
markNudgeShown('discovery-footer');
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=footer.js.map
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
import { parse } from 'yaml';
|
|
5
|
+
const EMPTY_LINKS = {
|
|
6
|
+
website: '',
|
|
7
|
+
repository: { github: '' },
|
|
8
|
+
channels: [],
|
|
9
|
+
star_cta: { short: '', long: '' },
|
|
10
|
+
};
|
|
11
|
+
function moduleDir() {
|
|
12
|
+
return path.dirname(fileURLToPath(import.meta.url));
|
|
13
|
+
}
|
|
14
|
+
export function communityDataPath() {
|
|
15
|
+
return path.resolve(moduleDir(), '..', 'data', 'community.yaml');
|
|
16
|
+
}
|
|
17
|
+
function isString(value) {
|
|
18
|
+
return typeof value === 'string' && value.trim().length > 0;
|
|
19
|
+
}
|
|
20
|
+
export function validateCommunityLinks(raw) {
|
|
21
|
+
const issues = [];
|
|
22
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
|
|
23
|
+
return ['community links must be an object'];
|
|
24
|
+
}
|
|
25
|
+
const data = raw;
|
|
26
|
+
if (!isString(data.website))
|
|
27
|
+
issues.push('website must be a non-empty string');
|
|
28
|
+
const repository = data.repository;
|
|
29
|
+
if (!repository || typeof repository !== 'object' || Array.isArray(repository)) {
|
|
30
|
+
issues.push('repository must be an object');
|
|
31
|
+
}
|
|
32
|
+
else if (!isString(repository.github)) {
|
|
33
|
+
issues.push('repository.github must be a non-empty string');
|
|
34
|
+
}
|
|
35
|
+
if (!Array.isArray(data.channels)) {
|
|
36
|
+
issues.push('channels must be an array');
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
for (const [index, channel] of data.channels.entries()) {
|
|
40
|
+
if (!channel || typeof channel !== 'object' || Array.isArray(channel)) {
|
|
41
|
+
issues.push(`channels[${index}] must be an object`);
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
const ch = channel;
|
|
45
|
+
for (const key of ['id', 'name', 'url', 'cta']) {
|
|
46
|
+
if (!isString(ch[key]))
|
|
47
|
+
issues.push(`channels[${index}].${key} must be a non-empty string`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const starCta = data.star_cta;
|
|
52
|
+
if (!starCta || typeof starCta !== 'object' || Array.isArray(starCta)) {
|
|
53
|
+
issues.push('star_cta must be an object');
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
const cta = starCta;
|
|
57
|
+
if (!isString(cta.short))
|
|
58
|
+
issues.push('star_cta.short must be a non-empty string');
|
|
59
|
+
if (!isString(cta.long))
|
|
60
|
+
issues.push('star_cta.long must be a non-empty string');
|
|
61
|
+
}
|
|
62
|
+
return issues;
|
|
63
|
+
}
|
|
64
|
+
export function loadCommunityLinks(opts = {}) {
|
|
65
|
+
const dataPath = opts.dataPath ?? communityDataPath();
|
|
66
|
+
try {
|
|
67
|
+
if (!existsSync(dataPath)) {
|
|
68
|
+
opts.warn?.(`Community links file not found: ${dataPath}`);
|
|
69
|
+
return { ...EMPTY_LINKS, channels: [] };
|
|
70
|
+
}
|
|
71
|
+
const parsed = parse(readFileSync(dataPath, 'utf8'));
|
|
72
|
+
const issues = validateCommunityLinks(parsed);
|
|
73
|
+
if (issues.length > 0) {
|
|
74
|
+
opts.warn?.(`Community links file is invalid: ${issues.join('; ')}`);
|
|
75
|
+
return { ...EMPTY_LINKS, channels: [] };
|
|
76
|
+
}
|
|
77
|
+
return parsed;
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
81
|
+
opts.warn?.(`Failed to load community links: ${msg}`);
|
|
82
|
+
return { ...EMPTY_LINKS, channels: [] };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
export function compactUrl(url) {
|
|
86
|
+
return url.replace(/^https?:\/\//, '').replace(/\/$/, '');
|
|
87
|
+
}
|
|
88
|
+
export function formatCommunityFooter(links = loadCommunityLinks()) {
|
|
89
|
+
const parts = [
|
|
90
|
+
links.repository.github ? compactUrl(links.repository.github) : '',
|
|
91
|
+
links.channels.find((ch) => ch.id === 'discord')?.url
|
|
92
|
+
? compactUrl(links.channels.find((ch) => ch.id === 'discord').url)
|
|
93
|
+
: '',
|
|
94
|
+
links.website ? compactUrl(links.website) : '',
|
|
95
|
+
].filter(Boolean);
|
|
96
|
+
return parts.length > 0 ? `Community: ${parts.join(' · ')}` : null;
|
|
97
|
+
}
|
|
98
|
+
export function formatStarNudge(links = loadCommunityLinks()) {
|
|
99
|
+
if (!links.star_cta.long)
|
|
100
|
+
return null;
|
|
101
|
+
return `${links.star_cta.long}\nHide this: aiwg config set --user community.nudges false`;
|
|
102
|
+
}
|
|
103
|
+
export function formatMilestoneCelebration(milestone, links = loadCommunityLinks()) {
|
|
104
|
+
const repo = links.repository.github ? compactUrl(links.repository.github) : '';
|
|
105
|
+
const discord = links.channels.find((ch) => ch.id === 'discord')?.url ?? '';
|
|
106
|
+
const discordCompact = discord ? compactUrl(discord) : '';
|
|
107
|
+
if (!repo && !discordCompact)
|
|
108
|
+
return null;
|
|
109
|
+
const titles = {
|
|
110
|
+
first_deploy: 'First AIWG deploy complete.',
|
|
111
|
+
first_phase_transition: 'First phase transition complete.',
|
|
112
|
+
first_release: 'First release complete.',
|
|
113
|
+
first_production_deploy: 'First production deploy complete.',
|
|
114
|
+
};
|
|
115
|
+
const lines = [titles[milestone] ?? 'AIWG milestone complete.'];
|
|
116
|
+
if (repo)
|
|
117
|
+
lines.push(`If AIWG helped get you here, a star at ${repo} helps others find it.`);
|
|
118
|
+
if (discordCompact)
|
|
119
|
+
lines.push(`Share what you built: ${discordCompact}`);
|
|
120
|
+
lines.push('Hide future nudges: aiwg config set --user community.nudges false');
|
|
121
|
+
return lines.join('\n');
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=links.js.map
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { formatMilestoneCelebration } from './links.js';
|
|
4
|
+
import { shouldShowNudge } from './nudge-policy.js';
|
|
5
|
+
import { projectAiwgPath } from '../config/project-artifacts.js';
|
|
6
|
+
export function milestoneStatePath(projectDir) {
|
|
7
|
+
return projectAiwgPath(projectDir, '.milestones.json');
|
|
8
|
+
}
|
|
9
|
+
function readMilestones(projectDir) {
|
|
10
|
+
const statePath = milestoneStatePath(projectDir);
|
|
11
|
+
if (!existsSync(statePath))
|
|
12
|
+
return {};
|
|
13
|
+
try {
|
|
14
|
+
const parsed = JSON.parse(readFileSync(statePath, 'utf8'));
|
|
15
|
+
return parsed && typeof parsed === 'object' && !Array.isArray(parsed)
|
|
16
|
+
? parsed
|
|
17
|
+
: {};
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return {};
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export function recordMilestone(projectDir, milestone, now = new Date()) {
|
|
24
|
+
const state = readMilestones(projectDir);
|
|
25
|
+
if (state[milestone])
|
|
26
|
+
return false;
|
|
27
|
+
state[milestone] = now.toISOString();
|
|
28
|
+
const statePath = milestoneStatePath(projectDir);
|
|
29
|
+
mkdirSync(path.dirname(statePath), { recursive: true });
|
|
30
|
+
writeFileSync(statePath, JSON.stringify(state, null, 2) + '\n', 'utf8');
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
export function maybeCelebrateMilestone(projectDir, milestone) {
|
|
34
|
+
if (!shouldShowNudge('milestone'))
|
|
35
|
+
return false;
|
|
36
|
+
const isFirst = recordMilestone(projectDir, milestone);
|
|
37
|
+
if (!isFirst)
|
|
38
|
+
return false;
|
|
39
|
+
const message = formatMilestoneCelebration(milestone);
|
|
40
|
+
if (!message)
|
|
41
|
+
return false;
|
|
42
|
+
console.log('');
|
|
43
|
+
console.log(message);
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=milestones.js.map
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
import { parseYamlSimple } from '../config/user-config.js';
|
|
5
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
6
|
+
const CONTEXT_KEYS = {
|
|
7
|
+
intake: 'intake-shown',
|
|
8
|
+
'discovery-footer': 'footer-shown',
|
|
9
|
+
};
|
|
10
|
+
const CONTEXT_TTL_MS = {
|
|
11
|
+
intake: 90 * DAY_MS,
|
|
12
|
+
'discovery-footer': 7 * DAY_MS,
|
|
13
|
+
};
|
|
14
|
+
export function userAiwgDir() {
|
|
15
|
+
return process.env.AIWG_CONFIG ? path.resolve(process.env.AIWG_CONFIG) : path.join(os.homedir(), '.aiwg');
|
|
16
|
+
}
|
|
17
|
+
export function nudgeStatePath() {
|
|
18
|
+
return path.join(userAiwgDir(), '.nudge-state.json');
|
|
19
|
+
}
|
|
20
|
+
function envSuppresses() {
|
|
21
|
+
const noNudge = process.env.AIWG_NO_NUDGE?.toLowerCase();
|
|
22
|
+
if (noNudge === '1' || noNudge === 'true' || noNudge === 'yes')
|
|
23
|
+
return true;
|
|
24
|
+
if (process.env.CI?.toLowerCase() === 'true' || process.env.CI === '1')
|
|
25
|
+
return true;
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
function userConfigSuppresses() {
|
|
29
|
+
const configPath = path.join(userAiwgDir(), 'config.yaml');
|
|
30
|
+
if (!existsSync(configPath))
|
|
31
|
+
return false;
|
|
32
|
+
try {
|
|
33
|
+
const parsed = parseYamlSimple(readFileSync(configPath, 'utf8'));
|
|
34
|
+
const community = parsed.community;
|
|
35
|
+
return Boolean(community &&
|
|
36
|
+
typeof community === 'object' &&
|
|
37
|
+
!Array.isArray(community) &&
|
|
38
|
+
community.nudges === false);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function stdoutIsTty() {
|
|
45
|
+
return Boolean(process.stdout.isTTY);
|
|
46
|
+
}
|
|
47
|
+
function readState() {
|
|
48
|
+
const statePath = nudgeStatePath();
|
|
49
|
+
if (!existsSync(statePath))
|
|
50
|
+
return {};
|
|
51
|
+
try {
|
|
52
|
+
const parsed = JSON.parse(readFileSync(statePath, 'utf8'));
|
|
53
|
+
return parsed && typeof parsed === 'object' && !Array.isArray(parsed)
|
|
54
|
+
? parsed
|
|
55
|
+
: {};
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return {};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function isWithinThrottle(key, ttlMs, now) {
|
|
62
|
+
const state = readState();
|
|
63
|
+
const raw = state[key];
|
|
64
|
+
if (!raw)
|
|
65
|
+
return false;
|
|
66
|
+
const then = new Date(raw);
|
|
67
|
+
if (Number.isNaN(then.getTime()))
|
|
68
|
+
return false;
|
|
69
|
+
return now.getTime() - then.getTime() < ttlMs;
|
|
70
|
+
}
|
|
71
|
+
export function shouldShowNudge(ctx, opts = {}) {
|
|
72
|
+
if (envSuppresses())
|
|
73
|
+
return false;
|
|
74
|
+
if (userConfigSuppresses())
|
|
75
|
+
return false;
|
|
76
|
+
if (opts.requireTty ?? true) {
|
|
77
|
+
if (!stdoutIsTty())
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
if (ctx === 'milestone')
|
|
81
|
+
return true;
|
|
82
|
+
const key = CONTEXT_KEYS[ctx];
|
|
83
|
+
const ttlMs = CONTEXT_TTL_MS[ctx];
|
|
84
|
+
return !isWithinThrottle(key, ttlMs, opts.now ?? new Date());
|
|
85
|
+
}
|
|
86
|
+
export function markNudgeShown(ctx, opts = {}) {
|
|
87
|
+
const statePath = nudgeStatePath();
|
|
88
|
+
const state = readState();
|
|
89
|
+
state[CONTEXT_KEYS[ctx]] = (opts.now ?? new Date()).toISOString();
|
|
90
|
+
mkdirSync(path.dirname(statePath), { recursive: true });
|
|
91
|
+
writeFileSync(statePath, JSON.stringify(state, null, 2) + '\n', 'utf8');
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=nudge-policy.js.map
|