@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,804 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content Diversification Engine
|
|
3
|
+
*
|
|
4
|
+
* Generates diverse variations of content using different voices, perspectives,
|
|
5
|
+
* and structural approaches while maintaining authenticity and avoiding AI detection patterns.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Core Content Diversification Engine
|
|
9
|
+
*/
|
|
10
|
+
export class ContentDiversifier {
|
|
11
|
+
voiceCharacteristics;
|
|
12
|
+
constructor() {
|
|
13
|
+
this.voiceCharacteristics = this.initializeVoiceCharacteristics();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Generate multiple variations of content with different options
|
|
17
|
+
*/
|
|
18
|
+
async diversify(content, optionsList) {
|
|
19
|
+
const originalVoice = this.detectVoice(content);
|
|
20
|
+
const variations = [];
|
|
21
|
+
for (const options of optionsList) {
|
|
22
|
+
const variation = await this.generateVariation(content, options);
|
|
23
|
+
variations.push(variation);
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
original: content,
|
|
27
|
+
variations,
|
|
28
|
+
metadata: {
|
|
29
|
+
originalVoice,
|
|
30
|
+
originalLength: content.length,
|
|
31
|
+
variationsGenerated: variations.length,
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Generate a single variation with specified options
|
|
37
|
+
*/
|
|
38
|
+
async generateVariation(content, options) {
|
|
39
|
+
let transformed = content;
|
|
40
|
+
const changes = [];
|
|
41
|
+
// Apply transformations in order
|
|
42
|
+
if (options.voice) {
|
|
43
|
+
const currentVoice = this.detectVoice(transformed);
|
|
44
|
+
transformed = this.transformVoice(transformed, currentVoice, options.voice);
|
|
45
|
+
changes.push(`Voice: ${currentVoice} → ${options.voice}`);
|
|
46
|
+
}
|
|
47
|
+
if (options.perspective) {
|
|
48
|
+
transformed = this.changePerspective(transformed, options.perspective);
|
|
49
|
+
changes.push(`Perspective: → ${options.perspective}`);
|
|
50
|
+
}
|
|
51
|
+
if (options.structure) {
|
|
52
|
+
transformed = this.restructure(transformed, options.structure);
|
|
53
|
+
changes.push(`Structure: → ${options.structure}`);
|
|
54
|
+
}
|
|
55
|
+
if (options.tone) {
|
|
56
|
+
transformed = this.adjustTone(transformed, options.tone);
|
|
57
|
+
changes.push(`Tone: → ${options.tone}`);
|
|
58
|
+
}
|
|
59
|
+
if (options.length) {
|
|
60
|
+
transformed = this.adjustLength(transformed, options.length);
|
|
61
|
+
changes.push(`Length: → ${options.length}`);
|
|
62
|
+
}
|
|
63
|
+
// Calculate scores
|
|
64
|
+
const authenticity = this.scoreAuthenticity(transformed);
|
|
65
|
+
const diversity = this.scoreDiversity(content, transformed);
|
|
66
|
+
return {
|
|
67
|
+
content: transformed,
|
|
68
|
+
options,
|
|
69
|
+
score: {
|
|
70
|
+
authenticity,
|
|
71
|
+
diversity,
|
|
72
|
+
},
|
|
73
|
+
changes,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Transform content from one voice to another
|
|
78
|
+
*/
|
|
79
|
+
transformVoice(content, _fromVoice, toVoice) {
|
|
80
|
+
switch (toVoice) {
|
|
81
|
+
case 'academic':
|
|
82
|
+
return this.toAcademicVoice(content);
|
|
83
|
+
case 'technical':
|
|
84
|
+
return this.toTechnicalVoice(content);
|
|
85
|
+
case 'executive':
|
|
86
|
+
return this.toExecutiveVoice(content);
|
|
87
|
+
case 'casual':
|
|
88
|
+
return this.toCasualVoice(content);
|
|
89
|
+
default:
|
|
90
|
+
return content;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Transform to academic voice
|
|
95
|
+
*/
|
|
96
|
+
toAcademicVoice(content) {
|
|
97
|
+
let transformed = content;
|
|
98
|
+
let changeCount = 0;
|
|
99
|
+
// Add hedging and qualifications (deterministic: first match always transforms)
|
|
100
|
+
transformed = transformed.replace(/\b(is|are|will|must|should)\b/gi, (match) => {
|
|
101
|
+
const hedges = ['appears to be', 'suggests', 'may', 'could', 'might'];
|
|
102
|
+
if (changeCount < 2) {
|
|
103
|
+
changeCount++;
|
|
104
|
+
return hedges[changeCount % hedges.length];
|
|
105
|
+
}
|
|
106
|
+
return Math.random() > 0.7 ? hedges[Math.floor(Math.random() * hedges.length)] : match;
|
|
107
|
+
});
|
|
108
|
+
// Add citations and references
|
|
109
|
+
const sentences = this.splitIntoSentences(transformed);
|
|
110
|
+
const citations = ['(Smith, 2023)', '(Johnson et al., 2022)', '(Lee & Chen, 2024)', '(Anderson, 2021)'];
|
|
111
|
+
// Always add at least one citation to the first applicable sentence
|
|
112
|
+
if (sentences.length > 0) {
|
|
113
|
+
const citation = citations[0];
|
|
114
|
+
sentences[0] = sentences[0].replace(/\.$/, ` ${citation}.`);
|
|
115
|
+
}
|
|
116
|
+
// Optionally add more citations
|
|
117
|
+
const citationSentences = Math.floor(sentences.length * 0.3);
|
|
118
|
+
for (let i = 1; i < citationSentences && i < sentences.length; i++) {
|
|
119
|
+
const idx = Math.floor(Math.random() * sentences.length);
|
|
120
|
+
const citation = citations[Math.floor(Math.random() * citations.length)];
|
|
121
|
+
if (!sentences[idx].includes('(')) {
|
|
122
|
+
sentences[idx] = sentences[idx].replace(/\.$/, ` ${citation}.`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
transformed = sentences.join(' ');
|
|
126
|
+
// Add formal transitions (at least one if multiple sentences)
|
|
127
|
+
let transitionAdded = false;
|
|
128
|
+
transformed = transformed.replace(/\. ([A-Z])/g, (match, letter) => {
|
|
129
|
+
const transitions = [
|
|
130
|
+
'. Furthermore, ',
|
|
131
|
+
'. Moreover, ',
|
|
132
|
+
'. However, ',
|
|
133
|
+
'. Nevertheless, ',
|
|
134
|
+
'. Consequently, ',
|
|
135
|
+
];
|
|
136
|
+
if (!transitionAdded) {
|
|
137
|
+
transitionAdded = true;
|
|
138
|
+
return transitions[0] + letter;
|
|
139
|
+
}
|
|
140
|
+
return Math.random() > 0.7
|
|
141
|
+
? transitions[Math.floor(Math.random() * transitions.length)] + letter
|
|
142
|
+
: match;
|
|
143
|
+
});
|
|
144
|
+
// Add acknowledgment of limitations if not present and content is non-empty
|
|
145
|
+
if (transformed.trim() && !transformed.includes('limit')) {
|
|
146
|
+
transformed += ' It should be noted that this approach has certain limitations that warrant further investigation.';
|
|
147
|
+
}
|
|
148
|
+
return transformed;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Transform to technical voice
|
|
152
|
+
*/
|
|
153
|
+
toTechnicalVoice(content) {
|
|
154
|
+
let transformed = content;
|
|
155
|
+
let metricsAdded = 0;
|
|
156
|
+
// Add specific metrics and numbers (deterministic: first matches always transform)
|
|
157
|
+
transformed = transformed.replace(/\b(fast|slow|quick|better|improved|reduced|faster)\b/gi, (match) => {
|
|
158
|
+
const metrics = ['30%', '2.5x', '150ms', '40MB', '5 seconds'];
|
|
159
|
+
if (metricsAdded < 1) {
|
|
160
|
+
metricsAdded++;
|
|
161
|
+
return `${match} by ${metrics[metricsAdded % metrics.length]}`;
|
|
162
|
+
}
|
|
163
|
+
return Math.random() > 0.6
|
|
164
|
+
? `${match} by ${metrics[Math.floor(Math.random() * metrics.length)]}`
|
|
165
|
+
: match;
|
|
166
|
+
});
|
|
167
|
+
// Add technical terminology (deterministically apply first matching term)
|
|
168
|
+
const technicalTerms = {
|
|
169
|
+
'data': 'payload',
|
|
170
|
+
'information': 'metadata',
|
|
171
|
+
'storage': 'persistence layer',
|
|
172
|
+
'speed': 'latency',
|
|
173
|
+
'connection': 'TCP connection',
|
|
174
|
+
'code': 'implementation',
|
|
175
|
+
};
|
|
176
|
+
let termReplaced = false;
|
|
177
|
+
for (const [casual, technical] of Object.entries(technicalTerms)) {
|
|
178
|
+
const regex = new RegExp(`\\b${casual}\\b`, 'gi');
|
|
179
|
+
if (!termReplaced && regex.test(transformed)) {
|
|
180
|
+
transformed = transformed.replace(regex, technical);
|
|
181
|
+
termReplaced = true;
|
|
182
|
+
}
|
|
183
|
+
else if (Math.random() > 0.5) {
|
|
184
|
+
transformed = transformed.replace(regex, technical);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// Always add implementation details
|
|
188
|
+
const implementationExamples = [
|
|
189
|
+
' This can be achieved through connection pooling.',
|
|
190
|
+
' The implementation leverages a non-blocking I/O model.',
|
|
191
|
+
' We utilize a LRU cache with a 10-minute TTL.',
|
|
192
|
+
' The system employs exponential backoff for retry logic.',
|
|
193
|
+
];
|
|
194
|
+
const sentences = this.splitIntoSentences(transformed);
|
|
195
|
+
const insertIdx = Math.floor(sentences.length / 2);
|
|
196
|
+
sentences[insertIdx] += implementationExamples[0];
|
|
197
|
+
transformed = sentences.join(' ');
|
|
198
|
+
return transformed;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Transform to executive voice
|
|
202
|
+
*/
|
|
203
|
+
toExecutiveVoice(content) {
|
|
204
|
+
let transformed = content;
|
|
205
|
+
// Remove hedging - make assertions
|
|
206
|
+
transformed = transformed.replace(/\b(might|could|possibly|perhaps|maybe)\b/gi, 'will');
|
|
207
|
+
transformed = transformed.replace(/\b(appears to|seems to|suggests)\b/gi, 'demonstrates');
|
|
208
|
+
// Add business metrics (deterministic for at least first match)
|
|
209
|
+
const businessMetrics = [
|
|
210
|
+
'$500K annually',
|
|
211
|
+
'30% ROI',
|
|
212
|
+
'2 quarters',
|
|
213
|
+
'15% market share',
|
|
214
|
+
'$2M cost savings',
|
|
215
|
+
'40% efficiency gain',
|
|
216
|
+
];
|
|
217
|
+
let metricsAdded = 0;
|
|
218
|
+
transformed = transformed.replace(/\b(savings|revenue|cost|value|benefit)\b/gi, (match) => {
|
|
219
|
+
if (metricsAdded < 1) {
|
|
220
|
+
metricsAdded++;
|
|
221
|
+
return `${match} of ${businessMetrics[0]}`;
|
|
222
|
+
}
|
|
223
|
+
return Math.random() > 0.6
|
|
224
|
+
? `${match} of ${businessMetrics[Math.floor(Math.random() * businessMetrics.length)]}`
|
|
225
|
+
: match;
|
|
226
|
+
});
|
|
227
|
+
// Add decision-focused language (always add to first sentence)
|
|
228
|
+
const decisionPhrases = [
|
|
229
|
+
'We recommend',
|
|
230
|
+
'The strategic priority is',
|
|
231
|
+
'Our analysis indicates',
|
|
232
|
+
'The optimal approach requires',
|
|
233
|
+
'To maximize value, we should',
|
|
234
|
+
];
|
|
235
|
+
const sentences = this.splitIntoSentences(transformed);
|
|
236
|
+
if (sentences.length > 0) {
|
|
237
|
+
const firstSentence = decisionPhrases[0] + ' ' + sentences[0].toLowerCase();
|
|
238
|
+
sentences[0] = firstSentence;
|
|
239
|
+
}
|
|
240
|
+
// Always add risk/opportunity framing
|
|
241
|
+
sentences.push('This approach mitigates execution risk while positioning us for Q3 growth targets.');
|
|
242
|
+
return sentences.join(' ');
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Transform to casual voice
|
|
246
|
+
*/
|
|
247
|
+
toCasualVoice(content) {
|
|
248
|
+
let transformed = content;
|
|
249
|
+
// Add contractions
|
|
250
|
+
const contractions = {
|
|
251
|
+
'do not': "don't",
|
|
252
|
+
'does not': "doesn't",
|
|
253
|
+
'will not': "won't",
|
|
254
|
+
'cannot': "can't",
|
|
255
|
+
'it is': "it's",
|
|
256
|
+
'that is': "that's",
|
|
257
|
+
'we are': "we're",
|
|
258
|
+
'you are': "you're",
|
|
259
|
+
'they are': "they're",
|
|
260
|
+
};
|
|
261
|
+
for (const [formal, casual] of Object.entries(contractions)) {
|
|
262
|
+
const regex = new RegExp(`\\b${formal}\\b`, 'gi');
|
|
263
|
+
transformed = transformed.replace(regex, casual);
|
|
264
|
+
}
|
|
265
|
+
// Add conversational phrases (always add to first sentence)
|
|
266
|
+
const conversationalStarts = [
|
|
267
|
+
"Here's the thing - ",
|
|
268
|
+
"Look, ",
|
|
269
|
+
"The reality is ",
|
|
270
|
+
"Here's what matters: ",
|
|
271
|
+
"Bottom line? ",
|
|
272
|
+
];
|
|
273
|
+
const sentences = this.splitIntoSentences(transformed);
|
|
274
|
+
if (sentences.length > 0) {
|
|
275
|
+
sentences[0] = conversationalStarts[0] + sentences[0].toLowerCase();
|
|
276
|
+
}
|
|
277
|
+
// Always add personal examples
|
|
278
|
+
const personalExamples = [
|
|
279
|
+
"I've seen this pattern in production systems before.",
|
|
280
|
+
"We ran into this exact issue last quarter.",
|
|
281
|
+
"This reminds me of a project we did in 2022.",
|
|
282
|
+
];
|
|
283
|
+
sentences.push(personalExamples[0]);
|
|
284
|
+
// Always add analogies
|
|
285
|
+
const analogies = [
|
|
286
|
+
"Think of it like a conveyor belt - things need to move at a steady pace.",
|
|
287
|
+
"It's similar to how a restaurant kitchen handles orders during rush hour.",
|
|
288
|
+
"You can think of this as the difference between a highway and city streets.",
|
|
289
|
+
];
|
|
290
|
+
sentences.splice(Math.floor(sentences.length / 2), 0, analogies[0]);
|
|
291
|
+
return sentences.join(' ');
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Change perspective of content
|
|
295
|
+
*/
|
|
296
|
+
changePerspective(content, perspective) {
|
|
297
|
+
switch (perspective) {
|
|
298
|
+
case 'first-person':
|
|
299
|
+
return this.toFirstPerson(content);
|
|
300
|
+
case 'third-person':
|
|
301
|
+
return this.toThirdPerson(content);
|
|
302
|
+
case 'neutral':
|
|
303
|
+
return this.toNeutral(content);
|
|
304
|
+
default:
|
|
305
|
+
return content;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Convert to first-person perspective
|
|
310
|
+
*/
|
|
311
|
+
toFirstPerson(content) {
|
|
312
|
+
let transformed = content;
|
|
313
|
+
// Replace third-person with first-person
|
|
314
|
+
transformed = transformed.replace(/\bone\b/gi, 'I');
|
|
315
|
+
transformed = transformed.replace(/\bthe (user|developer|reader)\b/gi, 'I');
|
|
316
|
+
transformed = transformed.replace(/\bwe can\b/gi, 'I can');
|
|
317
|
+
// Add personal statements
|
|
318
|
+
if (!transformed.includes(' I ') && Math.random() > 0.5) {
|
|
319
|
+
const sentences = this.splitIntoSentences(transformed);
|
|
320
|
+
sentences[0] = "In my experience, " + sentences[0].toLowerCase();
|
|
321
|
+
transformed = sentences.join(' ');
|
|
322
|
+
}
|
|
323
|
+
return transformed;
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Convert to third-person perspective
|
|
327
|
+
*/
|
|
328
|
+
toThirdPerson(content) {
|
|
329
|
+
let transformed = content;
|
|
330
|
+
// Replace first-person with third-person
|
|
331
|
+
transformed = transformed.replace(/\bI\b/g, 'one');
|
|
332
|
+
transformed = transformed.replace(/\bmy\b/gi, 'their');
|
|
333
|
+
transformed = transformed.replace(/\bwe\b/gi, 'they');
|
|
334
|
+
transformed = transformed.replace(/\bour\b/gi, 'their');
|
|
335
|
+
return transformed;
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Convert to neutral perspective
|
|
339
|
+
*/
|
|
340
|
+
toNeutral(content) {
|
|
341
|
+
let transformed = content;
|
|
342
|
+
// Remove personal pronouns - use precise replacements
|
|
343
|
+
transformed = transformed.replace(/\bI\b/g, 'the system');
|
|
344
|
+
transformed = transformed.replace(/\bwe\b/gi, 'the approach');
|
|
345
|
+
transformed = transformed.replace(/\byou\b/gi, 'users');
|
|
346
|
+
transformed = transformed.replace(/\bmy\b/gi, 'the');
|
|
347
|
+
transformed = transformed.replace(/\bour\b/gi, 'the');
|
|
348
|
+
transformed = transformed.replace(/\byour\b/gi, 'user');
|
|
349
|
+
// Add passive voice - more carefully to avoid breaking grammar
|
|
350
|
+
transformed = transformed.replace(/\bcan configure\b/g, 'can be configured to');
|
|
351
|
+
transformed = transformed.replace(/\bcan handle\b/g, 'handles');
|
|
352
|
+
transformed = transformed.replace(/\bwill process\b/g, 'processes');
|
|
353
|
+
return transformed;
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Restructure content into different format
|
|
357
|
+
*/
|
|
358
|
+
restructure(content, structure) {
|
|
359
|
+
switch (structure) {
|
|
360
|
+
case 'bullets':
|
|
361
|
+
return this.toBulletPoints(content);
|
|
362
|
+
case 'narrative':
|
|
363
|
+
return this.toNarrative(content);
|
|
364
|
+
case 'qa':
|
|
365
|
+
return this.toQA(content);
|
|
366
|
+
case 'tutorial':
|
|
367
|
+
return this.toTutorial(content);
|
|
368
|
+
case 'comparison':
|
|
369
|
+
return this.toComparison(content);
|
|
370
|
+
default:
|
|
371
|
+
return content;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Convert to bullet point format
|
|
376
|
+
*/
|
|
377
|
+
toBulletPoints(content) {
|
|
378
|
+
const sentences = this.splitIntoSentences(content);
|
|
379
|
+
const bullets = sentences.map(sentence => `- ${sentence.trim()}`);
|
|
380
|
+
return bullets.join('\n');
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Convert to narrative format
|
|
384
|
+
*/
|
|
385
|
+
toNarrative(content) {
|
|
386
|
+
const lines = content.split('\n').filter(line => line.trim());
|
|
387
|
+
let narrative = '';
|
|
388
|
+
for (let i = 0; i < lines.length; i++) {
|
|
389
|
+
const line = lines[i].replace(/^[-*]\s*/, '').trim();
|
|
390
|
+
if (i === 0) {
|
|
391
|
+
narrative += line + '. ';
|
|
392
|
+
}
|
|
393
|
+
else {
|
|
394
|
+
const transitions = ['Additionally', 'Furthermore', 'Next', 'Then', 'Moreover', 'Also'];
|
|
395
|
+
const transition = transitions[Math.floor(Math.random() * transitions.length)];
|
|
396
|
+
narrative += `${transition}, ${line.toLowerCase()}. `;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
return narrative.trim();
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Convert to Q&A format
|
|
403
|
+
*/
|
|
404
|
+
toQA(content) {
|
|
405
|
+
const sentences = this.splitIntoSentences(content);
|
|
406
|
+
let qa = '';
|
|
407
|
+
for (let i = 0; i < sentences.length; i += 2) {
|
|
408
|
+
const statement = sentences[i];
|
|
409
|
+
// Generate question from statement
|
|
410
|
+
const question = this.statementToQuestion(statement);
|
|
411
|
+
qa += `Q: ${question}\n`;
|
|
412
|
+
// Use statement as answer
|
|
413
|
+
const answer = sentences[i] + (sentences[i + 1] ? ' ' + sentences[i + 1] : '');
|
|
414
|
+
qa += `A: ${answer}\n\n`;
|
|
415
|
+
}
|
|
416
|
+
return qa.trim();
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* Convert to tutorial format
|
|
420
|
+
*/
|
|
421
|
+
toTutorial(content) {
|
|
422
|
+
const sentences = this.splitIntoSentences(content);
|
|
423
|
+
let tutorial = '## Step-by-Step Guide\n\n';
|
|
424
|
+
sentences.forEach((sentence, idx) => {
|
|
425
|
+
tutorial += `### Step ${idx + 1}\n\n${sentence}\n\n`;
|
|
426
|
+
});
|
|
427
|
+
return tutorial;
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* Convert to comparison format
|
|
431
|
+
*/
|
|
432
|
+
toComparison(content) {
|
|
433
|
+
const sentences = this.splitIntoSentences(content);
|
|
434
|
+
const midpoint = Math.floor(sentences.length / 2);
|
|
435
|
+
let comparison = '## Approach A\n\n';
|
|
436
|
+
for (let i = 0; i < midpoint; i++) {
|
|
437
|
+
comparison += `- ${sentences[i]}\n`;
|
|
438
|
+
}
|
|
439
|
+
comparison += '\n## Approach B\n\n';
|
|
440
|
+
for (let i = midpoint; i < sentences.length; i++) {
|
|
441
|
+
comparison += `- ${sentences[i]}\n`;
|
|
442
|
+
}
|
|
443
|
+
return comparison;
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* Adjust tone of content
|
|
447
|
+
*/
|
|
448
|
+
adjustTone(content, tone) {
|
|
449
|
+
switch (tone) {
|
|
450
|
+
case 'formal':
|
|
451
|
+
return this.toFormal(content);
|
|
452
|
+
case 'conversational':
|
|
453
|
+
return this.toConversational(content);
|
|
454
|
+
case 'enthusiastic':
|
|
455
|
+
return this.toEnthusiastic(content);
|
|
456
|
+
case 'matter-of-fact':
|
|
457
|
+
return this.toMatterOfFact(content);
|
|
458
|
+
default:
|
|
459
|
+
return content;
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* Convert to formal tone
|
|
464
|
+
*/
|
|
465
|
+
toFormal(content) {
|
|
466
|
+
let transformed = content;
|
|
467
|
+
// Expand contractions
|
|
468
|
+
const expansions = {
|
|
469
|
+
"don't": 'do not',
|
|
470
|
+
"doesn't": 'does not',
|
|
471
|
+
"won't": 'will not',
|
|
472
|
+
"can't": 'cannot',
|
|
473
|
+
"it's": 'it is',
|
|
474
|
+
"that's": 'that is',
|
|
475
|
+
"we're": 'we are',
|
|
476
|
+
"here's": 'here is',
|
|
477
|
+
};
|
|
478
|
+
for (const [contraction, expansion] of Object.entries(expansions)) {
|
|
479
|
+
const regex = new RegExp(contraction, 'gi');
|
|
480
|
+
transformed = transformed.replace(regex, expansion);
|
|
481
|
+
}
|
|
482
|
+
// Remove casual phrases
|
|
483
|
+
transformed = transformed.replace(/\b(just|really|very|pretty)\b/gi, '');
|
|
484
|
+
// Remove informal starters
|
|
485
|
+
transformed = transformed.replace(/^(Here's the thing - |Look, |The reality is |Here's what matters: |Bottom line\? )/gi, '');
|
|
486
|
+
// Clean up spacing
|
|
487
|
+
transformed = transformed.replace(/\s+/g, ' ').trim();
|
|
488
|
+
return transformed;
|
|
489
|
+
}
|
|
490
|
+
/**
|
|
491
|
+
* Convert to conversational tone
|
|
492
|
+
*/
|
|
493
|
+
toConversational(content) {
|
|
494
|
+
let transformed = content;
|
|
495
|
+
// Add conversational markers (always add to first sentence)
|
|
496
|
+
const markers = ['Well, ', 'So, ', 'Now, ', 'You see, '];
|
|
497
|
+
const sentences = this.splitIntoSentences(transformed);
|
|
498
|
+
if (sentences.length > 0) {
|
|
499
|
+
sentences[0] = markers[0] + sentences[0].toLowerCase();
|
|
500
|
+
}
|
|
501
|
+
// Always add a question
|
|
502
|
+
const questions = ['Make sense?', 'Follow me?', 'See what I mean?', 'Right?'];
|
|
503
|
+
sentences.push(questions[0]);
|
|
504
|
+
return sentences.join(' ');
|
|
505
|
+
}
|
|
506
|
+
/**
|
|
507
|
+
* Convert to enthusiastic tone
|
|
508
|
+
*/
|
|
509
|
+
toEnthusiastic(content) {
|
|
510
|
+
let transformed = content;
|
|
511
|
+
let modifiedCount = 0;
|
|
512
|
+
// Add enthusiastic modifiers (deterministic: first match always transforms)
|
|
513
|
+
transformed = transformed.replace(/\b(good|great|nice|effective|useful)\b/gi, (match) => {
|
|
514
|
+
const enthusiastic = ['amazing', 'fantastic', 'excellent', 'outstanding', 'brilliant'];
|
|
515
|
+
if (modifiedCount < 1) {
|
|
516
|
+
modifiedCount++;
|
|
517
|
+
return enthusiastic[0];
|
|
518
|
+
}
|
|
519
|
+
return Math.random() > 0.6
|
|
520
|
+
? enthusiastic[Math.floor(Math.random() * enthusiastic.length)]
|
|
521
|
+
: match;
|
|
522
|
+
});
|
|
523
|
+
// Add exclamation points (at least one)
|
|
524
|
+
let exclamationAdded = false;
|
|
525
|
+
transformed = transformed.replace(/\./g, (match) => {
|
|
526
|
+
if (!exclamationAdded) {
|
|
527
|
+
exclamationAdded = true;
|
|
528
|
+
return '!';
|
|
529
|
+
}
|
|
530
|
+
return Math.random() > 0.7 ? '!' : match;
|
|
531
|
+
});
|
|
532
|
+
return transformed;
|
|
533
|
+
}
|
|
534
|
+
/**
|
|
535
|
+
* Convert to matter-of-fact tone
|
|
536
|
+
*/
|
|
537
|
+
toMatterOfFact(content) {
|
|
538
|
+
let transformed = content;
|
|
539
|
+
// Remove exclamation points
|
|
540
|
+
transformed = transformed.replace(/!/g, '.');
|
|
541
|
+
// Remove qualifiers (with trailing space)
|
|
542
|
+
transformed = transformed.replace(/\b(very|really|extremely|quite|rather|absolutely)\b\s*/gi, '');
|
|
543
|
+
// Remove emphatic words (with trailing space)
|
|
544
|
+
transformed = transformed.replace(/\b(clearly|obviously|certainly|definitely)\b\s*/gi, '');
|
|
545
|
+
// Replace enthusiastic adjectives with neutral ones
|
|
546
|
+
transformed = transformed.replace(/\b(amazing|fantastic|incredible|excellent)\b/gi, (match) => {
|
|
547
|
+
const neutralReplacements = {
|
|
548
|
+
'amazing': 'notable',
|
|
549
|
+
'fantastic': 'good',
|
|
550
|
+
'incredible': 'significant',
|
|
551
|
+
'excellent': 'good',
|
|
552
|
+
};
|
|
553
|
+
return neutralReplacements[match.toLowerCase()] || match;
|
|
554
|
+
});
|
|
555
|
+
// Clean up spacing and multiple periods
|
|
556
|
+
transformed = transformed.replace(/\s+/g, ' ').trim();
|
|
557
|
+
transformed = transformed.replace(/\.+/g, '.');
|
|
558
|
+
return transformed;
|
|
559
|
+
}
|
|
560
|
+
/**
|
|
561
|
+
* Adjust length of content
|
|
562
|
+
*/
|
|
563
|
+
adjustLength(content, length) {
|
|
564
|
+
switch (length) {
|
|
565
|
+
case 'concise':
|
|
566
|
+
return this.toConcise(content);
|
|
567
|
+
case 'comprehensive':
|
|
568
|
+
return this.toComprehensive(content);
|
|
569
|
+
case 'standard':
|
|
570
|
+
default:
|
|
571
|
+
return content;
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
/**
|
|
575
|
+
* Shorten content
|
|
576
|
+
*/
|
|
577
|
+
toConcise(content) {
|
|
578
|
+
const sentences = this.splitIntoSentences(content);
|
|
579
|
+
const targetLength = Math.ceil(sentences.length * 0.6);
|
|
580
|
+
// Keep most important sentences (first and last are usually key)
|
|
581
|
+
const kept = [
|
|
582
|
+
sentences[0],
|
|
583
|
+
...sentences.slice(1, -1).slice(0, targetLength - 2),
|
|
584
|
+
sentences[sentences.length - 1],
|
|
585
|
+
];
|
|
586
|
+
return kept.join(' ');
|
|
587
|
+
}
|
|
588
|
+
/**
|
|
589
|
+
* Expand content
|
|
590
|
+
*/
|
|
591
|
+
toComprehensive(content) {
|
|
592
|
+
const sentences = this.splitIntoSentences(content);
|
|
593
|
+
const expanded = [];
|
|
594
|
+
for (const sentence of sentences) {
|
|
595
|
+
expanded.push(sentence);
|
|
596
|
+
// Add elaboration
|
|
597
|
+
if (Math.random() > 0.5) {
|
|
598
|
+
const elaborations = [
|
|
599
|
+
'This approach offers several advantages.',
|
|
600
|
+
'Let me explain this in more detail.',
|
|
601
|
+
'Consider the implications of this carefully.',
|
|
602
|
+
'This is particularly important in practice.',
|
|
603
|
+
];
|
|
604
|
+
expanded.push(elaborations[Math.floor(Math.random() * elaborations.length)]);
|
|
605
|
+
}
|
|
606
|
+
// Add examples
|
|
607
|
+
if (Math.random() > 0.7) {
|
|
608
|
+
expanded.push('For example, in a typical production environment, this pattern reduces latency by 25%.');
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
return expanded.join(' ');
|
|
612
|
+
}
|
|
613
|
+
/**
|
|
614
|
+
* Generate before/after example pair
|
|
615
|
+
*/
|
|
616
|
+
async generateBeforeAfter(topic) {
|
|
617
|
+
// Generate AI-heavy "before" content
|
|
618
|
+
const before = this.generateAIHeavyContent(topic);
|
|
619
|
+
// Transform to authentic "after" content
|
|
620
|
+
const after = await this.generateVariation(before, {
|
|
621
|
+
voice: 'technical',
|
|
622
|
+
tone: 'conversational',
|
|
623
|
+
structure: 'narrative',
|
|
624
|
+
});
|
|
625
|
+
return {
|
|
626
|
+
before,
|
|
627
|
+
after: after.content,
|
|
628
|
+
};
|
|
629
|
+
}
|
|
630
|
+
/**
|
|
631
|
+
* Generate diverse scenarios for a concept
|
|
632
|
+
*/
|
|
633
|
+
async generateDiverseScenarios(concept, count) {
|
|
634
|
+
const scenarios = [];
|
|
635
|
+
const baseContent = `${concept} is an important consideration in software development.`;
|
|
636
|
+
const voiceOptions = ['academic', 'technical', 'executive', 'casual'];
|
|
637
|
+
for (let i = 0; i < count; i++) {
|
|
638
|
+
const voice = voiceOptions[i % voiceOptions.length];
|
|
639
|
+
const variation = await this.generateVariation(baseContent, {
|
|
640
|
+
voice,
|
|
641
|
+
perspective: i % 2 === 0 ? 'first-person' : 'neutral',
|
|
642
|
+
tone: i % 2 === 0 ? 'conversational' : 'formal',
|
|
643
|
+
});
|
|
644
|
+
scenarios.push(variation.content);
|
|
645
|
+
}
|
|
646
|
+
return scenarios;
|
|
647
|
+
}
|
|
648
|
+
// Private helper methods
|
|
649
|
+
initializeVoiceCharacteristics() {
|
|
650
|
+
const characteristics = new Map();
|
|
651
|
+
characteristics.set('academic', {
|
|
652
|
+
markers: [/\([\w\s,&]+,\s*\d{4}\)/, /suggests that/, /appears to/, /research indicates/i],
|
|
653
|
+
vocabulary: ['furthermore', 'moreover', 'nevertheless', 'consequently', 'empirical'],
|
|
654
|
+
structurePreferences: ['formal transitions', 'citations', 'hedging'],
|
|
655
|
+
});
|
|
656
|
+
characteristics.set('technical', {
|
|
657
|
+
markers: [/\d+(\.\d+)?\s*(ms|MB|GB|%)/, /implementation/, /latency/, /throughput/i],
|
|
658
|
+
vocabulary: ['payload', 'metadata', 'optimization', 'configuration', 'deployment'],
|
|
659
|
+
structurePreferences: ['metrics', 'code examples', 'specifications'],
|
|
660
|
+
});
|
|
661
|
+
characteristics.set('executive', {
|
|
662
|
+
markers: [/\$[\d,]+[KM]?/, /ROI/, /\d+%\s*(increase|decrease|improvement)/, /strategic/i],
|
|
663
|
+
vocabulary: ['strategic', 'leverage', 'optimize', 'maximize', 'stakeholder'],
|
|
664
|
+
structurePreferences: ['business impact', 'recommendations', 'decisions'],
|
|
665
|
+
});
|
|
666
|
+
characteristics.set('casual', {
|
|
667
|
+
markers: [/\b(don't|can't|won't|it's)\b/, /here's/i, /\bI\b/, /you know/i],
|
|
668
|
+
vocabulary: ["here's", 'basically', 'pretty', 'just', 'really'],
|
|
669
|
+
structurePreferences: ['contractions', 'personal examples', 'analogies'],
|
|
670
|
+
});
|
|
671
|
+
return characteristics;
|
|
672
|
+
}
|
|
673
|
+
detectVoice(content) {
|
|
674
|
+
const scores = new Map();
|
|
675
|
+
for (const [voice, characteristics] of this.voiceCharacteristics.entries()) {
|
|
676
|
+
let score = 0;
|
|
677
|
+
for (const marker of characteristics.markers) {
|
|
678
|
+
const matches = content.match(marker);
|
|
679
|
+
if (matches) {
|
|
680
|
+
score += matches.length;
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
for (const term of characteristics.vocabulary) {
|
|
684
|
+
const regex = new RegExp(`\\b${term}\\b`, 'gi');
|
|
685
|
+
const matches = content.match(regex);
|
|
686
|
+
if (matches) {
|
|
687
|
+
score += matches.length;
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
scores.set(voice, score);
|
|
691
|
+
}
|
|
692
|
+
const sortedScores = Array.from(scores.entries()).sort((a, b) => b[1] - a[1]);
|
|
693
|
+
// If top score is significantly higher, return that voice
|
|
694
|
+
if (sortedScores[0][1] > sortedScores[1][1] * 1.5) {
|
|
695
|
+
return sortedScores[0][0];
|
|
696
|
+
}
|
|
697
|
+
return 'mixed';
|
|
698
|
+
}
|
|
699
|
+
scoreAuthenticity(content) {
|
|
700
|
+
let score = 50; // baseline
|
|
701
|
+
// Positive markers
|
|
702
|
+
if (content.match(/\d+(\.\d+)?\s*(ms|MB|GB|%|seconds)/))
|
|
703
|
+
score += 10; // specific metrics
|
|
704
|
+
if (content.match(/\$[\d,]+/))
|
|
705
|
+
score += 10; // concrete numbers
|
|
706
|
+
if (content.match(/\b(I|we)\b/))
|
|
707
|
+
score += 5; // personal voice
|
|
708
|
+
if (content.match(/\b(However|But|Although)\b/))
|
|
709
|
+
score += 5; // acknowledges nuance
|
|
710
|
+
// Negative markers
|
|
711
|
+
if (content.includes('delve'))
|
|
712
|
+
score -= 20;
|
|
713
|
+
if (content.includes('leverage') && !content.includes('executive'))
|
|
714
|
+
score -= 10;
|
|
715
|
+
if (content.match(/it's important to note/i))
|
|
716
|
+
score -= 15;
|
|
717
|
+
return Math.max(0, Math.min(100, score));
|
|
718
|
+
}
|
|
719
|
+
scoreDiversity(original, variation) {
|
|
720
|
+
// Simple edit distance-based diversity score
|
|
721
|
+
const distance = this.levenshteinDistance(original, variation);
|
|
722
|
+
const maxLength = Math.max(original.length, variation.length);
|
|
723
|
+
return Math.round((distance / maxLength) * 100);
|
|
724
|
+
}
|
|
725
|
+
levenshteinDistance(str1, str2) {
|
|
726
|
+
const matrix = [];
|
|
727
|
+
for (let i = 0; i <= str2.length; i++) {
|
|
728
|
+
matrix[i] = [i];
|
|
729
|
+
}
|
|
730
|
+
for (let j = 0; j <= str1.length; j++) {
|
|
731
|
+
matrix[0][j] = j;
|
|
732
|
+
}
|
|
733
|
+
for (let i = 1; i <= str2.length; i++) {
|
|
734
|
+
for (let j = 1; j <= str1.length; j++) {
|
|
735
|
+
if (str2.charAt(i - 1) === str1.charAt(j - 1)) {
|
|
736
|
+
matrix[i][j] = matrix[i - 1][j - 1];
|
|
737
|
+
}
|
|
738
|
+
else {
|
|
739
|
+
matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, matrix[i][j - 1] + 1, matrix[i - 1][j] + 1);
|
|
740
|
+
}
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
return matrix[str2.length][str1.length];
|
|
744
|
+
}
|
|
745
|
+
splitIntoSentences(content) {
|
|
746
|
+
// Split on sentence boundaries
|
|
747
|
+
const sentences = content
|
|
748
|
+
.split(/[.!?]+/)
|
|
749
|
+
.map(s => s.trim())
|
|
750
|
+
.filter(s => s.length > 0);
|
|
751
|
+
return sentences.map(s => {
|
|
752
|
+
// Ensure sentence ends with period
|
|
753
|
+
if (!s.match(/[.!?]$/)) {
|
|
754
|
+
return s + '.';
|
|
755
|
+
}
|
|
756
|
+
return s;
|
|
757
|
+
});
|
|
758
|
+
}
|
|
759
|
+
statementToQuestion(statement) {
|
|
760
|
+
// Simple heuristic to convert statement to question
|
|
761
|
+
const lower = statement.toLowerCase();
|
|
762
|
+
const cleanStatement = statement.replace(/\.$/, ''); // Remove trailing period
|
|
763
|
+
// Match common sentence structures and convert to questions
|
|
764
|
+
if (lower.startsWith('the ')) {
|
|
765
|
+
// "The system is reliable." -> "Is the system reliable?"
|
|
766
|
+
const match = cleanStatement.match(/^The\s+(\w+)\s+is\s+(.+)$/i);
|
|
767
|
+
if (match) {
|
|
768
|
+
return `Is the ${match[1]} ${match[2]}?`;
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
if (lower.includes(' is ')) {
|
|
772
|
+
// Extract subject and convert: "X is Y" -> "What is X?"
|
|
773
|
+
const match = cleanStatement.match(/^(.+?)\s+is\s+/i);
|
|
774
|
+
if (match) {
|
|
775
|
+
return `What is ${match[1].toLowerCase()}?`;
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
if (lower.includes(' can ')) {
|
|
779
|
+
const match = cleanStatement.match(/^(.+?)\s+can\s+/i);
|
|
780
|
+
if (match) {
|
|
781
|
+
return `How can ${match[1].toLowerCase()} be used?`;
|
|
782
|
+
}
|
|
783
|
+
}
|
|
784
|
+
if (lower.includes(' should ')) {
|
|
785
|
+
const match = cleanStatement.match(/^(.+?)\s+should\s+/i);
|
|
786
|
+
if (match) {
|
|
787
|
+
return `Why should ${match[1].toLowerCase()}?`;
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
// Default fallback - make it a proper question
|
|
791
|
+
return `What about ${cleanStatement.toLowerCase()}?`;
|
|
792
|
+
}
|
|
793
|
+
generateAIHeavyContent(topic) {
|
|
794
|
+
// Generate content with typical AI patterns
|
|
795
|
+
const aiPhrases = [
|
|
796
|
+
`It's important to note that ${topic} plays a crucial role in modern development.`,
|
|
797
|
+
`When delving into ${topic}, one must consider various aspects and nuances.`,
|
|
798
|
+
`At the end of the day, ${topic} is absolutely essential for success.`,
|
|
799
|
+
`It goes without saying that ${topic} should be carefully considered.`,
|
|
800
|
+
];
|
|
801
|
+
return aiPhrases.join(' ');
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
//# sourceMappingURL=content-diversifier.js.map
|