claudeos-core 2.4.4 → 2.5.1

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 (49) hide show
  1. package/CHANGELOG.md +125 -0
  2. package/README.de.md +12 -10
  3. package/README.es.md +12 -10
  4. package/README.fr.md +12 -10
  5. package/README.hi.md +12 -10
  6. package/README.ja.md +12 -10
  7. package/README.ko.md +12 -10
  8. package/README.md +12 -10
  9. package/README.ru.md +12 -10
  10. package/README.vi.md +12 -10
  11. package/README.zh-CN.md +12 -10
  12. package/bin/commands/init.js +121 -24
  13. package/bin/commands/lint.js +2 -0
  14. package/bin/commands/memory.js +10 -3
  15. package/content-validator/index.js +82 -13
  16. package/lib/env-parser.js +98 -12
  17. package/lib/memory-scaffold.js +35 -16
  18. package/manifest-generator/index.js +15 -4
  19. package/package.json +92 -92
  20. package/pass-json-validator/index.js +1 -1
  21. package/pass-prompts/templates/angular/pass3.md +2 -1
  22. package/pass-prompts/templates/common/claude-md-scaffold.md +1 -1
  23. package/pass-prompts/templates/common/pass3a-facts.md +11 -9
  24. package/pass-prompts/templates/common/pass4.md +3 -3
  25. package/pass-prompts/templates/java-spring/pass1.md +10 -2
  26. package/pass-prompts/templates/java-spring/pass3.md +5 -4
  27. package/pass-prompts/templates/kotlin-spring/pass3.md +2 -2
  28. package/pass-prompts/templates/node-express/pass3.md +1 -1
  29. package/pass-prompts/templates/node-fastify/pass3.md +1 -0
  30. package/pass-prompts/templates/node-nestjs/pass3.md +1 -0
  31. package/pass-prompts/templates/node-nextjs/pass3.md +1 -1
  32. package/pass-prompts/templates/node-vite/pass3.md +1 -0
  33. package/pass-prompts/templates/python-django/pass3.md +1 -1
  34. package/pass-prompts/templates/python-fastapi/pass3.md +1 -1
  35. package/pass-prompts/templates/python-flask/pass3.md +1 -0
  36. package/pass-prompts/templates/vue-nuxt/pass3.md +1 -0
  37. package/plan-installer/domain-grouper.js +4 -1
  38. package/plan-installer/index.js +26 -7
  39. package/plan-installer/jvm-detect.js +562 -0
  40. package/plan-installer/pass3-context-builder.js +10 -0
  41. package/plan-installer/prompt-generator.js +18 -2
  42. package/plan-installer/scanners/scan-frontend.js +67 -6
  43. package/plan-installer/scanners/scan-java.js +214 -15
  44. package/plan-installer/scanners/scan-kotlin.js +68 -3
  45. package/plan-installer/scanners/scan-node.js +115 -0
  46. package/plan-installer/scanners/scan-python.js +56 -0
  47. package/plan-installer/source-paths.js +61 -0
  48. package/plan-installer/stack-detector.js +726 -51
  49. package/plan-installer/structure-scanner.js +15 -4
@@ -17,6 +17,7 @@ const { scanKotlinDomains, resolveSharedQueryDomains } = require("./scanners/sca
17
17
  const { scanNodeDomains } = require("./scanners/scan-node");
18
18
  const { scanPythonDomains } = require("./scanners/scan-python");
19
19
  const { scanFrontendDomains, countFrontendStats } = require("./scanners/scan-frontend");
20
+ const path = require("path");
20
21
 
21
22
  async function scanStructure(stack, ROOT) {
22
23
  let backendDomains = [];
@@ -36,22 +37,32 @@ async function scanStructure(stack, ROOT) {
36
37
  if (r.rootPackage) rootPackage = r.rootPackage;
37
38
  }
38
39
 
39
- if ((stack.language === "typescript" || stack.language === "javascript") && stack.framework && stack.framework !== "vite") {
40
+ // v2.5.0 dispatch is framework-aware for Python. A Django/FastAPI/Flask
41
+ // repo may carry a package.json (tailwind/postcss tooling, or a SPA in a
42
+ // sub-directory) that sets `language` to typescript/javascript; the backend
43
+ // is still Python and must be scanned by the Python scanner, never by the
44
+ // Node scanner.
45
+ const PY_FRAMEWORKS = ["django", "fastapi", "flask"];
46
+ const isPythonBackend = stack.language === "python" || PY_FRAMEWORKS.includes(stack.framework);
47
+
48
+ if ((stack.language === "typescript" || stack.language === "javascript") && stack.framework && stack.framework !== "vite" && !isPythonBackend) {
40
49
  const r = await scanNodeDomains(stack, ROOT);
41
50
  backendDomains.push(...r.backendDomains);
42
51
  }
43
52
 
44
- if (stack.language === "python") {
53
+ if (isPythonBackend) {
45
54
  const r = await scanPythonDomains(stack, ROOT);
46
55
  backendDomains.push(...r.backendDomains);
47
56
  }
48
57
 
49
58
  // ── Frontend scanner ──
50
- const fe = await scanFrontendDomains(stack, ROOT);
59
+ // v2.5.0: when the SPA lives in frontend/ (stack.frontendRoot), scan there.
60
+ const FE_ROOT = stack.frontendRoot ? path.join(ROOT, stack.frontendRoot) : ROOT;
61
+ const fe = await scanFrontendDomains(stack, FE_ROOT, { projectRoot: ROOT });
51
62
  frontendDomains.push(...fe.frontendDomains);
52
63
 
53
64
  // ── Frontend stats ──
54
- const frontend = await countFrontendStats(stack, ROOT);
65
+ const frontend = await countFrontendStats(stack, FE_ROOT);
55
66
 
56
67
  // ── Aggregate ──
57
68
  const allDomains = [