cohorte 3.0.0-dev.0 → 3.0.0-dev.2

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 (53) hide show
  1. package/assets/manifest.json +4 -4
  2. package/assets/schemas/reconcile-plan.schema.json +1 -2
  3. package/dist/agent-host.mjs +2142 -5
  4. package/dist/agent-host.mjs.map +1 -1
  5. package/dist/bundle-manifest.json +38 -36
  6. package/dist/chunks/{auth-D8rCVY33.mjs → auth-ybswxUPK.mjs} +54 -2
  7. package/dist/chunks/auth-ybswxUPK.mjs.map +1 -0
  8. package/dist/chunks/{brainstorm-CU10T1tm.mjs → brainstorm-BwKA6yZP.mjs} +2 -2
  9. package/dist/chunks/{brainstorm-CU10T1tm.mjs.map → brainstorm-BwKA6yZP.mjs.map} +1 -1
  10. package/dist/chunks/{catalogue-BvwSrM_j.mjs → catalogue-B5uFqfzJ.mjs} +2 -2
  11. package/dist/chunks/{catalogue-BvwSrM_j.mjs.map → catalogue-B5uFqfzJ.mjs.map} +1 -1
  12. package/dist/chunks/{compose-Cr0hP0qm.mjs → compose-C0rEh5wB.mjs} +3354 -3343
  13. package/dist/chunks/compose-C0rEh5wB.mjs.map +1 -0
  14. package/dist/chunks/{contract-B0ra2-bm.mjs → contract-BkMjU1kR.mjs} +2 -2
  15. package/dist/chunks/{contract-B0ra2-bm.mjs.map → contract-BkMjU1kR.mjs.map} +1 -1
  16. package/dist/chunks/{contract-vYbwYr0Y.mjs → contract-bQ9FJl4N.mjs} +2 -2
  17. package/dist/chunks/contract-bQ9FJl4N.mjs.map +1 -0
  18. package/dist/chunks/{diff-Qw0II0sj.mjs → diff-D_0hBwHl.mjs} +2 -2
  19. package/dist/chunks/{diff-Qw0II0sj.mjs.map → diff-D_0hBwHl.mjs.map} +1 -1
  20. package/dist/chunks/{discover-30Ciya_0.mjs → discover-eS01-me1.mjs} +3 -2
  21. package/dist/chunks/{discover-30Ciya_0.mjs.map → discover-eS01-me1.mjs.map} +1 -1
  22. package/dist/chunks/{doctor-DfCrKpfT.mjs → doctor-CginW8y8.mjs} +5 -5
  23. package/dist/chunks/{doctor-DfCrKpfT.mjs.map → doctor-CginW8y8.mjs.map} +1 -1
  24. package/dist/chunks/init-BUnzIkeE.mjs +63 -0
  25. package/dist/chunks/init-BUnzIkeE.mjs.map +1 -0
  26. package/dist/chunks/migrate-DybihKzZ.mjs +33 -0
  27. package/dist/chunks/migrate-DybihKzZ.mjs.map +1 -0
  28. package/dist/chunks/{policy-DUIgzF3W.mjs → policy-Clypo20s.mjs} +3 -3
  29. package/dist/chunks/{policy-DUIgzF3W.mjs.map → policy-Clypo20s.mjs.map} +1 -1
  30. package/dist/chunks/reconcile-Bhy3IIYo.mjs +50 -0
  31. package/dist/chunks/reconcile-Bhy3IIYo.mjs.map +1 -0
  32. package/dist/chunks/scan-8Gy_B6kI.mjs +122 -0
  33. package/dist/chunks/scan-8Gy_B6kI.mjs.map +1 -0
  34. package/dist/chunks/src-CmFjh4M0.mjs +928 -0
  35. package/dist/chunks/src-CmFjh4M0.mjs.map +1 -0
  36. package/dist/chunks/{src-CfAOde7C.mjs → src-DZazJCp1.mjs} +2 -2
  37. package/dist/chunks/{src-CfAOde7C.mjs.map → src-DZazJCp1.mjs.map} +1 -1
  38. package/dist/chunks/{src-CId6kMsY.mjs → src-r0ECB1UJ.mjs} +2 -2
  39. package/dist/chunks/{src-CId6kMsY.mjs.map → src-r0ECB1UJ.mjs.map} +1 -1
  40. package/dist/cli.mjs +12 -12
  41. package/dist/cli.mjs.map +1 -1
  42. package/package.json +1 -1
  43. package/dist/chunks/auth-D8rCVY33.mjs.map +0 -1
  44. package/dist/chunks/compose-Cr0hP0qm.mjs.map +0 -1
  45. package/dist/chunks/contract-vYbwYr0Y.mjs.map +0 -1
  46. package/dist/chunks/init-Okz4mlhW.mjs +0 -30
  47. package/dist/chunks/init-Okz4mlhW.mjs.map +0 -1
  48. package/dist/chunks/migrate-DRoFUg53.mjs +0 -19
  49. package/dist/chunks/migrate-DRoFUg53.mjs.map +0 -1
  50. package/dist/chunks/reconcile-BfD785gd.mjs +0 -26
  51. package/dist/chunks/reconcile-BfD785gd.mjs.map +0 -1
  52. package/dist/chunks/src-JxawBQBn.mjs +0 -446
  53. package/dist/chunks/src-JxawBQBn.mjs.map +0 -1
@@ -0,0 +1,122 @@
1
+ import { readFile, readdir } from "node:fs/promises";
2
+ import { join, relative } from "node:path";
3
+ //#region ../../packages/project-model/src/scan/index.ts
4
+ async function filesUnder(root) {
5
+ const found = [];
6
+ const visit = async (dir) => {
7
+ try {
8
+ const entries = await readdir(dir, { withFileTypes: true });
9
+ for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {
10
+ if (entry.name === ".git" || entry.name === "node_modules" || entry.name === ".cohorte" || entry.name === ".pi" || entry.name === ".build" || entry.name === "dist" || entry.name === "coverage") continue;
11
+ const path = join(dir, entry.name);
12
+ if (entry.isDirectory()) await visit(path);
13
+ else if (entry.isFile()) found.push(relative(root, path).split("\\").join("/"));
14
+ }
15
+ } catch {
16
+ return;
17
+ }
18
+ };
19
+ await visit(root);
20
+ return found.sort();
21
+ }
22
+ function field(value, detector, sources, className = "observed") {
23
+ return {
24
+ value,
25
+ class: className,
26
+ provenance: {
27
+ detector,
28
+ sources
29
+ }
30
+ };
31
+ }
32
+ async function scanRepository(root, options) {
33
+ const files = await filesUnder(root);
34
+ const packagePath = join(root, "package.json");
35
+ let pkg = {};
36
+ try {
37
+ pkg = JSON.parse(await readFile(packagePath, "utf8"));
38
+ } catch {}
39
+ const ext = /* @__PURE__ */ new Map([
40
+ [".ts", "typescript"],
41
+ [".tsx", "typescript"],
42
+ [".js", "javascript"],
43
+ [".jsx", "javascript"],
44
+ [".py", "python"],
45
+ [".go", "go"],
46
+ [".rs", "rust"],
47
+ [".java", "java"]
48
+ ]);
49
+ const languages = [...new Set(files.map((file) => ext.get(file.slice(file.lastIndexOf(".")))).filter((value) => value !== void 0))].sort();
50
+ const supportedLocks = [
51
+ "pnpm-lock.yaml",
52
+ "package-lock.json",
53
+ "yarn.lock",
54
+ "bun.lockb"
55
+ ];
56
+ const locks = files.filter((file) => supportedLocks.includes(file));
57
+ const lock = locks.length === 1 ? locks[0] : void 0;
58
+ const packageManager = lock === void 0 ? pkg.packageManager?.split("@")[0] ?? null : lock === "pnpm-lock.yaml" ? "pnpm" : lock === "package-lock.json" ? "npm" : lock === "yarn.lock" ? "yarn" : "bun";
59
+ const deps = {
60
+ ...pkg.dependencies ?? {},
61
+ ...pkg.devDependencies ?? {}
62
+ };
63
+ const frameworks = Object.keys(deps).filter((name) => /^(react|vue|angular|svelte|next|nuxt|express|nestjs|fastify|vite|vitest|jest|playwright)/i.test(name)).sort();
64
+ const scripts = pkg.scripts ?? {};
65
+ const commands = {};
66
+ for (const name of Object.keys(scripts).sort()) {
67
+ const command = scripts[name];
68
+ if (command !== void 0) commands[name] = field(command.split(/\s+/u), "package-json", ["package.json"]);
69
+ }
70
+ const testLocations = files.filter((file) => /(^|\/)(test|tests|__tests__)(\/|$)|\.(test|spec)\./u.test(file));
71
+ const surfaces = {};
72
+ const topLevel = [...new Set(files.map((file) => file.split("/")[0]).filter((name) => Boolean(name && !name.startsWith("."))))];
73
+ for (const name of topLevel.sort()) {
74
+ const paths = files.filter((file) => file === name || file.startsWith(`${name}/`));
75
+ if (paths.length) surfaces[name.replace(/[^A-Za-z0-9_.-]/g, "_")] = { paths: field([`${name}/**`], "workspace-layout", paths) };
76
+ }
77
+ const id = pkg.name?.replace(/^@[^/]+\//u, "") ?? (relative(process.cwd(), root).replace(/[^A-Za-z0-9_.-]/g, "_") || "project");
78
+ const unknowns = locks.length > 1 ? [{
79
+ id: "package-manager",
80
+ question: "more than one supported lockfile was detected; which package manager is authoritative?",
81
+ candidates: [...locks].sort(),
82
+ sources: [...locks].sort()
83
+ }] : [];
84
+ return {
85
+ schemaVersion: 1,
86
+ project: {
87
+ id: field(id, "package-json", ["package.json"], "human"),
88
+ root: field(root, "filesystem", [])
89
+ },
90
+ stack: {
91
+ languages: field(languages, "file-extensions", files),
92
+ packageManager: field(packageManager, "lockfile", lock ? [lock] : []),
93
+ frameworks: field(frameworks, "package-json", ["package.json"])
94
+ },
95
+ surfaces,
96
+ commands,
97
+ testStrategy: field({
98
+ runner: scripts.test ? scripts.test.split(/\s+/u)[0] ?? null : null,
99
+ locations: testLocations
100
+ }, "package-json", ["package.json"]),
101
+ deploymentHints: field(files.filter((file) => /(^|\/)(Dockerfile|Procfile|vercel\.json|fly\.toml)$/u.test(file)), "file-presence", files),
102
+ ownership: field({ codeowners: files.includes(".github/CODEOWNERS") ? ".github/CODEOWNERS" : null }, "file-presence", [".github/CODEOWNERS"]),
103
+ risks: packageManager === null ? [{
104
+ id: "missing-lockfile",
105
+ severity: "medium",
106
+ message: "no supported lockfile was detected",
107
+ sources: []
108
+ }] : [],
109
+ conventions: field(files.filter((file) => /(^|\/)(CONTRIBUTING|conventions)\.(md|yaml)$/iu.test(file)), "file-presence", files),
110
+ generatedArtifacts: field(["manifest.yaml", "project.yaml"], "manifest", [".cohorte/manifest.yaml"]),
111
+ unknowns,
112
+ provenance: {
113
+ generatedAt: options.clock.now(),
114
+ toolVersion: options.toolVersion,
115
+ analysis: "deterministic"
116
+ }
117
+ };
118
+ }
119
+ //#endregion
120
+ export { scanRepository as t };
121
+
122
+ //# sourceMappingURL=scan-8Gy_B6kI.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-8Gy_B6kI.mjs","names":[],"sources":["../../../../packages/project-model/src/scan/index.ts"],"sourcesContent":["// Deterministic repository scan: bounded filesystem observations, never guessed semantics.\n\nimport { readdir, readFile } from 'node:fs/promises';\nimport { join, relative } from 'node:path';\nimport type { Clock } from '@cohorte/base';\nimport type { ProjectModel } from '../contract.ts';\n\nexport interface ScanOptions {\n clock: Clock;\n /** stamped into `provenance.toolVersion` */\n toolVersion: string;\n}\n\nasync function filesUnder(root: string): Promise<string[]> {\n const found: string[] = [];\n const visit = async (dir: string): Promise<void> => {\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {\n if (\n entry.name === '.git' ||\n entry.name === 'node_modules' ||\n entry.name === '.cohorte' ||\n entry.name === '.pi' ||\n entry.name === '.build' ||\n entry.name === 'dist' ||\n entry.name === 'coverage'\n )\n continue;\n const path = join(dir, entry.name);\n if (entry.isDirectory()) await visit(path);\n else if (entry.isFile()) found.push(relative(root, path).split('\\\\').join('/'));\n }\n } catch {\n return;\n }\n };\n await visit(root);\n return found.sort();\n}\n\nfunction field<T>(\n value: T,\n detector: string,\n sources: string[],\n className: ProjectModel['project']['id']['class'] = 'observed',\n) {\n return { value, class: className, provenance: { detector, sources } };\n}\n\nexport async function scanRepository(root: string, options: ScanOptions): Promise<ProjectModel> {\n const files = await filesUnder(root);\n const packagePath = join(root, 'package.json');\n let pkg: {\n name?: string;\n packageManager?: string;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n } = {};\n try {\n pkg = JSON.parse(await readFile(packagePath, 'utf8')) as typeof pkg;\n } catch {\n /* absent or invalid package.json is an observation */\n }\n const ext = new Map<string, string>([\n ['.ts', 'typescript'],\n ['.tsx', 'typescript'],\n ['.js', 'javascript'],\n ['.jsx', 'javascript'],\n ['.py', 'python'],\n ['.go', 'go'],\n ['.rs', 'rust'],\n ['.java', 'java'],\n ]);\n const languages = [\n ...new Set(\n files\n .map((file) => ext.get(file.slice(file.lastIndexOf('.'))))\n .filter((value): value is string => value !== undefined),\n ),\n ].sort();\n const supportedLocks = ['pnpm-lock.yaml', 'package-lock.json', 'yarn.lock', 'bun.lockb'];\n const locks = files.filter((file) => supportedLocks.includes(file));\n const lock = locks.length === 1 ? locks[0] : undefined;\n const packageManager =\n lock === undefined\n ? (pkg.packageManager?.split('@')[0] ?? null)\n : lock === 'pnpm-lock.yaml'\n ? 'pnpm'\n : lock === 'package-lock.json'\n ? 'npm'\n : lock === 'yarn.lock'\n ? 'yarn'\n : 'bun';\n const deps = { ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}) };\n const frameworks = Object.keys(deps)\n .filter((name) =>\n /^(react|vue|angular|svelte|next|nuxt|express|nestjs|fastify|vite|vitest|jest|playwright)/i.test(name),\n )\n .sort();\n const scripts = pkg.scripts ?? {};\n const commands: Record<string, ReturnType<typeof field<string[]>>> = {};\n for (const name of Object.keys(scripts).sort()) {\n const command = scripts[name];\n if (command !== undefined) commands[name] = field(command.split(/\\s+/u), 'package-json', ['package.json']);\n }\n const testLocations = files.filter((file) => /(^|\\/)(test|tests|__tests__)(\\/|$)|\\.(test|spec)\\./u.test(file));\n const surfaces: ProjectModel['surfaces'] = {};\n const topLevel: string[] = [\n ...new Set(\n files.map((file) => file.split('/')[0]).filter((name): name is string => Boolean(name && !name.startsWith('.'))),\n ),\n ];\n for (const name of topLevel.sort()) {\n const paths = files.filter((file) => file === name || file.startsWith(`${name}/`));\n if (paths.length)\n surfaces[name.replace(/[^A-Za-z0-9_.-]/g, '_')] = { paths: field([`${name}/**`], 'workspace-layout', paths) };\n }\n const id =\n pkg.name?.replace(/^@[^/]+\\//u, '') ??\n (relative(process.cwd(), root).replace(/[^A-Za-z0-9_.-]/g, '_') || 'project');\n const unknowns =\n locks.length > 1\n ? [\n {\n id: 'package-manager',\n question: 'more than one supported lockfile was detected; which package manager is authoritative?',\n candidates: [...locks].sort(),\n sources: [...locks].sort(),\n },\n ]\n : [];\n return {\n schemaVersion: 1,\n project: { id: field(id, 'package-json', ['package.json'], 'human'), root: field(root, 'filesystem', []) },\n stack: {\n languages: field(languages, 'file-extensions', files),\n packageManager: field(packageManager, 'lockfile', lock ? [lock] : []),\n frameworks: field(frameworks, 'package-json', ['package.json']),\n },\n surfaces,\n commands,\n testStrategy: field(\n { runner: scripts.test ? (scripts.test.split(/\\s+/u)[0] ?? null) : null, locations: testLocations },\n 'package-json',\n ['package.json'],\n ),\n deploymentHints: field(\n files.filter((file) => /(^|\\/)(Dockerfile|Procfile|vercel\\.json|fly\\.toml)$/u.test(file)),\n 'file-presence',\n files,\n ),\n ownership: field(\n { codeowners: files.includes('.github/CODEOWNERS') ? '.github/CODEOWNERS' : null },\n 'file-presence',\n ['.github/CODEOWNERS'],\n ),\n risks:\n packageManager === null\n ? [{ id: 'missing-lockfile', severity: 'medium', message: 'no supported lockfile was detected', sources: [] }]\n : [],\n conventions: field(\n files.filter((file) => /(^|\\/)(CONTRIBUTING|conventions)\\.(md|yaml)$/iu.test(file)),\n 'file-presence',\n files,\n ),\n generatedArtifacts: field(['manifest.yaml', 'project.yaml'], 'manifest', ['.cohorte/manifest.yaml']),\n unknowns,\n provenance: { generatedAt: options.clock.now(), toolVersion: options.toolVersion, analysis: 'deterministic' },\n };\n}\n"],"mappings":"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"}