@pm_zhousl/xinyun-ai-init 2.0.0 → 3.0.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.
Files changed (199) hide show
  1. package/README.md +29 -39
  2. package/bin/xinyun-ai-init.js +121 -175
  3. package/init/xinyun-ai-init/README.md +26 -144
  4. package/init/xinyun-ai-init/rules/v3-skill-runtime.md +45 -0
  5. package/init/xinyun-ai-init/runtime/migrate-v3.js +115 -0
  6. package/init/xinyun-ai-init/runtime/route-skill.js +69 -0
  7. package/init/xinyun-ai-init/runtime-manifest.json +26 -0
  8. package/init/xinyun-ai-init/skills/registry.json +112 -0
  9. package/init/xinyun-ai-init/templates/AGENTS.template.md +4 -27
  10. package/init/xinyun-ai-init/templates/README.template.md +3 -31
  11. package/init/xinyun-ai-init/templates/control-plane-index.template.json +5 -24
  12. package/init/xinyun-ai-init/templates/core-rules.template.md +9 -57
  13. package/init/xinyun-ai-init/templates/current-task.template.md +3 -19
  14. package/init/xinyun-ai-init/templates/manifest.template.json +13 -67
  15. package/init/xinyun-ai-init/templates/project-context.template.json +3 -11
  16. package/init/xinyun-ai-init/templates/project-index.template.json +5 -51
  17. package/init/xinyun-ai-init/templates/skill-run-record.template.json +4 -16
  18. package/init/xinyun-ai-init/templates/skill-runtime-route.template.json +3 -24
  19. package/init/xinyun-ai-init/templates/skills-assignments.template.json +3 -21
  20. package/init/xinyun-ai-init/templates/skills-registry.template.json +5 -29
  21. package/init/xinyun-ai-init/templates/task-graph.template.json +3 -5
  22. package/init/xinyun-ai-init/templates/task-index.template.json +3 -31
  23. package/init/xinyun-ai-init/version.json +8 -8
  24. package/package.json +8 -14
  25. package/scripts/run-v3-runtime-probe.js +8 -0
  26. package/scripts/verify-legacy-cleanup.js +24 -0
  27. package/scripts/verify-release-gate.js +10 -23
  28. package/scripts/verify-rules-tarball-security.js +1 -1
  29. package/scripts/verify-skill-runtime.js +33 -0
  30. package/scripts/verify-tarball.js +42 -0
  31. package/scripts/verify-v3-package.js +70 -0
  32. package/test-scenarios/v3.0.0-behavior-evidence.json +25 -0
  33. package/test-scenarios/v3.0.0-scenarios.md +41 -0
  34. package/init/xinyun-ai-init/prompt.md +0 -1
  35. package/init/xinyun-ai-init/rules/coordination.md +0 -43
  36. package/init/xinyun-ai-init/rules/directory-self-completion.md +0 -100
  37. package/init/xinyun-ai-init/rules/frameworks/README.md +0 -56
  38. package/init/xinyun-ai-init/rules/frameworks/backend/php/thinkphp.md +0 -42
  39. package/init/xinyun-ai-init/rules/frameworks/frontend/uni-app.md +0 -36
  40. package/init/xinyun-ai-init/rules/frameworks/frontend/wechat-miniprogram.md +0 -36
  41. package/init/xinyun-ai-init/rules/frontend-audit.md +0 -9
  42. package/init/xinyun-ai-init/rules/init-rules.md +0 -145
  43. package/init/xinyun-ai-init/rules/self-learning-rules.md +0 -16
  44. package/init/xinyun-ai-init/rules/session-workbench.md +0 -333
  45. package/init/xinyun-ai-init/rules/skills.md +0 -23
  46. package/init/xinyun-ai-init/rules/temporary-sessions.md +0 -13
  47. package/init/xinyun-ai-init/rules/upgrade-rules.md +0 -161
  48. package/init/xinyun-ai-init/rules/v1.10.2-contract.md +0 -30
  49. package/init/xinyun-ai-init/rules/v1.11.0-acceleration.md +0 -27
  50. package/init/xinyun-ai-init/rules/v1.12.0-recovery.md +0 -34
  51. package/init/xinyun-ai-init/rules/v1.12.1-provider-session-binding.md +0 -25
  52. package/init/xinyun-ai-init/rules/v1.13.0-host-adapter.md +0 -43
  53. package/init/xinyun-ai-init/rules/v1.14.0-agent-core.md +0 -35
  54. package/init/xinyun-ai-init/rules/v1.15.0-session-binding.md +0 -44
  55. package/init/xinyun-ai-init/rules/v1.16.0-capability-efficiency.md +0 -23
  56. package/init/xinyun-ai-init/rules/v2.0.0-shared-project-conversations.md +0 -68
  57. package/init/xinyun-ai-init/rules/v2.0.0-single-session-skills.md +0 -89
  58. package/init/xinyun-ai-init/scripts/README.md +0 -16
  59. package/init/xinyun-ai-init/templates/agent-capabilities.template.json +0 -27
  60. package/init/xinyun-ai-init/templates/agent-profile.template.json +0 -21
  61. package/init/xinyun-ai-init/templates/archive-transaction.template.json +0 -15
  62. package/init/xinyun-ai-init/templates/bootstrap-snapshot.template.json +0 -22
  63. package/init/xinyun-ai-init/templates/capabilities.template.json +0 -19
  64. package/init/xinyun-ai-init/templates/codegraph-incremental-record.template.json +0 -21
  65. package/init/xinyun-ai-init/templates/conversation-binding.template.json +0 -26
  66. package/init/xinyun-ai-init/templates/conversation-event.template.json +0 -24
  67. package/init/xinyun-ai-init/templates/conversation-registry.template.json +0 -15
  68. package/init/xinyun-ai-init/templates/conversation-stream-head.template.json +0 -14
  69. package/init/xinyun-ai-init/templates/conversation-sync-cursor.template.json +0 -13
  70. package/init/xinyun-ai-init/templates/coordination-change-ledger.template.json +0 -15
  71. package/init/xinyun-ai-init/templates/coordination-conflict-record.template.json +0 -18
  72. package/init/xinyun-ai-init/templates/coordination-contract-snapshot.template.json +0 -9
  73. package/init/xinyun-ai-init/templates/coordination-project-facts.template.json +0 -20
  74. package/init/xinyun-ai-init/templates/coordination-transaction.template.json +0 -16
  75. package/init/xinyun-ai-init/templates/database-authorization.template.json +0 -53
  76. package/init/xinyun-ai-init/templates/final-delivery.template.json +0 -22
  77. package/init/xinyun-ai-init/templates/fixed-materialization.template.json +0 -12
  78. package/init/xinyun-ai-init/templates/framework-profile.template.json +0 -48
  79. package/init/xinyun-ai-init/templates/framework-profile.template.md +0 -39
  80. package/init/xinyun-ai-init/templates/frontend-audit.template.json +0 -27
  81. package/init/xinyun-ai-init/templates/handoff.template.json +0 -27
  82. package/init/xinyun-ai-init/templates/host-capabilities.template.json +0 -37
  83. package/init/xinyun-ai-init/templates/host-preflight.template.json +0 -33
  84. package/init/xinyun-ai-init/templates/html-migration-asset-map.template.md +0 -6
  85. package/init/xinyun-ai-init/templates/html-migration-compatibility-matrix.template.md +0 -6
  86. package/init/xinyun-ai-init/templates/html-migration-open-issues.template.md +0 -12
  87. package/init/xinyun-ai-init/templates/html-migration-pilot-plan.template.md +0 -21
  88. package/init/xinyun-ai-init/templates/html-migration-record.template.json +0 -36
  89. package/init/xinyun-ai-init/templates/html-migration-route-map.template.md +0 -6
  90. package/init/xinyun-ai-init/templates/html-migration-scope.template.md +0 -28
  91. package/init/xinyun-ai-init/templates/init-result.template.json +0 -25
  92. package/init/xinyun-ai-init/templates/initialization-cache.template.json +0 -13
  93. package/init/xinyun-ai-init/templates/initialization-change-report.template.json +0 -14
  94. package/init/xinyun-ai-init/templates/initialization-recovery.template.json +0 -24
  95. package/init/xinyun-ai-init/templates/initialization-stages.template.json +0 -18
  96. package/init/xinyun-ai-init/templates/initialization-timing.template.json +0 -16
  97. package/init/xinyun-ai-init/templates/local-query-index.template.json +0 -15
  98. package/init/xinyun-ai-init/templates/managed-baseline.template.json +0 -17
  99. package/init/xinyun-ai-init/templates/manual-session-binding.template.json +0 -45
  100. package/init/xinyun-ai-init/templates/manual-session-recovery.template.json +0 -53
  101. package/init/xinyun-ai-init/templates/multi-conversation-migration.template.json +0 -24
  102. package/init/xinyun-ai-init/templates/onboarding-report.template.json +0 -30
  103. package/init/xinyun-ai-init/templates/orchestrator.template.json +0 -28
  104. package/init/xinyun-ai-init/templates/parallelism.template.json +0 -13
  105. package/init/xinyun-ai-init/templates/performance-metrics.template.json +0 -17
  106. package/init/xinyun-ai-init/templates/preflight-report.template.json +0 -25
  107. package/init/xinyun-ai-init/templates/project-check.template.md +0 -56
  108. package/init/xinyun-ai-init/templates/project-guide.template.md +0 -57
  109. package/init/xinyun-ai-init/templates/project-identity.template.json +0 -23
  110. package/init/xinyun-ai-init/templates/project-status.template.json +0 -28
  111. package/init/xinyun-ai-init/templates/provider-adapter.template.json +0 -25
  112. package/init/xinyun-ai-init/templates/provider-session-binding.template.json +0 -77
  113. package/init/xinyun-ai-init/templates/re-takeover-record.template.json +0 -37
  114. package/init/xinyun-ai-init/templates/requirement-packet.template.json +0 -23
  115. package/init/xinyun-ai-init/templates/role-execution.template.md +0 -72
  116. package/init/xinyun-ai-init/templates/role-session-binding.template.json +0 -105
  117. package/init/xinyun-ai-init/templates/role-subtask.template.md +0 -36
  118. package/init/xinyun-ai-init/templates/session-binding.template.json +0 -38
  119. package/init/xinyun-ai-init/templates/session-candidates.template.json +0 -19
  120. package/init/xinyun-ai-init/templates/shared-project-snapshot.template.json +0 -24
  121. package/init/xinyun-ai-init/templates/single-session-migration.template.json +0 -31
  122. package/init/xinyun-ai-init/templates/sync-check.template.json +0 -23
  123. package/init/xinyun-ai-init/templates/takeover-baseline.template.json +0 -17
  124. package/init/xinyun-ai-init/templates/takeover-gate.template.json +0 -22
  125. package/init/xinyun-ai-init/templates/task-history.template.md +0 -35
  126. package/init/xinyun-ai-init/templates/task-lease.template.json +0 -19
  127. package/init/xinyun-ai-init/templates/task-lock.template.json +0 -31
  128. package/init/xinyun-ai-init/templates/task-main.template.md +0 -38
  129. package/init/xinyun-ai-init/templates/task-result.template.json +0 -23
  130. package/init/xinyun-ai-init/templates/team/README.md +0 -51
  131. package/init/xinyun-ai-init/templates/team/assignments.json +0 -49
  132. package/init/xinyun-ai-init/templates/team/confirmations/chief-engineer.md +0 -24
  133. package/init/xinyun-ai-init/templates/team/confirmations/programmer.md +0 -24
  134. package/init/xinyun-ai-init/templates/team/confirmations/project-owner.md +0 -24
  135. package/init/xinyun-ai-init/templates/team/confirmations/project-product.md +0 -24
  136. package/init/xinyun-ai-init/templates/team/confirmations/test-reviewer.md +0 -24
  137. package/init/xinyun-ai-init/templates/team/file-ownership.json +0 -32
  138. package/init/xinyun-ai-init/templates/team/members.json +0 -61
  139. package/init/xinyun-ai-init/templates/team/responsibility-matrix.json +0 -81
  140. package/init/xinyun-ai-init/templates/team/roles.json +0 -71
  141. package/init/xinyun-ai-init/templates/team/understandings/chief-engineer.md +0 -23
  142. package/init/xinyun-ai-init/templates/team/understandings/programmer.md +0 -23
  143. package/init/xinyun-ai-init/templates/team/understandings/project-owner.md +0 -23
  144. package/init/xinyun-ai-init/templates/team/understandings/project-product.md +0 -23
  145. package/init/xinyun-ai-init/templates/team/understandings/test-reviewer.md +0 -23
  146. package/init/xinyun-ai-init/templates/technical-impact-packet.template.json +0 -31
  147. package/init/xinyun-ai-init/templates/technical-landscape.template.json +0 -41
  148. package/init/xinyun-ai-init/templates/temporary-session.template.json +0 -32
  149. package/init/xinyun-ai-init/templates/workstreams-readme.template.md +0 -36
  150. package/scripts/collect-v1.10-evidence.js +0 -159
  151. package/scripts/collect-v1.14-local-evidence.js +0 -66
  152. package/scripts/collect-v1.15-real-evidence.js +0 -114
  153. package/scripts/collect-v1.16-evidence.js +0 -48
  154. package/scripts/collect-v2-evidence.js +0 -35
  155. package/scripts/run-v1.16-runtime-probe.js +0 -91
  156. package/scripts/run-v2-runtime-probe.js +0 -110
  157. package/scripts/verify-init-package.js +0 -2297
  158. package/scripts/verify-multi-conversation-contract.js +0 -61
  159. package/scripts/verify-re-takeover-contract.js +0 -54
  160. package/scripts/verify-rules-package.js +0 -1287
  161. package/scripts/verify-v2-package.js +0 -210
  162. package/scripts/verify-v2-tarball.js +0 -73
  163. package/test-scenarios/README.md +0 -130
  164. package/test-scenarios/fixtures/v1.10.0-takeover-gate-fixture/README.md +0 -23
  165. package/test-scenarios/fixtures/v1.10.0-takeover-gate-fixture/after/project-status.json +0 -7
  166. package/test-scenarios/fixtures/v1.10.0-takeover-gate-fixture/before/project-status.json +0 -7
  167. package/test-scenarios/fixtures/v1.9.0-behavior-fixture/README.md +0 -9
  168. package/test-scenarios/multi-conversation-evidence.json +0 -26
  169. package/test-scenarios/multi-conversation-scenarios.md +0 -16
  170. package/test-scenarios/re-takeover-evidence.json +0 -20
  171. package/test-scenarios/re-takeover-scenarios.md +0 -33
  172. package/test-scenarios/review-template.md +0 -165
  173. package/test-scenarios/scenarios.md +0 -1273
  174. package/test-scenarios/v1.10.0-behavior-evidence.json +0 -31
  175. package/test-scenarios/v1.10.0-scenarios.md +0 -96
  176. package/test-scenarios/v1.10.2-scenarios.md +0 -38
  177. package/test-scenarios/v1.11.0-scenarios.md +0 -30
  178. package/test-scenarios/v1.12.0-behavior-evidence.json +0 -29
  179. package/test-scenarios/v1.12.0-scenarios.md +0 -51
  180. package/test-scenarios/v1.12.1-behavior-evidence.json +0 -27
  181. package/test-scenarios/v1.12.1-scenarios.md +0 -42
  182. package/test-scenarios/v1.13.0-behavior-evidence.json +0 -650
  183. package/test-scenarios/v1.13.0-scenarios.md +0 -94
  184. package/test-scenarios/v1.14.0-behavior-evidence.json +0 -780
  185. package/test-scenarios/v1.14.0-scenarios.md +0 -63
  186. package/test-scenarios/v1.15.0-behavior-evidence.json +0 -476
  187. package/test-scenarios/v1.15.0-scenarios.md +0 -57
  188. package/test-scenarios/v1.16.0-behavior-evidence.json +0 -46
  189. package/test-scenarios/v1.16.0-real-host-probe.json +0 -132
  190. package/test-scenarios/v1.16.0-scenarios.md +0 -19
  191. package/test-scenarios/v1.7.0-scenarios.md +0 -91
  192. package/test-scenarios/v1.7.1-scenarios.md +0 -130
  193. package/test-scenarios/v1.7.2-scenarios.md +0 -51
  194. package/test-scenarios/v1.7.3-scenarios.md +0 -79
  195. package/test-scenarios/v1.8.0-scenarios.md +0 -39
  196. package/test-scenarios/v1.9.0-behavior-evidence.json +0 -269
  197. package/test-scenarios/v1.9.0-scenarios.md +0 -55
  198. package/test-scenarios/v2.0.0-behavior-evidence.json +0 -40
  199. package/test-scenarios/v2.0.0-scenarios.md +0 -21
@@ -5,37 +5,24 @@ const path = require("path");
5
5
 
6
6
  const root = path.resolve(__dirname, "..");
7
7
  const packageJson = JSON.parse(fs.readFileSync(path.join(root, "package.json"), "utf8"));
8
- const contract = JSON.parse(fs.readFileSync(path.join(root, "test-scenarios", "v2.0.0-behavior-evidence.json"), "utf8"));
9
- const probePath = path.join(root, "test-scenarios", "v2.0.0-real-host-probe.json");
10
- const requiredOperations = ["create-or-reuse", "send", "receive", "query-status", "recover", "close", "control-file-read-write"];
8
+ const evidencePath = path.join(root, "test-scenarios", "v3.0.0-behavior-evidence.json");
11
9
 
12
10
  function main() {
13
11
  const errors = [];
14
- if (packageJson.name !== "@pm_zhousl/xinyun-ai-init" || packageJson.version !== "2.0.0") errors.push("package identity must be @pm_zhousl/xinyun-ai-init@2.0.0");
15
- if (contract.version !== "2.0.0" || contract.evidenceType !== "contract-regression" || contract.scenarios.length !== 15) errors.push("v2 contract evidence is incomplete");
16
- if (!contract.scenarios.every((scenario, index) => scenario.scenarioId === 401 + index && scenario.result === "contract-passed")) errors.push("v2 scenarios 401-415 must pass contract validation");
17
- if (!contract.sensitiveScan || contract.sensitiveScan.status !== "pass" || contract.sensitiveScan.matches.length !== 0) errors.push("contract sensitive scan is not clean");
18
-
19
- if (!fs.existsSync(probePath)) {
20
- errors.push("real host probe is missing; run probe:v2 with verified interaction and Skill-run evidence");
21
- } else {
22
- const probe = JSON.parse(fs.readFileSync(probePath, "utf8"));
23
- if (probe.version !== "2.0.0" || probe.executionModel !== "shared-project-multi-conversation-runtime") errors.push("real host probe contract is incorrect");
24
- if (probe.evidenceType !== "real-cross-conversation" || probe.executionMode !== "real-host" || probe.realCrossConversationVerified !== true) errors.push("real host cross-conversation behavior is not verified");
25
- if (probe.readyEligible !== true || probe.publishBlocked !== false) errors.push("real host readiness gate is blocked");
26
- if (!probe.projectContextId || !probe.projectRootHash || !Array.isArray(probe.verifiedConversationIds) || probe.verifiedConversationIds.length < 2) errors.push("real host project context and conversation identity is incomplete");
27
- if (!Array.isArray(probe.verifiedHostOperations) || !requiredOperations.every((item) => probe.verifiedHostOperations.includes(item))) errors.push("seven real host operations are required");
28
- if (!Array.isArray(probe.verifiedSkillRunIds) || probe.verifiedSkillRunIds.length < 2) errors.push("at least two real Skill runs in the shared project context are required");
29
- if (!probe.crossConversationEventId) errors.push("verified cross-conversation event propagation is required");
30
- if (!probe.sensitiveScan || probe.sensitiveScan.status !== "pass" || probe.sensitiveScan.matches.length !== 0) errors.push("real host sensitive scan is not clean");
12
+ if (packageJson.name !== "@pm_zhousl/xinyun-ai-init" || packageJson.version !== "3.0.0") errors.push("package identity must be @pm_zhousl/xinyun-ai-init@3.0.0");
13
+ if (!fs.existsSync(evidencePath)) errors.push("v3 behavior evidence is missing");
14
+ if (fs.existsSync(evidencePath)) {
15
+ const evidence = JSON.parse(fs.readFileSync(evidencePath, "utf8"));
16
+ if (evidence.version !== "3.0.0" || evidence.executionModel !== "bundled-skill-runtime") errors.push("v3 evidence contract is incorrect");
17
+ if (evidence.readyEligible !== false || evidence.realHostVerified !== false) errors.push("unverified host behavior must remain explicitly unverified");
18
+ if (!evidence.sensitiveScan || evidence.sensitiveScan.status !== "pass" || evidence.sensitiveScan.matches.length !== 0) errors.push("sensitive scan is not clean");
31
19
  }
32
-
33
- if (errors.length > 0) {
20
+ if (errors.length) {
34
21
  errors.forEach((message) => console.error(`[xinyun-ai-init release gate] BLOCKED: ${message}`));
35
22
  process.exitCode = 2;
36
23
  return;
37
24
  }
38
- console.log(`[xinyun-ai-init release gate] PASS: ${packageJson.name}@${packageJson.version} is eligible for user-authorized publish.`);
25
+ console.log(`[xinyun-ai-init release gate] PASS: ${packageJson.name}@${packageJson.version} static release evidence is complete; user publish authorization remains separate.`);
39
26
  }
40
27
 
41
28
  main();
@@ -7,7 +7,7 @@ const zlib = require("zlib");
7
7
  const { spawnSync } = require("child_process");
8
8
 
9
9
  const root = path.resolve(__dirname, "..");
10
- const verifyScript = path.join(root, "scripts", "verify-v2-tarball.js");
10
+ const verifyScript = path.join(root, "scripts", "verify-tarball.js");
11
11
 
12
12
  function writeString(buffer, offset, length, value) {
13
13
  buffer.write(String(value), offset, Math.min(length, Buffer.byteLength(String(value))), "utf8");
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require("fs");
4
+ const os = require("os");
5
+ const path = require("path");
6
+ const { spawnSync } = require("child_process");
7
+
8
+ const root = path.resolve(__dirname, "..");
9
+ const runtime = path.join(root, "init", "xinyun-ai-init", "runtime", "route-skill.js");
10
+ const temp = fs.mkdtempSync(path.join(os.tmpdir(), "xinyun-ai-v3-"));
11
+ const factsPath = path.join(temp, "facts.json");
12
+ const facts = {
13
+ taskType: "product-major-version-development",
14
+ framework: "node",
15
+ riskTerms: ["publish", "token"],
16
+ permissionScope: ["control-plane-read", "control-plane-write", "business-code-write", "release-review", "shell-read"],
17
+ requiresConversationSync: true
18
+ };
19
+ fs.writeFileSync(factsPath, `${JSON.stringify(facts)}\n`, "utf8");
20
+ const result = spawnSync(process.execPath, [runtime, "--facts", factsPath], { encoding: "utf8" });
21
+ try {
22
+ if (result.status !== 0) throw new Error(result.stderr || "route command failed");
23
+ const route = JSON.parse(result.stdout);
24
+ const selected = route.selected.map((item) => item.skillId);
25
+ const required = ["task-analysis", "technical-design", "implementation", "verification", "security-review"];
26
+ const missing = required.filter((skillId) => !selected.includes(skillId));
27
+ if (missing.length) throw new Error(`missing selected skills: ${missing.join(",")}`);
28
+ if (selected.includes("project-owner") || selected.includes("role-session")) throw new Error("role route leaked");
29
+ console.log(`[PASS] deterministic-route:${selected.join(",")}`);
30
+ console.log("[PASS] route-fingerprint-present");
31
+ } finally {
32
+ fs.rmSync(temp, { recursive: true, force: true });
33
+ }
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require("fs");
4
+ const path = require("path");
5
+ const zlib = require("zlib");
6
+
7
+ function field(buffer, offset, length) {
8
+ return buffer.toString("utf8", offset, offset + length).replace(/\0.*$/, "").trim();
9
+ }
10
+
11
+ function fail(message, json) {
12
+ const result = { status: "error", checks: [{ actual: message }] };
13
+ if (json) process.stdout.write(`${JSON.stringify(result)}\n`);
14
+ else console.error(message);
15
+ process.exitCode = 2;
16
+ }
17
+
18
+ function main() {
19
+ const args = process.argv.slice(2);
20
+ const tarballIndex = args.indexOf("--tarball");
21
+ const tarball = tarballIndex >= 0 ? args[tarballIndex + 1] : null;
22
+ const json = args.includes("--json");
23
+ if (!tarball || !fs.existsSync(tarball)) return fail("Tarball is missing", json);
24
+ const data = zlib.gunzipSync(fs.readFileSync(path.resolve(tarball)));
25
+ for (let offset = 0; offset + 512 <= data.length; offset += 512) {
26
+ const header = data.subarray(offset, offset + 512);
27
+ if (header.every((value) => value === 0)) break;
28
+ const name = field(header, 0, 100);
29
+ const type = String.fromCharCode(header[156] || 48);
30
+ const link = field(header, 157, 100);
31
+ if (name.startsWith("/") || /^[A-Za-z]:[\\/]/.test(name) || name.includes("\\") || name.split("/").includes("..")) return fail(`Unsafe tarball entry: ${name}`, json);
32
+ if (type === "2" || type === "1") return fail(`Unsafe tar entry: ${name} (${type === "2" ? "symbolic" : "hard"} link)`, json);
33
+ const size = Number.parseInt(field(header, 124, 12), 8) || 0;
34
+ offset += Math.ceil(size / 512) * 512;
35
+ if (link) return fail(`Unsafe tarball entry link: ${name}`, json);
36
+ }
37
+ const result = { status: "ok", checks: [{ actual: "tarball entries are safe" }] };
38
+ if (json) process.stdout.write(`${JSON.stringify(result)}\n`);
39
+ else console.log("tarball entries are safe");
40
+ }
41
+
42
+ main();
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require("fs");
4
+ const path = require("path");
5
+
6
+ const root = path.resolve(__dirname, "..");
7
+ const initRoot = path.join(root, "init", "xinyun-ai-init");
8
+ const manifest = JSON.parse(fs.readFileSync(path.join(initRoot, "runtime-manifest.json"), "utf8"));
9
+ const checks = [];
10
+
11
+ function check(name, condition, detail = "") {
12
+ checks.push({ name, ok: Boolean(condition), detail });
13
+ }
14
+
15
+ function readJson(relative) {
16
+ return JSON.parse(fs.readFileSync(path.join(root, relative), "utf8"));
17
+ }
18
+
19
+ function walk(dir) {
20
+ const result = [];
21
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
22
+ const full = path.join(dir, entry.name);
23
+ if (entry.isDirectory()) result.push(...walk(full));
24
+ else result.push(full);
25
+ }
26
+ return result;
27
+ }
28
+
29
+ const packageJson = readJson("package.json");
30
+ const version = readJson("init/xinyun-ai-init/version.json");
31
+ const registry = readJson("init/xinyun-ai-init/skills/registry.json");
32
+ const runtimeManifest = readJson("init/xinyun-ai-init/runtime-manifest.json");
33
+
34
+ check("package-version", packageJson.version === "3.0.0", packageJson.version);
35
+ check("runtime-version", version.version === "3.0.0" && version.schemaVersion === "3");
36
+ check("runtime-model", version.executionModel === "bundled-skill-runtime");
37
+ check("manifest-files", runtimeManifest.runtimeVersion === "3.0.0" && runtimeManifest.files.length === 20);
38
+ check("manifest-files-exist", runtimeManifest.files.every((file) => fs.existsSync(path.join(initRoot, file))));
39
+ check("skill-count", registry.skills.length >= 8);
40
+ check("skill-identities", registry.skills.every((skill) => skill.skillId && skill.name && Number.isInteger(skill.order) && skill.triggers && skill.permissions && skill.tools));
41
+ check("stable-order", registry.skills.every((skill, index, list) => index === 0 || list[index - 1].order < skill.order));
42
+ check("no-role-routing", JSON.stringify(registry).toLowerCase().includes("roleid") === false && JSON.stringify(registry).toLowerCase().includes("allowedroles") === false);
43
+ check("legacy-runtime-removed", version.legacyRuntime === "removed");
44
+ check("cli-offline-path", fs.readFileSync(path.join(root, "bin", "xinyun-ai-init.js"), "utf8").includes("--offline") && fs.readFileSync(path.join(root, "bin", "xinyun-ai-init.js"), "utf8").includes("cacheFresh"));
45
+
46
+ for (const file of walk(initRoot)) {
47
+ const relative = path.relative(initRoot, file).replace(/\\/g, "/");
48
+ if (file.endsWith(".json")) {
49
+ try {
50
+ JSON.parse(fs.readFileSync(file, "utf8"));
51
+ check(`json:${relative}`, true);
52
+ } catch (error) {
53
+ check(`json:${relative}`, false, error.message);
54
+ }
55
+ }
56
+ if (file.endsWith(".md")) {
57
+ const fenceCount = (fs.readFileSync(file, "utf8").match(/```/g) || []).length;
58
+ check(`markdown:${relative}`, fenceCount % 2 === 0, "unbalanced code fence");
59
+ }
60
+ }
61
+
62
+ const legacyPrefixes = ["templates/team/", "templates/role-", "templates/role-session", "templates/provider-session", "rules/v1.", "rules/v2.0.0-single-session"];
63
+ const legacyFiles = walk(initRoot).map((file) => path.relative(initRoot, file).replace(/\\/g, "/"))
64
+ .filter((file) => legacyPrefixes.some((prefix) => file.startsWith(prefix)));
65
+ check("legacy-files-absent", legacyFiles.length === 0, legacyFiles.join(", "));
66
+
67
+ for (const item of checks) console.log(`[${item.ok ? "PASS" : "FAIL"}] ${item.name}${item.ok || !item.detail ? "" : `: ${item.detail}`}`);
68
+ const failed = checks.filter((item) => !item.ok);
69
+ console.log(`[v3 package] ${checks.length - failed.length}/${checks.length} checks passed`);
70
+ if (failed.length) process.exitCode = 1;
@@ -0,0 +1,25 @@
1
+ {
2
+ "schemaVersion": 3,
3
+ "version": "3.0.0",
4
+ "evidenceType": "contract-regression",
5
+ "executionMode": "static-package",
6
+ "executionModel": "bundled-skill-runtime",
7
+ "realHostVerified": false,
8
+ "readyEligible": false,
9
+ "publishBlocked": false,
10
+ "unverifiedScope": ["real host Skill execution", "real target-project cleanup", "real concurrent route writes"],
11
+ "scenarios": [
12
+ {"scenarioId": 601, "name": "bundled concrete Skills", "result": "contract-passed"},
13
+ {"scenarioId": 602, "name": "deterministic task-fact routing", "result": "contract-passed"},
14
+ {"scenarioId": 603, "name": "role-free routing", "result": "contract-passed"},
15
+ {"scenarioId": 604, "name": "minimal runtime manifest", "result": "contract-passed"},
16
+ {"scenarioId": 605, "name": "offline and cached version check", "result": "contract-passed"},
17
+ {"scenarioId": 606, "name": "incremental materialization", "result": "contract-passed"},
18
+ {"scenarioId": 607, "name": "user file conflict preservation", "result": "contract-passed"},
19
+ {"scenarioId": 608, "name": "v3 migration preview", "result": "contract-passed"},
20
+ {"scenarioId": 609, "name": "v3 legacy cleanup apply gate", "result": "contract-passed"},
21
+ {"scenarioId": 610, "name": "authorization boundary", "result": "contract-passed"}
22
+ ],
23
+ "sensitiveScan": {"status": "pass", "matches": []},
24
+ "recordedAt": "2026-10-13T00:00:00.000Z"
25
+ }
@@ -0,0 +1,41 @@
1
+ # v3.0.0 Skill Runtime 场景
2
+
3
+ ## 601. Bundled concrete Skills
4
+
5
+ registry 必须包含项目接管、需求分析、技术设计、实现、验证、安全审查、发布审查和交接同步。
6
+
7
+ ## 602. Deterministic task-fact routing
8
+
9
+ 相同 task facts 和 registry 版本必须产生相同 route fingerprint、选择结果和顺序。
10
+
11
+ ## 603. Role-free routing
12
+
13
+ 路由输入和 registry 不得包含 `roleId`、角色名称或角色优先级。
14
+
15
+ ## 604. Minimal runtime manifest
16
+
17
+ 初始化 manifest 只列出 v3 核心规则、路由器、迁移器、registry 和最小控制面模板。
18
+
19
+ ## 605. Offline and cached version check
20
+
21
+ `--offline` 或有效 TTL 缓存不得访问 npm registry。
22
+
23
+ ## 606. Incremental materialization
24
+
25
+ 重复执行只更新源哈希变化的托管文件,不递归删除整个初始化目录。
26
+
27
+ ## 607. User file conflict preservation
28
+
29
+ 用户修改过的托管文件默认保留并记录 `conflict`,不得静默覆盖。
30
+
31
+ ## 608. v3 migration preview
32
+
33
+ 没有 `--apply` 时只生成合并和清理预览,不删除旧目录。
34
+
35
+ ## 609. v3 legacy cleanup apply gate
36
+
37
+ 只有清单稳定且明确提供 `--apply` 时才删除已知旧运行目录。
38
+
39
+ ## 610. Authorization boundary
40
+
41
+ 业务修改、数据库、Git 和 npm 发布仍需要独立授权。
@@ -1 +0,0 @@
1
- 请执行 `npx --yes @pm_zhousl/xinyun-ai-init@latest --force`,然后读取 `xinyun-ai-init/README.md`,按其中规则初始化或升级当前项目。
@@ -1,43 +0,0 @@
1
- # v2 项目共享上下文与跨对话协调
2
-
3
- `xinyun-ai/coordination/` 是多个对话共享的项目控制面,不是业务代码目录。所有事实、任务和结果都属于同一个 `projectContextId`。
4
-
5
- ## 单写者事件流
6
-
7
- - 每个对话拥有独立目录 `streams/<conversationBindingId>/`。
8
- - 对话先写不可变事件 `events/<eventId>.json`,校验哈希链后原子替换自己的 `head.json`。
9
- - 一个对话不得写另一个对话的流,也不得让多个对话追加同一个 JSON 数组。
10
- - 单流 `streamSequence` 严格递增;跨流顺序由消费者游标分别记录,不依赖机器时间形成全局顺序。
11
-
12
- ## 交互时增量同步
13
-
14
- 收到用户消息、计划前、写入前、验证前和交付前执行同步检查:
15
-
16
- 1. 读取对话注册表和所有活动流 head。
17
- 2. 与 `cursors/<consumerConversationId>.json` 的 `streamPositions` 比较。
18
- 3. 没有新序号时静默继续。
19
- 4. 有新序号时读取新增事件,根据受影响任务、域和路径刷新最小事实集合。
20
- 5. 校验事件链、项目身份、任务状态和冲突后更新游标。
21
-
22
- head 倒退、事件缺失、哈希断裂、跨项目事件或游标超前时进入 `recovery-required` 或 `blocked`。
23
-
24
- ## 共享事实与台账
25
-
26
- - `project-facts.json` 是可追溯事实物化视图,事实来源必须引用事件和证据。
27
- - `change-ledger.json` 是变更物化视图,不是多写者追加日志;由已校验事件事务化更新。
28
- - 有长期价值的任务、决策、修改、Skill、验证、授权、冲突和交接必须写回。
29
- - 临时推理、闲聊、未确认猜测和敏感信息不得进入共享流。
30
-
31
- ## 任务租约和冲突
32
-
33
- - 写入前创建 `leases/<leaseId>.json`,声明 `taskId`、`ownerConversationId`、`targetKeys` 和 `baselineHashes`。
34
- - 目标键格式至少包括 `file:`、`api:`、`db:`、`component:` 和 `flow:`。
35
- - 不同目标允许并行;活动租约目标重叠或基线变化时记录 `conflict-records/<conflictId>.json` 并阻断写入。
36
- - 租约过期后必须检查事件、文件和事务,不能直接假定工作未发生。
37
- - 冲突不得由单个对话静默裁决或覆盖;数据库、API、业务流程和跨端冲突继续要求用户确认。
38
-
39
- ## 状态与恢复
40
-
41
- - `taskStatus`、`changeStatus`、`conflictStatus`、`leaseStatus` 和 `cursorStatus` 分域记录,不能互相代替。
42
- - 事务失败、部分写入或游标无法恢复时保留证据并进入 `recovery-required`。
43
- - 最终交付前必须再次同步,确保没有相关未消费事件、活动冲突或变化后的基线。
@@ -1,100 +0,0 @@
1
- # 目录自完善规则
2
-
3
- ## v2.0.0 当前目录规则
4
-
5
- 正式任务触发能力补齐时,只在目标项目 `xinyun-ai/` 中更新普通任务、任务图、共享项目上下文、对话绑定、事件流、增量游标、Skill、协调和交接目录。新安装和新任务不得补建 `team/`、角色任务或角色会话目录。旧目录只在迁移清单中登记为 `legacy/read-only`。
6
-
7
- 首次初始化只创建最小 `xinyun-ai/` 骨架。后续 AI 会话中,如果用户需求、问题排查或项目理解触发了某个端、模块或能力,AI 应自动在 `xinyun-ai/` 下补齐对应目录和基础说明文件。
8
-
9
- 规则:
10
-
11
- - 只补齐当前任务涉及的目录,不为了完整创建所有目录。
12
- - 只允许补齐 `xinyun-ai/` 内的文档、索引和记录,不修改业务代码。
13
- - 新目录创建后必须更新 `manifest.json` 和 `index/project-index.json`。
14
- - 自完善内容必须标注来源、判断依据和状态:`推断`、`已确认`、`待确认`。
15
- - 如果自完善会改变正式规则、开发流程或代码修改策略,必须先输出方案并等待用户确认。
16
- - `xinyun-ai/global-review/` 只在新功能、大改、重构、跨端改动、目录 / 规则 / 索引调整、数据库 / API / UI 联动变更或多会话交接复杂任务中按需创建。
17
- - 首次极速初始化不强制创建 `xinyun-ai/global-review/`。
18
- - 创建或更新全局审视后,必须同步 `xinyun-ai/global-review/index.json` 和 `xinyun-ai/index/project-index.json`。
19
- - 全局审视最小字段包括:`reviewId`、触发原因、关联任务、影响层、已确认内容、推断内容、待确认内容、风险点、后续动作、创建时间、更新时间。
20
- - 识别到端口框架线索时,可按需补齐 `workstreams/<端>/`,记录 ThinkPHP / uni-app / 微信小程序识别证据、证据类型、发现预算、覆盖范围、`未在项目中发现` 或 `状态未知`。
21
- - 识别到多仓库 Git 结构时,可按需补齐端口 Git 只读索引,记录 `repoRoot`、`path`、`workstream`、`kind`、`parentRepo`、`branch`、`remote`、`status`、`evidence`,不得执行 Git 写操作。
22
- - 触发字段影响审视时,可按需补齐字段审视记录,记录字段分类、检索根目录、排除项、CodeGraph 状态、证据、可能遗漏位置、兼容方案和确认状态。
23
- - 首次初始化必须补齐 `xinyun-ai/team/`;升级时发现团队能力缺失,可按方案补齐团队控制文件。
24
- - 团队目录补齐后必须同步 `manifest.json` 和 `index/project-index.json` 的 team 路径注册。
25
- - `xinyun-ai/team/**` 属于控制文件,计入实际更新记录,但与业务代码修改分栏统计。
26
- - 超出预计目录时必须设置 `status=paused`、`pauseReason=out-of-scope`,不得使用 `paused-out-of-scope`。
27
- - v1.6 初始化或升级触发后,必须补齐任务控制目录和文件:`xinyun-ai/tasks/`、`xinyun-ai/tasks/.idempotency/`、`xinyun-ai/init-result.json`、`xinyun-ai/task-lock.json`、`xinyun-ai/index/managed-baseline.json`、`xinyun-ai/index/capabilities.json`。
28
- - `manifest.json` 必须登记 `tasking.currentTask`、`tasking.tasksDirectory`、`tasking.idempotencyDirectory`、`tasking.initResult`、`tasking.taskLock`、`tasking.managedBaseline`、`tasking.capabilities`。
29
- - `index/project-index.json` 必须登记同名 `tasking` 路径、统一状态机枚举和 `statusSource=current-task.md`。
30
- - 自完善写控制文件时必须使用临时文件完整写入和原子重命名;写入失败时保留原文件,步骤标记为 `failed`。
31
- - 受管理文件首次写入时记录 `baselineHash`、`templateHash`、`lastAppliedVersion` 和 `managedBy`;文件缺失、不可读、无基线或哈希无法计算时标注 `unknown`,不得覆盖。
32
- - 能力检测记录可按需补齐到 `xinyun-ai/index/capabilities.json`,必须包含 `capabilityId`、`detectionMethod`、`status`、`evidence`、`fallbackPlan`、`unverifiedScope` 和 `checkedAt`。
33
- - 补齐任何 Markdown、JSON 或交接记录前必须先脱敏;无法确认是否敏感时按敏感处理并记录 `sensitiveScanStatus=unknown`。
34
- ## v1.7 按需目录补齐
35
-
36
- - 框架专项深化触发后,按需创建 `xinyun-ai/frameworks/`、`xinyun-ai/frameworks/framework-profile.md`、`xinyun-ai/frameworks/framework-profile.json`。
37
- - HTML 迁移准备触发后,按需创建 `xinyun-ai/migrations/html-to-client/`、`migration-scope.md`、`compatibility-matrix.md`、`route-map.md`、`asset-map.md`、`pilot-plan.md`、`open-issues.md`、`migration-record.json`。
38
- - `framework-profile.json` 和 `migration-record.json` 创建后必须确认 JSON 可解析,并同步 `xinyun-ai/index/project-index.json`。
39
- - 首次极速初始化不强制创建上述目录;普通咨询也不创建迁移或 profile 记录。
40
-
41
- ## v1.12 接管恢复目录
42
-
43
- When takeover initialization is authorized, create `host-preflight.json`, `index/initialization-recovery.json`, `sessions/manual-bindings.json`, `index/shared-project-snapshot.json`, and `index/initialization-timing.json` under `xinyun-ai/`. Use atomic writes and preserve blocked state on host or permission failure.
44
-
45
- ## v1.7.1 任务树、归档与 CodeGraph 目录
46
-
47
- - 初始化或升级流程必须补齐 `xinyun-ai/tasks/task-index.json`、`xinyun-ai/tasks/archive/`、`xinyun-ai/tasks/.archive-transactions/`、`xinyun-ai/tasks/.archive-tmp/`。
48
- - 主任务文件路径为 `xinyun-ai/tasks/<taskId>.md`,角色子任务路径为 `xinyun-ai/tasks/<taskId>/subtasks/<roleTaskId>.md`。
49
- - `manifest.json` 和 `xinyun-ai/index/project-index.json` 必须登记 `taskTree`、`tasking.taskIndex`、`tasking.archiveDirectory`、`tasking.archiveTransactionsDirectory`。
50
- - 归档事务文件必须使用 `xinyun-ai/tasks/.archive-transactions/<archiveTransactionId>.json`,不得放入业务目录。
51
- - `.codegraph/` 是工具控制目录,属于一句话初始化授权范围;CodeGraph 状态源为 `manifest.json`,其他控制文件只引用同一 `codeGraphRecordId`。
52
- - 普通咨询不创建完整主任务、五角色任务树或触发 CodeGraph 初始化。
53
-
54
- ## v1.7.2 任务可见性目录
55
-
56
- - 需要补建角色后续任务时创建 `xinyun-ai/tasks/role-execution/`,不得把 `role-execution` 文件写入业务目录。
57
- - 同步校验 `task-index.json`、`current-task.md`、`manifest.json` 和 `project-index.json` 的角色执行任务路径与索引。
58
- - 活动角色任务不可执行时仍保留在 `activeTaskIds`;只有活动列表为空才允许 current-task 为 idle/null。
59
- - 逐角色临时文件和索引必须原子写入;发现中断、冲突或写入失败时保留恢复记录,不清空活动任务。
60
-
61
- ## v1.7.3 角色会话绑定目录
62
-
63
- - Codex 角色会话绑定触发后,按需补齐 `xinyun-ai/sessions/`、`xinyun-ai/sessions/roles/` 和 `xinyun-ai/sessions/role-session-bindings.json`。
64
- - 绑定模板来源固定为 `xinyun-ai-init/templates/role-session-binding.template.json`。
65
- - `manifest.json`、`project-index.json` 和 `task-index.json` 必须登记 `roleSessions`、`roleSessionBindingIds`、`roleSessionBindings`、`provider=codex` 和 `sessionStatus` 枚举。
66
- - 绑定目录只保存 Codex 宿主返回的真实 `sessionId` 摘要、onboarding 状态、失败原因和 audit,不保存伪造 sessionId。
67
- - 宿主不支持创建子会话时,仍可补齐本地目录和降级记录,状态使用 `local-degraded-no-fake-session-id`。
68
- - v1.12.1 provider 绑定记录固定写入 `xinyun-ai/sessions/provider-session-bindings.json`,模板来源为 `xinyun-ai-init/templates/provider-session-binding.template.json`。只有宿主 canonical `providerSessionId`、身份/交互证据和独占占用均通过时才可绑定;未知或普通线程 ID 保持 blocked/pending。
69
- - v1.13.0 按需补齐 `provider-adapter.json`、`manual-session-recovery.json` 和 `index/initialization-change-report.json`;宿主预检失败时只生成恢复引导和阻断记录,不先执行大规模 CodeGraph 扫描。
70
-
71
- ## v1.8 按需目录
72
-
73
- - 多会话协调任务按需补齐 `xinyun-ai/coordination/`、`contract-snapshots/`、`conflict-records/` 和 `.transactions/`。
74
- - Skill 路由任务按需补齐 `xinyun-ai/skills/registry.json`、`assignments.json` 和 `usage-records/`;分配字段必须是 `assignmentStatus`。
75
- - 前端审计按需补齐 `xinyun-ai/frontend-audits/`;临时程序员任务按需补齐 `xinyun-ai/sessions/temporary/`。
76
- - 普通咨询、首次极速初始化和不涉及这些能力的任务不创建空目录。目录补齐只修改 AI 控制面,不修改业务代码。
77
- - 普通咨询、首次极速初始化和不涉及这些能力的任务不创建空目录。目录补齐只修改 AI 控制面,不修改业务代码。
78
-
79
- ## v1.10 项目 AI 接管目录
80
-
81
- - `xinyun-ai/project-status.json`
82
- - `xinyun-ai/preflight-report.json`
83
- - `xinyun-ai/onboarding-report.json`
84
- - `xinyun-ai/host-capabilities.json`
85
- - `xinyun-ai/index/takeover-baseline.json`
86
- - `xinyun-ai/index/control-plane-index.json`
87
- - `xinyun-ai/events/events.jsonl`
88
-
89
- 接管门禁目录必须在业务代码开发前创建或明确记录为 blocked/partial;首次 CLI 仍只创建 `xinyun-ai-init/`,不会直接创建 `xinyun-ai/`。
90
-
91
- ## v1.9 按需目录
92
-
93
- - `xinyun-ai/project-identity.json`
94
- - `xinyun-ai/sessions/session-candidates.json`
95
- - `xinyun-ai/technical-landscape.json`
96
- - `xinyun-ai/packets/requirement-packet.json`
97
- - `xinyun-ai/packets/technical-impact-packet.json`
98
- - `xinyun-ai/database/authorization.json`
99
-
100
- 小改和普通咨询不强制创建技术全景或 packet。创建后同步 manifest、project-index、current-task 和任务引用;只登记当前项目身份,不复制其他项目会话。
@@ -1,56 +0,0 @@
1
- # 框架适配规则
2
-
3
- 本目录用于按端和框架存放轻量识别规则。
4
-
5
- ## 目录约定
6
-
7
- ```md
8
- frameworks/backend/<language>/<framework>.md
9
- frameworks/frontend/<framework>.md
10
- ```
11
-
12
- 首期只集成:
13
-
14
- - `backend/php/thinkphp.md`
15
- - `frontend/uni-app.md`
16
- - `frontend/wechat-miniprogram.md`
17
-
18
- ## 执行边界
19
-
20
- - 框架适配只用于帮助 AI 定位入口、配置、页面 / 路由、请求封装线索。
21
- - 不做深度扫描。
22
- - 不默认创建大量框架说明文件。
23
- - 框架识别应结合关键配置、入口文件、目录结构、依赖或代码特征交叉判断。
24
- - 只发现单一线索时,标注为 `推断` 或 `待确认`,不得直接当作已确认框架。
25
- - 首次初始化只查关键文件、配置文件、入口文件和少量抽样文件。
26
- - 不为确认框架做全量 grep 或追完整调用链。
27
- - 如需进一步确认,放到后续任务按需补齐。
28
- - 未识别到对应框架时,不强行套用该框架规则。
29
- - 多端项目应分别说明每个端口的框架、入口、启动线索和请求链路线索。
30
- - 每个端口从端口根目录向下最多发现 3 层目录,最多读取 20 个关键文件。
31
- - 正向识别必须列出证据路径和证据类型,证据类型包括依赖、配置、入口、目录结构和代码特征。
32
- - 预算内无识别证据时标注 `未在项目中发现`。
33
- - 权限不足、路径不可读或超过预算时标注 `状态未知`,同时写明 `覆盖范围:部分` 和未检查范围。
34
- - 单一线索只能标注 `推断` 或 `待确认`。
35
- - 不把 uni-app 规则套到原生微信小程序,也不把微信小程序规则套到 uni-app。
36
-
37
- ## 输出字段
38
-
39
- - workstream
40
- - 框架候选
41
- - 识别状态:已确认 / 推断 / 待确认 / 未在项目中发现 / 状态未知
42
- - 覆盖范围:完整 / 部分
43
- - 发现预算:目录深度 3 层、关键文件 20 个
44
- - 证据:路径、证据类型、命中内容摘要
45
- - 未检查范围
46
- ## v1.7 技术栈 profile
47
-
48
- - `language`、`runtime`、`platform`、`framework` 必须独立记录,不能把语言或运行时直接当框架。
49
- - `frameworkStatus=confirmed/inferred/not-found/unknown/detected-unsupported`。
50
- - `moduleStatus=loaded/not-loaded`。
51
- - `activation=loaded/not-loaded`。
52
- - 只有 `frameworkStatus=confirmed` 且存在匹配模块时,才允许 `moduleStatus=loaded` 和 `activation=loaded`。
53
- - v1.4 轻量识别预算保留为 3 层目录、20 个关键文件。
54
- - v1.7 深化预算:5 层目录、80 个关键文件、100 条证据。
55
- - 超预算、权限不足、路径不可读或工具失败时输出 `unknown`、`coverage=partial` 和 `unverifiedScope`,不得伪造 confirmed。
56
- - 按需生成 `framework-profile.md` 和 `framework-profile.json`,二者状态和证据必须一致。
@@ -1,42 +0,0 @@
1
- # ThinkPHP 轻量识别规则
2
-
3
- ## 识别线索
4
-
5
- - `composer.json` 中存在 `topthink/framework`
6
- - 存在 `public/index.php` 或 `think`
7
- - 存在 `app/`、`config/`、`route/`
8
- - 存在 `app/*/controller`、`app/*/model`、`app/*/service`
9
- - 关键文件或少量抽样文件中出现 `think\facade`、`think\Request`、`think\Response`
10
-
11
- ## 接手重点
12
-
13
- 1. 应用入口:`public/index.php`、`think`
14
- 2. 路由位置:`route/`、`config/route.php`、注解路由线索
15
- 3. 模块结构:`app/<module>/controller`、`model`、`service`、`validate`、`middleware`
16
- 4. 配置位置:`config/`、`.env`
17
- 5. 公共前置逻辑:`middleware`、控制器基类、公共调用位置
18
- 6. 命令任务:`app/command`、`config/console.php`
19
- 7. 异常处理:`app/ExceptionHandle.php` 或项目自定义异常处理
20
- 8. 返回结构:控制器统一响应方法、JSON 返回规范
21
-
22
- ## 边界
23
-
24
- - 只做轻量识别,不追完整调用链。
25
- - 识别时应结合依赖、入口文件、目录结构和代码特征交叉判断。
26
- - 只发现单一线索时,标注为 `推断` 或 `待确认`,不得直接当作已确认 ThinkPHP 项目。
27
- - 首次初始化不为确认 ThinkPHP 做全量 grep。
28
- - 不把 ThinkPHP 规则套到其他 PHP 框架。
29
- - 不默认生成大量 ThinkPHP 说明文件。
30
- - 每个端口从端口根目录向下最多发现 3 层目录,最多读取 20 个关键文件。
31
- - 正向识别必须输出证据路径和证据类型:依赖、入口、目录结构、配置或代码特征。
32
- - 预算内无 ThinkPHP 证据时标注 `未在项目中发现`。
33
- - 超预算、权限不足或路径不可读时标注 `状态未知` 和 `覆盖范围:部分`,并列出未检查范围。
34
- - 单一线索不能直接确认 ThinkPHP,只能标注 `推断` 或 `待确认`。
35
- ## v1.7 ThinkPHP 深化模块
36
-
37
- - ThinkPHP 深化模块只在 `frameworkStatus=confirmed` 且存在 ThinkPHP 匹配证据时启用。
38
- - 启用后 `moduleStatus=loaded`、`activation=loaded`、`moduleId=backend/php/thinkphp`。
39
- - 未确认 ThinkPHP、仅发现 PHP/runtime、或已确认其他框架时,必须 `moduleStatus=not-loaded`、`activation=not-loaded`,不得误套 ThinkPHP。
40
- - v1.7 深化预算:5 层目录、80 个关键文件、100 条证据。
41
- - 证据类型至少覆盖可用范围内的依赖、入口、路由、Controller、Request/Validate、Service、Model/ORM、Middleware、队列、配置、测试。
42
- - 输出 `framework-profile.md` / `framework-profile.json` 时必须列出 coverage、unverifiedScope、checkedAt 和无法确认的范围。
@@ -1,36 +0,0 @@
1
- # uni-app 轻量识别规则
2
-
3
- ## 识别线索
4
-
5
- - `pages.json`
6
- - `manifest.json`
7
- - `App.vue`
8
- - `main.js` / `main.ts`
9
- - `pages/`、`components/`、`static/`
10
- - `package.json` 中出现 `@dcloudio`、`uni-app`、`vite-plugin-uni`
11
-
12
- ## 接手重点
13
-
14
- 1. 应用入口:`main.js` / `main.ts`、`App.vue`
15
- 2. 页面配置:`pages.json`
16
- 3. 平台配置:`manifest.json`
17
- 4. 页面目录:`pages/`
18
- 5. 分包配置:`subPackages`
19
- 6. 组件目录:`components/`
20
- 7. 静态资源:`static/`
21
- 8. 请求封装:常见 `utils/request`、`common/request`、`api/`
22
- 9. 登录态与缓存:`uni.getStorageSync`、`uni.setStorageSync`
23
- 10. 条件编译:`#ifdef`、`#ifndef`
24
-
25
- ## 边界
26
-
27
- - 只做轻量识别,不默认创建大量框架说明文件。
28
- - 识别时应结合 `pages.json`、`manifest.json`、入口文件、目录结构和依赖交叉判断。
29
- - 只发现单一线索时,标注为 `推断` 或 `待确认`,不得直接当作已确认 uni-app 项目。
30
- - 首次初始化不为确认 uni-app 做全量 grep。
31
- - 不把 uni-app 规则套到原生微信小程序。
32
- - 每个端口从端口根目录向下最多发现 3 层目录,最多读取 20 个关键文件。
33
- - 正向识别必须输出证据路径和证据类型:依赖、配置、入口、目录结构或代码特征。
34
- - 预算内无 uni-app 证据时标注 `未在项目中发现`。
35
- - 超预算、权限不足或路径不可读时标注 `状态未知` 和 `覆盖范围:部分`,并列出未检查范围。
36
- - 不把原生微信小程序规则反向套到 uni-app。
@@ -1,36 +0,0 @@
1
- # 微信小程序轻量识别规则
2
-
3
- ## 识别线索
4
-
5
- - `app.json`
6
- - `app.js` / `app.ts`
7
- - `app.wxss`
8
- - 关键页面或少量抽样页面包含 `.wxml`、`.wxss`、`.js` / `.ts`、`.json`
9
- - `project.config.json`
10
- - `sitemap.json`
11
-
12
- ## 接手重点
13
-
14
- 1. 应用入口:`app.js` / `app.ts`
15
- 2. 全局配置:`app.json`
16
- 3. 页面路径:`pages`
17
- 4. 分包配置:`subpackages` / `subPackages`
18
- 5. 页面结构:`.wxml`
19
- 6. 页面样式:`.wxss`
20
- 7. 页面逻辑:`.js` / `.ts`
21
- 8. 组件:`components/`
22
- 9. 请求封装:`wx.request` 或项目封装
23
- 10. 登录流程:`wx.login`、用户信息获取、token 缓存
24
-
25
- ## 边界
26
-
27
- - 只做轻量识别,不默认创建大量框架说明文件。
28
- - 识别时应结合 `app.json`、入口文件、页面结构、项目配置和目录结构交叉判断。
29
- - 只发现单一线索时,标注为 `推断` 或 `待确认`,不得直接当作已确认微信小程序项目。
30
- - 首次初始化不为确认微信小程序做全量 grep。
31
- - 不把微信小程序规则套到 uni-app。
32
- - 每个端口从端口根目录向下最多发现 3 层目录,最多读取 20 个关键文件。
33
- - 正向识别必须输出证据路径和证据类型:配置、入口、页面结构、目录结构或代码特征。
34
- - 预算内无微信小程序证据时标注 `未在项目中发现`。
35
- - 超预算、权限不足或路径不可读时标注 `状态未知` 和 `覆盖范围:部分`,并列出未检查范围。
36
- - 不把 uni-app 规则反向套到原生微信小程序。
@@ -1,9 +0,0 @@
1
- # v1.8-C 前端耦合审计与渐进式组件化
2
-
3
- 适用微信小程序、uni-app 和 HTML。先审计,再决定是否改造;不整站重写,不默认更换 UI 框架,不自动把 HTML 转成小程序或 uni-app。
4
-
5
- 审计记录必须包含页面/组件路径、平台、框架、`couplingType`、props、events、slots、状态、API、路由、业务流程依赖、`baselineHash`、`decision`、`status`、`coverage`、`evidence` 和 `unverifiedScope`。`couplingType` 使用 `template-style/state-view/api-page/route-page/business-page/cross-platform/shared-component/unknown`。
6
-
7
- 审计状态使用 `not-started/assessing/partial/completed/blocked/unknown`;处理决定使用 `audit-only/refactor-now/defer/requires-confirmation/out-of-scope`;覆盖使用 `full/partial/unknown`。这些是审计记录的字段,不得与 `taskStatus`、`changeStatus` 或 `conflictStatus` 混用。
8
-
9
- `audit-only` 必须零代码 diff。`refactor-now` 必须先有 `planId`、`userConfirmationId`、`permittedPaths`,并保留前后哈希、diff 证据和测试证据;单页面或单组件试点也必须遵守确认门禁。预算超限、权限失败或依赖未知只能输出 `partial/unknown` 和未验证范围,不能宣称完整审计。