@jaimevalasek/aioson 1.7.2 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +35 -0
- package/README.md +153 -10
- package/docs/en/cli-reference.md +56 -1
- package/docs/en/i18n.md +18 -18
- package/docs/en/schemas/index.json +10 -0
- package/docs/en/schemas/parallel-assign.schema.json +9 -0
- package/docs/en/schemas/parallel-doctor.schema.json +36 -0
- package/docs/en/schemas/parallel-guard.schema.json +63 -0
- package/docs/en/schemas/parallel-merge.schema.json +84 -0
- package/docs/en/schemas/parallel-status.schema.json +91 -1
- package/docs/integrations/apps-publish-marketplace.md +94 -0
- package/docs/pt/README.md +9 -0
- package/docs/pt/agentes.md +324 -3
- package/docs/pt/clientes-ai.md +7 -3
- package/docs/pt/comandos-cli.md +160 -13
- package/docs/pt/compress-agents.md +304 -0
- package/docs/pt/design-docs-governance.md +59 -0
- package/docs/pt/feature-archive.md +191 -0
- package/docs/pt/genome-3.0-spec.md +115 -4
- package/docs/pt/genome-distribution.md +232 -0
- package/docs/pt/inicio-rapido.md +1 -0
- package/docs/pt/motor-hardening.md +492 -0
- package/docs/pt/runner-system.md +113 -0
- package/package.json +2 -1
- package/src/agent-manifests.js +66 -0
- package/src/agents.js +27 -7
- package/src/autonomy-policy.js +139 -0
- package/src/brain-query.js +161 -0
- package/src/cli.js +1377 -1099
- package/src/commands/agents.js +102 -7
- package/src/commands/artifact-validate.js +33 -4
- package/src/commands/auth.js +272 -0
- package/src/commands/brain-query.js +44 -0
- package/src/commands/briefing.js +344 -0
- package/src/commands/commit-prepare.js +547 -0
- package/src/commands/compress-agents.js +416 -0
- package/src/commands/context-health.js +4 -2
- package/src/commands/context-trim.js +17 -11
- package/src/commands/design-hybrid-options.js +3 -3
- package/src/commands/devlog-process.js +6 -4
- package/src/commands/dossier.js +423 -0
- package/src/commands/feature-archive.js +513 -0
- package/src/commands/feature-close.js +123 -18
- package/src/commands/gate-approve.js +198 -0
- package/src/commands/gate-check.js +24 -5
- package/src/commands/genome-doctor.js +166 -9
- package/src/commands/git-guard.js +170 -0
- package/src/commands/harness.js +121 -0
- package/src/commands/implementation-plan.js +47 -20
- package/src/commands/init.js +6 -2
- package/src/commands/install.js +6 -2
- package/src/commands/live.js +497 -56
- package/src/commands/locale-apply.js +9 -6
- package/src/commands/locale-diff.js +11 -112
- package/src/commands/mcp-doctor.js +2 -1
- package/src/commands/mcp-init.js +4 -10
- package/src/commands/memory.js +234 -0
- package/src/commands/parallel-assign.js +107 -27
- package/src/commands/parallel-doctor.js +416 -3
- package/src/commands/parallel-guard.js +241 -0
- package/src/commands/parallel-init.js +66 -4
- package/src/commands/parallel-merge.js +299 -0
- package/src/commands/parallel-status.js +147 -3
- package/src/commands/preflight.js +63 -4
- package/src/commands/qa-init.js +10 -5
- package/src/commands/revision.js +235 -0
- package/src/commands/scaffold-complete.js +188 -0
- package/src/commands/security-audit.js +275 -0
- package/src/commands/security-scan.js +376 -0
- package/src/commands/self-implement-loop.js +46 -2
- package/src/commands/setup-context.js +11 -10
- package/src/commands/squad-agent-create.js +51 -9
- package/src/commands/squad-investigate.js +53 -0
- package/src/commands/squad-plan.js +33 -1
- package/src/commands/squad-scaffold.js +4 -3
- package/src/commands/squad-score.js +71 -14
- package/src/commands/squad-status.js +22 -1
- package/src/commands/squad-validate.js +93 -2
- package/src/commands/store-genome.js +304 -0
- package/src/commands/store-skill.js +247 -0
- package/src/commands/store-squad.js +431 -0
- package/src/commands/store-system.js +392 -0
- package/src/commands/tool-capabilities.js +63 -0
- package/src/commands/update.js +3 -3
- package/src/commands/verify-gate.js +40 -0
- package/src/commands/workflow-execute.js +644 -155
- package/src/commands/workflow-harden.js +231 -0
- package/src/commands/workflow-heal.js +136 -0
- package/src/commands/workflow-next.js +460 -22
- package/src/commands/workflow-status.js +328 -138
- package/src/commands/workspace.js +144 -0
- package/src/constants.js +42 -75
- package/src/context-memory.js +133 -4
- package/src/context-writer.js +2 -1
- package/src/context.js +32 -2
- package/src/doctor.js +46 -6
- package/src/dossier/codemap-store.js +267 -0
- package/src/dossier/dossier-bootstrap.js +222 -0
- package/src/dossier/dossier-compact.js +159 -0
- package/src/dossier/lock.js +128 -0
- package/src/dossier/revision-store.js +313 -0
- package/src/dossier/schema.js +155 -0
- package/src/dossier/store.js +400 -0
- package/src/execution-gateway.js +3 -0
- package/src/friction-scanner.js +202 -0
- package/src/genome-schema.js +24 -1
- package/src/genomes.js +33 -0
- package/src/handoff-contract.js +363 -0
- package/src/handoff-validator.js +45 -0
- package/src/harness/circuit-breaker.js +135 -0
- package/src/i18n/messages/en.js +317 -22
- package/src/i18n/messages/es.js +259 -18
- package/src/i18n/messages/fr.js +260 -18
- package/src/i18n/messages/pt-BR.js +313 -22
- package/src/install-profile.js +0 -16
- package/src/installer.js +70 -6
- package/src/lib/git-commit-guard.js +691 -0
- package/src/lib/security/artifact-reader.js +167 -0
- package/src/lib/security/exit-codes.js +51 -0
- package/src/lib/security/findings-writer.js +176 -0
- package/src/lib/security/runtime-events.js +77 -0
- package/src/lib/security/secrets-regex.js +115 -0
- package/src/lib/store/security-scan.js +173 -0
- package/src/lib/terminal-checkbox.js +130 -0
- package/src/lib/tmux-launcher.js +163 -0
- package/src/lib/tool-capabilities.js +102 -0
- package/src/locales.js +12 -8
- package/src/parallel-workspace.js +756 -0
- package/src/parser.js +8 -1
- package/src/path-guard.js +47 -0
- package/src/preflight-engine.js +237 -26
- package/src/self-healing.js +142 -0
- package/src/session-handoff.js +111 -1
- package/src/squad/squad-scaffold.js +183 -19
- package/src/test-briefing.js +226 -0
- package/src/updater.js +1 -1
- package/src/utils.js +3 -0
- package/src/workflow-gates.js +185 -0
- package/template/.aioson/agents/analyst.md +76 -130
- package/template/.aioson/agents/architect.md +53 -86
- package/template/.aioson/agents/committer.md +161 -0
- package/template/.aioson/agents/cypher.md +252 -0
- package/template/.aioson/agents/dev.md +112 -628
- package/template/.aioson/agents/deyvin.md +33 -236
- package/template/.aioson/agents/discover.md +235 -0
- package/template/.aioson/agents/discovery-design-doc.md +17 -252
- package/template/.aioson/agents/genome.md +76 -26
- package/template/.aioson/agents/manifests/analyst.manifest.json +26 -0
- package/template/.aioson/agents/manifests/architect.manifest.json +23 -0
- package/template/.aioson/agents/manifests/committer.manifest.json +23 -0
- package/template/.aioson/agents/manifests/dev.manifest.json +37 -0
- package/template/.aioson/agents/manifests/orchestrator.manifest.json +30 -0
- package/template/.aioson/agents/manifests/pentester.manifest.json +39 -0
- package/template/.aioson/agents/manifests/pm.manifest.json +26 -0
- package/template/.aioson/agents/manifests/product.manifest.json +23 -0
- package/template/.aioson/agents/manifests/qa.manifest.json +25 -0
- package/template/.aioson/agents/manifests/setup.manifest.json +20 -0
- package/template/.aioson/agents/manifests/ux-ui.manifest.json +24 -0
- package/template/.aioson/agents/neo.md +5 -7
- package/template/.aioson/agents/orache.md +2 -6
- package/template/.aioson/agents/orchestrator.md +81 -182
- package/template/.aioson/agents/pentester.md +235 -0
- package/template/.aioson/agents/pm.md +40 -104
- package/template/.aioson/agents/product.md +99 -344
- package/template/.aioson/agents/profiler-enricher.md +57 -6
- package/template/.aioson/agents/profiler-forge.md +17 -7
- package/template/.aioson/agents/profiler-researcher.md +29 -6
- package/template/.aioson/agents/qa.md +168 -514
- package/template/.aioson/agents/setup.md +52 -278
- package/template/.aioson/agents/sheldon.md +122 -754
- package/template/.aioson/agents/site-forge.md +111 -1583
- package/template/.aioson/agents/squad.md +139 -2010
- package/template/.aioson/agents/tester.md +10 -0
- package/template/.aioson/agents/ux-ui.md +104 -812
- package/template/.aioson/agents/validator.md +69 -0
- package/template/.aioson/brains/scripts/query.js +5 -1
- package/template/.aioson/config/autonomy-protocol.json +43 -0
- package/template/.aioson/config.md +43 -15
- package/template/.aioson/constitution.md +36 -33
- package/template/.aioson/context/design-doc.md +136 -0
- package/template/.aioson/context/project-map.md +57 -0
- package/template/.aioson/design-docs/code-reuse.md +48 -0
- package/template/.aioson/design-docs/componentization.md +47 -0
- package/template/.aioson/design-docs/file-size.md +52 -0
- package/template/.aioson/design-docs/folder-structure.md +51 -0
- package/template/.aioson/design-docs/naming.md +54 -0
- package/template/.aioson/docs/LAYERS.md +12 -2
- package/template/.aioson/docs/dev/execution-discipline.md +106 -0
- package/template/.aioson/docs/dev/stack-conventions.md +83 -0
- package/template/.aioson/docs/deyvin/continuity-recovery.md +57 -0
- package/template/.aioson/docs/deyvin/debugging-escalation.md +30 -0
- package/template/.aioson/docs/deyvin/pair-execution.md +44 -0
- package/template/.aioson/docs/deyvin/runtime-handoffs.md +36 -0
- package/template/.aioson/docs/product/conversation-playbook.md +116 -0
- package/template/.aioson/docs/product/prd-contract.md +107 -0
- package/template/.aioson/docs/product/quality-lens.md +57 -0
- package/template/.aioson/docs/product/research-loop.md +65 -0
- package/template/.aioson/docs/sheldon/enrichment-paths.md +134 -0
- package/template/.aioson/docs/sheldon/quality-lens.md +57 -0
- package/template/.aioson/docs/sheldon/research-loop.md +56 -0
- package/template/.aioson/docs/sheldon/web-intelligence.md +75 -0
- package/template/.aioson/docs/site-forge-build.md +195 -0
- package/template/.aioson/docs/site-forge-extraction.md +135 -0
- package/template/.aioson/docs/site-forge-qa.md +155 -0
- package/template/.aioson/docs/site-forge-recon.md +434 -0
- package/template/.aioson/docs/site-forge-transform.md +249 -0
- package/template/.aioson/docs/squad/content-output.md +91 -0
- package/template/.aioson/docs/squad/creation-flow.md +135 -0
- package/template/.aioson/docs/squad/domain-classification.md +117 -0
- package/template/.aioson/docs/squad/genome-bindings.md +47 -0
- package/template/.aioson/docs/squad/package-contract.md +234 -0
- package/template/.aioson/docs/squad/quality-lens.md +56 -0
- package/template/.aioson/docs/squad/research-loop.md +59 -0
- package/template/.aioson/docs/squad/session-operations.md +117 -0
- package/template/.aioson/docs/squad/workflow-quality.md +165 -0
- package/template/.aioson/docs/ux-ui/accessibility-audit.md +55 -0
- package/template/.aioson/docs/ux-ui/audit-mode.md +86 -0
- package/template/.aioson/docs/ux-ui/component-map.md +35 -0
- package/template/.aioson/docs/ux-ui/design-execution.md +111 -0
- package/template/.aioson/docs/ux-ui/design-gate.md +27 -0
- package/template/.aioson/docs/ux-ui/research-mode.md +39 -0
- package/template/.aioson/docs/ux-ui/site-delivery.md +156 -0
- package/template/.aioson/docs/ux-ui/token-contract.md +57 -0
- package/template/.aioson/genomes/copywriting.meta.json +48 -0
- package/template/.aioson/git-guard.json +11 -0
- package/template/.aioson/mcp/servers.md +0 -1
- package/template/.aioson/rules/agent-language-policy.md +93 -0
- package/template/.aioson/rules/aioson-context-boundary.md +63 -0
- package/template/.aioson/rules/canonical-path-contract.md +47 -0
- package/template/.aioson/rules/data-format-convention.md +24 -86
- package/template/.aioson/rules/disk-first-artifacts.md +44 -0
- package/template/.aioson/rules/output-brevity.md +44 -0
- package/template/.aioson/rules/prd-section-ownership.md +49 -0
- package/template/.aioson/rules/security-baseline.md +139 -0
- package/template/.aioson/rules/spec-level-ownership.md +61 -0
- package/template/.aioson/rules/squad-driver-pattern.md +81 -0
- package/template/.aioson/schemas/squad-blueprint.schema.json +24 -0
- package/template/.aioson/schemas/squad-manifest.schema.json +44 -0
- package/template/.aioson/skills/process/aioson-spec-driven/references/pm.md +30 -0
- package/template/.aioson/skills/process/secure-tdd/SKILL.md +97 -0
- package/template/.aioson/skills/process/secure-tdd/references/nextjs.md +81 -0
- package/template/.aioson/skills/process/secure-tdd/references/node-express.md +91 -0
- package/template/.aioson/skills/process/secure-tdd/references/planned-stacks.md +33 -0
- package/template/.aioson/skills/static/harness-validate/SKILL.md +46 -0
- package/template/.aioson/skills/static/web-research-cache.md +3 -0
- package/template/.aioson/tasks/squad-create.md +35 -8
- package/template/.aioson/tasks/squad-design.md +50 -2
- package/template/.aioson/tasks/squad-investigate.md +14 -1
- package/template/.claude/commands/aioson/agent/committer.md +5 -0
- package/template/.claude/commands/aioson/agent/copywriter.md +5 -0
- package/template/.claude/commands/aioson/agent/cypher.md +5 -0
- package/template/.claude/commands/aioson/agent/pair.md +5 -0
- package/template/.claude/commands/aioson/agent/validator.md +5 -0
- package/template/.gemini/commands/aios-analyst.toml +6 -3
- package/template/.gemini/commands/aios-architect.toml +7 -6
- package/template/.gemini/commands/aios-committer.toml +7 -0
- package/template/.gemini/commands/aios-copywriter.toml +7 -0
- package/template/.gemini/commands/aios-cypher.toml +7 -0
- package/template/.gemini/commands/aios-dev.toml +8 -7
- package/template/.gemini/commands/aios-deyvin.toml +6 -5
- package/template/.gemini/commands/aios-discovery-design-doc.toml +6 -3
- package/template/.gemini/commands/aios-genome.toml +7 -0
- package/template/.gemini/commands/aios-neo.toml +5 -3
- package/template/.gemini/commands/aios-orache.toml +7 -0
- package/template/.gemini/commands/aios-orchestrator.toml +8 -7
- package/template/.gemini/commands/aios-pair.toml +6 -5
- package/template/.gemini/commands/aios-pm.toml +8 -7
- package/template/.gemini/commands/aios-product.toml +5 -3
- package/template/.gemini/commands/aios-qa.toml +6 -5
- package/template/.gemini/commands/aios-setup.toml +5 -2
- package/template/.gemini/commands/aios-sheldon.toml +7 -0
- package/template/.gemini/commands/aios-site-forge.toml +7 -0
- package/template/.gemini/commands/aios-squad.toml +7 -0
- package/template/.gemini/commands/aios-tester.toml +6 -5
- package/template/.gemini/commands/aios-ux-ui.toml +8 -7
- package/template/.gemini/commands/aios-validator.toml +7 -0
- package/template/AGENTS.md +12 -1
- package/template/CLAUDE.md +5 -1
- package/template/.aioson/locales/en/agents/analyst.md +0 -244
- package/template/.aioson/locales/en/agents/architect.md +0 -245
- package/template/.aioson/locales/en/agents/dev.md +0 -397
- package/template/.aioson/locales/en/agents/deyvin.md +0 -137
- package/template/.aioson/locales/en/agents/discovery-design-doc.md +0 -27
- package/template/.aioson/locales/en/agents/genome.md +0 -212
- package/template/.aioson/locales/en/agents/neo.md +0 -8
- package/template/.aioson/locales/en/agents/orache.md +0 -6
- package/template/.aioson/locales/en/agents/orchestrator.md +0 -189
- package/template/.aioson/locales/en/agents/pair.md +0 -5
- package/template/.aioson/locales/en/agents/pm.md +0 -84
- package/template/.aioson/locales/en/agents/product.md +0 -378
- package/template/.aioson/locales/en/agents/profiler-enricher.md +0 -5
- package/template/.aioson/locales/en/agents/profiler-forge.md +0 -5
- package/template/.aioson/locales/en/agents/profiler-researcher.md +0 -5
- package/template/.aioson/locales/en/agents/qa.md +0 -270
- package/template/.aioson/locales/en/agents/setup.md +0 -421
- package/template/.aioson/locales/en/agents/sheldon.md +0 -455
- package/template/.aioson/locales/en/agents/squad.md +0 -449
- package/template/.aioson/locales/en/agents/tester.md +0 -6
- package/template/.aioson/locales/en/agents/ux-ui.md +0 -668
- package/template/.aioson/locales/es/agents/analyst.md +0 -225
- package/template/.aioson/locales/es/agents/architect.md +0 -245
- package/template/.aioson/locales/es/agents/dev.md +0 -370
- package/template/.aioson/locales/es/agents/deyvin.md +0 -99
- package/template/.aioson/locales/es/agents/discovery-design-doc.md +0 -21
- package/template/.aioson/locales/es/agents/genome.md +0 -104
- package/template/.aioson/locales/es/agents/neo.md +0 -50
- package/template/.aioson/locales/es/agents/orache.md +0 -105
- package/template/.aioson/locales/es/agents/orchestrator.md +0 -194
- package/template/.aioson/locales/es/agents/pair.md +0 -7
- package/template/.aioson/locales/es/agents/pm.md +0 -90
- package/template/.aioson/locales/es/agents/product.md +0 -372
- package/template/.aioson/locales/es/agents/profiler-enricher.md +0 -7
- package/template/.aioson/locales/es/agents/profiler-forge.md +0 -7
- package/template/.aioson/locales/es/agents/profiler-researcher.md +0 -7
- package/template/.aioson/locales/es/agents/qa.md +0 -198
- package/template/.aioson/locales/es/agents/setup.md +0 -405
- package/template/.aioson/locales/es/agents/sheldon.md +0 -309
- package/template/.aioson/locales/es/agents/squad.md +0 -532
- package/template/.aioson/locales/es/agents/tester.md +0 -9
- package/template/.aioson/locales/es/agents/ux-ui.md +0 -212
- package/template/.aioson/locales/fr/agents/analyst.md +0 -225
- package/template/.aioson/locales/fr/agents/architect.md +0 -245
- package/template/.aioson/locales/fr/agents/dev.md +0 -370
- package/template/.aioson/locales/fr/agents/deyvin.md +0 -99
- package/template/.aioson/locales/fr/agents/discovery-design-doc.md +0 -21
- package/template/.aioson/locales/fr/agents/genome.md +0 -104
- package/template/.aioson/locales/fr/agents/neo.md +0 -50
- package/template/.aioson/locales/fr/agents/orache.md +0 -106
- package/template/.aioson/locales/fr/agents/orchestrator.md +0 -194
- package/template/.aioson/locales/fr/agents/pair.md +0 -7
- package/template/.aioson/locales/fr/agents/pm.md +0 -90
- package/template/.aioson/locales/fr/agents/product.md +0 -372
- package/template/.aioson/locales/fr/agents/profiler-enricher.md +0 -7
- package/template/.aioson/locales/fr/agents/profiler-forge.md +0 -7
- package/template/.aioson/locales/fr/agents/profiler-researcher.md +0 -7
- package/template/.aioson/locales/fr/agents/qa.md +0 -198
- package/template/.aioson/locales/fr/agents/setup.md +0 -405
- package/template/.aioson/locales/fr/agents/sheldon.md +0 -309
- package/template/.aioson/locales/fr/agents/squad.md +0 -532
- package/template/.aioson/locales/fr/agents/tester.md +0 -9
- package/template/.aioson/locales/fr/agents/ux-ui.md +0 -212
- package/template/.aioson/locales/pt-BR/agents/analyst.md +0 -319
- package/template/.aioson/locales/pt-BR/agents/architect.md +0 -284
- package/template/.aioson/locales/pt-BR/agents/dev.md +0 -483
- package/template/.aioson/locales/pt-BR/agents/deyvin.md +0 -184
- package/template/.aioson/locales/pt-BR/agents/discovery-design-doc.md +0 -198
- package/template/.aioson/locales/pt-BR/agents/genome.md +0 -297
- package/template/.aioson/locales/pt-BR/agents/neo.md +0 -208
- package/template/.aioson/locales/pt-BR/agents/orache.md +0 -137
- package/template/.aioson/locales/pt-BR/agents/orchestrator.md +0 -324
- package/template/.aioson/locales/pt-BR/agents/pair.md +0 -5
- package/template/.aioson/locales/pt-BR/agents/pm.md +0 -182
- package/template/.aioson/locales/pt-BR/agents/product.md +0 -466
- package/template/.aioson/locales/pt-BR/agents/profiler-enricher.md +0 -5
- package/template/.aioson/locales/pt-BR/agents/profiler-forge.md +0 -5
- package/template/.aioson/locales/pt-BR/agents/profiler-researcher.md +0 -5
- package/template/.aioson/locales/pt-BR/agents/qa.md +0 -300
- package/template/.aioson/locales/pt-BR/agents/setup.md +0 -533
- package/template/.aioson/locales/pt-BR/agents/sheldon.md +0 -323
- package/template/.aioson/locales/pt-BR/agents/squad.md +0 -1330
- package/template/.aioson/locales/pt-BR/agents/tester.md +0 -449
- package/template/.aioson/locales/pt-BR/agents/ux-ui.md +0 -669
package/src/agents.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
const { AGENT_DEFINITIONS } = require('./constants');
|
|
4
|
-
const { getLocalizedAgentPath } = require('./locales');
|
|
5
4
|
|
|
6
5
|
function normalizeAgentName(input) {
|
|
7
6
|
return String(input || '')
|
|
@@ -23,18 +22,37 @@ function listAgentDefinitions() {
|
|
|
23
22
|
}
|
|
24
23
|
|
|
25
24
|
function resolveInstructionPath(agent, locale) {
|
|
26
|
-
|
|
27
|
-
return getLocalizedAgentPath(agent.id, locale);
|
|
25
|
+
return agent.path;
|
|
28
26
|
}
|
|
29
27
|
|
|
30
28
|
function buildAgentPrompt(agent, tool, options = {}) {
|
|
31
29
|
const safeTool = String(tool || 'codex').toLowerCase();
|
|
32
30
|
const instructionPath = options.instructionPath || agent.path;
|
|
33
31
|
const targetDir = options.targetDir ? String(options.targetDir) : '.';
|
|
32
|
+
const interactionLanguage = String(options.interactionLanguage || 'en');
|
|
33
|
+
const autonomyMode = String(options.autonomyMode || '').trim();
|
|
34
|
+
const capabilitySummary = String(options.capabilitySummary || '').trim();
|
|
35
|
+
const activationContext = String(options.activationContext || '').trim();
|
|
34
36
|
const dependencyText =
|
|
35
37
|
agent.dependsOn.length > 0
|
|
36
38
|
? `Check required context files first: ${agent.dependsOn.join(', ')}.`
|
|
37
39
|
: 'No prerequisite context files are required.';
|
|
40
|
+
const activationBlock = activationContext
|
|
41
|
+
? [
|
|
42
|
+
'',
|
|
43
|
+
'## Activation Context',
|
|
44
|
+
'',
|
|
45
|
+
activationContext
|
|
46
|
+
].join('\n')
|
|
47
|
+
: '';
|
|
48
|
+
|
|
49
|
+
const autonomyBlock = [
|
|
50
|
+
'',
|
|
51
|
+
'## Autonomy Contract',
|
|
52
|
+
'',
|
|
53
|
+
`**Autonomy mode:** ${autonomyMode || 'guarded'}. Respect this as the maximum automation level allowed for this activation.`,
|
|
54
|
+
capabilitySummary ? `**Capability summary:** ${capabilitySummary}` : '**Capability summary:** No manifest declared for this agent in the current workspace.'
|
|
55
|
+
].join('\n');
|
|
38
56
|
|
|
39
57
|
const lifecycleBlock = [
|
|
40
58
|
'',
|
|
@@ -45,22 +63,24 @@ function buildAgentPrompt(agent, tool, options = {}) {
|
|
|
45
63
|
'',
|
|
46
64
|
'> If the user needs dashboard-visible tracked execution in an external client, they must enter through `aioson workflow:next` or `aioson agent:prompt` before continuing.',
|
|
47
65
|
'',
|
|
66
|
+
`**Language boundary:** Agent instructions are canonical in English. All user-facing communication must be in ${interactionLanguage}.`,
|
|
67
|
+
'',
|
|
48
68
|
`**Scope boundary:** You operate exclusively as ${agent.command}. Do not perform work that belongs to another agent. When your work is complete, output only the handoff — which agent is next and why. Do not continue into that agent\'s territory.`,
|
|
49
69
|
].join('\n');
|
|
50
70
|
|
|
51
71
|
if (safeTool === 'claude') {
|
|
52
|
-
return `Read ${instructionPath} and execute ${agent.command}. ${dependencyText} Write output to ${agent.output}.${lifecycleBlock}`;
|
|
72
|
+
return `Read ${instructionPath} and execute ${agent.command}. ${dependencyText}${activationBlock} Write output to ${agent.output}.${autonomyBlock}${lifecycleBlock}`;
|
|
53
73
|
}
|
|
54
74
|
|
|
55
75
|
if (safeTool === 'gemini') {
|
|
56
|
-
return `Run the Gemini command mapped to ${instructionPath} and execute ${agent.command}. ${dependencyText} Save result to ${agent.output}.${lifecycleBlock}`;
|
|
76
|
+
return `Run the Gemini command mapped to ${instructionPath} and execute ${agent.command}. ${dependencyText}${activationBlock} Save result to ${agent.output}.${autonomyBlock}${lifecycleBlock}`;
|
|
57
77
|
}
|
|
58
78
|
|
|
59
79
|
if (safeTool === 'opencode') {
|
|
60
|
-
return `Use agent "${agent.id}" from ${instructionPath}. ${dependencyText} Save output to ${agent.output}.${lifecycleBlock}`;
|
|
80
|
+
return `Use agent "${agent.id}" from ${instructionPath}. ${dependencyText}${activationBlock} Save output to ${agent.output}.${autonomyBlock}${lifecycleBlock}`;
|
|
61
81
|
}
|
|
62
82
|
|
|
63
|
-
return `Read AGENTS.md and execute ${agent.command} using ${instructionPath}. ${dependencyText} Save output to ${agent.output}.${lifecycleBlock}`;
|
|
83
|
+
return `Read AGENTS.md and execute ${agent.command} using ${instructionPath}. ${dependencyText}${activationBlock} Save output to ${agent.output}.${autonomyBlock}${lifecycleBlock}`;
|
|
64
84
|
}
|
|
65
85
|
|
|
66
86
|
module.exports = {
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const fs = require('node:fs/promises');
|
|
4
|
+
const path = require('node:path');
|
|
5
|
+
const { exists } = require('./utils');
|
|
6
|
+
|
|
7
|
+
const AUTONOMY_PROTOCOL_RELATIVE_PATH = '.aioson/config/autonomy-protocol.json';
|
|
8
|
+
const MODES = ['guarded', 'trusted', 'headless'];
|
|
9
|
+
|
|
10
|
+
function buildDefaultProtocol() {
|
|
11
|
+
return {
|
|
12
|
+
version: '1.0',
|
|
13
|
+
global_mode: 'guarded',
|
|
14
|
+
tools: {},
|
|
15
|
+
agents: {}
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function normalizeMode(mode, fallback = 'guarded') {
|
|
20
|
+
const safe = String(mode || '').trim().toLowerCase();
|
|
21
|
+
return MODES.includes(safe) ? safe : fallback;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
async function readAutonomyProtocol(targetDir) {
|
|
25
|
+
const protocolPath = path.join(targetDir, AUTONOMY_PROTOCOL_RELATIVE_PATH);
|
|
26
|
+
if (!(await exists(protocolPath))) return buildDefaultProtocol();
|
|
27
|
+
|
|
28
|
+
try {
|
|
29
|
+
const raw = await fs.readFile(protocolPath, 'utf8');
|
|
30
|
+
const parsed = JSON.parse(raw);
|
|
31
|
+
return {
|
|
32
|
+
...buildDefaultProtocol(),
|
|
33
|
+
...parsed,
|
|
34
|
+
global_mode: normalizeMode(parsed.global_mode, 'guarded'),
|
|
35
|
+
tools: parsed.tools && typeof parsed.tools === 'object' ? parsed.tools : {},
|
|
36
|
+
agents: parsed.agents && typeof parsed.agents === 'object' ? parsed.agents : {}
|
|
37
|
+
};
|
|
38
|
+
} catch {
|
|
39
|
+
return buildDefaultProtocol();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function getToolPolicy(protocol, tool) {
|
|
44
|
+
const safeTool = String(tool || 'codex').trim().toLowerCase();
|
|
45
|
+
const policy = protocol && protocol.tools && typeof protocol.tools === 'object'
|
|
46
|
+
? protocol.tools[safeTool]
|
|
47
|
+
: null;
|
|
48
|
+
const rawFallbackMode = String(policy && policy.fallback_mode ? policy.fallback_mode : 'guarded').trim().toLowerCase();
|
|
49
|
+
|
|
50
|
+
return {
|
|
51
|
+
mode: normalizeMode(policy && policy.mode, protocol && protocol.global_mode ? protocol.global_mode : 'guarded'),
|
|
52
|
+
fallback_mode: ['guarded', 'headless', 'abort'].includes(rawFallbackMode) ? rawFallbackMode : 'guarded',
|
|
53
|
+
shell_whitelist: Array.isArray(policy && policy.shell_whitelist) ? policy.shell_whitelist : [],
|
|
54
|
+
shell_blacklist: Array.isArray(policy && policy.shell_blacklist) ? policy.shell_blacklist : [],
|
|
55
|
+
aioson_whitelist: Array.isArray(policy && policy.aioson_whitelist) ? policy.aioson_whitelist : [],
|
|
56
|
+
requires_tty: policy && Object.prototype.hasOwnProperty.call(policy, 'requires_tty')
|
|
57
|
+
? Boolean(policy.requires_tty)
|
|
58
|
+
: true,
|
|
59
|
+
max_auto_retries: Number.isInteger(policy && policy.max_auto_retries) ? policy.max_auto_retries : 3
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function getAgentPolicy(protocol, agentId) {
|
|
64
|
+
if (!protocol || !protocol.agents || typeof protocol.agents !== 'object') return {};
|
|
65
|
+
return protocol.agents[String(agentId || '').trim()] || {};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function getMostPermissiveMode(modes, fallback = 'guarded') {
|
|
69
|
+
if (!Array.isArray(modes) || modes.length === 0) return fallback;
|
|
70
|
+
let bestIndex = MODES.indexOf(normalizeMode(fallback, 'guarded'));
|
|
71
|
+
for (const mode of modes) {
|
|
72
|
+
const index = MODES.indexOf(normalizeMode(mode, fallback));
|
|
73
|
+
if (index > bestIndex) bestIndex = index;
|
|
74
|
+
}
|
|
75
|
+
return MODES[bestIndex];
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function getAgentMaxMode(protocol, agentId, manifest = null) {
|
|
79
|
+
const agentPolicy = getAgentPolicy(protocol, agentId);
|
|
80
|
+
if (agentPolicy && agentPolicy.max_mode) {
|
|
81
|
+
return normalizeMode(agentPolicy.max_mode, 'guarded');
|
|
82
|
+
}
|
|
83
|
+
if (manifest && Array.isArray(manifest.autonomy_modes) && manifest.autonomy_modes.length > 0) {
|
|
84
|
+
return getMostPermissiveMode(manifest.autonomy_modes, 'guarded');
|
|
85
|
+
}
|
|
86
|
+
return normalizeMode(protocol && protocol.global_mode, 'guarded');
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function resolveEffectiveMode({ protocol, tool, agentId, manifest = null, requestedMode = null }) {
|
|
90
|
+
const toolPolicy = getToolPolicy(protocol || buildDefaultProtocol(), tool);
|
|
91
|
+
const toolMode = normalizeMode(toolPolicy.mode, 'guarded');
|
|
92
|
+
const agentMode = getAgentMaxMode(protocol || buildDefaultProtocol(), agentId, manifest);
|
|
93
|
+
|
|
94
|
+
const toolIndex = MODES.indexOf(toolMode);
|
|
95
|
+
const agentIndex = MODES.indexOf(agentMode);
|
|
96
|
+
const baseIndex = Math.min(toolIndex, agentIndex);
|
|
97
|
+
|
|
98
|
+
if (!requestedMode) return MODES[baseIndex];
|
|
99
|
+
|
|
100
|
+
const requestedIndex = MODES.indexOf(normalizeMode(requestedMode, 'guarded'));
|
|
101
|
+
return MODES[Math.min(baseIndex, requestedIndex)];
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function matchPattern(value, pattern) {
|
|
105
|
+
const escaped = String(pattern || '')
|
|
106
|
+
.replace(/[.+^${}()|[\]\\]/g, '\\$&')
|
|
107
|
+
.replace(/\*/g, '.*');
|
|
108
|
+
return new RegExp(`^${escaped}$`, 'i').test(String(value || ''));
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function isCommandAllowed(policy, commandType, commandString) {
|
|
112
|
+
if (!policy) return false;
|
|
113
|
+
const safeType = String(commandType || '').trim().toLowerCase();
|
|
114
|
+
const whitelist = Array.isArray(policy[`${safeType}_whitelist`]) ? policy[`${safeType}_whitelist`] : [];
|
|
115
|
+
const blacklist = Array.isArray(policy[`${safeType}_blacklist`]) ? policy[`${safeType}_blacklist`] : [];
|
|
116
|
+
|
|
117
|
+
for (const pattern of blacklist) {
|
|
118
|
+
if (matchPattern(commandString, pattern)) return false;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (whitelist.length === 0) return true;
|
|
122
|
+
return whitelist.some((pattern) => matchPattern(commandString, pattern));
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function canRunHeadless(policy) {
|
|
126
|
+
return Boolean(policy) && policy.requires_tty === false;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
module.exports = {
|
|
130
|
+
AUTONOMY_PROTOCOL_RELATIVE_PATH,
|
|
131
|
+
MODES,
|
|
132
|
+
readAutonomyProtocol,
|
|
133
|
+
getToolPolicy,
|
|
134
|
+
getAgentPolicy,
|
|
135
|
+
getAgentMaxMode,
|
|
136
|
+
resolveEffectiveMode,
|
|
137
|
+
isCommandAllowed,
|
|
138
|
+
canRunHeadless
|
|
139
|
+
};
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const fs = require('node:fs/promises');
|
|
4
|
+
const path = require('node:path');
|
|
5
|
+
|
|
6
|
+
function splitCsv(value) {
|
|
7
|
+
return String(value || '')
|
|
8
|
+
.split(',')
|
|
9
|
+
.map((item) => item.trim())
|
|
10
|
+
.filter(Boolean);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function normalizeBrainPath(targetDir, brainPath) {
|
|
14
|
+
const raw = String(brainPath || '').trim();
|
|
15
|
+
if (!raw) return null;
|
|
16
|
+
if (path.isAbsolute(raw)) return raw;
|
|
17
|
+
if (raw.startsWith('.aioson/brains/')) return path.join(targetDir, raw);
|
|
18
|
+
return path.join(targetDir, '.aioson', 'brains', raw);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
async function readJsonFile(filePath) {
|
|
22
|
+
const content = await fs.readFile(filePath, 'utf8');
|
|
23
|
+
return JSON.parse(content);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function brainMatches({ brain, tags, agent }) {
|
|
27
|
+
if (agent) {
|
|
28
|
+
const agents = Array.isArray(brain.agents) ? brain.agents : [];
|
|
29
|
+
if (!agents.includes(agent)) return false;
|
|
30
|
+
}
|
|
31
|
+
if (tags.length > 0) {
|
|
32
|
+
const brainTags = Array.isArray(brain.tags) ? brain.tags : [];
|
|
33
|
+
if (!tags.some((tag) => brainTags.includes(tag))) return false;
|
|
34
|
+
}
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function nodeMatches({ node, tags, matchMode, minQuality, verdicts, ids, avoidOnly }) {
|
|
39
|
+
if (ids.length > 0) return ids.includes(node.id);
|
|
40
|
+
|
|
41
|
+
const nodeTags = Array.isArray(node.tags) ? node.tags : [];
|
|
42
|
+
if (tags.length > 0) {
|
|
43
|
+
const ok = matchMode === 'all'
|
|
44
|
+
? tags.every((tag) => nodeTags.includes(tag))
|
|
45
|
+
: tags.some((tag) => nodeTags.includes(tag));
|
|
46
|
+
if (!ok) return false;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (minQuality > 0 && Number(node.q || 0) < minQuality) return false;
|
|
50
|
+
|
|
51
|
+
if (verdicts.length > 0) {
|
|
52
|
+
const verdict = String(node.v || '').toUpperCase();
|
|
53
|
+
if (!verdicts.includes(verdict)) return false;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (avoidOnly) {
|
|
57
|
+
const verdict = String(node.v || '').toUpperCase();
|
|
58
|
+
if (verdict !== 'AVOID' && verdict !== 'BROKEN') return false;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
async function queryBrains({
|
|
65
|
+
targetDir,
|
|
66
|
+
tags = [],
|
|
67
|
+
matchMode = 'any',
|
|
68
|
+
minQuality = 0,
|
|
69
|
+
agent = '',
|
|
70
|
+
verdicts = [],
|
|
71
|
+
ids = [],
|
|
72
|
+
avoidOnly = false
|
|
73
|
+
}) {
|
|
74
|
+
const brainsDir = path.join(targetDir, '.aioson', 'brains');
|
|
75
|
+
const indexPath = path.join(brainsDir, '_index.json');
|
|
76
|
+
|
|
77
|
+
let index;
|
|
78
|
+
try {
|
|
79
|
+
index = await readJsonFile(indexPath);
|
|
80
|
+
} catch {
|
|
81
|
+
return {
|
|
82
|
+
ok: false,
|
|
83
|
+
reason: 'missing_index',
|
|
84
|
+
indexPath,
|
|
85
|
+
brainFiles: [],
|
|
86
|
+
nodes: [],
|
|
87
|
+
warnings: [`No _index.json found at ${indexPath}`]
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const requestedTags = Array.isArray(tags) ? tags : splitCsv(tags);
|
|
92
|
+
const requestedVerdicts = (Array.isArray(verdicts) ? verdicts : splitCsv(verdicts))
|
|
93
|
+
.map((verdict) => verdict.toUpperCase());
|
|
94
|
+
const requestedIds = Array.isArray(ids) ? ids : splitCsv(ids);
|
|
95
|
+
const requestedAgent = String(agent || '').replace(/^@/, '').trim();
|
|
96
|
+
const normalizedMatchMode = matchMode === 'all' ? 'all' : 'any';
|
|
97
|
+
const minQ = Number(minQuality || 0);
|
|
98
|
+
|
|
99
|
+
const indexedBrains = Array.isArray(index.brains) ? index.brains : [];
|
|
100
|
+
const selectedBrains = indexedBrains.filter((brain) => brainMatches({
|
|
101
|
+
brain,
|
|
102
|
+
tags: requestedTags,
|
|
103
|
+
agent: requestedAgent
|
|
104
|
+
}));
|
|
105
|
+
|
|
106
|
+
const warnings = [];
|
|
107
|
+
const nodes = [];
|
|
108
|
+
|
|
109
|
+
for (const brain of selectedBrains) {
|
|
110
|
+
const brainPath = normalizeBrainPath(targetDir, brain.path);
|
|
111
|
+
if (!brainPath) {
|
|
112
|
+
warnings.push(`Brain ${brain.id || '(unknown)'} has no path`);
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
let data;
|
|
117
|
+
try {
|
|
118
|
+
data = await readJsonFile(brainPath);
|
|
119
|
+
} catch {
|
|
120
|
+
warnings.push(`Brain file not found or invalid: ${brainPath}`);
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const brainNodes = Array.isArray(data.nodes) ? data.nodes : [];
|
|
125
|
+
for (const node of brainNodes) {
|
|
126
|
+
if (nodeMatches({
|
|
127
|
+
node,
|
|
128
|
+
tags: requestedTags,
|
|
129
|
+
matchMode: normalizedMatchMode,
|
|
130
|
+
minQuality: minQ,
|
|
131
|
+
verdicts: requestedVerdicts,
|
|
132
|
+
ids: requestedIds,
|
|
133
|
+
avoidOnly
|
|
134
|
+
})) {
|
|
135
|
+
nodes.push({ ...node, _brain: brain.id || null, _brain_path: brain.path || null });
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return {
|
|
141
|
+
ok: true,
|
|
142
|
+
indexPath,
|
|
143
|
+
brainFiles: selectedBrains.map((brain) => brain.path),
|
|
144
|
+
nodes,
|
|
145
|
+
warnings
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function formatBrainNodesCompact(nodes) {
|
|
150
|
+
if (!nodes || nodes.length === 0) return '(no matches)';
|
|
151
|
+
return nodes
|
|
152
|
+
.map((node) => `[${node.q || 0}* ${node.v || 'UNKNOWN'}] ${node.id} - ${node.title}\n ${node.s || ''}`.trimEnd())
|
|
153
|
+
.join('\n\n');
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
module.exports = {
|
|
157
|
+
splitCsv,
|
|
158
|
+
normalizeBrainPath,
|
|
159
|
+
queryBrains,
|
|
160
|
+
formatBrainNodesCompact
|
|
161
|
+
};
|