oxe-cc 1.2.1 → 1.3.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/.cursor/commands/oxe-ask.md +2 -2
- package/.cursor/commands/oxe-capabilities.md +2 -2
- package/.cursor/commands/oxe-checkpoint.md +2 -2
- package/.cursor/commands/oxe-compact.md +2 -2
- package/.cursor/commands/oxe-dashboard.md +2 -2
- package/.cursor/commands/oxe-debug.md +2 -2
- package/.cursor/commands/oxe-discuss.md +2 -2
- package/.cursor/commands/oxe-execute.md +5 -2
- package/.cursor/commands/oxe-forensics.md +2 -2
- package/.cursor/commands/oxe-help.md +2 -2
- package/.cursor/commands/oxe-loop.md +2 -2
- package/.cursor/commands/oxe-milestone.md +2 -2
- package/.cursor/commands/oxe-next.md +2 -2
- package/.cursor/commands/oxe-obs.md +2 -2
- package/.cursor/commands/oxe-plan-agent.md +2 -2
- package/.cursor/commands/oxe-plan.md +2 -2
- package/.cursor/commands/oxe-project.md +2 -2
- package/.cursor/commands/oxe-quick.md +2 -2
- package/.cursor/commands/oxe-research.md +2 -2
- package/.cursor/commands/oxe-retro.md +2 -2
- package/.cursor/commands/oxe-review-pr.md +2 -2
- package/.cursor/commands/oxe-route.md +2 -2
- package/.cursor/commands/oxe-scan.md +2 -2
- package/.cursor/commands/oxe-security.md +2 -2
- package/.cursor/commands/oxe-session.md +2 -2
- package/.cursor/commands/oxe-ship.md +2 -2
- package/.cursor/commands/oxe-skill.md +2 -2
- package/.cursor/commands/oxe-spec.md +2 -2
- package/.cursor/commands/oxe-ui-review.md +2 -2
- package/.cursor/commands/oxe-ui-spec.md +2 -2
- package/.cursor/commands/oxe-update.md +2 -2
- package/.cursor/commands/oxe-validate-gaps.md +2 -2
- package/.cursor/commands/oxe-verify.md +5 -2
- package/.cursor/commands/oxe-workstream.md +2 -2
- package/.cursor/commands/oxe.md +2 -2
- package/.github/copilot-instructions.md +13 -13
- package/.github/prompts/oxe-ask.prompt.md +2 -2
- package/.github/prompts/oxe-capabilities.prompt.md +2 -2
- package/.github/prompts/oxe-checkpoint.prompt.md +2 -2
- package/.github/prompts/oxe-compact.prompt.md +2 -2
- package/.github/prompts/oxe-dashboard.prompt.md +2 -2
- package/.github/prompts/oxe-debug.prompt.md +2 -2
- package/.github/prompts/oxe-discuss.prompt.md +2 -2
- package/.github/prompts/oxe-execute.prompt.md +5 -2
- package/.github/prompts/oxe-forensics.prompt.md +2 -2
- package/.github/prompts/oxe-help.prompt.md +2 -2
- package/.github/prompts/oxe-loop.prompt.md +2 -2
- package/.github/prompts/oxe-milestone.prompt.md +2 -2
- package/.github/prompts/oxe-next.prompt.md +2 -2
- package/.github/prompts/oxe-obs.prompt.md +2 -2
- package/.github/prompts/oxe-plan-agent.prompt.md +2 -2
- package/.github/prompts/oxe-plan.prompt.md +2 -2
- package/.github/prompts/oxe-project.prompt.md +2 -2
- package/.github/prompts/oxe-quick.prompt.md +2 -2
- package/.github/prompts/oxe-research.prompt.md +2 -2
- package/.github/prompts/oxe-retro.prompt.md +2 -2
- package/.github/prompts/oxe-review-pr.prompt.md +2 -2
- package/.github/prompts/oxe-route.prompt.md +2 -2
- package/.github/prompts/oxe-scan.prompt.md +2 -2
- package/.github/prompts/oxe-security.prompt.md +2 -2
- package/.github/prompts/oxe-session.prompt.md +2 -2
- package/.github/prompts/oxe-ship.prompt.md +2 -2
- package/.github/prompts/oxe-skill.prompt.md +2 -2
- package/.github/prompts/oxe-spec.prompt.md +2 -2
- package/.github/prompts/oxe-ui-review.prompt.md +2 -2
- package/.github/prompts/oxe-ui-spec.prompt.md +2 -2
- package/.github/prompts/oxe-update.prompt.md +2 -2
- package/.github/prompts/oxe-validate-gaps.prompt.md +2 -2
- package/.github/prompts/oxe-verify.prompt.md +5 -2
- package/.github/prompts/oxe-workstream.prompt.md +2 -2
- package/.github/prompts/oxe.prompt.md +2 -2
- package/CHANGELOG.md +52 -17
- package/README.md +610 -551
- package/bin/banner.txt +1 -1
- package/bin/lib/oxe-agent-install.cjs +69 -69
- package/bin/lib/oxe-azure.cjs +1445 -1445
- package/bin/lib/oxe-context-engine.cjs +867 -867
- package/bin/lib/oxe-dashboard.cjs +76 -28
- package/bin/lib/oxe-operational.cjs +2144 -1340
- package/bin/lib/oxe-project-health.cjs +483 -1
- package/bin/lib/oxe-runtime-semantics.cjs +12 -0
- package/bin/oxe-cc.js +554 -152
- package/commands/oxe/ask.md +2 -2
- package/commands/oxe/capabilities.md +2 -2
- package/commands/oxe/checkpoint.md +2 -2
- package/commands/oxe/compact.md +2 -2
- package/commands/oxe/dashboard.md +2 -2
- package/commands/oxe/debug.md +2 -2
- package/commands/oxe/discuss.md +2 -2
- package/commands/oxe/execute.md +5 -2
- package/commands/oxe/forensics.md +2 -2
- package/commands/oxe/help.md +2 -2
- package/commands/oxe/loop.md +2 -2
- package/commands/oxe/milestone.md +2 -2
- package/commands/oxe/next.md +2 -2
- package/commands/oxe/obs.md +2 -2
- package/commands/oxe/oxe.md +2 -2
- package/commands/oxe/plan-agent.md +2 -2
- package/commands/oxe/plan.md +2 -2
- package/commands/oxe/project.md +2 -2
- package/commands/oxe/quick.md +2 -2
- package/commands/oxe/research.md +2 -2
- package/commands/oxe/retro.md +2 -2
- package/commands/oxe/review-pr.md +2 -2
- package/commands/oxe/route.md +2 -2
- package/commands/oxe/scan.md +2 -2
- package/commands/oxe/security.md +2 -2
- package/commands/oxe/session.md +2 -2
- package/commands/oxe/ship.md +2 -2
- package/commands/oxe/skill.md +2 -2
- package/commands/oxe/spec.md +2 -2
- package/commands/oxe/ui-review.md +2 -2
- package/commands/oxe/ui-spec.md +2 -2
- package/commands/oxe/update.md +2 -2
- package/commands/oxe/validate-gaps.md +2 -2
- package/commands/oxe/verify.md +5 -2
- package/commands/oxe/workstream.md +2 -2
- package/lib/runtime/delivery/branch-manager.d.ts +1 -0
- package/lib/runtime/delivery/branch-manager.js +7 -0
- package/lib/runtime/delivery/ci-checks.js +34 -1
- package/lib/runtime/delivery/delivery-records.d.ts +34 -0
- package/lib/runtime/delivery/delivery-records.js +48 -0
- package/lib/runtime/delivery/index.d.ts +1 -0
- package/lib/runtime/delivery/index.js +1 -0
- package/lib/runtime/delivery/promotion-pipeline.d.ts +26 -2
- package/lib/runtime/delivery/promotion-pipeline.js +111 -14
- package/lib/runtime/gate/gate-manager.d.ts +41 -0
- package/lib/runtime/gate/gate-manager.js +108 -1
- package/lib/runtime/index.d.ts +2 -2
- package/lib/runtime/index.js +3 -1
- package/lib/runtime/models/gate-decision.d.ts +4 -1
- package/lib/runtime/models/workspace.d.ts +3 -0
- package/lib/runtime/plugins/capability-adapter.d.ts +12 -0
- package/lib/runtime/plugins/capability-adapter.js +204 -0
- package/lib/runtime/plugins/capability-matrix.d.ts +5 -0
- package/lib/runtime/plugins/capability-matrix.js +48 -17
- package/lib/runtime/plugins/index.d.ts +1 -0
- package/lib/runtime/plugins/index.js +1 -0
- package/lib/runtime/plugins/plugin-abi.d.ts +2 -0
- package/lib/runtime/plugins/plugin-manifest.d.ts +1 -1
- package/lib/runtime/plugins/plugin-manifest.js +6 -2
- package/lib/runtime/plugins/plugin-registry.d.ts +46 -0
- package/lib/runtime/plugins/plugin-registry.js +79 -2
- package/lib/runtime/policy/policy-engine.d.ts +19 -0
- package/lib/runtime/policy/policy-engine.js +76 -4
- package/lib/runtime/projection/projection-engine.d.ts +9 -1
- package/lib/runtime/projection/projection-engine.js +73 -3
- package/lib/runtime/scheduler/multi-agent-coordinator.d.ts +43 -1
- package/lib/runtime/scheduler/multi-agent-coordinator.js +151 -39
- package/lib/runtime/scheduler/run-journal.d.ts +1 -1
- package/lib/runtime/scheduler/scheduler.d.ts +19 -1
- package/lib/runtime/scheduler/scheduler.js +258 -13
- package/lib/runtime/verification/verification-compiler.d.ts +43 -0
- package/lib/runtime/verification/verification-compiler.js +137 -0
- package/lib/runtime/verification/verification-manifest.d.ts +9 -0
- package/lib/runtime/verification/verification-manifest.js +56 -6
- package/lib/runtime/workspace/strategies/ephemeral-container.d.ts +1 -0
- package/lib/runtime/workspace/strategies/ephemeral-container.js +4 -0
- package/lib/runtime/workspace/strategies/git-worktree.d.ts +1 -0
- package/lib/runtime/workspace/strategies/git-worktree.js +2 -0
- package/lib/runtime/workspace/strategies/inplace.d.ts +1 -0
- package/lib/runtime/workspace/strategies/inplace.js +2 -0
- package/lib/runtime/workspace/workspace-manager.d.ts +2 -1
- package/lib/sdk/README.md +9 -9
- package/lib/sdk/index.cjs +33 -24
- package/lib/sdk/index.d.ts +149 -14
- package/oxe/templates/ACTIVE-RUN.template.json +32 -32
- package/oxe/templates/CAPABILITIES.template.md +7 -7
- package/oxe/templates/CAPABILITY.template.md +45 -45
- package/oxe/templates/CHECKPOINTS.template.md +7 -7
- package/oxe/templates/EXECUTION-RUNTIME.template.md +68 -68
- package/oxe/templates/HYPOTHESES.template.md +33 -33
- package/oxe/templates/LESSONS-METRICS.template.json +13 -13
- package/oxe/templates/NOTES.template.md +16 -16
- package/oxe/templates/PLAN-REVIEW.template.md +31 -31
- package/oxe/templates/SESSION.template.md +34 -34
- package/oxe/templates/SKILL.template.md +26 -26
- package/oxe/templates/STATE.md +55 -55
- package/oxe/templates/WORKFLOW_AUTHORING.md +18 -18
- package/oxe/workflows/ask.md +96 -96
- package/oxe/workflows/capabilities.md +25 -25
- package/oxe/workflows/dashboard.md +33 -33
- package/oxe/workflows/discuss.md +12 -12
- package/oxe/workflows/execute.md +14 -0
- package/oxe/workflows/help.md +352 -352
- package/oxe/workflows/next.md +22 -22
- package/oxe/workflows/oxe.md +6 -6
- package/oxe/workflows/plan-agent.md +9 -9
- package/oxe/workflows/quick.md +10 -10
- package/oxe/workflows/references/reasoning-discovery.md +28 -28
- package/oxe/workflows/references/reasoning-execution.md +29 -29
- package/oxe/workflows/references/reasoning-planning.md +32 -32
- package/oxe/workflows/references/reasoning-review.md +29 -29
- package/oxe/workflows/references/reasoning-status.md +24 -24
- package/oxe/workflows/references/robustness-elevation.md +295 -295
- package/oxe/workflows/references/workflow-runtime-contracts.json +952 -930
- package/oxe/workflows/route.md +16 -16
- package/oxe/workflows/session.md +213 -213
- package/oxe/workflows/ship.md +142 -142
- package/oxe/workflows/skill.md +44 -44
- package/oxe/workflows/ui-review.md +36 -36
- package/oxe/workflows/verify-audit.md +73 -73
- package/oxe/workflows/verify.md +10 -0
- package/package.json +92 -92
- package/packages/runtime/package.json +17 -17
- package/packages/runtime/src/audit/audit-trail.ts +243 -243
- package/packages/runtime/src/audit/index.ts +2 -2
- package/packages/runtime/src/audit/policy-pack.ts +62 -62
- package/packages/runtime/src/compiler/graph-compiler.ts +245 -245
- package/packages/runtime/src/compiler/index.ts +1 -1
- package/packages/runtime/src/context/context-pack-builder.ts +259 -259
- package/packages/runtime/src/context/context-pack-store.ts +197 -197
- package/packages/runtime/src/context/context-profiles.ts +60 -60
- package/packages/runtime/src/context/index.ts +3 -3
- package/packages/runtime/src/decision/decision-engine.ts +174 -174
- package/packages/runtime/src/decision/decision-memo.ts +211 -211
- package/packages/runtime/src/decision/index.ts +2 -2
- package/packages/runtime/src/delivery/branch-manager.ts +91 -84
- package/packages/runtime/src/delivery/ci-checks.ts +285 -252
- package/packages/runtime/src/delivery/delivery-records.ts +75 -0
- package/packages/runtime/src/delivery/index.ts +5 -4
- package/packages/runtime/src/delivery/pr-manager.ts +112 -112
- package/packages/runtime/src/delivery/promotion-pipeline.ts +334 -180
- package/packages/runtime/src/events/bus.ts +92 -92
- package/packages/runtime/src/events/catalog.ts +29 -29
- package/packages/runtime/src/events/envelope.ts +14 -14
- package/packages/runtime/src/events/index.ts +3 -3
- package/packages/runtime/src/evidence/evidence-store.ts +130 -130
- package/packages/runtime/src/evidence/index.ts +1 -1
- package/packages/runtime/src/gate/gate-manager.ts +289 -137
- package/packages/runtime/src/gate/index.ts +1 -1
- package/packages/runtime/src/index.ts +41 -37
- package/packages/runtime/src/models/attempt.ts +19 -19
- package/packages/runtime/src/models/evidence.ts +21 -21
- package/packages/runtime/src/models/gate-decision.ts +25 -21
- package/packages/runtime/src/models/index.ts +8 -8
- package/packages/runtime/src/models/run.ts +24 -24
- package/packages/runtime/src/models/session.ts +11 -11
- package/packages/runtime/src/models/verification-result.ts +10 -10
- package/packages/runtime/src/models/work-item.ts +25 -25
- package/packages/runtime/src/models/workspace.ts +31 -28
- package/packages/runtime/src/plugins/capability-adapter.ts +206 -0
- package/packages/runtime/src/plugins/capability-matrix.ts +126 -83
- package/packages/runtime/src/plugins/index.ts +5 -4
- package/packages/runtime/src/plugins/plugin-abi.ts +97 -95
- package/packages/runtime/src/plugins/plugin-manifest.ts +118 -113
- package/packages/runtime/src/plugins/plugin-registry.ts +232 -124
- package/packages/runtime/src/policy/index.ts +1 -1
- package/packages/runtime/src/policy/policy-engine.ts +330 -244
- package/packages/runtime/src/projection/index.ts +1 -1
- package/packages/runtime/src/projection/projection-engine.ts +328 -249
- package/packages/runtime/src/reducers/debug-reducer.ts +36 -36
- package/packages/runtime/src/reducers/index.ts +2 -2
- package/packages/runtime/src/reducers/run-state-reducer.ts +269 -269
- package/packages/runtime/src/scheduler/agent-registry.ts +132 -132
- package/packages/runtime/src/scheduler/agent-roles.ts +109 -109
- package/packages/runtime/src/scheduler/index.ts +4 -4
- package/packages/runtime/src/scheduler/multi-agent-coordinator.ts +521 -333
- package/packages/runtime/src/scheduler/run-journal.ts +62 -62
- package/packages/runtime/src/scheduler/scheduler.ts +722 -441
- package/packages/runtime/src/verification/index.ts +2 -2
- package/packages/runtime/src/verification/verification-compiler.ts +436 -225
- package/packages/runtime/src/verification/verification-manifest.ts +252 -192
- package/packages/runtime/src/workspace/index.ts +5 -5
- package/packages/runtime/src/workspace/strategies/ephemeral-container.ts +126 -121
- package/packages/runtime/src/workspace/strategies/git-worktree.ts +79 -77
- package/packages/runtime/src/workspace/strategies/inplace.ts +38 -35
- package/packages/runtime/src/workspace/workspace-manager.ts +16 -15
- package/packages/runtime/tsconfig.json +17 -17
- package/vscode-extension/.vscodeignore +7 -7
- package/vscode-extension/oxe-agents-1.0.0.vsix +0 -0
- package/vscode-extension/package.json +185 -185
- package/vscode-extension/src/extension.js +310 -310
- package/vscode-extension/src/shared/contextLoader.js +137 -137
- package/vscode-extension/src/shared/contractBuilder.js +159 -159
- package/vscode-extension/src/shared/stateReader.js +101 -101
|
@@ -1,137 +1,137 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const fs = require('fs');
|
|
4
|
-
const path = require('path');
|
|
5
|
-
const { spawnSync } = require('child_process');
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Tenta parsear JSON do stdout do oxe-cc (pula linhas de banner antes do `{`).
|
|
9
|
-
* @param {string} stdout
|
|
10
|
-
* @returns {object | null}
|
|
11
|
-
*/
|
|
12
|
-
function parseJsonFromOutput(stdout) {
|
|
13
|
-
if (!stdout) return null;
|
|
14
|
-
const text = String(stdout).trim();
|
|
15
|
-
const jsonStart = text.indexOf('{');
|
|
16
|
-
if (jsonStart === -1) return null;
|
|
17
|
-
try {
|
|
18
|
-
return JSON.parse(text.slice(jsonStart));
|
|
19
|
-
} catch {
|
|
20
|
-
return null;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Tenta resolver o context pack via oxe-cc CLI.
|
|
26
|
-
* Primeiro tenta o binário local em node_modules, depois npx global.
|
|
27
|
-
* @param {string} projectRoot
|
|
28
|
-
* @param {string} workflow
|
|
29
|
-
* @returns {object | null}
|
|
30
|
-
*/
|
|
31
|
-
function resolveViaOxeCc(projectRoot, workflow) {
|
|
32
|
-
const localBin = path.join(projectRoot, 'node_modules', 'oxe-cc', 'bin', 'oxe-cc.js');
|
|
33
|
-
const args = ['context', 'inspect', '--workflow', workflow, '--json', '--dir', projectRoot];
|
|
34
|
-
const env = { ...process.env, OXE_NO_BANNER: '1' };
|
|
35
|
-
const opts = { cwd: projectRoot, encoding: 'utf8', timeout: 12000, env };
|
|
36
|
-
|
|
37
|
-
// Tentativa 1 — binário local
|
|
38
|
-
if (fs.existsSync(localBin)) {
|
|
39
|
-
const r = spawnSync(process.execPath, [localBin, ...args], opts);
|
|
40
|
-
if (r.status === 0) {
|
|
41
|
-
const pack = parseJsonFromOutput(r.stdout);
|
|
42
|
-
if (pack) return pack;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
// Tentativa 2 — npx (global ou cache)
|
|
47
|
-
const npxCmd = process.platform === 'win32' ? 'npx.cmd' : 'npx';
|
|
48
|
-
const r = spawnSync(npxCmd, ['oxe-cc', ...args], opts);
|
|
49
|
-
if (r.status === 0) {
|
|
50
|
-
return parseJsonFromOutput(r.stdout);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
return null;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Carrega o context pack para um workflow. Tenta disco primeiro, depois CLI.
|
|
58
|
-
* @param {string} projectRoot
|
|
59
|
-
* @param {string} workflow
|
|
60
|
-
* @returns {object | null}
|
|
61
|
-
*/
|
|
62
|
-
function loadContextPack(projectRoot, workflow) {
|
|
63
|
-
// Tentativa 1 — ler pack já materializado em disco
|
|
64
|
-
const packPath = path.join(projectRoot, '.oxe', 'context', 'packs', `${workflow}.json`);
|
|
65
|
-
if (fs.existsSync(packPath)) {
|
|
66
|
-
try {
|
|
67
|
-
const data = JSON.parse(fs.readFileSync(packPath, 'utf8'));
|
|
68
|
-
if (data && data.workflow) return data;
|
|
69
|
-
} catch {
|
|
70
|
-
// arquivo corrompido → tenta CLI
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// Tentativa 2 — resolver on-demand via oxe-cc
|
|
75
|
-
return resolveViaOxeCc(projectRoot, workflow);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Formata os artefatos selecionados do pack em markdown legível.
|
|
80
|
-
* Usa semantic_summary quando disponível, cai para summary.
|
|
81
|
-
* @param {object | null} pack
|
|
82
|
-
* @returns {string}
|
|
83
|
-
*/
|
|
84
|
-
function formatArtifacts(pack) {
|
|
85
|
-
if (!pack || !Array.isArray(pack.selected_artifacts)) return '';
|
|
86
|
-
|
|
87
|
-
const artifacts = pack.selected_artifacts
|
|
88
|
-
.filter((a) => a.exists && (a.semantic_summary || a.summary))
|
|
89
|
-
.map((a) => {
|
|
90
|
-
const content = (a.semantic_summary || a.summary || '').trim();
|
|
91
|
-
if (!content) return null;
|
|
92
|
-
const label = a.alias.replace(/_/g, ' ');
|
|
93
|
-
const flags = [
|
|
94
|
-
a.using_fallback ? '[fallback]' : '',
|
|
95
|
-
a.required ? '[obrigatório]' : '',
|
|
96
|
-
].filter(Boolean).join(' ');
|
|
97
|
-
return `### ${label}${flags ? ' ' + flags : ''}\n${content}`;
|
|
98
|
-
})
|
|
99
|
-
.filter(Boolean);
|
|
100
|
-
|
|
101
|
-
return artifacts.length > 0 ? artifacts.join('\n\n') : '';
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Formata hipóteses pendentes do pack para o system prompt.
|
|
106
|
-
* @param {object | null} pack
|
|
107
|
-
* @returns {string}
|
|
108
|
-
*/
|
|
109
|
-
function formatHypotheses(pack) {
|
|
110
|
-
if (!pack || !Array.isArray(pack.hypotheses)) return '';
|
|
111
|
-
const pending = pack.hypotheses.filter((h) => h.status === 'pending');
|
|
112
|
-
if (pending.length === 0) return '';
|
|
113
|
-
const lines = pending.map((h) =>
|
|
114
|
-
`- **[${h.id}]** ${h.condition}${h.checkpoint ? ` *(checkpoint: ${h.checkpoint})*` : ''}`
|
|
115
|
-
);
|
|
116
|
-
return `## Hipóteses críticas pendentes\n\n${lines.join('\n')}`;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* Formata gaps críticos do pack.
|
|
121
|
-
* @param {object | null} pack
|
|
122
|
-
* @returns {string}
|
|
123
|
-
*/
|
|
124
|
-
function formatGaps(pack) {
|
|
125
|
-
if (!pack || !Array.isArray(pack.gaps)) return '';
|
|
126
|
-
const critical = pack.gaps.filter((g) => g.severity === 'critical');
|
|
127
|
-
if (critical.length === 0) return '';
|
|
128
|
-
const lines = critical.map((g) => `- \`${g.alias}\`: ${g.reason}`);
|
|
129
|
-
return `## Artefatos críticos ausentes\n\n${lines.join('\n')}`;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
module.exports = {
|
|
133
|
-
loadContextPack,
|
|
134
|
-
formatArtifacts,
|
|
135
|
-
formatHypotheses,
|
|
136
|
-
formatGaps,
|
|
137
|
-
};
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const { spawnSync } = require('child_process');
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Tenta parsear JSON do stdout do oxe-cc (pula linhas de banner antes do `{`).
|
|
9
|
+
* @param {string} stdout
|
|
10
|
+
* @returns {object | null}
|
|
11
|
+
*/
|
|
12
|
+
function parseJsonFromOutput(stdout) {
|
|
13
|
+
if (!stdout) return null;
|
|
14
|
+
const text = String(stdout).trim();
|
|
15
|
+
const jsonStart = text.indexOf('{');
|
|
16
|
+
if (jsonStart === -1) return null;
|
|
17
|
+
try {
|
|
18
|
+
return JSON.parse(text.slice(jsonStart));
|
|
19
|
+
} catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Tenta resolver o context pack via oxe-cc CLI.
|
|
26
|
+
* Primeiro tenta o binário local em node_modules, depois npx global.
|
|
27
|
+
* @param {string} projectRoot
|
|
28
|
+
* @param {string} workflow
|
|
29
|
+
* @returns {object | null}
|
|
30
|
+
*/
|
|
31
|
+
function resolveViaOxeCc(projectRoot, workflow) {
|
|
32
|
+
const localBin = path.join(projectRoot, 'node_modules', 'oxe-cc', 'bin', 'oxe-cc.js');
|
|
33
|
+
const args = ['context', 'inspect', '--workflow', workflow, '--json', '--dir', projectRoot];
|
|
34
|
+
const env = { ...process.env, OXE_NO_BANNER: '1' };
|
|
35
|
+
const opts = { cwd: projectRoot, encoding: 'utf8', timeout: 12000, env };
|
|
36
|
+
|
|
37
|
+
// Tentativa 1 — binário local
|
|
38
|
+
if (fs.existsSync(localBin)) {
|
|
39
|
+
const r = spawnSync(process.execPath, [localBin, ...args], opts);
|
|
40
|
+
if (r.status === 0) {
|
|
41
|
+
const pack = parseJsonFromOutput(r.stdout);
|
|
42
|
+
if (pack) return pack;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Tentativa 2 — npx (global ou cache)
|
|
47
|
+
const npxCmd = process.platform === 'win32' ? 'npx.cmd' : 'npx';
|
|
48
|
+
const r = spawnSync(npxCmd, ['oxe-cc', ...args], opts);
|
|
49
|
+
if (r.status === 0) {
|
|
50
|
+
return parseJsonFromOutput(r.stdout);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Carrega o context pack para um workflow. Tenta disco primeiro, depois CLI.
|
|
58
|
+
* @param {string} projectRoot
|
|
59
|
+
* @param {string} workflow
|
|
60
|
+
* @returns {object | null}
|
|
61
|
+
*/
|
|
62
|
+
function loadContextPack(projectRoot, workflow) {
|
|
63
|
+
// Tentativa 1 — ler pack já materializado em disco
|
|
64
|
+
const packPath = path.join(projectRoot, '.oxe', 'context', 'packs', `${workflow}.json`);
|
|
65
|
+
if (fs.existsSync(packPath)) {
|
|
66
|
+
try {
|
|
67
|
+
const data = JSON.parse(fs.readFileSync(packPath, 'utf8'));
|
|
68
|
+
if (data && data.workflow) return data;
|
|
69
|
+
} catch {
|
|
70
|
+
// arquivo corrompido → tenta CLI
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Tentativa 2 — resolver on-demand via oxe-cc
|
|
75
|
+
return resolveViaOxeCc(projectRoot, workflow);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Formata os artefatos selecionados do pack em markdown legível.
|
|
80
|
+
* Usa semantic_summary quando disponível, cai para summary.
|
|
81
|
+
* @param {object | null} pack
|
|
82
|
+
* @returns {string}
|
|
83
|
+
*/
|
|
84
|
+
function formatArtifacts(pack) {
|
|
85
|
+
if (!pack || !Array.isArray(pack.selected_artifacts)) return '';
|
|
86
|
+
|
|
87
|
+
const artifacts = pack.selected_artifacts
|
|
88
|
+
.filter((a) => a.exists && (a.semantic_summary || a.summary))
|
|
89
|
+
.map((a) => {
|
|
90
|
+
const content = (a.semantic_summary || a.summary || '').trim();
|
|
91
|
+
if (!content) return null;
|
|
92
|
+
const label = a.alias.replace(/_/g, ' ');
|
|
93
|
+
const flags = [
|
|
94
|
+
a.using_fallback ? '[fallback]' : '',
|
|
95
|
+
a.required ? '[obrigatório]' : '',
|
|
96
|
+
].filter(Boolean).join(' ');
|
|
97
|
+
return `### ${label}${flags ? ' ' + flags : ''}\n${content}`;
|
|
98
|
+
})
|
|
99
|
+
.filter(Boolean);
|
|
100
|
+
|
|
101
|
+
return artifacts.length > 0 ? artifacts.join('\n\n') : '';
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Formata hipóteses pendentes do pack para o system prompt.
|
|
106
|
+
* @param {object | null} pack
|
|
107
|
+
* @returns {string}
|
|
108
|
+
*/
|
|
109
|
+
function formatHypotheses(pack) {
|
|
110
|
+
if (!pack || !Array.isArray(pack.hypotheses)) return '';
|
|
111
|
+
const pending = pack.hypotheses.filter((h) => h.status === 'pending');
|
|
112
|
+
if (pending.length === 0) return '';
|
|
113
|
+
const lines = pending.map((h) =>
|
|
114
|
+
`- **[${h.id}]** ${h.condition}${h.checkpoint ? ` *(checkpoint: ${h.checkpoint})*` : ''}`
|
|
115
|
+
);
|
|
116
|
+
return `## Hipóteses críticas pendentes\n\n${lines.join('\n')}`;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Formata gaps críticos do pack.
|
|
121
|
+
* @param {object | null} pack
|
|
122
|
+
* @returns {string}
|
|
123
|
+
*/
|
|
124
|
+
function formatGaps(pack) {
|
|
125
|
+
if (!pack || !Array.isArray(pack.gaps)) return '';
|
|
126
|
+
const critical = pack.gaps.filter((g) => g.severity === 'critical');
|
|
127
|
+
if (critical.length === 0) return '';
|
|
128
|
+
const lines = critical.map((g) => `- \`${g.alias}\`: ${g.reason}`);
|
|
129
|
+
return `## Artefatos críticos ausentes\n\n${lines.join('\n')}`;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
module.exports = {
|
|
133
|
+
loadContextPack,
|
|
134
|
+
formatArtifacts,
|
|
135
|
+
formatHypotheses,
|
|
136
|
+
formatGaps,
|
|
137
|
+
};
|
|
@@ -1,159 +1,159 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
/** Instruções específicas por reasoning_mode */
|
|
4
|
-
const MODE_INSTRUCTIONS = {
|
|
5
|
-
discovery: [
|
|
6
|
-
'Explore o repositório e os artefatos antes de perguntar.',
|
|
7
|
-
'Separe fatos confirmados, inferências e lacunas.',
|
|
8
|
-
'Pergunte apenas ambiguidades que mudem a decisão ou o artefato final.',
|
|
9
|
-
],
|
|
10
|
-
planning: [
|
|
11
|
-
'Produza plano decision-complete — feche interfaces, validação, riscos, rollback e assumptions.',
|
|
12
|
-
'Não deixe decisões importantes abertas para quem implementar depois.',
|
|
13
|
-
'Explicite confiança e condição objetiva para replanejar.',
|
|
14
|
-
],
|
|
15
|
-
execution: [
|
|
16
|
-
'Faça reconhecimento curto antes de editar ou executar mutações.',
|
|
17
|
-
'Trabalhe no menor write set viável e valide após cada fatia relevante.',
|
|
18
|
-
'Pare e explicite o bloqueio quando houver hipótese crítica não verificada.',
|
|
19
|
-
],
|
|
20
|
-
review: [
|
|
21
|
-
'Apresente findings primeiro, ordenados por severidade e evidência.',
|
|
22
|
-
'Separe bug, risco, regressão e lacuna de teste.',
|
|
23
|
-
'Se não houver findings, declare isso explicitamente e liste riscos residuais.',
|
|
24
|
-
],
|
|
25
|
-
status: [
|
|
26
|
-
'Responda com leitura curta e orientada a decisão.',
|
|
27
|
-
'Dê uma recomendação única e justifique o motivo.',
|
|
28
|
-
'Explicite a confiança quando o estado estiver incompleto ou ambíguo.',
|
|
29
|
-
],
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
/** Instruções por sub-comando */
|
|
33
|
-
const COMMAND_INSTRUCTIONS = {
|
|
34
|
-
replan: 'Sub-comando **replan**: leia LESSONS.md e lessons-metrics.json antes de replanejar. Registre o motivo do replanejamento e as lições aplicadas.',
|
|
35
|
-
agents: 'Sub-comando **agents**: identifique 2–4 domínios distintos no PLAN.md e gere um blueprint multi-agente em formato plan-agents.json.',
|
|
36
|
-
discuss: 'Sub-comando **discuss**: abra uma discussão estruturada. Pergunte sobre contexto, alternativas e trade-offs antes de gerar a spec.',
|
|
37
|
-
wave: 'Sub-comando **wave**: o usuário indicou uma onda específica. Concentre o reconhecimento e a execução nessa onda apenas.',
|
|
38
|
-
task: 'Sub-comando **task**: o usuário indicou uma tarefa específica (ex: T3). Execute apenas essa tarefa com reconhecimento mínimo.',
|
|
39
|
-
audit: 'Sub-comando **audit**: modo auditor adversarial. Avalie SPEC.md + VERIFY.md sem consultar PLAN.md nem EXECUTION-RUNTIME.md. Objetivo: falsificar, não confirmar.',
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Formata o vetor de confiança do pack para o system prompt.
|
|
44
|
-
* @param {object | null} pack
|
|
45
|
-
* @returns {string}
|
|
46
|
-
*/
|
|
47
|
-
function formatConfidenceVector(pack) {
|
|
48
|
-
const artifacts = pack?.selected_artifacts || [];
|
|
49
|
-
const planArtifact = artifacts.find((a) => a.alias === 'plan' && a.exists);
|
|
50
|
-
if (!planArtifact || !planArtifact.semantic_summary) return '';
|
|
51
|
-
|
|
52
|
-
// Verificar se o semantic_summary contém dados de confiança
|
|
53
|
-
if (!planArtifact.semantic_summary.includes('Confiança') &&
|
|
54
|
-
!planArtifact.semantic_summary.includes('confidence')) return '';
|
|
55
|
-
|
|
56
|
-
return ''; // O semantic_summary já inclui isso via extraction_intent=planning_input
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Constrói o system prompt completo para um agente OXE.
|
|
61
|
-
*
|
|
62
|
-
* @param {string} workflow - slug do workflow (ex: 'plan', 'execute')
|
|
63
|
-
* @param {object | null} pack - context pack carregado
|
|
64
|
-
* @param {string} stateText - conteúdo do STATE.md (truncado)
|
|
65
|
-
* @param {string | undefined} command - sub-comando invocado (ex: 'replan')
|
|
66
|
-
* @param {{ phase: string | null, session: string | null, nextStep: string | null }} stateInfo
|
|
67
|
-
* @param {string} artifactsText - artefatos formatados pelo contextLoader
|
|
68
|
-
* @param {string} hypothesesText - hipóteses formatadas
|
|
69
|
-
* @param {string} gapsText - gaps formatados
|
|
70
|
-
* @returns {string}
|
|
71
|
-
*/
|
|
72
|
-
function build(workflow, pack, stateText, command, stateInfo, artifactsText, hypothesesText, gapsText) {
|
|
73
|
-
const contract = pack?.contract || {};
|
|
74
|
-
const mode = contract.reasoning_mode || 'status';
|
|
75
|
-
const guidance = Array.isArray(contract.guidance) && contract.guidance.length > 0
|
|
76
|
-
? contract.guidance
|
|
77
|
-
: (MODE_INSTRUCTIONS[mode] || MODE_INSTRUCTIONS.status);
|
|
78
|
-
|
|
79
|
-
const modeInstructions = MODE_INSTRUCTIONS[mode] || MODE_INSTRUCTIONS.status;
|
|
80
|
-
const commandInstruction = command && COMMAND_INSTRUCTIONS[command]
|
|
81
|
-
? `\n\n**${COMMAND_INSTRUCTIONS[command]}**`
|
|
82
|
-
: '';
|
|
83
|
-
|
|
84
|
-
// Resumo do estado do projeto
|
|
85
|
-
const stateSection = stateText
|
|
86
|
-
? `## Estado atual do projeto\n\n${stateText}`
|
|
87
|
-
: '';
|
|
88
|
-
|
|
89
|
-
// Info de contexto rápido
|
|
90
|
-
const contextInfo = [
|
|
91
|
-
stateInfo.phase ? `- **Fase:** ${stateInfo.phase}` : '',
|
|
92
|
-
stateInfo.session ? `- **Sessão ativa:** ${stateInfo.session}` : '',
|
|
93
|
-
stateInfo.nextStep ? `- **Próximo passo sugerido:** ${stateInfo.nextStep}` : '',
|
|
94
|
-
].filter(Boolean).join('\n');
|
|
95
|
-
|
|
96
|
-
// Qualidade do contexto
|
|
97
|
-
let qualityNote = '';
|
|
98
|
-
if (pack) {
|
|
99
|
-
const quality = pack.context_quality;
|
|
100
|
-
if (quality && quality.status === 'critical') {
|
|
101
|
-
qualityNote = `\n> ⚠️ **Contexto crítico** (score: ${quality.score}/100) — artefatos obrigatórios ausentes. Declare fallback para leitura direta se necessário.`;
|
|
102
|
-
} else if (pack.fallback_required) {
|
|
103
|
-
qualityNote = '\n> ℹ️ **Contexto com fallback** — alguns artefatos foram resolvidos por caminhos alternativos.';
|
|
104
|
-
}
|
|
105
|
-
if (pack.freshness && pack.freshness.stale) {
|
|
106
|
-
qualityNote += `\n> 🕐 **Pack desatualizado** (${pack.freshness.reason}) — considere regenerar com \`oxe-cc context build --workflow ${workflow}\`.`;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
const parts = [
|
|
111
|
-
`Você é o agente **OXE ${workflow}**, especializado na fase de ${mode} do framework OXE (Orchestrated eXperience Engineering).`,
|
|
112
|
-
'',
|
|
113
|
-
'## Contrato de raciocínio',
|
|
114
|
-
`- **Modo:** ${mode}`,
|
|
115
|
-
`- **Política de perguntas:** ${contract.question_policy || 'none'}`,
|
|
116
|
-
`- **Saída esperada:** ${contract.output_contract || 'routing'}`,
|
|
117
|
-
`- **Perfil de ferramentas:** ${contract.tool_profile || 'read_heavy'}`,
|
|
118
|
-
`- **Política de confiança:** ${contract.confidence_policy || 'explicit'}`,
|
|
119
|
-
'',
|
|
120
|
-
'## Diretrizes de raciocínio',
|
|
121
|
-
...guidance.map((g) => `- ${g}`),
|
|
122
|
-
'',
|
|
123
|
-
];
|
|
124
|
-
|
|
125
|
-
if (contextInfo) {
|
|
126
|
-
parts.push('## Contexto rápido', contextInfo, '');
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
if (stateSection) {
|
|
130
|
-
parts.push(stateSection, '');
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
if (artifactsText) {
|
|
134
|
-
parts.push('## Artefatos do projeto', artifactsText, '');
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
if (hypothesesText) {
|
|
138
|
-
parts.push(hypothesesText, '');
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
if (gapsText) {
|
|
142
|
-
parts.push(gapsText, '');
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
if (qualityNote) {
|
|
146
|
-
parts.push(qualityNote.trim(), '');
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
parts.push(
|
|
150
|
-
'## Instrução geral',
|
|
151
|
-
'Responda **em português**. Use evidência explícita dos artefatos acima — não invente estado. ' +
|
|
152
|
-
modeInstructions.join(' ') +
|
|
153
|
-
commandInstruction
|
|
154
|
-
);
|
|
155
|
-
|
|
156
|
-
return parts.join('\n').trim();
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
module.exports = { build };
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/** Instruções específicas por reasoning_mode */
|
|
4
|
+
const MODE_INSTRUCTIONS = {
|
|
5
|
+
discovery: [
|
|
6
|
+
'Explore o repositório e os artefatos antes de perguntar.',
|
|
7
|
+
'Separe fatos confirmados, inferências e lacunas.',
|
|
8
|
+
'Pergunte apenas ambiguidades que mudem a decisão ou o artefato final.',
|
|
9
|
+
],
|
|
10
|
+
planning: [
|
|
11
|
+
'Produza plano decision-complete — feche interfaces, validação, riscos, rollback e assumptions.',
|
|
12
|
+
'Não deixe decisões importantes abertas para quem implementar depois.',
|
|
13
|
+
'Explicite confiança e condição objetiva para replanejar.',
|
|
14
|
+
],
|
|
15
|
+
execution: [
|
|
16
|
+
'Faça reconhecimento curto antes de editar ou executar mutações.',
|
|
17
|
+
'Trabalhe no menor write set viável e valide após cada fatia relevante.',
|
|
18
|
+
'Pare e explicite o bloqueio quando houver hipótese crítica não verificada.',
|
|
19
|
+
],
|
|
20
|
+
review: [
|
|
21
|
+
'Apresente findings primeiro, ordenados por severidade e evidência.',
|
|
22
|
+
'Separe bug, risco, regressão e lacuna de teste.',
|
|
23
|
+
'Se não houver findings, declare isso explicitamente e liste riscos residuais.',
|
|
24
|
+
],
|
|
25
|
+
status: [
|
|
26
|
+
'Responda com leitura curta e orientada a decisão.',
|
|
27
|
+
'Dê uma recomendação única e justifique o motivo.',
|
|
28
|
+
'Explicite a confiança quando o estado estiver incompleto ou ambíguo.',
|
|
29
|
+
],
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
/** Instruções por sub-comando */
|
|
33
|
+
const COMMAND_INSTRUCTIONS = {
|
|
34
|
+
replan: 'Sub-comando **replan**: leia LESSONS.md e lessons-metrics.json antes de replanejar. Registre o motivo do replanejamento e as lições aplicadas.',
|
|
35
|
+
agents: 'Sub-comando **agents**: identifique 2–4 domínios distintos no PLAN.md e gere um blueprint multi-agente em formato plan-agents.json.',
|
|
36
|
+
discuss: 'Sub-comando **discuss**: abra uma discussão estruturada. Pergunte sobre contexto, alternativas e trade-offs antes de gerar a spec.',
|
|
37
|
+
wave: 'Sub-comando **wave**: o usuário indicou uma onda específica. Concentre o reconhecimento e a execução nessa onda apenas.',
|
|
38
|
+
task: 'Sub-comando **task**: o usuário indicou uma tarefa específica (ex: T3). Execute apenas essa tarefa com reconhecimento mínimo.',
|
|
39
|
+
audit: 'Sub-comando **audit**: modo auditor adversarial. Avalie SPEC.md + VERIFY.md sem consultar PLAN.md nem EXECUTION-RUNTIME.md. Objetivo: falsificar, não confirmar.',
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Formata o vetor de confiança do pack para o system prompt.
|
|
44
|
+
* @param {object | null} pack
|
|
45
|
+
* @returns {string}
|
|
46
|
+
*/
|
|
47
|
+
function formatConfidenceVector(pack) {
|
|
48
|
+
const artifacts = pack?.selected_artifacts || [];
|
|
49
|
+
const planArtifact = artifacts.find((a) => a.alias === 'plan' && a.exists);
|
|
50
|
+
if (!planArtifact || !planArtifact.semantic_summary) return '';
|
|
51
|
+
|
|
52
|
+
// Verificar se o semantic_summary contém dados de confiança
|
|
53
|
+
if (!planArtifact.semantic_summary.includes('Confiança') &&
|
|
54
|
+
!planArtifact.semantic_summary.includes('confidence')) return '';
|
|
55
|
+
|
|
56
|
+
return ''; // O semantic_summary já inclui isso via extraction_intent=planning_input
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Constrói o system prompt completo para um agente OXE.
|
|
61
|
+
*
|
|
62
|
+
* @param {string} workflow - slug do workflow (ex: 'plan', 'execute')
|
|
63
|
+
* @param {object | null} pack - context pack carregado
|
|
64
|
+
* @param {string} stateText - conteúdo do STATE.md (truncado)
|
|
65
|
+
* @param {string | undefined} command - sub-comando invocado (ex: 'replan')
|
|
66
|
+
* @param {{ phase: string | null, session: string | null, nextStep: string | null }} stateInfo
|
|
67
|
+
* @param {string} artifactsText - artefatos formatados pelo contextLoader
|
|
68
|
+
* @param {string} hypothesesText - hipóteses formatadas
|
|
69
|
+
* @param {string} gapsText - gaps formatados
|
|
70
|
+
* @returns {string}
|
|
71
|
+
*/
|
|
72
|
+
function build(workflow, pack, stateText, command, stateInfo, artifactsText, hypothesesText, gapsText) {
|
|
73
|
+
const contract = pack?.contract || {};
|
|
74
|
+
const mode = contract.reasoning_mode || 'status';
|
|
75
|
+
const guidance = Array.isArray(contract.guidance) && contract.guidance.length > 0
|
|
76
|
+
? contract.guidance
|
|
77
|
+
: (MODE_INSTRUCTIONS[mode] || MODE_INSTRUCTIONS.status);
|
|
78
|
+
|
|
79
|
+
const modeInstructions = MODE_INSTRUCTIONS[mode] || MODE_INSTRUCTIONS.status;
|
|
80
|
+
const commandInstruction = command && COMMAND_INSTRUCTIONS[command]
|
|
81
|
+
? `\n\n**${COMMAND_INSTRUCTIONS[command]}**`
|
|
82
|
+
: '';
|
|
83
|
+
|
|
84
|
+
// Resumo do estado do projeto
|
|
85
|
+
const stateSection = stateText
|
|
86
|
+
? `## Estado atual do projeto\n\n${stateText}`
|
|
87
|
+
: '';
|
|
88
|
+
|
|
89
|
+
// Info de contexto rápido
|
|
90
|
+
const contextInfo = [
|
|
91
|
+
stateInfo.phase ? `- **Fase:** ${stateInfo.phase}` : '',
|
|
92
|
+
stateInfo.session ? `- **Sessão ativa:** ${stateInfo.session}` : '',
|
|
93
|
+
stateInfo.nextStep ? `- **Próximo passo sugerido:** ${stateInfo.nextStep}` : '',
|
|
94
|
+
].filter(Boolean).join('\n');
|
|
95
|
+
|
|
96
|
+
// Qualidade do contexto
|
|
97
|
+
let qualityNote = '';
|
|
98
|
+
if (pack) {
|
|
99
|
+
const quality = pack.context_quality;
|
|
100
|
+
if (quality && quality.status === 'critical') {
|
|
101
|
+
qualityNote = `\n> ⚠️ **Contexto crítico** (score: ${quality.score}/100) — artefatos obrigatórios ausentes. Declare fallback para leitura direta se necessário.`;
|
|
102
|
+
} else if (pack.fallback_required) {
|
|
103
|
+
qualityNote = '\n> ℹ️ **Contexto com fallback** — alguns artefatos foram resolvidos por caminhos alternativos.';
|
|
104
|
+
}
|
|
105
|
+
if (pack.freshness && pack.freshness.stale) {
|
|
106
|
+
qualityNote += `\n> 🕐 **Pack desatualizado** (${pack.freshness.reason}) — considere regenerar com \`oxe-cc context build --workflow ${workflow}\`.`;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const parts = [
|
|
111
|
+
`Você é o agente **OXE ${workflow}**, especializado na fase de ${mode} do framework OXE (Orchestrated eXperience Engineering).`,
|
|
112
|
+
'',
|
|
113
|
+
'## Contrato de raciocínio',
|
|
114
|
+
`- **Modo:** ${mode}`,
|
|
115
|
+
`- **Política de perguntas:** ${contract.question_policy || 'none'}`,
|
|
116
|
+
`- **Saída esperada:** ${contract.output_contract || 'routing'}`,
|
|
117
|
+
`- **Perfil de ferramentas:** ${contract.tool_profile || 'read_heavy'}`,
|
|
118
|
+
`- **Política de confiança:** ${contract.confidence_policy || 'explicit'}`,
|
|
119
|
+
'',
|
|
120
|
+
'## Diretrizes de raciocínio',
|
|
121
|
+
...guidance.map((g) => `- ${g}`),
|
|
122
|
+
'',
|
|
123
|
+
];
|
|
124
|
+
|
|
125
|
+
if (contextInfo) {
|
|
126
|
+
parts.push('## Contexto rápido', contextInfo, '');
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if (stateSection) {
|
|
130
|
+
parts.push(stateSection, '');
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
if (artifactsText) {
|
|
134
|
+
parts.push('## Artefatos do projeto', artifactsText, '');
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (hypothesesText) {
|
|
138
|
+
parts.push(hypothesesText, '');
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
if (gapsText) {
|
|
142
|
+
parts.push(gapsText, '');
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if (qualityNote) {
|
|
146
|
+
parts.push(qualityNote.trim(), '');
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
parts.push(
|
|
150
|
+
'## Instrução geral',
|
|
151
|
+
'Responda **em português**. Use evidência explícita dos artefatos acima — não invente estado. ' +
|
|
152
|
+
modeInstructions.join(' ') +
|
|
153
|
+
commandInstruction
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
return parts.join('\n').trim();
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
module.exports = { build };
|