@chenmk/superflow 0.3.0 → 0.5.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/INSTALL.en.md +54 -12
- package/INSTALL.md +59 -33
- package/README.md +192 -49
- package/README.zh-CN.md +166 -46
- package/assets/brand/managed-review-loop.png +0 -0
- package/assets/manifest.json +15 -9
- package/assets/prompts/superflow-design.md +3 -0
- package/assets/prompts/superflow-docs.md +4 -1
- package/assets/scripts/superflow-coding-ready.mjs +135 -0
- package/assets/scripts/superflow-dependency-update-hook.sh +81 -8
- package/assets/scripts/superflow-document-audit.mjs +240 -0
- package/assets/scripts/superflow-environment-preflight.mjs +398 -0
- package/assets/scripts/superflow-hook-guard.sh +40 -1
- package/assets/scripts/superflow-managed-command-guard.py +309 -0
- package/assets/scripts/superflow-managed-executor-preflight.mjs +421 -0
- package/assets/scripts/superflow-managed-owner-verification.sh +117 -0
- package/assets/scripts/superflow-managed-work-check.mjs +455 -0
- package/assets/scripts/superflow-managed-work-guard.sh +17 -0
- package/assets/skills/openspec-propose/SKILL.md +11 -0
- package/assets/skills/superflow-clarify/SKILL.md +14 -0
- package/assets/skills/superflow-design/SKILL.md +46 -12
- package/assets/skills/superflow-docs/SKILL.md +109 -2
- package/assets/skills/superflow-pipeline/SKILL.md +205 -2
- package/assets/skills/superflow-pipeline/references/batch-prompt-template.md +17 -9
- package/assets/skills/superflow-pipeline/references/document-readiness.md +157 -0
- package/assets/skills/superflow-pipeline/references/document-templates.md +17 -5
- package/assets/skills/superflow-pipeline/references/feature-gated-workflow.md +14 -0
- package/assets/skills/superflow-pipeline/references/implementation-prompt-template.md +20 -11
- package/assets/skills/superflow-pipeline/references/managed-work.md +166 -0
- package/assets/skills/superflow-pipeline/references/orchestration.md +2 -2
- package/assets/skills/superflow-pipeline/references/p0-baseline-template.md +3 -2
- package/assets/skills/superflow-pipeline/references/quality-gate.md +8 -5
- package/assets/skills/superflow-pipeline/references/reviewer-checklist.md +7 -0
- package/assets/skills/superflow-pipeline/references/superpower-technical-design-template.md +10 -0
- package/assets/skills/superflow-pipeline/scripts/superflow-archive.sh +1 -1
- package/assets/skills/superflow-pipeline/scripts/superflow-guard.sh +282 -16
- package/assets/skills/superflow-pipeline/scripts/superflow-handoff.sh +7 -4
- package/assets/skills/superflow-requirement-review/SKILL.md +178 -0
- package/assets/skills/superflow-requirement-review/agents/openai.yaml +4 -0
- package/assets/skills-en/openspec-propose/SKILL.md +14 -0
- package/assets/skills-en/superflow-clarify/SKILL.md +17 -0
- package/assets/skills-en/superflow-design/SKILL.md +40 -11
- package/assets/skills-en/superflow-docs/SKILL.md +115 -0
- package/assets/skills-en/superflow-pipeline/SKILL.md +202 -0
- package/assets/skills-en/superflow-pipeline/references/batch-prompt-template.md +4 -0
- package/assets/skills-en/superflow-pipeline/references/document-readiness.md +125 -0
- package/assets/skills-en/superflow-pipeline/references/document-templates.md +15 -0
- package/assets/skills-en/superflow-pipeline/references/feature-gated-workflow.md +7 -0
- package/assets/skills-en/superflow-pipeline/references/implementation-prompt-template.md +7 -0
- package/assets/skills-en/superflow-pipeline/references/managed-work.md +184 -0
- package/assets/skills-en/superflow-pipeline/references/quality-gate.md +20 -0
- package/assets/skills-en/superflow-pipeline/references/reviewer-checklist.md +7 -0
- package/assets/skills-en/superflow-pipeline/references/superpower-technical-design-template.md +11 -0
- package/assets/skills-en/superflow-pipeline/scripts/superflow-archive.sh +1 -1
- package/assets/skills-en/superflow-pipeline/scripts/superflow-guard.sh +279 -14
- package/assets/skills-en/superflow-pipeline/scripts/superflow-handoff.sh +7 -4
- package/assets/skills-en/superflow-requirement-review/SKILL.md +99 -0
- package/assets/skills-en/superflow-requirement-review/agents/openai.yaml +4 -0
- package/dist/app/cli.js +176 -103
- package/dist/app/cli.js.map +1 -1
- package/dist/app/commands/change-guard.js +19 -2
- package/dist/app/commands/change-guard.js.map +1 -1
- package/dist/app/commands/check.js +107 -45
- package/dist/app/commands/check.js.map +1 -1
- package/dist/app/commands/docs.js +7 -3
- package/dist/app/commands/docs.js.map +1 -1
- package/dist/app/commands/doctor.js +174 -198
- package/dist/app/commands/doctor.js.map +1 -1
- package/dist/app/commands/eval.js +64 -0
- package/dist/app/commands/eval.js.map +1 -0
- package/dist/app/commands/implement.js +7 -3
- package/dist/app/commands/implement.js.map +1 -1
- package/dist/app/commands/init.js +16 -24
- package/dist/app/commands/init.js.map +1 -1
- package/dist/app/commands/managed-service.js +5 -0
- package/dist/app/commands/managed-service.js.map +1 -0
- package/dist/app/commands/mcp.js +167 -0
- package/dist/app/commands/mcp.js.map +1 -0
- package/dist/app/commands/pipeline.js +757 -3
- package/dist/app/commands/pipeline.js.map +1 -1
- package/dist/app/commands/requirement-review.js +6 -0
- package/dist/app/commands/requirement-review.js.map +1 -0
- package/dist/app/commands/status.js +262 -77
- package/dist/app/commands/status.js.map +1 -1
- package/dist/app/commands/uninstall.js +8 -5
- package/dist/app/commands/uninstall.js.map +1 -1
- package/dist/app/commands/update.js +114 -15
- package/dist/app/commands/update.js.map +1 -1
- package/dist/domains/agent.js +3 -11
- package/dist/domains/agent.js.map +1 -1
- package/dist/domains/config/cli-help.js +145 -73
- package/dist/domains/config/cli-help.js.map +1 -1
- package/dist/domains/config/i18n.js +6 -8
- package/dist/domains/config/i18n.js.map +1 -1
- package/dist/domains/config/manifest.js +0 -3
- package/dist/domains/config/manifest.js.map +1 -1
- package/dist/domains/deps.js +70 -8
- package/dist/domains/deps.js.map +1 -1
- package/dist/domains/hook.js +71 -38
- package/dist/domains/hook.js.map +1 -1
- package/dist/domains/managed-work/completion-policy.js +174 -0
- package/dist/domains/managed-work/completion-policy.js.map +1 -0
- package/dist/domains/managed-work/context-manifest.js +208 -0
- package/dist/domains/managed-work/context-manifest.js.map +1 -0
- package/dist/domains/managed-work/contract.js +349 -0
- package/dist/domains/managed-work/contract.js.map +1 -0
- package/dist/domains/managed-work/control-signals.js +34 -0
- package/dist/domains/managed-work/control-signals.js.map +1 -0
- package/dist/domains/managed-work/control.js +628 -0
- package/dist/domains/managed-work/control.js.map +1 -0
- package/dist/domains/managed-work/evaluation.js +497 -0
- package/dist/domains/managed-work/evaluation.js.map +1 -0
- package/dist/domains/managed-work/evidence-path.js +14 -0
- package/dist/domains/managed-work/evidence-path.js.map +1 -0
- package/dist/domains/managed-work/execution-contract.js +167 -0
- package/dist/domains/managed-work/execution-contract.js.map +1 -0
- package/dist/domains/managed-work/executor-policy.js +65 -0
- package/dist/domains/managed-work/executor-policy.js.map +1 -0
- package/dist/domains/managed-work/failure.js +65 -0
- package/dist/domains/managed-work/failure.js.map +1 -0
- package/dist/domains/managed-work/host-review.js +77 -0
- package/dist/domains/managed-work/host-review.js.map +1 -0
- package/dist/domains/managed-work/human-messages.js +31 -0
- package/dist/domains/managed-work/human-messages.js.map +1 -0
- package/dist/domains/managed-work/i18n.js +12 -0
- package/dist/domains/managed-work/i18n.js.map +1 -0
- package/dist/domains/managed-work/input.js +137 -0
- package/dist/domains/managed-work/input.js.map +1 -0
- package/dist/domains/managed-work/journal.js +196 -0
- package/dist/domains/managed-work/journal.js.map +1 -0
- package/dist/domains/managed-work/lock.js +106 -0
- package/dist/domains/managed-work/lock.js.map +1 -0
- package/dist/domains/managed-work/notifications.js +38 -0
- package/dist/domains/managed-work/notifications.js.map +1 -0
- package/dist/domains/managed-work/pair-admission.js +108 -0
- package/dist/domains/managed-work/pair-admission.js.map +1 -0
- package/dist/domains/managed-work/paths.js +18 -0
- package/dist/domains/managed-work/paths.js.map +1 -0
- package/dist/domains/managed-work/prompts.js +453 -0
- package/dist/domains/managed-work/prompts.js.map +1 -0
- package/dist/domains/managed-work/redaction.js +90 -0
- package/dist/domains/managed-work/redaction.js.map +1 -0
- package/dist/domains/managed-work/review-convergence.js +41 -0
- package/dist/domains/managed-work/review-convergence.js.map +1 -0
- package/dist/domains/managed-work/review-facts.js +181 -0
- package/dist/domains/managed-work/review-facts.js.map +1 -0
- package/dist/domains/managed-work/rule-selection.js +84 -0
- package/dist/domains/managed-work/rule-selection.js.map +1 -0
- package/dist/domains/managed-work/runner.js +2418 -0
- package/dist/domains/managed-work/runner.js.map +1 -0
- package/dist/domains/managed-work/schemas.js +155 -0
- package/dist/domains/managed-work/schemas.js.map +1 -0
- package/dist/domains/managed-work/service.js +190 -0
- package/dist/domains/managed-work/service.js.map +1 -0
- package/dist/domains/managed-work/state.js +280 -0
- package/dist/domains/managed-work/state.js.map +1 -0
- package/dist/domains/managed-work/storage.js +223 -0
- package/dist/domains/managed-work/storage.js.map +1 -0
- package/dist/domains/managed-work/types.js +19 -0
- package/dist/domains/managed-work/types.js.map +1 -0
- package/dist/domains/managed-work/verification-categories.js +39 -0
- package/dist/domains/managed-work/verification-categories.js.map +1 -0
- package/dist/domains/managed-work/verification-policy.js +116 -0
- package/dist/domains/managed-work/verification-policy.js.map +1 -0
- package/dist/domains/managed-work/wait.js +58 -0
- package/dist/domains/managed-work/wait.js.map +1 -0
- package/dist/domains/managed-work/workspace-binding.js +133 -0
- package/dist/domains/managed-work/workspace-binding.js.map +1 -0
- package/dist/domains/sdd-readiness.js +44 -0
- package/dist/domains/sdd-readiness.js.map +1 -0
- package/dist/domains/skill/deploy.js +0 -6
- package/dist/domains/skill/deploy.js.map +1 -1
- package/dist/domains/skill/scripts.js +0 -8
- package/dist/domains/skill/scripts.js.map +1 -1
- package/dist/domains/state.js +1 -2
- package/dist/domains/state.js.map +1 -1
- package/dist/mcp/runtime-identity.js +21 -0
- package/dist/mcp/runtime-identity.js.map +1 -0
- package/dist/mcp/server.js +369 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/platform/agent-process.js +769 -0
- package/dist/platform/agent-process.js.map +1 -0
- package/dist/platform/executable.js +28 -0
- package/dist/platform/executable.js.map +1 -0
- package/dist/platform/paths.js +1 -17
- package/dist/platform/paths.js.map +1 -1
- package/dist/platform/process-liveness.js +10 -0
- package/dist/platform/process-liveness.js.map +1 -0
- package/dist/platform/process-tree.js +44 -0
- package/dist/platform/process-tree.js.map +1 -0
- package/dist/platform/process.js +1 -1
- package/dist/platform/process.js.map +1 -1
- package/dist/platform/version-check.js +30 -9
- package/dist/platform/version-check.js.map +1 -1
- package/package.json +16 -7
- package/scripts/check-design-principles.mjs +107 -0
- package/scripts/check-managed-work-design.mjs +507 -0
- package/scripts/clean-dist.js +9 -0
- package/scripts/ensure-bin-modes.js +11 -0
- package/dist/cli/index.js +0 -193
- package/dist/cli/index.js.map +0 -1
- package/dist/commands/archive.js +0 -6
- package/dist/commands/archive.js.map +0 -1
- package/dist/commands/clarify.js +0 -6
- package/dist/commands/clarify.js.map +0 -1
- package/dist/commands/design.js +0 -28
- package/dist/commands/design.js.map +0 -1
- package/dist/commands/docs.js +0 -6
- package/dist/commands/docs.js.map +0 -1
- package/dist/commands/doctor.js +0 -494
- package/dist/commands/doctor.js.map +0 -1
- package/dist/commands/implement.js +0 -6
- package/dist/commands/implement.js.map +0 -1
- package/dist/commands/init.js +0 -520
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/pipeline.js +0 -6
- package/dist/commands/pipeline.js.map +0 -1
- package/dist/commands/scan.js +0 -63
- package/dist/commands/scan.js.map +0 -1
- package/dist/commands/status.js +0 -173
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/uninstall.js +0 -214
- package/dist/commands/uninstall.js.map +0 -1
- package/dist/commands/update.js +0 -193
- package/dist/commands/update.js.map +0 -1
- package/dist/commands/verify.js +0 -6
- package/dist/commands/verify.js.map +0 -1
- package/dist/core/assets.js +0 -27
- package/dist/core/assets.js.map +0 -1
- package/dist/core/cli-help.js +0 -98
- package/dist/core/cli-help.js.map +0 -1
- package/dist/core/context.js +0 -123
- package/dist/core/context.js.map +0 -1
- package/dist/core/dependencies.js +0 -146
- package/dist/core/dependencies.js.map +0 -1
- package/dist/core/detect.js +0 -64
- package/dist/core/detect.js.map +0 -1
- package/dist/core/i18n.js +0 -105
- package/dist/core/i18n.js.map +0 -1
- package/dist/core/integrity.js +0 -46
- package/dist/core/integrity.js.map +0 -1
- package/dist/core/manifest.js +0 -21
- package/dist/core/manifest.js.map +0 -1
- package/dist/core/prompts.js +0 -20
- package/dist/core/prompts.js.map +0 -1
- package/dist/core/registry.js +0 -134
- package/dist/core/registry.js.map +0 -1
- package/dist/core/rules.js +0 -17
- package/dist/core/rules.js.map +0 -1
- package/dist/core/scripts.js +0 -48
- package/dist/core/scripts.js.map +0 -1
- package/dist/core/skill-check.js +0 -32
- package/dist/core/skill-check.js.map +0 -1
- package/dist/core/skills.js +0 -62
- package/dist/core/skills.js.map +0 -1
- package/dist/core/state.js +0 -54
- package/dist/core/state.js.map +0 -1
- package/dist/utils/path.js +0 -11
- package/dist/utils/path.js.map +0 -1
- package/dist/utils/shell.js +0 -29
- package/dist/utils/shell.js.map +0 -1
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
const MAX_STAGNANT_TRANSITIONS = 2;
|
|
2
|
+
export function assessReviewConvergence(history) {
|
|
3
|
+
const relevant = history.filter((review) => review.result === "needs_fix");
|
|
4
|
+
const current = relevant.at(-1);
|
|
5
|
+
const previous = relevant.at(-2);
|
|
6
|
+
if (!current || !previous) {
|
|
7
|
+
return decision(true, 0, previous, current);
|
|
8
|
+
}
|
|
9
|
+
let stagnantTransitions = 0;
|
|
10
|
+
for (let index = relevant.length - 1; index > 0; index -= 1) {
|
|
11
|
+
if (resolvedAny(relevant[index - 1], relevant[index]))
|
|
12
|
+
break;
|
|
13
|
+
stagnantTransitions += 1;
|
|
14
|
+
}
|
|
15
|
+
return decision(stagnantTransitions < MAX_STAGNANT_TRANSITIONS, stagnantTransitions, previous, current);
|
|
16
|
+
}
|
|
17
|
+
function decision(shouldContinue, stagnantTransitions, previous, current) {
|
|
18
|
+
return {
|
|
19
|
+
shouldContinue,
|
|
20
|
+
stagnantTransitions,
|
|
21
|
+
previousBlocking: blocking(previous).length,
|
|
22
|
+
currentBlocking: blocking(current).length,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function resolvedAny(previous, current) {
|
|
26
|
+
const currentFindings = blocking(current);
|
|
27
|
+
return blocking(previous).some((finding) => !currentFindings.some((item) => sameFinding(finding, item)));
|
|
28
|
+
}
|
|
29
|
+
function blocking(review) {
|
|
30
|
+
return review?.findings.filter((finding) => finding.blocking) ?? [];
|
|
31
|
+
}
|
|
32
|
+
function sameFinding(left, right) {
|
|
33
|
+
const sameId = normalize(left.id) !== "" && normalize(left.id) === normalize(right.id);
|
|
34
|
+
const sameScope = normalize(left.category) === normalize(right.category) &&
|
|
35
|
+
normalize(left.target) === normalize(right.target);
|
|
36
|
+
return sameId || sameScope;
|
|
37
|
+
}
|
|
38
|
+
function normalize(value) {
|
|
39
|
+
return value.toLowerCase().replace(/\s+/g, " ").trim();
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=review-convergence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-convergence.js","sourceRoot":"","sources":["../../../src/domains/managed-work/review-convergence.ts"],"names":[],"mappings":"AASA,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAEnC,MAAM,UAAU,uBAAuB,CACrC,OAAuB;IAEvB,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;IAC3E,MAAM,OAAO,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC1B,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,mBAAmB,GAAG,CAAC,CAAC;IAC5B,KAAK,IAAI,KAAK,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC5D,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;YAAE,MAAM;QAC7D,mBAAmB,IAAI,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,QAAQ,CACb,mBAAmB,GAAG,wBAAwB,EAC9C,mBAAmB,EACnB,QAAQ,EACR,OAAO,CACR,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CACf,cAAuB,EACvB,mBAA2B,EAC3B,QAAuB,EACvB,OAAsB;IAEtB,OAAO;QACL,cAAc;QACd,mBAAmB;QACnB,gBAAgB,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM;QAC3C,eAAe,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM;KAC1C,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,QAAsB,EAAE,OAAqB;IAChE,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC1C,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAC5B,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CACzE,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,MAAqB;IACrC,OAAO,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;AACtE,CAAC;AAED,SAAS,WAAW,CAAC,IAAmB,EAAE,KAAoB;IAC5D,MAAM,MAAM,GACV,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC1E,MAAM,SAAS,GACb,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC;QACtD,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACrD,OAAO,MAAM,IAAI,SAAS,CAAC;AAC7B,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { createHash } from "crypto";
|
|
2
|
+
import { existsSync, readFileSync, statSync, writeFileSync } from "fs";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import { readCompletionTasks } from "./completion-policy.js";
|
|
5
|
+
import { ensureManagedContextManifest, managedContextManifestPath, } from "./context-manifest.js";
|
|
6
|
+
import { managedRunDir } from "./paths.js";
|
|
7
|
+
import { snapshotChangedWorkspaceFiles } from "./state.js";
|
|
8
|
+
import { writeJsonAtomic } from "./storage.js";
|
|
9
|
+
import { categoriesForCommand } from "./verification-categories.js";
|
|
10
|
+
import { canonicalEvidencePath } from "./evidence-path.js";
|
|
11
|
+
import { isAcceptedEvidenceCommand } from "./execution-contract.js";
|
|
12
|
+
export function writeManagedReviewFacts(contract, state) {
|
|
13
|
+
const runDir = managedRunDir(state.projectRoot, state.taskId, state.runId);
|
|
14
|
+
const result = state.lastExecutorResult
|
|
15
|
+
? JSON.parse(readFileSync(state.lastExecutorResult, "utf-8"))
|
|
16
|
+
: emptyResult();
|
|
17
|
+
const manifest = ensureManagedContextManifest(contract);
|
|
18
|
+
const tasks = readCompletionTasks(contract, result);
|
|
19
|
+
const commands = result.commands ?? [];
|
|
20
|
+
const categories = [
|
|
21
|
+
...new Set(commands.flatMap(categoriesForCommand)),
|
|
22
|
+
].sort();
|
|
23
|
+
const roots = [contract.projectRoot, ...contract.relatedProjectRoots];
|
|
24
|
+
const workspaceSnapshot = snapshotChangedWorkspaceFiles(roots);
|
|
25
|
+
const roundBaseline = state.lastReviewedWorkspaceFiles ?? state.baselineWorkspaceFiles ?? {};
|
|
26
|
+
const facts = {
|
|
27
|
+
schemaVersion: 1,
|
|
28
|
+
taskId: state.taskId,
|
|
29
|
+
runId: state.runId,
|
|
30
|
+
reviewRound: state.reviewRound,
|
|
31
|
+
contextManifest: {
|
|
32
|
+
path: managedContextManifestPath(contract),
|
|
33
|
+
sha256: manifest.manifestHash,
|
|
34
|
+
},
|
|
35
|
+
workspace: {
|
|
36
|
+
roots,
|
|
37
|
+
changedFiles: [...new Set(result.changedFiles ?? [])].sort(),
|
|
38
|
+
roundChangedFiles: changedFilesBetween(workspaceSnapshot, roundBaseline, contract.projectRoot),
|
|
39
|
+
},
|
|
40
|
+
tasks: {
|
|
41
|
+
total: tasks.length,
|
|
42
|
+
completed: tasks.filter((task) => task.completed).length,
|
|
43
|
+
pendingLocal: tasks
|
|
44
|
+
.filter((task) => !task.completed && task.category === "local_required")
|
|
45
|
+
.map((task) => task.taskId),
|
|
46
|
+
pendingExternal: tasks
|
|
47
|
+
.filter((task) => !task.completed && task.category !== "local_required")
|
|
48
|
+
.map((task) => task.taskId),
|
|
49
|
+
},
|
|
50
|
+
commands: {
|
|
51
|
+
total: commands.length,
|
|
52
|
+
successful: commands.filter(isAcceptedEvidenceCommand).length,
|
|
53
|
+
categories,
|
|
54
|
+
items: commands.map((command) => ({
|
|
55
|
+
command: command.command,
|
|
56
|
+
exitCode: command.exitCode,
|
|
57
|
+
assertion: command.assertion ?? "positive",
|
|
58
|
+
categories: categoriesForCommand(command),
|
|
59
|
+
})),
|
|
60
|
+
},
|
|
61
|
+
evidence: evidencePaths(result)
|
|
62
|
+
.sort()
|
|
63
|
+
.map((entry) => evidenceFact(entry, contract, runDir)),
|
|
64
|
+
};
|
|
65
|
+
const jsonPath = path.join(runDir, `review-facts-${state.reviewRound}.json`);
|
|
66
|
+
const markdownPath = path.join(runDir, `review-facts-${state.reviewRound}.md`);
|
|
67
|
+
writeJsonAtomic(jsonPath, facts);
|
|
68
|
+
writeFileSync(markdownPath, renderReviewFacts(facts, contract.language), "utf-8");
|
|
69
|
+
return { jsonPath, markdownPath, facts, workspaceSnapshot };
|
|
70
|
+
}
|
|
71
|
+
function evidencePaths(result) {
|
|
72
|
+
const structured = (result.taskEvidence ?? []).flatMap((item) => item.evidencePaths);
|
|
73
|
+
const paths = structured.length > 0 ? structured : (result.evidence ?? []);
|
|
74
|
+
return [...new Set(paths.map(canonicalEvidencePath))];
|
|
75
|
+
}
|
|
76
|
+
function changedFilesBetween(current, baseline, primaryRoot) {
|
|
77
|
+
const keys = new Set([...Object.keys(current), ...Object.keys(baseline)]);
|
|
78
|
+
return [...keys]
|
|
79
|
+
.filter((key) => current[key] !== baseline[key])
|
|
80
|
+
.map((key) => {
|
|
81
|
+
const separator = key.indexOf("::");
|
|
82
|
+
const root = key.slice(0, separator);
|
|
83
|
+
const relative = key.slice(separator + 2).replaceAll("\\", "/");
|
|
84
|
+
return path.resolve(root) === path.resolve(primaryRoot)
|
|
85
|
+
? relative
|
|
86
|
+
: path.join(root, relative).replaceAll("\\", "/");
|
|
87
|
+
})
|
|
88
|
+
.sort();
|
|
89
|
+
}
|
|
90
|
+
function evidenceFact(entry, contract, runDir) {
|
|
91
|
+
const evidencePath = canonicalEvidencePath(entry);
|
|
92
|
+
const candidates = path.isAbsolute(evidencePath)
|
|
93
|
+
? [evidencePath]
|
|
94
|
+
: [
|
|
95
|
+
path.resolve(contract.projectRoot, evidencePath),
|
|
96
|
+
path.resolve(runDir, evidencePath),
|
|
97
|
+
];
|
|
98
|
+
const file = candidates.find(existsSync) ?? candidates[0];
|
|
99
|
+
if (!existsSync(file)) {
|
|
100
|
+
return {
|
|
101
|
+
path: file,
|
|
102
|
+
kind: "file",
|
|
103
|
+
exists: false,
|
|
104
|
+
bytes: null,
|
|
105
|
+
sha256: null,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
const stat = statSync(file);
|
|
109
|
+
if (stat.isDirectory()) {
|
|
110
|
+
return {
|
|
111
|
+
path: file,
|
|
112
|
+
kind: "directory",
|
|
113
|
+
exists: true,
|
|
114
|
+
bytes: stat.size,
|
|
115
|
+
sha256: null,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
path: file,
|
|
120
|
+
kind: "file",
|
|
121
|
+
exists: true,
|
|
122
|
+
bytes: stat.size,
|
|
123
|
+
sha256: createHash("sha256").update(readFileSync(file)).digest("hex"),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
function renderReviewFacts(facts, language) {
|
|
127
|
+
const title = language === "en" ? "# Host Review Facts" : "# Host 评审事实包";
|
|
128
|
+
const labels = language === "en"
|
|
129
|
+
? {
|
|
130
|
+
warning: "Runner facts are deterministic inputs, not semantic conclusions.",
|
|
131
|
+
changed: "Task changed files",
|
|
132
|
+
roundChanged: "Changed since previous Host review",
|
|
133
|
+
tasks: "Tasks",
|
|
134
|
+
commands: "Commands",
|
|
135
|
+
evidence: "Evidence",
|
|
136
|
+
}
|
|
137
|
+
: {
|
|
138
|
+
warning: "Runner 事实仅作为确定性输入,不代表语义结论。",
|
|
139
|
+
changed: "任务累计变更文件",
|
|
140
|
+
roundChanged: "相对上次 Host 评审的变更文件",
|
|
141
|
+
tasks: "任务",
|
|
142
|
+
commands: "命令",
|
|
143
|
+
evidence: "证据",
|
|
144
|
+
};
|
|
145
|
+
return [
|
|
146
|
+
title,
|
|
147
|
+
"",
|
|
148
|
+
labels.warning,
|
|
149
|
+
"",
|
|
150
|
+
`## ${labels.changed} (${facts.workspace.changedFiles.length})`,
|
|
151
|
+
...facts.workspace.changedFiles.map((file) => `- ${file}`),
|
|
152
|
+
"",
|
|
153
|
+
`## ${labels.roundChanged} (${facts.workspace.roundChangedFiles.length})`,
|
|
154
|
+
...(facts.workspace.roundChangedFiles.length > 0
|
|
155
|
+
? facts.workspace.roundChangedFiles.map((file) => `- ${file}`)
|
|
156
|
+
: [language === "en" ? "- none" : "- 无"]),
|
|
157
|
+
"",
|
|
158
|
+
`## ${labels.tasks} (${facts.tasks.completed}/${facts.tasks.total})`,
|
|
159
|
+
`- pending local: ${facts.tasks.pendingLocal.join(", ") || "none"}`,
|
|
160
|
+
`- pending external: ${facts.tasks.pendingExternal.join(", ") || "none"}`,
|
|
161
|
+
"",
|
|
162
|
+
`## ${labels.commands} (${facts.commands.successful}/${facts.commands.total})`,
|
|
163
|
+
`- categories: ${facts.commands.categories.join(", ") || "none"}`,
|
|
164
|
+
"",
|
|
165
|
+
`## ${labels.evidence} (${facts.evidence.length})`,
|
|
166
|
+
...facts.evidence.map((item) => `- ${item.exists ? "PASS" : "MISSING"} ${item.path}`),
|
|
167
|
+
"",
|
|
168
|
+
].join("\n");
|
|
169
|
+
}
|
|
170
|
+
function emptyResult() {
|
|
171
|
+
return {
|
|
172
|
+
status: "ready_for_review",
|
|
173
|
+
summary: "",
|
|
174
|
+
changedFiles: [],
|
|
175
|
+
commands: [],
|
|
176
|
+
evidence: [],
|
|
177
|
+
releasePrerequisites: [],
|
|
178
|
+
blockers: [],
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=review-facts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-facts.js","sourceRoot":"","sources":["../../../src/domains/managed-work/review-facts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { existsSync, readdirSync } from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
const SCENARIO_TOKENS = {
|
|
4
|
+
core: ["common", "core", "general", "security", "git", "review"],
|
|
5
|
+
java: ["java", "spring", "maven", "gradle", "backend"],
|
|
6
|
+
frontend: ["front", "javascript", "typescript", "react", "vue", "node"],
|
|
7
|
+
database: ["database", "mysql", "sql", "migration", "mybatis"],
|
|
8
|
+
runtime: ["runtime", "e2e", "integration", "docker", "browser", "deploy"],
|
|
9
|
+
};
|
|
10
|
+
export function selectManagedRuleFiles(contract) {
|
|
11
|
+
const roots = [contract.projectRoot, ...contract.relatedProjectRoots];
|
|
12
|
+
const scenarios = new Set(["core"]);
|
|
13
|
+
for (const root of roots)
|
|
14
|
+
detectRepositoryScenarios(root, scenarios);
|
|
15
|
+
detectRequestScenarios(contract, scenarios);
|
|
16
|
+
const files = roots.flatMap((root) => selectRootRules(root, scenarios));
|
|
17
|
+
return {
|
|
18
|
+
scenarios: [...scenarios].sort(),
|
|
19
|
+
files: [...new Set(files)].sort(),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function detectRepositoryScenarios(root, scenarios) {
|
|
23
|
+
const javaMarkers = ["pom.xml", "build.gradle", "build.gradle.kts"];
|
|
24
|
+
if (javaMarkers.some((name) => existsSync(path.join(root, name)))) {
|
|
25
|
+
scenarios.add("java");
|
|
26
|
+
}
|
|
27
|
+
if (existsSync(path.join(root, "package.json")))
|
|
28
|
+
scenarios.add("frontend");
|
|
29
|
+
if (["migrations", "db", "sql"].some((name) => existsSync(path.join(root, name)))) {
|
|
30
|
+
scenarios.add("database");
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function detectRequestScenarios(contract, scenarios) {
|
|
34
|
+
const text = [contract.request, contract.objective, ...contract.doneCriteria]
|
|
35
|
+
.join("\n")
|
|
36
|
+
.toLowerCase();
|
|
37
|
+
for (const [scenario, tokens] of Object.entries(SCENARIO_TOKENS)) {
|
|
38
|
+
if (tokens.some((token) => text.includes(token))) {
|
|
39
|
+
scenarios.add(scenario);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (["engineering", "sdd"].includes(contract.profile)) {
|
|
43
|
+
scenarios.add("runtime");
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function selectRootRules(root, scenarios) {
|
|
47
|
+
const files = ["AGENTS.md", "CLAUDE.md"]
|
|
48
|
+
.map((name) => path.join(root, name))
|
|
49
|
+
.filter((file) => existsSync(file));
|
|
50
|
+
for (const relativeRoot of [
|
|
51
|
+
path.join(".codex", "rules"),
|
|
52
|
+
path.join(".claude", "rules"),
|
|
53
|
+
]) {
|
|
54
|
+
const rulesRoot = path.join(root, relativeRoot);
|
|
55
|
+
if (!existsSync(rulesRoot))
|
|
56
|
+
continue;
|
|
57
|
+
for (const file of markdownFiles(rulesRoot)) {
|
|
58
|
+
if (matchesScenario(file, rulesRoot, scenarios))
|
|
59
|
+
files.push(file);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return files;
|
|
63
|
+
}
|
|
64
|
+
function matchesScenario(file, rulesRoot, scenarios) {
|
|
65
|
+
const relative = path.relative(rulesRoot, file).toLowerCase();
|
|
66
|
+
let classified = false;
|
|
67
|
+
for (const [scenario, tokens] of Object.entries(SCENARIO_TOKENS)) {
|
|
68
|
+
if (!tokens.some((token) => relative.includes(token)))
|
|
69
|
+
continue;
|
|
70
|
+
classified = true;
|
|
71
|
+
if (scenarios.has(scenario))
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
return !classified;
|
|
75
|
+
}
|
|
76
|
+
function markdownFiles(root) {
|
|
77
|
+
return readdirSync(root, { withFileTypes: true }).flatMap((entry) => {
|
|
78
|
+
const target = path.join(root, entry.name);
|
|
79
|
+
if (entry.isDirectory())
|
|
80
|
+
return markdownFiles(target);
|
|
81
|
+
return entry.isFile() && entry.name.endsWith(".md") ? [target] : [];
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=rule-selection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-selection.js","sourceRoot":"","sources":["../../../src/domains/managed-work/rule-selection.ts"],"names":[],"mappings":"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"}
|