devworkspace 0.2.0 → 0.2.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 (37) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/cli/render.js +8 -4
  3. package/dist/cli/render.js.map +1 -1
  4. package/dist/config/schemas.d.ts +7 -1
  5. package/dist/config/schemas.js +10 -0
  6. package/dist/config/schemas.js.map +1 -1
  7. package/dist/discovery/commands.d.ts +34 -3
  8. package/dist/discovery/commands.js +95 -33
  9. package/dist/discovery/commands.js.map +1 -1
  10. package/dist/discovery/detect.d.ts +17 -0
  11. package/dist/discovery/detect.js +101 -42
  12. package/dist/discovery/detect.js.map +1 -1
  13. package/dist/integrations/adapters/graphify.js +46 -8
  14. package/dist/integrations/adapters/graphify.js.map +1 -1
  15. package/dist/integrations/manager.js +14 -1
  16. package/dist/integrations/manager.js.map +1 -1
  17. package/dist/integrations/persistentPath.d.ts +20 -0
  18. package/dist/integrations/persistentPath.js +47 -0
  19. package/dist/integrations/persistentPath.js.map +1 -0
  20. package/dist/integrations/types.d.ts +6 -0
  21. package/dist/integrations/types.js.map +1 -1
  22. package/dist/prompts/onboarding.js +4 -4
  23. package/dist/prompts/onboarding.js.map +1 -1
  24. package/dist/services/analysis.d.ts +13 -1
  25. package/dist/services/analysis.js +17 -18
  26. package/dist/services/analysis.js.map +1 -1
  27. package/dist/services/doctor.js +78 -4
  28. package/dist/services/doctor.js.map +1 -1
  29. package/dist/services/refresh.js +1 -1
  30. package/dist/services/refresh.js.map +1 -1
  31. package/dist/services/status.d.ts +1 -0
  32. package/dist/services/status.js +1 -1
  33. package/dist/services/status.js.map +1 -1
  34. package/docs/integrations.md +1 -1
  35. package/docs/testing.md +4 -0
  36. package/docs/troubleshooting.md +4 -1
  37. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/discovery/detect.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'node:path';\nimport { safeReadText } from '../security/files.js';\nimport { isSensitiveFile } from '../security/files.js';\nimport type { ScanResult } from './scan.js';\nimport { buildContract } from './commands.js';\nimport type { CommandEntry } from '../config/schemas.js';\n\nexport interface Detected {\n name: string;\n category: 'framework' | 'test' | 'tool' | 'database' | 'runtime';\n evidence: string;\n}\n\nexport interface SubProject {\n path: string;\n name: string;\n ecosystem: string;\n frameworks: string[];\n}\n\nexport interface PackageInfo {\n rel: string;\n name?: string;\n scripts: Record<string, string>;\n deps: Record<string, string>;\n workspaces: string[];\n packageManagerField?: string;\n hasTypes: boolean;\n type?: string;\n}\n\nexport interface DiscoveryReport {\n schemaVersion: 1;\n project: { name: string };\n scan: {\n fileCount: number;\n dirCount: number;\n truncated: boolean;\n skippedSymlinks: number;\n ignoredEntries: number;\n };\n languages: { name: string; files: number }[];\n topDirs: { name: string; files: number }[];\n ecosystems: string[];\n packageManager: string | null;\n frameworks: Detected[];\n monorepo: { tool: string | null; packages: SubProject[] };\n commands: CommandEntry[];\n testConfigs: string[];\n ci: string[];\n docker: string[];\n deployment: string[];\n aiInstructions: string[];\n docs: string[];\n /** Names of credential-like files that exist. Their content is never read. */\n sensitiveFilesPresent: string[];\n entryHints: string[];\n warnings: string[];\n}\n\nconst EXT_LANG: Record<string, string> = {\n '.ts': 'TypeScript',\n '.tsx': 'TypeScript',\n '.mts': 'TypeScript',\n '.cts': 'TypeScript',\n '.js': 'JavaScript',\n '.jsx': 'JavaScript',\n '.mjs': 'JavaScript',\n '.cjs': 'JavaScript',\n '.py': 'Python',\n '.go': 'Go',\n '.rs': 'Rust',\n '.java': 'Java',\n '.kt': 'Kotlin',\n '.php': 'PHP',\n '.rb': 'Ruby',\n '.cs': 'C#',\n '.swift': 'Swift',\n '.c': 'C',\n '.h': 'C',\n '.cpp': 'C++',\n '.cc': 'C++',\n '.hpp': 'C++',\n '.vue': 'Vue',\n '.svelte': 'Svelte',\n '.sql': 'SQL',\n};\n\nconst NODE_DEP_MAP: Record<string, { name: string; category: Detected['category'] }> = {\n express: { name: 'Express', category: 'framework' },\n fastify: { name: 'Fastify', category: 'framework' },\n koa: { name: 'Koa', category: 'framework' },\n hono: { name: 'Hono', category: 'framework' },\n '@nestjs/core': { name: 'NestJS', category: 'framework' },\n next: { name: 'Next.js', category: 'framework' },\n react: { name: 'React', category: 'framework' },\n vue: { name: 'Vue', category: 'framework' },\n nuxt: { name: 'Nuxt', category: 'framework' },\n svelte: { name: 'Svelte', category: 'framework' },\n '@sveltejs/kit': { name: 'SvelteKit', category: 'framework' },\n '@angular/core': { name: 'Angular', category: 'framework' },\n astro: { name: 'Astro', category: 'framework' },\n electron: { name: 'Electron', category: 'framework' },\n '@remix-run/react': { name: 'Remix', category: 'framework' },\n vite: { name: 'Vite', category: 'tool' },\n typescript: { name: 'TypeScript', category: 'tool' },\n eslint: { name: 'ESLint', category: 'tool' },\n prettier: { name: 'Prettier', category: 'tool' },\n tailwindcss: { name: 'Tailwind CSS', category: 'tool' },\n webpack: { name: 'webpack', category: 'tool' },\n '@biomejs/biome': { name: 'Biome', category: 'tool' },\n jest: { name: 'Jest', category: 'test' },\n vitest: { name: 'Vitest', category: 'test' },\n mocha: { name: 'Mocha', category: 'test' },\n '@playwright/test': { name: 'Playwright', category: 'test' },\n cypress: { name: 'Cypress', category: 'test' },\n prisma: { name: 'Prisma', category: 'database' },\n '@prisma/client': { name: 'Prisma', category: 'database' },\n typeorm: { name: 'TypeORM', category: 'database' },\n mongoose: { name: 'Mongoose', category: 'database' },\n sequelize: { name: 'Sequelize', category: 'database' },\n 'drizzle-orm': { name: 'Drizzle', category: 'database' },\n knex: { name: 'Knex', category: 'database' },\n pg: { name: 'PostgreSQL client', category: 'database' },\n redis: { name: 'Redis client', category: 'database' },\n ioredis: { name: 'Redis client', category: 'database' },\n};\n\nconst PY_DEP_MAP: Record<string, { name: string; category: Detected['category'] }> = {\n fastapi: { name: 'FastAPI', category: 'framework' },\n django: { name: 'Django', category: 'framework' },\n flask: { name: 'Flask', category: 'framework' },\n starlette: { name: 'Starlette', category: 'framework' },\n celery: { name: 'Celery', category: 'framework' },\n pydantic: { name: 'Pydantic', category: 'tool' },\n sqlalchemy: { name: 'SQLAlchemy', category: 'database' },\n alembic: { name: 'Alembic', category: 'database' },\n pytest: { name: 'pytest', category: 'test' },\n ruff: { name: 'Ruff', category: 'tool' },\n mypy: { name: 'mypy', category: 'tool' },\n black: { name: 'Black', category: 'tool' },\n};\n\nconst TEST_CONFIG_RE =\n /(^|\\/)(jest\\.config\\.[cm]?[jt]s|jest\\.config\\.json|vitest\\.config\\.[cm]?[jt]s|vitest\\.workspace\\.[cm]?[jt]s|playwright\\.config\\.[cm]?[jt]s|cypress\\.config\\.[cm]?[jt]s|\\.mocharc\\.[a-z]+|pytest\\.ini|tox\\.ini|conftest\\.py|phpunit\\.xml(\\.dist)?|karma\\.conf\\.[cm]?js)$/;\n\nconst AI_FILES = [\n 'CLAUDE.md',\n 'CLAUDE.local.md',\n '.claude/CLAUDE.md',\n 'AGENTS.md',\n 'GEMINI.md',\n '.cursorrules',\n '.github/copilot-instructions.md',\n '.windsurfrules',\n];\n\n/** Directories that hold samples or test data rather than the project's own code; they must not define its stack. */\nconst AUX_DIRS = new Set(['fixtures', 'fixture', '__fixtures__', 'examples', 'example', 'samples', 'sample', 'testdata', 'test-data', 'demo', 'demos', 'docs', 'doc', 'third_party', 'thirdparty']);\n\nexport function isAuxPath(rel: string): boolean {\n return rel.split('/').slice(0, -1).some((s) => AUX_DIRS.has(s.toLowerCase()));\n}\n\nfunction parseJsonLoose(text: string | null): Record<string, unknown> | null {\n if (!text) return null;\n try {\n const v = JSON.parse(text);\n return typeof v === 'object' && v !== null && !Array.isArray(v) ? (v as Record<string, unknown>) : null;\n } catch {\n return null;\n }\n}\n\nfunction strMap(v: unknown): Record<string, string> {\n const out: Record<string, string> = {};\n if (typeof v === 'object' && v !== null) {\n for (const [k, val] of Object.entries(v as Record<string, unknown>)) if (typeof val === 'string') out[k] = val;\n }\n return out;\n}\n\nexport async function readPackageJson(root: string, rel: string): Promise<PackageInfo | null> {\n let text: string | null;\n try {\n text = await safeReadText(root, rel, 1024 * 1024);\n } catch {\n return null;\n }\n const j = parseJsonLoose(text);\n if (!j) return null;\n const ws = j.workspaces;\n const workspaces = Array.isArray(ws)\n ? ws.filter((x): x is string => typeof x === 'string')\n : typeof ws === 'object' && ws !== null && Array.isArray((ws as { packages?: unknown }).packages)\n ? ((ws as { packages: unknown[] }).packages.filter((x) => typeof x === 'string') as string[])\n : [];\n const deps = { ...strMap(j.dependencies), ...strMap(j.devDependencies), ...strMap(j.peerDependencies) };\n return {\n rel,\n name: typeof j.name === 'string' ? j.name : undefined,\n scripts: strMap(j.scripts),\n deps,\n workspaces,\n packageManagerField: typeof j.packageManager === 'string' ? j.packageManager : undefined,\n hasTypes: 'typescript' in deps,\n type: typeof j.type === 'string' ? j.type : undefined,\n };\n}\n\nfunction nodeFrameworks(pkg: PackageInfo): Detected[] {\n const out = new Map<string, Detected>();\n for (const dep of Object.keys(pkg.deps)) {\n const hit = NODE_DEP_MAP[dep];\n if (hit && !out.has(hit.name)) out.set(hit.name, { ...hit, evidence: pkg.rel });\n }\n return [...out.values()];\n}\n\nasync function pythonText(root: string, scan: ScanResult): Promise<{ text: string; evidence: Record<string, string> }> {\n const names = [...scan.files].filter((f) => {\n const b = path.posix.basename(f);\n const depth = f.split('/').length;\n return depth <= 3 && !isAuxPath(f) && (b === 'pyproject.toml' || /^requirements.*\\.txt$/.test(b) || b === 'Pipfile' || b === 'setup.py' || b === 'setup.cfg');\n });\n let text = '';\n const evidence: Record<string, string> = {};\n for (const n of names.slice(0, 12)) {\n const t = await safeReadText(root, n, 256 * 1024).catch(() => null);\n if (t) {\n text += `\\n${t.toLowerCase()}`;\n for (const key of Object.keys(PY_DEP_MAP)) {\n if (!evidence[key] && new RegExp(`(^|[\\\\s\"'\\\\[,=<>~!-])${key}(?![a-z0-9_])`, 'm').test(t.toLowerCase())) evidence[key] = n;\n }\n }\n }\n return { text, evidence };\n}\n\nfunction parseWorkspaceYaml(text: string): string[] {\n const out: string[] = [];\n for (const line of text.split(/\\r?\\n/)) {\n const m = /^\\s*-\\s*['\"]?([^'\"#]+?)['\"]?\\s*(?:#.*)?$/.exec(line);\n if (m && m[1] && !m[1].startsWith('!')) out.push(m[1].trim());\n }\n return out;\n}\n\n/** Expand simple workspace globs (\"packages/*\", \"apps/**\" treated as one level, or a literal directory). */\nexport function expandWorkspaceGlobs(patterns: string[], files: Set<string>, manifest: string): string[] {\n const dirs = new Set<string>();\n for (const f of files) {\n if (path.posix.basename(f) === manifest && f.includes('/')) dirs.add(path.posix.dirname(f));\n }\n const out = new Set<string>();\n for (const pat of patterns) {\n const clean = pat.replace(/^\\.\\//, '').replace(/\\/$/, '');\n if (!clean.includes('*')) {\n if (dirs.has(clean)) out.add(clean);\n continue;\n }\n const prefix = clean.slice(0, clean.indexOf('*')).replace(/\\/$/, '');\n const deep = clean.includes('**');\n for (const d of dirs) {\n if (!d.startsWith(prefix + '/')) continue;\n const rest = d.slice(prefix.length + 1);\n if (deep || !rest.includes('/')) out.add(d);\n }\n }\n return [...out].sort();\n}\n\nfunction languagesFrom(byExt: Record<string, number>): { name: string; files: number }[] {\n const acc = new Map<string, number>();\n for (const [ext, n] of Object.entries(byExt)) {\n const lang = EXT_LANG[ext];\n if (lang) acc.set(lang, (acc.get(lang) ?? 0) + n);\n }\n return [...acc.entries()].map(([name, files]) => ({ name, files })).sort((a, b) => b.files - a.files || a.name.localeCompare(b.name));\n}\n\nexport interface DetectInput {\n root: string;\n projectName: string;\n scan: ScanResult;\n}\n\nexport async function detectProject(input: DetectInput): Promise<DiscoveryReport> {\n const { root, scan } = input;\n const files = scan.files;\n const has = (rel: string): boolean => files.has(rel);\n const warnings: string[] = [];\n const ecosystems = new Set<string>();\n const frameworks = new Map<string, Detected>();\n const addFw = (d: Detected): void => {\n if (!frameworks.has(d.name)) frameworks.set(d.name, d);\n };\n\n // Node / JS\n const rootPkg = has('package.json') ? await readPackageJson(root, 'package.json') : null;\n if (has('package.json') && !rootPkg) warnings.push('package.json exists but could not be parsed.');\n if (rootPkg) {\n ecosystems.add('node');\n nodeFrameworks(rootPkg).forEach(addFw);\n }\n let packageManager: string | null = null;\n if (has('pnpm-lock.yaml')) packageManager = 'pnpm';\n else if (has('yarn.lock')) packageManager = 'yarn';\n else if (has('bun.lockb') || has('bun.lock')) packageManager = 'bun';\n else if (has('package-lock.json') || has('npm-shrinkwrap.json')) packageManager = 'npm';\n else if (rootPkg?.packageManagerField) packageManager = rootPkg.packageManagerField.split('@')[0] ?? null;\n else if (rootPkg) packageManager = 'npm';\n\n // Python\n const py = await pythonText(root, scan);\n const hasPy = has('pyproject.toml') || has('requirements.txt') || has('Pipfile') || has('setup.py') || [...files].some((f) => f.endsWith('.py') && !isAuxPath(f));\n if (hasPy) {\n ecosystems.add('python');\n for (const [k, ev] of Object.entries(py.evidence)) {\n const m = PY_DEP_MAP[k];\n if (m) addFw({ ...m, evidence: ev });\n }\n if (!packageManager) {\n if (has('poetry.lock') || py.text.includes('[tool.poetry]')) packageManager = 'poetry';\n else if (has('uv.lock')) packageManager = 'uv';\n else if (has('Pipfile')) packageManager = 'pipenv';\n else if (has('requirements.txt') || has('pyproject.toml')) packageManager = 'pip';\n }\n }\n\n const simple: [string, string, string][] = [\n ['go.mod', 'go', 'go'],\n ['Cargo.toml', 'rust', 'cargo'],\n ['pom.xml', 'java', 'maven'],\n ['build.gradle', 'java', 'gradle'],\n ['build.gradle.kts', 'java', 'gradle'],\n ['composer.json', 'php', 'composer'],\n ['Gemfile', 'ruby', 'bundler'],\n ];\n for (const [file, eco, pm] of simple) {\n if (has(file)) {\n ecosystems.add(eco);\n if (!packageManager) packageManager = pm;\n }\n }\n if ([...files].some((f) => /\\.csproj$/.test(f) && f.split('/').length <= 3)) ecosystems.add('dotnet');\n\n // Monorepo\n let monoTool: string | null = null;\n let workspacePatterns: string[] = [];\n let manifest = 'package.json';\n if (has('pnpm-workspace.yaml')) {\n monoTool = 'pnpm-workspaces';\n workspacePatterns = parseWorkspaceYaml((await safeReadText(root, 'pnpm-workspace.yaml', 64 * 1024).catch(() => null)) ?? '');\n } else if (rootPkg && rootPkg.workspaces.length > 0) {\n monoTool = packageManager === 'yarn' ? 'yarn-workspaces' : 'npm-workspaces';\n workspacePatterns = rootPkg.workspaces;\n } else if (has('lerna.json')) monoTool = 'lerna';\n else if (has('nx.json')) monoTool = 'nx';\n else if (has('turbo.json')) monoTool = 'turborepo';\n else if (has('Cargo.toml')) {\n const cargo = (await safeReadText(root, 'Cargo.toml', 64 * 1024).catch(() => null)) ?? '';\n if (/^\\[workspace\\]/m.test(cargo)) {\n monoTool = 'cargo-workspace';\n manifest = 'Cargo.toml';\n workspacePatterns = [...cargo.matchAll(/\"([^\"]+)\"/g)].map((m) => m[1]!).filter((s) => !s.includes(' '));\n }\n } else if (has('go.work')) monoTool = 'go-work';\n\n const packages: SubProject[] = [];\n if (monoTool) {\n if (workspacePatterns.length === 0 && (monoTool === 'lerna' || monoTool === 'nx' || monoTool === 'turborepo')) {\n workspacePatterns = ['packages/*', 'apps/*', 'libs/*'];\n }\n const dirs = expandWorkspaceGlobs(workspacePatterns, files, manifest).slice(0, 100);\n for (const d of dirs) {\n if (manifest === 'package.json') {\n const p = await readPackageJson(root, `${d}/package.json`);\n packages.push({\n path: d,\n name: p?.name ?? path.posix.basename(d),\n ecosystem: 'node',\n frameworks: p ? nodeFrameworks(p).map((f) => f.name) : [],\n });\n if (p) nodeFrameworks(p).forEach(addFw);\n } else {\n packages.push({ path: d, name: path.posix.basename(d), ecosystem: 'rust', frameworks: [] });\n }\n }\n }\n\n const testConfigs = [...files].filter((f) => TEST_CONFIG_RE.test(f) && f.split('/').length <= 4 && !isAuxPath(f)).sort().slice(0, 30);\n const ci = [\n ...[...files].filter((f) => f.startsWith('.github/workflows/')),\n ...['.gitlab-ci.yml', 'azure-pipelines.yml', 'Jenkinsfile', '.travis.yml', 'bitbucket-pipelines.yml', '.circleci/config.yml'].filter(has),\n ].sort();\n const docker = [...files].filter((f) => !isAuxPath(f) && /(^|\\/)(Dockerfile(\\..+)?|docker-compose[^/]*\\.ya?ml|compose\\.ya?ml)$/.test(f) && f.split('/').length <= 3).sort();\n const deployment = [\n 'vercel.json',\n 'netlify.toml',\n 'fly.toml',\n 'render.yaml',\n 'Procfile',\n 'app.yaml',\n 'serverless.yml',\n 'wrangler.toml',\n 'railway.json',\n 'firebase.json',\n 'Chart.yaml',\n ]\n .filter(has)\n .concat([...files].filter((f) => /^(k8s|kubernetes|deploy|infra|terraform)\\//.test(f)).slice(0, 5))\n .sort();\n const aiInstructions = [...AI_FILES.filter(has), ...[...files].filter((f) => f.startsWith('.claude/') && /\\.(md|json)$/.test(f)).slice(0, 20)].sort();\n const docs = [\n ...[...files].filter((f) => /^readme(\\.[a-z]+)?$/i.test(f)),\n ...[...files].filter((f) => /^docs\\/[^/]+\\.(md|mdx|rst)$/i.test(f)).slice(0, 15),\n ...['CONTRIBUTING.md', 'ARCHITECTURE.md', 'CHANGELOG.md'].filter(has),\n ].sort();\n\n const entryHints: string[] = [];\n for (const cand of ['src/index.ts', 'src/main.ts', 'src/app.ts', 'src/server.ts', 'index.js', 'server.js', 'app.js', 'main.py', 'app/main.py', 'main.go', 'cmd', 'src/main.rs', 'manage.py', 'src/App.tsx', 'app/layout.tsx']) {\n if (has(cand) || [...files].some((f) => f.startsWith(cand + '/'))) entryHints.push(cand);\n }\n\n const commands = buildContract({\n pkg: rootPkg,\n packageManager,\n ecosystems,\n has,\n pythonEvidence: py.evidence,\n files,\n });\n\n if (scan.truncated) warnings.push('Scan hit its file or depth limit; discovery is partial.');\n if (scan.sensitiveFiles.length > 0) warnings.push('Credential-like files exist; their contents were not read.');\n if (!has('README.md') && !docs.some((d) => /^readme/i.test(d))) warnings.push('No README found.');\n\n return {\n schemaVersion: 1,\n project: { name: rootPkg?.name ?? input.projectName },\n scan: {\n fileCount: scan.fileCount,\n dirCount: scan.dirCount,\n truncated: scan.truncated,\n skippedSymlinks: scan.skippedSymlinks,\n ignoredEntries: scan.ignoredEntries,\n },\n languages: languagesFrom(scan.byExtension).slice(0, 12),\n topDirs: scan.topDirs,\n ecosystems: [...ecosystems].sort(),\n packageManager,\n frameworks: [...frameworks.values()].sort((a, b) => a.name.localeCompare(b.name)),\n monorepo: { tool: monoTool, packages },\n commands,\n testConfigs,\n ci,\n docker,\n deployment,\n aiInstructions,\n docs,\n sensitiveFilesPresent: scan.sensitiveFiles.filter((f) => isSensitiveFile(f)),\n entryHints,\n warnings,\n };\n}\n"]}
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/discovery/detect.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'node:path';\nimport { safeReadText } from '../security/files.js';\nimport { isSensitiveFile } from '../security/files.js';\nimport type { ScanResult } from './scan.js';\nimport { buildContract, type NodePackageInput } from './commands.js';\nimport type { CommandEntry } from '../config/schemas.js';\n\nexport interface Detected {\n name: string;\n category: 'framework' | 'test' | 'tool' | 'database' | 'runtime';\n evidence: string;\n}\n\nexport interface SubProject {\n path: string;\n name: string;\n ecosystem: string;\n frameworks: string[];\n packageManager?: string;\n}\n\nexport interface PackageInfo {\n rel: string;\n name?: string;\n scripts: Record<string, string>;\n deps: Record<string, string>;\n workspaces: string[];\n packageManagerField?: string;\n hasTypes: boolean;\n type?: string;\n}\n\nexport interface DiscoveryReport {\n schemaVersion: 1;\n project: { name: string };\n scan: {\n fileCount: number;\n dirCount: number;\n truncated: boolean;\n skippedSymlinks: number;\n ignoredEntries: number;\n };\n languages: { name: string; files: number }[];\n topDirs: { name: string; files: number }[];\n ecosystems: string[];\n packageManager: string | null;\n frameworks: Detected[];\n monorepo: { tool: string | null; packages: SubProject[] };\n commands: CommandEntry[];\n /** Recognised package manifests (project-relative). Used as evidence for derived facts. */\n manifests: string[];\n testConfigs: string[];\n ci: string[];\n docker: string[];\n deployment: string[];\n aiInstructions: string[];\n docs: string[];\n /** Names of credential-like files that exist. Their content is never read. */\n sensitiveFilesPresent: string[];\n entryHints: string[];\n warnings: string[];\n}\n\nconst EXT_LANG: Record<string, string> = {\n '.ts': 'TypeScript',\n '.tsx': 'TypeScript',\n '.mts': 'TypeScript',\n '.cts': 'TypeScript',\n '.js': 'JavaScript',\n '.jsx': 'JavaScript',\n '.mjs': 'JavaScript',\n '.cjs': 'JavaScript',\n '.py': 'Python',\n '.go': 'Go',\n '.rs': 'Rust',\n '.java': 'Java',\n '.kt': 'Kotlin',\n '.php': 'PHP',\n '.rb': 'Ruby',\n '.cs': 'C#',\n '.swift': 'Swift',\n '.c': 'C',\n '.h': 'C',\n '.cpp': 'C++',\n '.cc': 'C++',\n '.hpp': 'C++',\n '.vue': 'Vue',\n '.svelte': 'Svelte',\n '.sql': 'SQL',\n};\n\nconst NODE_DEP_MAP: Record<string, { name: string; category: Detected['category'] }> = {\n express: { name: 'Express', category: 'framework' },\n fastify: { name: 'Fastify', category: 'framework' },\n koa: { name: 'Koa', category: 'framework' },\n hono: { name: 'Hono', category: 'framework' },\n '@nestjs/core': { name: 'NestJS', category: 'framework' },\n next: { name: 'Next.js', category: 'framework' },\n react: { name: 'React', category: 'framework' },\n vue: { name: 'Vue', category: 'framework' },\n nuxt: { name: 'Nuxt', category: 'framework' },\n svelte: { name: 'Svelte', category: 'framework' },\n '@sveltejs/kit': { name: 'SvelteKit', category: 'framework' },\n '@angular/core': { name: 'Angular', category: 'framework' },\n astro: { name: 'Astro', category: 'framework' },\n electron: { name: 'Electron', category: 'framework' },\n '@remix-run/react': { name: 'Remix', category: 'framework' },\n vite: { name: 'Vite', category: 'tool' },\n typescript: { name: 'TypeScript', category: 'tool' },\n eslint: { name: 'ESLint', category: 'tool' },\n prettier: { name: 'Prettier', category: 'tool' },\n tailwindcss: { name: 'Tailwind CSS', category: 'tool' },\n webpack: { name: 'webpack', category: 'tool' },\n '@biomejs/biome': { name: 'Biome', category: 'tool' },\n jest: { name: 'Jest', category: 'test' },\n vitest: { name: 'Vitest', category: 'test' },\n mocha: { name: 'Mocha', category: 'test' },\n '@playwright/test': { name: 'Playwright', category: 'test' },\n cypress: { name: 'Cypress', category: 'test' },\n prisma: { name: 'Prisma', category: 'database' },\n '@prisma/client': { name: 'Prisma', category: 'database' },\n typeorm: { name: 'TypeORM', category: 'database' },\n mongoose: { name: 'Mongoose', category: 'database' },\n sequelize: { name: 'Sequelize', category: 'database' },\n 'drizzle-orm': { name: 'Drizzle', category: 'database' },\n knex: { name: 'Knex', category: 'database' },\n pg: { name: 'PostgreSQL client', category: 'database' },\n redis: { name: 'Redis client', category: 'database' },\n ioredis: { name: 'Redis client', category: 'database' },\n};\n\nconst PY_DEP_MAP: Record<string, { name: string; category: Detected['category'] }> = {\n fastapi: { name: 'FastAPI', category: 'framework' },\n django: { name: 'Django', category: 'framework' },\n flask: { name: 'Flask', category: 'framework' },\n starlette: { name: 'Starlette', category: 'framework' },\n celery: { name: 'Celery', category: 'framework' },\n pydantic: { name: 'Pydantic', category: 'tool' },\n sqlalchemy: { name: 'SQLAlchemy', category: 'database' },\n alembic: { name: 'Alembic', category: 'database' },\n pytest: { name: 'pytest', category: 'test' },\n ruff: { name: 'Ruff', category: 'tool' },\n mypy: { name: 'mypy', category: 'tool' },\n black: { name: 'Black', category: 'tool' },\n};\n\nconst TEST_CONFIG_RE =\n /(^|\\/)(jest\\.config\\.[cm]?[jt]s|jest\\.config\\.json|vitest\\.config\\.[cm]?[jt]s|vitest\\.workspace\\.[cm]?[jt]s|playwright\\.config\\.[cm]?[jt]s|cypress\\.config\\.[cm]?[jt]s|\\.mocharc\\.[a-z]+|pytest\\.ini|tox\\.ini|conftest\\.py|phpunit\\.xml(\\.dist)?|karma\\.conf\\.[cm]?js)$/;\n\nconst AI_FILES = [\n 'CLAUDE.md',\n 'CLAUDE.local.md',\n '.claude/CLAUDE.md',\n 'AGENTS.md',\n 'GEMINI.md',\n '.cursorrules',\n '.github/copilot-instructions.md',\n '.windsurfrules',\n];\n\n/** Directories that hold samples or test data rather than the project's own code; they must not define its stack. */\nconst AUX_DIRS = new Set(['fixtures', 'fixture', '__fixtures__', 'examples', 'example', 'samples', 'sample', 'testdata', 'test-data', 'demo', 'demos', 'docs', 'doc', 'third_party', 'thirdparty']);\n\nexport function isAuxPath(rel: string): boolean {\n return rel.split('/').slice(0, -1).some((s) => AUX_DIRS.has(s.toLowerCase()));\n}\n\nfunction parseJsonLoose(text: string | null): Record<string, unknown> | null {\n if (!text) return null;\n try {\n const v = JSON.parse(text);\n return typeof v === 'object' && v !== null && !Array.isArray(v) ? (v as Record<string, unknown>) : null;\n } catch {\n return null;\n }\n}\n\nfunction strMap(v: unknown): Record<string, string> {\n const out: Record<string, string> = {};\n if (typeof v === 'object' && v !== null) {\n for (const [k, val] of Object.entries(v as Record<string, unknown>)) if (typeof val === 'string') out[k] = val;\n }\n return out;\n}\n\nexport async function readPackageJson(root: string, rel: string): Promise<PackageInfo | null> {\n let text: string | null;\n try {\n text = await safeReadText(root, rel, 1024 * 1024);\n } catch {\n return null;\n }\n const j = parseJsonLoose(text);\n if (!j) return null;\n const ws = j.workspaces;\n const workspaces = Array.isArray(ws)\n ? ws.filter((x): x is string => typeof x === 'string')\n : typeof ws === 'object' && ws !== null && Array.isArray((ws as { packages?: unknown }).packages)\n ? ((ws as { packages: unknown[] }).packages.filter((x) => typeof x === 'string') as string[])\n : [];\n const deps = { ...strMap(j.dependencies), ...strMap(j.devDependencies), ...strMap(j.peerDependencies) };\n return {\n rel,\n name: typeof j.name === 'string' ? j.name : undefined,\n scripts: strMap(j.scripts),\n deps,\n workspaces,\n packageManagerField: typeof j.packageManager === 'string' ? j.packageManager : undefined,\n hasTypes: 'typescript' in deps,\n type: typeof j.type === 'string' ? j.type : undefined,\n };\n}\n\nfunction nodeFrameworks(pkg: PackageInfo): Detected[] {\n const out = new Map<string, Detected>();\n for (const dep of Object.keys(pkg.deps)) {\n const hit = NODE_DEP_MAP[dep];\n if (hit && !out.has(hit.name)) out.set(hit.name, { ...hit, evidence: pkg.rel });\n }\n return [...out.values()];\n}\n\nasync function pythonText(root: string, scan: ScanResult): Promise<{ text: string; evidence: Record<string, string> }> {\n const names = [...scan.files].filter((f) => {\n const b = path.posix.basename(f);\n const depth = f.split('/').length;\n return depth <= 3 && !isAuxPath(f) && (b === 'pyproject.toml' || /^requirements.*\\.txt$/.test(b) || b === 'Pipfile' || b === 'setup.py' || b === 'setup.cfg');\n });\n let text = '';\n const evidence: Record<string, string> = {};\n for (const n of names.slice(0, 12)) {\n const t = await safeReadText(root, n, 256 * 1024).catch(() => null);\n if (t) {\n text += `\\n${t.toLowerCase()}`;\n for (const key of Object.keys(PY_DEP_MAP)) {\n if (!evidence[key] && new RegExp(`(^|[\\\\s\"'\\\\[,=<>~!-])${key}(?![a-z0-9_])`, 'm').test(t.toLowerCase())) evidence[key] = n;\n }\n }\n }\n return { text, evidence };\n}\n\nfunction parseWorkspaceYaml(text: string): string[] {\n const out: string[] = [];\n for (const line of text.split(/\\r?\\n/)) {\n const m = /^\\s*-\\s*['\"]?([^'\"#]+?)['\"]?\\s*(?:#.*)?$/.exec(line);\n if (m && m[1] && !m[1].startsWith('!')) out.push(m[1].trim());\n }\n return out;\n}\n\n/** Expand simple workspace globs (\"packages/*\", \"apps/**\" treated as one level, or a literal directory). */\nexport function expandWorkspaceGlobs(patterns: string[], files: Set<string>, manifest: string): string[] {\n const dirs = new Set<string>();\n for (const f of files) {\n if (path.posix.basename(f) === manifest && f.includes('/')) dirs.add(path.posix.dirname(f));\n }\n const out = new Set<string>();\n for (const pat of patterns) {\n const clean = pat.replace(/^\\.\\//, '').replace(/\\/$/, '');\n if (!clean.includes('*')) {\n if (dirs.has(clean)) out.add(clean);\n continue;\n }\n const prefix = clean.slice(0, clean.indexOf('*')).replace(/\\/$/, '');\n const deep = clean.includes('**');\n for (const d of dirs) {\n if (!d.startsWith(prefix + '/')) continue;\n const rest = d.slice(prefix.length + 1);\n if (deep || !rest.includes('/')) out.add(d);\n }\n }\n return [...out].sort();\n}\n\nfunction languagesFrom(byExt: Record<string, number>): { name: string; files: number }[] {\n const acc = new Map<string, number>();\n for (const [ext, n] of Object.entries(byExt)) {\n const lang = EXT_LANG[ext];\n if (lang) acc.set(lang, (acc.get(lang) ?? 0) + n);\n }\n return [...acc.entries()].map(([name, files]) => ({ name, files })).sort((a, b) => b.files - a.files || a.name.localeCompare(b.name));\n}\n\nexport interface DetectInput {\n root: string;\n projectName: string;\n scan: ScanResult;\n}\n\nconst LOCKFILES: [string, string][] = [\n ['pnpm-lock.yaml', 'pnpm'],\n ['yarn.lock', 'yarn'],\n ['bun.lockb', 'bun'],\n ['bun.lock', 'bun'],\n ['package-lock.json', 'npm'],\n ['npm-shrinkwrap.json', 'npm'],\n];\n\nconst MAX_NODE_PACKAGES = 200;\nconst MAX_MANIFEST_DEPTH = 5;\n\n/** A package.json that only sets {\"type\":\"module\"} (a marker file) is not a package. */\nfunction isRealManifest(p: PackageInfo): boolean {\n return !!p.name || Object.keys(p.scripts).length > 0 || Object.keys(p.deps).length > 0 || p.workspaces.length > 0;\n}\n\nfunction lockfilePm(files: Set<string>, dir: string): string | null {\n for (const [lock, pm] of LOCKFILES) if (files.has(dir ? `${dir}/${lock}` : lock)) return pm;\n return null;\n}\n\nexport interface FoundNodePackage extends NodePackageInput {\n manifest: string;\n /** Where the package manager came from, for transparency in discovery.json consumers. */\n pmSource: 'lockfile' | 'packageManager field' | 'inherited from root' | 'default';\n}\n\n/**\n * Find every Node.js package, not just the root one. Each package gets its own package manager from its own lockfile\n * (falling back to the packageManager field, then the root lockfile, then npm). No script is ever executed.\n */\nexport async function discoverNodePackages(root: string, files: Set<string>): Promise<{ packages: FoundNodePackage[]; unparsable: string[] }> {\n const manifests = [...files]\n .filter((f) => path.posix.basename(f) === 'package.json' && !isAuxPath(f) && f.split('/').length <= MAX_MANIFEST_DEPTH)\n .sort((a, b) => a.split('/').length - b.split('/').length || a.localeCompare(b))\n .slice(0, MAX_NODE_PACKAGES);\n const rootLockPm = lockfilePm(files, '');\n const packages: FoundNodePackage[] = [];\n const unparsable: string[] = [];\n for (const manifest of manifests) {\n const pkg = await readPackageJson(root, manifest);\n if (!pkg) {\n unparsable.push(manifest);\n continue;\n }\n if (!isRealManifest(pkg)) continue;\n const dir = path.posix.dirname(manifest) === '.' ? '' : path.posix.dirname(manifest);\n const own = lockfilePm(files, dir);\n const field = pkg.packageManagerField?.split('@')[0] ?? null;\n let packageManager: string;\n let pmSource: FoundNodePackage['pmSource'];\n if (own) {\n packageManager = own;\n pmSource = 'lockfile';\n } else if (field) {\n packageManager = field;\n pmSource = 'packageManager field';\n } else if (rootLockPm && dir !== '') {\n packageManager = rootLockPm;\n pmSource = 'inherited from root';\n } else {\n packageManager = 'npm';\n pmSource = 'default';\n }\n packages.push({ dir, pkg, packageManager, hasTsconfig: files.has(dir ? `${dir}/tsconfig.json` : 'tsconfig.json'), manifest, pmSource });\n }\n return { packages, unparsable };\n}\n\nexport async function detectProject(input: DetectInput): Promise<DiscoveryReport> {\n const { root, scan } = input;\n const files = scan.files;\n const has = (rel: string): boolean => files.has(rel);\n const warnings: string[] = [];\n const ecosystems = new Set<string>();\n const frameworks = new Map<string, Detected>();\n const addFw = (d: Detected): void => {\n if (!frameworks.has(d.name)) frameworks.set(d.name, d);\n };\n\n // Node / JS: every package.json, not only the one at the root\n const { packages: nodePkgs, unparsable } = await discoverNodePackages(root, files);\n for (const m of unparsable.slice(0, 5)) warnings.push(`${m} exists but could not be parsed.`);\n const rootNode = nodePkgs.find((p) => p.dir === '');\n const rootPkg = rootNode?.pkg ?? null;\n if (nodePkgs.length > 0) {\n ecosystems.add('node');\n for (const p of nodePkgs) nodeFrameworks(p.pkg).forEach(addFw);\n }\n let packageManager: string | null = null;\n const pms = [...new Set(nodePkgs.map((p) => p.packageManager))].sort();\n if (pms.length === 1) packageManager = pms[0]!;\n else if (pms.length > 1) packageManager = `mixed (${pms.join(', ')})`;\n\n // Python\n const py = await pythonText(root, scan);\n const hasPy = has('pyproject.toml') || has('requirements.txt') || has('Pipfile') || has('setup.py') || [...files].some((f) => f.endsWith('.py') && !isAuxPath(f));\n if (hasPy) {\n ecosystems.add('python');\n for (const [k, ev] of Object.entries(py.evidence)) {\n const m = PY_DEP_MAP[k];\n if (m) addFw({ ...m, evidence: ev });\n }\n if (!packageManager) {\n if (has('poetry.lock') || py.text.includes('[tool.poetry]')) packageManager = 'poetry';\n else if (has('uv.lock')) packageManager = 'uv';\n else if (has('Pipfile')) packageManager = 'pipenv';\n else if (has('requirements.txt') || has('pyproject.toml')) packageManager = 'pip';\n }\n }\n\n const simple: [string, string, string][] = [\n ['go.mod', 'go', 'go'],\n ['Cargo.toml', 'rust', 'cargo'],\n ['pom.xml', 'java', 'maven'],\n ['build.gradle', 'java', 'gradle'],\n ['build.gradle.kts', 'java', 'gradle'],\n ['composer.json', 'php', 'composer'],\n ['Gemfile', 'ruby', 'bundler'],\n ];\n for (const [file, eco, pm] of simple) {\n if (has(file)) {\n ecosystems.add(eco);\n if (!packageManager) packageManager = pm;\n }\n }\n if ([...files].some((f) => /\\.csproj$/.test(f) && f.split('/').length <= 3)) ecosystems.add('dotnet');\n\n // Monorepo\n let monoTool: string | null = null;\n let workspacePatterns: string[] = [];\n let manifest = 'package.json';\n if (has('pnpm-workspace.yaml')) {\n monoTool = 'pnpm-workspaces';\n workspacePatterns = parseWorkspaceYaml((await safeReadText(root, 'pnpm-workspace.yaml', 64 * 1024).catch(() => null)) ?? '');\n } else if (rootPkg && rootPkg.workspaces.length > 0) {\n monoTool = rootNode?.packageManager === 'yarn' ? 'yarn-workspaces' : 'npm-workspaces';\n workspacePatterns = rootPkg.workspaces;\n } else if (has('lerna.json')) monoTool = 'lerna';\n else if (has('nx.json')) monoTool = 'nx';\n else if (has('turbo.json')) monoTool = 'turborepo';\n else if (has('Cargo.toml')) {\n const cargo = (await safeReadText(root, 'Cargo.toml', 64 * 1024).catch(() => null)) ?? '';\n if (/^\\[workspace\\]/m.test(cargo)) {\n monoTool = 'cargo-workspace';\n manifest = 'Cargo.toml';\n workspacePatterns = [...cargo.matchAll(/\"([^\"]+)\"/g)].map((m) => m[1]!).filter((s) => !s.includes(' '));\n }\n } else if (has('go.work')) monoTool = 'go-work';\n\n const packages: SubProject[] = [];\n for (const p of nodePkgs) {\n if (p.dir === '') continue;\n packages.push({ path: p.dir, name: p.pkg.name ?? path.posix.basename(p.dir), ecosystem: 'node', frameworks: nodeFrameworks(p.pkg).map((f) => f.name), packageManager: p.packageManager });\n }\n if (monoTool === 'cargo-workspace') {\n for (const d of expandWorkspaceGlobs(workspacePatterns, files, manifest).slice(0, 100)) {\n packages.push({ path: d, name: path.posix.basename(d), ecosystem: 'rust', frameworks: [] });\n }\n }\n // Several packages without any workspace tooling (e.g. backend/ + frontend/ and no root package.json) is still one repository of many packages.\n if (!monoTool && nodePkgs.length >= 2) monoTool = 'multi-package';\n\n const testConfigs = [...files].filter((f) => TEST_CONFIG_RE.test(f) && f.split('/').length <= 4 && !isAuxPath(f)).sort().slice(0, 30);\n const ci = [\n ...[...files].filter((f) => f.startsWith('.github/workflows/')),\n ...['.gitlab-ci.yml', 'azure-pipelines.yml', 'Jenkinsfile', '.travis.yml', 'bitbucket-pipelines.yml', '.circleci/config.yml'].filter(has),\n ].sort();\n const docker = [...files].filter((f) => !isAuxPath(f) && /(^|\\/)(Dockerfile(\\..+)?|docker-compose[^/]*\\.ya?ml|compose\\.ya?ml)$/.test(f) && f.split('/').length <= 3).sort();\n const deployment = [\n 'vercel.json',\n 'netlify.toml',\n 'fly.toml',\n 'render.yaml',\n 'Procfile',\n 'app.yaml',\n 'serverless.yml',\n 'wrangler.toml',\n 'railway.json',\n 'firebase.json',\n 'Chart.yaml',\n ]\n .filter(has)\n .concat([...files].filter((f) => /^(k8s|kubernetes|deploy|infra|terraform)\\//.test(f)).slice(0, 5))\n .sort();\n const aiInstructions = [...AI_FILES.filter(has), ...[...files].filter((f) => f.startsWith('.claude/') && /\\.(md|json)$/.test(f)).slice(0, 20)].sort();\n const docs = [\n ...[...files].filter((f) => /^readme(\\.[a-z]+)?$/i.test(f)),\n ...[...files].filter((f) => /^docs\\/[^/]+\\.(md|mdx|rst)$/i.test(f)).slice(0, 15),\n ...['CONTRIBUTING.md', 'ARCHITECTURE.md', 'CHANGELOG.md'].filter(has),\n ].sort();\n\n const entryHints: string[] = [];\n for (const cand of ['src/index.ts', 'src/main.ts', 'src/app.ts', 'src/server.ts', 'index.js', 'server.js', 'app.js', 'main.py', 'app/main.py', 'main.go', 'cmd', 'src/main.rs', 'manage.py', 'src/App.tsx', 'app/layout.tsx']) {\n if (has(cand) || [...files].some((f) => f.startsWith(cand + '/'))) entryHints.push(cand);\n }\n\n const commands = buildContract({\n nodePackages: nodePkgs,\n ecosystems,\n has,\n pythonEvidence: py.evidence,\n files,\n });\n\n const languages = languagesFrom(scan.byExtension).slice(0, 12);\n if (ecosystems.size === 0 && languages.length > 0) {\n warnings.push(\n `No ecosystem was recognised although source files were found (${languages.slice(0, 3).map((l) => l.name).join(', ')}). Package manifests may be missing or unsupported; record verification commands by hand in .devworkspace/context/commands.json.`,\n );\n }\n if (ecosystems.size > 0 && !commands.some((c) => c.available)) {\n warnings.push('No verification commands (tests, lint, typecheck, build) were found in the package manifests.');\n }\n if (scan.truncated) warnings.push('Scan hit its file or depth limit; discovery is partial.');\n if (scan.sensitiveFiles.length > 0) warnings.push('Credential-like files exist; their contents were not read.');\n if (!has('README.md') && !docs.some((d) => /^readme/i.test(d))) warnings.push('No README found.');\n\n return {\n schemaVersion: 1,\n project: { name: rootPkg?.name ?? input.projectName },\n scan: {\n fileCount: scan.fileCount,\n dirCount: scan.dirCount,\n truncated: scan.truncated,\n skippedSymlinks: scan.skippedSymlinks,\n ignoredEntries: scan.ignoredEntries,\n },\n languages,\n topDirs: scan.topDirs,\n ecosystems: [...ecosystems].sort(),\n packageManager,\n frameworks: [...frameworks.values()].sort((a, b) => a.name.localeCompare(b.name)),\n monorepo: { tool: monoTool, packages },\n commands,\n manifests: [...nodePkgs.map((p) => p.manifest), ...['pyproject.toml', 'requirements.txt', 'Pipfile', 'go.mod', 'Cargo.toml', 'pom.xml', 'build.gradle', 'build.gradle.kts', 'composer.json', 'Gemfile'].filter(has)].sort(),\n testConfigs,\n ci,\n docker,\n deployment,\n aiInstructions,\n docs,\n sensitiveFilesPresent: scan.sensitiveFiles.filter((f) => isSensitiveFile(f)),\n entryHints,\n warnings,\n };\n}\n"]}
@@ -3,6 +3,7 @@ import path from 'node:path';
3
3
  import { compareVersions, findPython, findTool } from '../exec.js';
4
4
  import { GRAPHIFY_NOTICE, writeThirdPartyNotice } from '../notices.js';
5
5
  import { pathExists } from '../../utils/fs.js';
6
+ import { persistentPathHas } from '../persistentPath.js';
6
7
  /**
7
8
  * Graphify. Verified against the published package (graphifyy 0.9.82) and its CLI help on 2026-10-09:
8
9
  * - PyPI package `graphifyy`, executable `graphify`; README documents pip and pipx (pipx recommended on Windows)
@@ -12,7 +13,6 @@ import { pathExists } from '../../utils/fs.js';
12
13
  * It merges and is idempotent, but it does change files the user owns, so every run is snapshotted and verified.
13
14
  * uv is not mentioned in the README; `uv tool install` is used because it is the equivalent of pipx for console tools.
14
15
  */
15
- const EXE = process.platform === 'win32' ? 'graphify.exe' : 'graphify';
16
16
  const MIN_PYTHON = '3.10.0';
17
17
  async function exists(p) {
18
18
  return pathExists(p);
@@ -25,7 +25,7 @@ async function locate(ctx, deep) {
25
25
  if (deep)
26
26
  dirs.push(...(await toolBinDirs(ctx)));
27
27
  for (const d of dirs) {
28
- const candidate = path.join(d, ctx.platform === 'win32' ? 'graphify.exe' : EXE);
28
+ const candidate = path.join(d, ctx.platform === 'win32' ? 'graphify.exe' : 'graphify');
29
29
  if (await exists(candidate))
30
30
  return { path: candidate, onPath: false };
31
31
  }
@@ -69,6 +69,35 @@ function pathAdvice(ctx, dir) {
69
69
  ? [`${where} (Settings > System > About > Advanced system settings > Environment Variables), or run \`pipx ensurepath\` / \`uv tool update-shell\`, then open a new terminal.`]
70
70
  : [`${where}, or run \`pipx ensurepath\` / \`uv tool update-shell\`, then open a new terminal.`];
71
71
  }
72
+ /**
73
+ * Why is graphify not on this process's PATH? On Windows the registry tells us whether the folder is already on the
74
+ * persistent PATH (then a restart is the fix and adding it again would be wrong advice) or genuinely missing from it.
75
+ * Elsewhere, or when the registry cannot be read, the persistent PATH is unknown and the general advice is kept.
76
+ * Only called for deep inspections; quick checks never spawn a process.
77
+ */
78
+ async function diagnoseMissingPath(ctx, dir) {
79
+ const persistent = await ctx.persistentPath();
80
+ const where = persistent ? persistentPathHas(persistent, dir) : null;
81
+ if (persistent && where) {
82
+ return {
83
+ staleSession: true,
84
+ explanation: `graphify is on your ${where} PATH (${dir}), but this terminal or editor started before that was set, so processes launched from it (including Claude Code hooks) still cannot find it.`,
85
+ nextSteps: ['Close and reopen your terminal, or restart VS Code (and Claude Code), so it inherits the updated PATH. No change to PATH is needed. Then run: devworkspace doctor'],
86
+ };
87
+ }
88
+ if (persistent) {
89
+ return {
90
+ staleSession: false,
91
+ explanation: `graphify is not on your PATH: ${dir} is missing from this terminal's PATH and from your persistent user and machine PATH.`,
92
+ nextSteps: pathAdvice(ctx, dir),
93
+ };
94
+ }
95
+ return {
96
+ staleSession: false,
97
+ explanation: 'graphify is not on this terminal\'s PATH.',
98
+ nextSteps: [...pathAdvice(ctx, dir), 'If you already added it, restart the terminal or editor so it picks up the change.'],
99
+ };
100
+ }
72
101
  export const graphify = {
73
102
  id: 'graphify',
74
103
  name: 'Graphify',
@@ -131,13 +160,22 @@ export const graphify = {
131
160
  nextSteps.push('devworkspace integrations repair --yes');
132
161
  return { ...base, status: 'DEGRADED', variant: 'cli + stale project skill', scope, version, warnings, nextSteps };
133
162
  }
134
- if (hooks && !loc.onPath) {
135
- warnings.push('Claude Code hooks call `graphify` by name, but it is not on PATH in this terminal, so the hooks would fail.');
136
- nextSteps.push(...pathAdvice(ctx, loc.path ? path.dirname(loc.path) : null));
137
- return { ...base, status: 'DEGRADED', variant: 'cli + project skill (PATH missing)', scope, version, warnings, nextSteps };
163
+ if (!loc.onPath) {
164
+ const dir = path.dirname(loc.path);
165
+ // Only a deep inspection may ask the registry; a quick check keeps the general advice.
166
+ const diag = deep
167
+ ? await diagnoseMissingPath(ctx, dir)
168
+ : { staleSession: false, explanation: 'graphify is not on this terminal\'s PATH.', nextSteps: pathAdvice(ctx, dir) };
169
+ if (hooks) {
170
+ warnings.push(`Claude Code hooks call \`graphify\` by name, so they fail until it is found. ${diag.explanation}`);
171
+ nextSteps.push(...diag.nextSteps);
172
+ return diag.staleSession
173
+ ? { ...base, status: 'RESTART_REQUIRED', variant: 'cli + project skill (restart terminal)', scope, version, warnings, nextSteps }
174
+ : { ...base, status: 'DEGRADED', variant: 'cli + project skill (PATH missing)', scope, version, warnings, nextSteps };
175
+ }
176
+ warnings.push(diag.explanation);
177
+ nextSteps.push(...diag.nextSteps);
138
178
  }
139
- if (!loc.onPath)
140
- warnings.push(`graphify is installed but not on PATH. ${pathAdvice(ctx, path.dirname(loc.path))[0]}`);
141
179
  return { ...base, status: deep ? 'VERIFIED' : 'INSTALLED', variant: 'cli + project skill', scope, version, warnings, nextSteps };
142
180
  },
143
181
  async plan(ctx, report) {
@@ -1 +1 @@
1
- {"version":3,"file":"graphify.js","sourceRoot":"","sources":["../../../src/integrations/adapters/graphify.ts"],"names":[],"mappings":"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","sourcesContent":["import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { compareVersions, findPython, findTool } from '../exec.js';\nimport { GRAPHIFY_NOTICE, writeThirdPartyNotice } from '../notices.js';\nimport type { AdapterContext, Check, IntegrationAdapter, IntegrationReport, PlanResult, PlanStep, StepOutcome } from '../types.js';\nimport { pathExists } from '../../utils/fs.js';\n\n/**\n * Graphify. Verified against the published package (graphifyy 0.9.82) and its CLI help on 2026-10-09:\n * - PyPI package `graphifyy`, executable `graphify`; README documents pip and pipx (pipx recommended on Windows)\n * - `graphify --version` prints \"graphify <version>\"\n * - `graphify install --project` writes .claude/skills/graphify/, appends a graphify section to CLAUDE.md,\n * creates .claude/CLAUDE.md and registers PreToolUse hooks (`graphify hook-guard ...`) in .claude/settings.json.\n * It merges and is idempotent, but it does change files the user owns, so every run is snapshotted and verified.\n * uv is not mentioned in the README; `uv tool install` is used because it is the equivalent of pipx for console tools.\n */\n\nconst EXE = process.platform === 'win32' ? 'graphify.exe' : 'graphify';\nconst MIN_PYTHON = '3.10.0';\n\ninterface Located {\n path: string | null;\n onPath: boolean;\n}\n\nasync function exists(p: string): Promise<boolean> {\n return pathExists(p);\n}\n\nasync function locate(ctx: AdapterContext, deep: boolean): Promise<Located> {\n const onPath = await ctx.runner.which('graphify');\n if (onPath) return { path: onPath, onPath: true };\n const dirs = [path.join(ctx.home, '.local', 'bin')];\n if (deep) dirs.push(...(await toolBinDirs(ctx)));\n for (const d of dirs) {\n const candidate = path.join(d, ctx.platform === 'win32' ? 'graphify.exe' : EXE);\n if (await exists(candidate)) return { path: candidate, onPath: false };\n }\n return { path: null, onPath: false };\n}\n\n/** Where uv, pipx and `pip --user` put console scripts, asked from the tools themselves (they differ by OS and version). */\nasync function toolBinDirs(ctx: AdapterContext): Promise<string[]> {\n const out: string[] = [];\n const uv = await findTool(ctx.runner, 'uv', ctx.signal);\n if (uv) {\n const r = await ctx.runner.run({ command: uv.command, args: ['tool', 'dir', '--bin'], timeoutMs: 10_000, signal: ctx.signal });\n if (r.ok && r.stdout.trim()) out.push(r.stdout.trim().split(/\\r?\\n/)[0]!);\n }\n const pipx = await findTool(ctx.runner, 'pipx', ctx.signal);\n if (pipx) {\n const r = await ctx.runner.run({ command: pipx.command, args: ['environment', '--value', 'PIPX_BIN_DIR'], timeoutMs: 10_000, signal: ctx.signal });\n if (r.ok && r.stdout.trim()) out.push(r.stdout.trim().split(/\\r?\\n/)[0]!);\n }\n const py = await findPython(ctx.runner, ctx.platform, ctx.signal);\n if (py) {\n const code = \"import sysconfig,os;print(sysconfig.get_path('scripts', os.name + '_user'))\";\n const r = await ctx.runner.run({ command: py.command, args: [...py.args, '-c', code], timeoutMs: 10_000, signal: ctx.signal });\n if (r.ok && r.stdout.trim()) out.push(r.stdout.trim().split(/\\r?\\n/)[0]!);\n }\n return out;\n}\n\nasync function readText(p: string): Promise<string | null> {\n try {\n return await fs.readFile(p, 'utf8');\n } catch {\n return null;\n }\n}\n\nfunction pathAdvice(ctx: AdapterContext, dir: string | null): string[] {\n const where = dir ? `Add ${dir} to your PATH` : 'Add the folder containing graphify to your PATH';\n return ctx.platform === 'win32'\n ? [`${where} (Settings > System > About > Advanced system settings > Environment Variables), or run \\`pipx ensurepath\\` / \\`uv tool update-shell\\`, then open a new terminal.`]\n : [`${where}, or run \\`pipx ensurepath\\` / \\`uv tool update-shell\\`, then open a new terminal.`];\n}\n\nexport const graphify: IntegrationAdapter = {\n id: 'graphify',\n name: 'Graphify',\n required: true,\n docsUrl: 'https://github.com/Graphify-Labs/graphify',\n usage:\n 'For \"where is X / what depends on Y\" questions, query the Graphify graph first (graphify query \"<question>\", graphify path \"<A>\" \"<B>\", graphify explain \"<concept>\") ' +\n 'or use the /graphify skill. The graph is a navigation aid, not a source of truth: confirm in the actual files before relying on it. After editing code, `graphify update .` refreshes it (no LLM cost).',\n\n async inspect(ctx, deep): Promise<IntegrationReport> {\n const loc = await locate(ctx, deep);\n const projectSkill = await exists(path.join(ctx.root, '.claude', 'skills', 'graphify', 'SKILL.md'));\n const userSkill = !projectSkill && (await exists(path.join(ctx.home, '.claude', 'skills', 'graphify', 'SKILL.md')));\n const settings = (await readText(path.join(ctx.root, '.claude', 'settings.json'))) ?? '';\n const hooks = /graphify\\s+hook-guard/.test(settings);\n const graph = await exists(path.join(ctx.root, 'graphify-out', 'graph.json'));\n const skillVersion = ((await readText(path.join(ctx.root, '.claude', 'skills', 'graphify', '.graphify_version'))) ?? '').trim() || null;\n\n let version: string | null = null;\n let runnable: boolean | null = null;\n if (deep && loc.path) {\n const r = await ctx.runner.run({ command: loc.path, args: ['--version'], timeoutMs: 15_000, signal: ctx.signal });\n const m = /graphify\\s+(\\S+)/i.exec(r.stdout);\n runnable = r.ok && !!m;\n version = m?.[1] ?? null;\n }\n\n const checks: Check[] = [\n { name: 'graphify executable', ok: !!loc.path, detail: loc.path ? (loc.onPath ? 'on PATH' : 'found, but not on PATH') : 'not found' },\n ];\n if (deep && loc.path) checks.push({ name: 'graphify --version', ok: !!runnable, detail: version ? `graphify ${version}` : 'did not run' });\n checks.push({ name: 'Claude skill', ok: projectSkill || userSkill, detail: projectSkill ? 'project (.claude/skills/graphify)' : userSkill ? 'user (~/.claude/skills/graphify)' : 'missing' });\n if (projectSkill && version && skillVersion) checks.push({ name: 'skill matches CLI version', ok: skillVersion === version, detail: `skill ${skillVersion}, CLI ${version}` });\n const capabilities = { cli: !!loc.path, skill: projectSkill || userSkill, hooks, graphBuilt: graph };\n const warnings: string[] = [];\n const nextSteps: string[] = [];\n if (!graph) warnings.push('No graph built yet. In Claude Code run `/graphify .` (graph building uses the model, so DevWorkspace does not do it).');\n\n const base = { id: 'graphify', name: 'Graphify', required: true, deep, capabilities, checks } as const;\n const scope = projectSkill ? 'project' : userSkill ? 'user' : null;\n\n if (!loc.path && !projectSkill && !userSkill) {\n nextSteps.push('devworkspace setup --integrations --yes');\n return { ...base, status: 'NOT_INSTALLED', variant: null, scope: null, version: null, warnings, nextSteps };\n }\n if (!loc.path) {\n warnings.push('The Claude skill/hooks exist but the graphify command is missing, so they cannot work.');\n nextSteps.push('devworkspace integrations repair --yes');\n return { ...base, status: 'DEGRADED', variant: 'project skill without CLI', scope, version: null, warnings, nextSteps };\n }\n if (deep && runnable === false) {\n warnings.push('The graphify executable was found but `graphify --version` failed.');\n nextSteps.push('devworkspace integrations repair --yes');\n return { ...base, status: 'DEGRADED', variant: 'cli (not runnable)', scope, version, warnings, nextSteps };\n }\n if (!projectSkill && !userSkill) {\n warnings.push('The graphify CLI is installed but its Claude skill is not set up for this project.');\n nextSteps.push('devworkspace setup --integrations --yes (runs `graphify install --project`)');\n return { ...base, status: 'DEGRADED', variant: 'cli without project skill', scope: null, version, warnings, nextSteps };\n }\n if (version && skillVersion && compareVersions(version.replace(/[^0-9.]/g, '') || '0.0.0', skillVersion.replace(/[^0-9.]/g, '') || '0.0.0') !== 0) {\n warnings.push(`The project skill is from graphify ${skillVersion} but the CLI is ${version}.`);\n nextSteps.push('devworkspace integrations repair --yes');\n return { ...base, status: 'DEGRADED', variant: 'cli + stale project skill', scope, version, warnings, nextSteps };\n }\n if (hooks && !loc.onPath) {\n warnings.push('Claude Code hooks call `graphify` by name, but it is not on PATH in this terminal, so the hooks would fail.');\n nextSteps.push(...pathAdvice(ctx, loc.path ? path.dirname(loc.path) : null));\n return { ...base, status: 'DEGRADED', variant: 'cli + project skill (PATH missing)', scope, version, warnings, nextSteps };\n }\n if (!loc.onPath) warnings.push(`graphify is installed but not on PATH. ${pathAdvice(ctx, path.dirname(loc.path))[0]}`);\n return { ...base, status: deep ? 'VERIFIED' : 'INSTALLED', variant: 'cli + project skill', scope, version, warnings, nextSteps };\n },\n\n async plan(ctx, report): Promise<PlanResult> {\n const protectPaths = ['CLAUDE.md', '.claude/CLAUDE.md', '.claude/settings.json', '.claude/settings.local.json', 'AGENTS.md'];\n const blockers: string[] = [];\n const notes: string[] = [];\n const steps: PlanStep[] = [];\n if (report.status === 'VERIFIED' && !ctx.setup.repair) return { steps, blockers, protectPaths, notes: ['already verified'] };\n\n const loc = await locate(ctx, true);\n const exeRef: { path: string | null } = { path: loc.path };\n const scope = ctx.setup.scope;\n\n if (!loc.path) {\n const uv = await findTool(ctx.runner, 'uv', ctx.signal);\n const pipx = await findTool(ctx.runner, 'pipx', ctx.signal);\n const py = await findPython(ctx.runner, ctx.platform, ctx.signal);\n const pyOk = !!py && compareVersions(py.version, MIN_PYTHON) >= 0;\n const choice: { command: string[]; how: string } | null = uv\n ? { command: [uv.command, 'tool', 'install', 'graphifyy'], how: 'uv tool install' }\n : pipx\n ? { command: [pipx.command, 'install', 'graphifyy'], how: 'pipx install' }\n : pyOk && py\n ? { command: [py.command, ...py.args, '-m', 'pip', 'install', '--user', 'graphifyy'], how: 'pip install --user' }\n : null;\n if (choice && !uv && !pipx) notes.push('uv and pipx were not found; falling back to the documented `pip install --user` (no administrator rights needed).');\n if (!choice) {\n if (py && !pyOk) blockers.push(`Python ${py.version} is too old; graphify needs Python 3.10 or newer.`);\n blockers.push(\n 'No installer found. Graphify is a Python tool: install ONE of these, then re-run setup (nothing else is required):',\n ctx.platform === 'win32'\n ? ' - uv: winget install --id astral-sh.uv (or https://docs.astral.sh/uv/getting-started/installation/)'\n : ' - uv: https://docs.astral.sh/uv/getting-started/installation/',\n ' - Python 3.10+ from https://www.python.org/downloads/ (the Microsoft Store \"python\" shortcut on Windows is not a real install)',\n ' - pipx: https://pipx.pypa.io/stable/installation/',\n );\n return { steps, blockers, protectPaths, notes };\n }\n const { command, how } = choice;\n const [cmd, ...args] = command;\n steps.push({\n id: 'graphify:tool',\n description: `Install the graphifyy package for your user account (${how}; no administrator rights, nothing system-wide)`,\n command: command.map((c, i) => (i === 0 ? path.basename(c, path.extname(c)) : c)).join(' '),\n level: 'machine',\n async run(): Promise<StepOutcome> {\n const r = await ctx.runner.run({ command: cmd!, args, cwd: ctx.root, timeoutMs: 600_000, signal: ctx.signal });\n if (r.aborted) return { ok: false, detail: 'cancelled' };\n if (r.timedOut) return { ok: false, detail: 'timed out after 10 minutes (network?)' };\n if (!r.ok) {\n const text = `${r.stderr}\\n${r.stdout}`;\n if (/externally[- ]managed/i.test(text)) return { ok: false, detail: 'pip refuses to install into this Python (externally-managed environment). Install pipx or uv instead, then re-run.' };\n if (/permission denied|access is denied|EACCES|WinError 5/i.test(text)) return { ok: false, detail: 'permission denied while installing. Run the command yourself from a terminal with the right permissions.' };\n const tail = text.split(/\\r?\\n/).map((l) => l.trim()).filter(Boolean).slice(-3).join(' ');\n return { ok: false, detail: (tail || r.error || `exit ${r.code}`).slice(0, 400) };\n }\n const found = await locate(ctx, true);\n if (!found.path) return { ok: false, detail: 'graphifyy was installed but the graphify executable could not be located. Check the Scripts/bin folder of your Python tool.' };\n exeRef.path = found.path;\n return { ok: true, detail: found.onPath ? 'installed' : 'installed (not on PATH in this terminal)' };\n },\n });\n }\n\n steps.push({\n id: 'graphify:project-skill',\n description:\n scope === 'user'\n ? 'Install the Graphify skill for your user account (graphify install)'\n : 'Install the Graphify project skill (graphify install --project): adds .claude/skills/graphify/, appends a graphify section to CLAUDE.md and registers Claude Code hooks in .claude/settings.json (existing content is preserved and verified)',\n command: scope === 'user' ? 'graphify install' : 'graphify install --project',\n level: scope === 'user' ? 'user-config' : 'project',\n async run(): Promise<StepOutcome> {\n if (!exeRef.path) return { ok: false, detail: 'the graphify executable is not available' };\n const r = await ctx.runner.run({ command: exeRef.path, args: scope === 'user' ? ['install'] : ['install', '--project'], cwd: ctx.root, timeoutMs: 120_000, signal: ctx.signal });\n if (r.aborted) return { ok: false, detail: 'cancelled' };\n if (r.timedOut) return { ok: false, detail: 'timed out after 120 s' };\n if (!r.ok) {\n const tail = `${r.stderr}\\n${r.stdout}`.split(/\\r?\\n/).map((l) => l.trim()).filter(Boolean).slice(-3).join(' ');\n return { ok: false, detail: (tail || r.error || `exit ${r.code}`).slice(0, 400) };\n }\n return { ok: true, detail: 'project skill installed', restartRequired: true, managedPaths: scope === 'user' ? [] : ['.claude/skills/graphify'] };\n },\n });\n steps.push({\n id: 'graphify:notice',\n description: 'Record attribution in .devworkspace/THIRD_PARTY_NOTICES.md',\n level: 'project',\n async run(): Promise<StepOutcome> {\n await writeThirdPartyNotice(ctx.root, GRAPHIFY_NOTICE);\n return { ok: true };\n },\n });\n return { steps, blockers, protectPaths, notes };\n },\n};\n"]}
1
+ {"version":3,"file":"graphify.js","sourceRoot":"","sources":["../../../src/integrations/adapters/graphify.ts"],"names":[],"mappings":"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","sourcesContent":["import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { compareVersions, findPython, findTool } from '../exec.js';\nimport { GRAPHIFY_NOTICE, writeThirdPartyNotice } from '../notices.js';\nimport type { AdapterContext, Check, IntegrationAdapter, IntegrationReport, PlanResult, PlanStep, StepOutcome } from '../types.js';\nimport { pathExists } from '../../utils/fs.js';\nimport { persistentPathHas } from '../persistentPath.js';\n\n/**\n * Graphify. Verified against the published package (graphifyy 0.9.82) and its CLI help on 2026-10-09:\n * - PyPI package `graphifyy`, executable `graphify`; README documents pip and pipx (pipx recommended on Windows)\n * - `graphify --version` prints \"graphify <version>\"\n * - `graphify install --project` writes .claude/skills/graphify/, appends a graphify section to CLAUDE.md,\n * creates .claude/CLAUDE.md and registers PreToolUse hooks (`graphify hook-guard ...`) in .claude/settings.json.\n * It merges and is idempotent, but it does change files the user owns, so every run is snapshotted and verified.\n * uv is not mentioned in the README; `uv tool install` is used because it is the equivalent of pipx for console tools.\n */\n\nconst MIN_PYTHON = '3.10.0';\n\ninterface Located {\n path: string | null;\n onPath: boolean;\n}\n\nasync function exists(p: string): Promise<boolean> {\n return pathExists(p);\n}\n\nasync function locate(ctx: AdapterContext, deep: boolean): Promise<Located> {\n const onPath = await ctx.runner.which('graphify');\n if (onPath) return { path: onPath, onPath: true };\n const dirs = [path.join(ctx.home, '.local', 'bin')];\n if (deep) dirs.push(...(await toolBinDirs(ctx)));\n for (const d of dirs) {\n const candidate = path.join(d, ctx.platform === 'win32' ? 'graphify.exe' : 'graphify');\n if (await exists(candidate)) return { path: candidate, onPath: false };\n }\n return { path: null, onPath: false };\n}\n\n/** Where uv, pipx and `pip --user` put console scripts, asked from the tools themselves (they differ by OS and version). */\nasync function toolBinDirs(ctx: AdapterContext): Promise<string[]> {\n const out: string[] = [];\n const uv = await findTool(ctx.runner, 'uv', ctx.signal);\n if (uv) {\n const r = await ctx.runner.run({ command: uv.command, args: ['tool', 'dir', '--bin'], timeoutMs: 10_000, signal: ctx.signal });\n if (r.ok && r.stdout.trim()) out.push(r.stdout.trim().split(/\\r?\\n/)[0]!);\n }\n const pipx = await findTool(ctx.runner, 'pipx', ctx.signal);\n if (pipx) {\n const r = await ctx.runner.run({ command: pipx.command, args: ['environment', '--value', 'PIPX_BIN_DIR'], timeoutMs: 10_000, signal: ctx.signal });\n if (r.ok && r.stdout.trim()) out.push(r.stdout.trim().split(/\\r?\\n/)[0]!);\n }\n const py = await findPython(ctx.runner, ctx.platform, ctx.signal);\n if (py) {\n const code = \"import sysconfig,os;print(sysconfig.get_path('scripts', os.name + '_user'))\";\n const r = await ctx.runner.run({ command: py.command, args: [...py.args, '-c', code], timeoutMs: 10_000, signal: ctx.signal });\n if (r.ok && r.stdout.trim()) out.push(r.stdout.trim().split(/\\r?\\n/)[0]!);\n }\n return out;\n}\n\nasync function readText(p: string): Promise<string | null> {\n try {\n return await fs.readFile(p, 'utf8');\n } catch {\n return null;\n }\n}\n\nfunction pathAdvice(ctx: AdapterContext, dir: string | null): string[] {\n const where = dir ? `Add ${dir} to your PATH` : 'Add the folder containing graphify to your PATH';\n return ctx.platform === 'win32'\n ? [`${where} (Settings > System > About > Advanced system settings > Environment Variables), or run \\`pipx ensurepath\\` / \\`uv tool update-shell\\`, then open a new terminal.`]\n : [`${where}, or run \\`pipx ensurepath\\` / \\`uv tool update-shell\\`, then open a new terminal.`];\n}\n\ninterface PathDiagnosis {\n /** The folder is on the PATH new processes get, but this process started before that was set. */\n staleSession: boolean;\n /** Short, accurate description of the situation for the user. */\n explanation: string;\n nextSteps: string[];\n}\n\n/**\n * Why is graphify not on this process's PATH? On Windows the registry tells us whether the folder is already on the\n * persistent PATH (then a restart is the fix and adding it again would be wrong advice) or genuinely missing from it.\n * Elsewhere, or when the registry cannot be read, the persistent PATH is unknown and the general advice is kept.\n * Only called for deep inspections; quick checks never spawn a process.\n */\nasync function diagnoseMissingPath(ctx: AdapterContext, dir: string): Promise<PathDiagnosis> {\n const persistent = await ctx.persistentPath();\n const where = persistent ? persistentPathHas(persistent, dir) : null;\n if (persistent && where) {\n return {\n staleSession: true,\n explanation: `graphify is on your ${where} PATH (${dir}), but this terminal or editor started before that was set, so processes launched from it (including Claude Code hooks) still cannot find it.`,\n nextSteps: ['Close and reopen your terminal, or restart VS Code (and Claude Code), so it inherits the updated PATH. No change to PATH is needed. Then run: devworkspace doctor'],\n };\n }\n if (persistent) {\n return {\n staleSession: false,\n explanation: `graphify is not on your PATH: ${dir} is missing from this terminal's PATH and from your persistent user and machine PATH.`,\n nextSteps: pathAdvice(ctx, dir),\n };\n }\n return {\n staleSession: false,\n explanation: 'graphify is not on this terminal\\'s PATH.',\n nextSteps: [...pathAdvice(ctx, dir), 'If you already added it, restart the terminal or editor so it picks up the change.'],\n };\n}\n\nexport const graphify: IntegrationAdapter = {\n id: 'graphify',\n name: 'Graphify',\n required: true,\n docsUrl: 'https://github.com/Graphify-Labs/graphify',\n usage:\n 'For \"where is X / what depends on Y\" questions, query the Graphify graph first (graphify query \"<question>\", graphify path \"<A>\" \"<B>\", graphify explain \"<concept>\") ' +\n 'or use the /graphify skill. The graph is a navigation aid, not a source of truth: confirm in the actual files before relying on it. After editing code, `graphify update .` refreshes it (no LLM cost).',\n\n async inspect(ctx, deep): Promise<IntegrationReport> {\n const loc = await locate(ctx, deep);\n const projectSkill = await exists(path.join(ctx.root, '.claude', 'skills', 'graphify', 'SKILL.md'));\n const userSkill = !projectSkill && (await exists(path.join(ctx.home, '.claude', 'skills', 'graphify', 'SKILL.md')));\n const settings = (await readText(path.join(ctx.root, '.claude', 'settings.json'))) ?? '';\n const hooks = /graphify\\s+hook-guard/.test(settings);\n const graph = await exists(path.join(ctx.root, 'graphify-out', 'graph.json'));\n const skillVersion = ((await readText(path.join(ctx.root, '.claude', 'skills', 'graphify', '.graphify_version'))) ?? '').trim() || null;\n\n let version: string | null = null;\n let runnable: boolean | null = null;\n if (deep && loc.path) {\n const r = await ctx.runner.run({ command: loc.path, args: ['--version'], timeoutMs: 15_000, signal: ctx.signal });\n const m = /graphify\\s+(\\S+)/i.exec(r.stdout);\n runnable = r.ok && !!m;\n version = m?.[1] ?? null;\n }\n\n const checks: Check[] = [\n { name: 'graphify executable', ok: !!loc.path, detail: loc.path ? (loc.onPath ? 'on PATH' : 'found, but not on PATH') : 'not found' },\n ];\n if (deep && loc.path) checks.push({ name: 'graphify --version', ok: !!runnable, detail: version ? `graphify ${version}` : 'did not run' });\n checks.push({ name: 'Claude skill', ok: projectSkill || userSkill, detail: projectSkill ? 'project (.claude/skills/graphify)' : userSkill ? 'user (~/.claude/skills/graphify)' : 'missing' });\n if (projectSkill && version && skillVersion) checks.push({ name: 'skill matches CLI version', ok: skillVersion === version, detail: `skill ${skillVersion}, CLI ${version}` });\n const capabilities = { cli: !!loc.path, skill: projectSkill || userSkill, hooks, graphBuilt: graph };\n const warnings: string[] = [];\n const nextSteps: string[] = [];\n if (!graph) warnings.push('No graph built yet. In Claude Code run `/graphify .` (graph building uses the model, so DevWorkspace does not do it).');\n\n const base = { id: 'graphify', name: 'Graphify', required: true, deep, capabilities, checks } as const;\n const scope = projectSkill ? 'project' : userSkill ? 'user' : null;\n\n if (!loc.path && !projectSkill && !userSkill) {\n nextSteps.push('devworkspace setup --integrations --yes');\n return { ...base, status: 'NOT_INSTALLED', variant: null, scope: null, version: null, warnings, nextSteps };\n }\n if (!loc.path) {\n warnings.push('The Claude skill/hooks exist but the graphify command is missing, so they cannot work.');\n nextSteps.push('devworkspace integrations repair --yes');\n return { ...base, status: 'DEGRADED', variant: 'project skill without CLI', scope, version: null, warnings, nextSteps };\n }\n if (deep && runnable === false) {\n warnings.push('The graphify executable was found but `graphify --version` failed.');\n nextSteps.push('devworkspace integrations repair --yes');\n return { ...base, status: 'DEGRADED', variant: 'cli (not runnable)', scope, version, warnings, nextSteps };\n }\n if (!projectSkill && !userSkill) {\n warnings.push('The graphify CLI is installed but its Claude skill is not set up for this project.');\n nextSteps.push('devworkspace setup --integrations --yes (runs `graphify install --project`)');\n return { ...base, status: 'DEGRADED', variant: 'cli without project skill', scope: null, version, warnings, nextSteps };\n }\n if (version && skillVersion && compareVersions(version.replace(/[^0-9.]/g, '') || '0.0.0', skillVersion.replace(/[^0-9.]/g, '') || '0.0.0') !== 0) {\n warnings.push(`The project skill is from graphify ${skillVersion} but the CLI is ${version}.`);\n nextSteps.push('devworkspace integrations repair --yes');\n return { ...base, status: 'DEGRADED', variant: 'cli + stale project skill', scope, version, warnings, nextSteps };\n }\n if (!loc.onPath) {\n const dir = path.dirname(loc.path);\n // Only a deep inspection may ask the registry; a quick check keeps the general advice.\n const diag: PathDiagnosis = deep\n ? await diagnoseMissingPath(ctx, dir)\n : { staleSession: false, explanation: 'graphify is not on this terminal\\'s PATH.', nextSteps: pathAdvice(ctx, dir) };\n if (hooks) {\n warnings.push(`Claude Code hooks call \\`graphify\\` by name, so they fail until it is found. ${diag.explanation}`);\n nextSteps.push(...diag.nextSteps);\n return diag.staleSession\n ? { ...base, status: 'RESTART_REQUIRED', variant: 'cli + project skill (restart terminal)', scope, version, warnings, nextSteps }\n : { ...base, status: 'DEGRADED', variant: 'cli + project skill (PATH missing)', scope, version, warnings, nextSteps };\n }\n warnings.push(diag.explanation);\n nextSteps.push(...diag.nextSteps);\n }\n return { ...base, status: deep ? 'VERIFIED' : 'INSTALLED', variant: 'cli + project skill', scope, version, warnings, nextSteps };\n },\n\n async plan(ctx, report): Promise<PlanResult> {\n const protectPaths = ['CLAUDE.md', '.claude/CLAUDE.md', '.claude/settings.json', '.claude/settings.local.json', 'AGENTS.md'];\n const blockers: string[] = [];\n const notes: string[] = [];\n const steps: PlanStep[] = [];\n if (report.status === 'VERIFIED' && !ctx.setup.repair) return { steps, blockers, protectPaths, notes: ['already verified'] };\n\n const loc = await locate(ctx, true);\n const exeRef: { path: string | null } = { path: loc.path };\n const scope = ctx.setup.scope;\n\n if (!loc.path) {\n const uv = await findTool(ctx.runner, 'uv', ctx.signal);\n const pipx = await findTool(ctx.runner, 'pipx', ctx.signal);\n const py = await findPython(ctx.runner, ctx.platform, ctx.signal);\n const pyOk = !!py && compareVersions(py.version, MIN_PYTHON) >= 0;\n const choice: { command: string[]; how: string } | null = uv\n ? { command: [uv.command, 'tool', 'install', 'graphifyy'], how: 'uv tool install' }\n : pipx\n ? { command: [pipx.command, 'install', 'graphifyy'], how: 'pipx install' }\n : pyOk && py\n ? { command: [py.command, ...py.args, '-m', 'pip', 'install', '--user', 'graphifyy'], how: 'pip install --user' }\n : null;\n if (choice && !uv && !pipx) notes.push('uv and pipx were not found; falling back to the documented `pip install --user` (no administrator rights needed).');\n if (!choice) {\n if (py && !pyOk) blockers.push(`Python ${py.version} is too old; graphify needs Python 3.10 or newer.`);\n blockers.push(\n 'No installer found. Graphify is a Python tool: install ONE of these, then re-run setup (nothing else is required):',\n ctx.platform === 'win32'\n ? ' - uv: winget install --id astral-sh.uv (or https://docs.astral.sh/uv/getting-started/installation/)'\n : ' - uv: https://docs.astral.sh/uv/getting-started/installation/',\n ' - Python 3.10+ from https://www.python.org/downloads/ (the Microsoft Store \"python\" shortcut on Windows is not a real install)',\n ' - pipx: https://pipx.pypa.io/stable/installation/',\n );\n return { steps, blockers, protectPaths, notes };\n }\n const { command, how } = choice;\n const [cmd, ...args] = command;\n steps.push({\n id: 'graphify:tool',\n description: `Install the graphifyy package for your user account (${how}; no administrator rights, nothing system-wide)`,\n command: command.map((c, i) => (i === 0 ? path.basename(c, path.extname(c)) : c)).join(' '),\n level: 'machine',\n async run(): Promise<StepOutcome> {\n const r = await ctx.runner.run({ command: cmd!, args, cwd: ctx.root, timeoutMs: 600_000, signal: ctx.signal });\n if (r.aborted) return { ok: false, detail: 'cancelled' };\n if (r.timedOut) return { ok: false, detail: 'timed out after 10 minutes (network?)' };\n if (!r.ok) {\n const text = `${r.stderr}\\n${r.stdout}`;\n if (/externally[- ]managed/i.test(text)) return { ok: false, detail: 'pip refuses to install into this Python (externally-managed environment). Install pipx or uv instead, then re-run.' };\n if (/permission denied|access is denied|EACCES|WinError 5/i.test(text)) return { ok: false, detail: 'permission denied while installing. Run the command yourself from a terminal with the right permissions.' };\n const tail = text.split(/\\r?\\n/).map((l) => l.trim()).filter(Boolean).slice(-3).join(' ');\n return { ok: false, detail: (tail || r.error || `exit ${r.code}`).slice(0, 400) };\n }\n const found = await locate(ctx, true);\n if (!found.path) return { ok: false, detail: 'graphifyy was installed but the graphify executable could not be located. Check the Scripts/bin folder of your Python tool.' };\n exeRef.path = found.path;\n return { ok: true, detail: found.onPath ? 'installed' : 'installed (not on PATH in this terminal)' };\n },\n });\n }\n\n steps.push({\n id: 'graphify:project-skill',\n description:\n scope === 'user'\n ? 'Install the Graphify skill for your user account (graphify install)'\n : 'Install the Graphify project skill (graphify install --project): adds .claude/skills/graphify/, appends a graphify section to CLAUDE.md and registers Claude Code hooks in .claude/settings.json (existing content is preserved and verified)',\n command: scope === 'user' ? 'graphify install' : 'graphify install --project',\n level: scope === 'user' ? 'user-config' : 'project',\n async run(): Promise<StepOutcome> {\n if (!exeRef.path) return { ok: false, detail: 'the graphify executable is not available' };\n const r = await ctx.runner.run({ command: exeRef.path, args: scope === 'user' ? ['install'] : ['install', '--project'], cwd: ctx.root, timeoutMs: 120_000, signal: ctx.signal });\n if (r.aborted) return { ok: false, detail: 'cancelled' };\n if (r.timedOut) return { ok: false, detail: 'timed out after 120 s' };\n if (!r.ok) {\n const tail = `${r.stderr}\\n${r.stdout}`.split(/\\r?\\n/).map((l) => l.trim()).filter(Boolean).slice(-3).join(' ');\n return { ok: false, detail: (tail || r.error || `exit ${r.code}`).slice(0, 400) };\n }\n return { ok: true, detail: 'project skill installed', restartRequired: true, managedPaths: scope === 'user' ? [] : ['.claude/skills/graphify'] };\n },\n });\n steps.push({\n id: 'graphify:notice',\n description: 'Record attribution in .devworkspace/THIRD_PARTY_NOTICES.md',\n level: 'project',\n async run(): Promise<StepOutcome> {\n await writeThirdPartyNotice(ctx.root, GRAPHIFY_NOTICE);\n return { ok: true };\n },\n });\n return { steps, blockers, protectPaths, notes };\n },\n};\n"]}
@@ -8,6 +8,7 @@ import { graphify } from './adapters/graphify.js';
8
8
  import { omniroute } from './adapters/omniroute.js';
9
9
  import { ponytail } from './adapters/ponytail.js';
10
10
  import { createRunner } from './exec.js';
11
+ import { readPersistentPath } from './persistentPath.js';
11
12
  import { restoreSnapshot, takeSnapshot, verifySnapshot } from './protect.js';
12
13
  import { blankEntry, loadIntegrationsState, saveIntegrationEntry, wasInterrupted } from './state.js';
13
14
  import { REQUIRED_INTEGRATIONS, } from './types.js';
@@ -33,7 +34,19 @@ function resolveEnv(m) {
33
34
  };
34
35
  }
35
36
  function ctxFor(m, setup, prior, report, signal) {
36
- return { root: m.root, home: m.home, env: m.env, platform: m.platform, runner: m.runner, setup, prior, report, signal };
37
+ let persistent;
38
+ return {
39
+ root: m.root,
40
+ home: m.home,
41
+ env: m.env,
42
+ platform: m.platform,
43
+ runner: m.runner,
44
+ setup,
45
+ signal,
46
+ prior,
47
+ report,
48
+ persistentPath: () => (persistent ??= readPersistentPath(m.runner, m.platform, m.env, signal)),
49
+ };
37
50
  }
38
51
  const DEFAULT_SETUP = { scope: 'project', yes: false, dryRun: false, repair: false };
39
52
  /** Combine what was observed with what earlier runs recorded. Records can only add warnings or RESTART_REQUIRED, never VERIFIED. */