agent-watch 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/LICENSE +21 -0
  3. package/README.md +95 -0
  4. package/dist/cli-nMe9-VkJ.d.ts +1 -0
  5. package/dist/cli.cjs +770 -0
  6. package/dist/cli.cjs.map +1 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +771 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/commands/init.d.ts +2 -0
  12. package/dist/commands/init.d.ts.map +1 -0
  13. package/dist/commands/run.d.ts +5 -0
  14. package/dist/commands/run.d.ts.map +1 -0
  15. package/dist/config.d.ts +31 -0
  16. package/dist/config.d.ts.map +1 -0
  17. package/dist/constants.d.ts +21 -0
  18. package/dist/constants.d.ts.map +1 -0
  19. package/dist/detect-BMnM34-m.cjs +177 -0
  20. package/dist/detect-BMnM34-m.cjs.map +1 -0
  21. package/dist/detect-BWGm1KGQ.js +122 -0
  22. package/dist/detect-BWGm1KGQ.js.map +1 -0
  23. package/dist/detect-B_DDBj5N.cjs +182 -0
  24. package/dist/detect-B_DDBj5N.cjs.map +1 -0
  25. package/dist/detect-CPW1RRIq.js +117 -0
  26. package/dist/detect-CPW1RRIq.js.map +1 -0
  27. package/dist/detect-Dii2e4wf.cjs +174 -0
  28. package/dist/detect-Dii2e4wf.cjs.map +1 -0
  29. package/dist/detect-Pkaqn3YG.js +120 -0
  30. package/dist/detect-Pkaqn3YG.js.map +1 -0
  31. package/dist/detect.d.ts +16 -0
  32. package/dist/detect.d.ts.map +1 -0
  33. package/dist/hooks.d.ts +13 -0
  34. package/dist/hooks.d.ts.map +1 -0
  35. package/dist/index-CXIlEXUx.d.ts +51 -0
  36. package/dist/index.cjs +13 -0
  37. package/dist/index.cjs.map +1 -0
  38. package/dist/index.d.cts +5 -0
  39. package/dist/index.d.ts +5 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +3 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/logger-BNjXChov.js +164 -0
  44. package/dist/logger-BNjXChov.js.map +1 -0
  45. package/dist/logger-CdAUnlsG.cjs +271 -0
  46. package/dist/logger-CdAUnlsG.cjs.map +1 -0
  47. package/dist/logger-hSIaaw_k.js +166 -0
  48. package/dist/logger-hSIaaw_k.js.map +1 -0
  49. package/dist/logger-oq2Z7oYf.cjs +269 -0
  50. package/dist/logger-oq2Z7oYf.cjs.map +1 -0
  51. package/dist/sessions-90kmJrQI.js +360 -0
  52. package/dist/sessions-90kmJrQI.js.map +1 -0
  53. package/dist/sessions-Bmk48zTI.js +311 -0
  54. package/dist/sessions-Bmk48zTI.js.map +1 -0
  55. package/dist/sessions-BpNk9YjU.cjs +431 -0
  56. package/dist/sessions-BpNk9YjU.cjs.map +1 -0
  57. package/dist/sessions-CkCQikpl.cjs +444 -0
  58. package/dist/sessions-CkCQikpl.cjs.map +1 -0
  59. package/dist/sessions-Cy-_zIh6.js +315 -0
  60. package/dist/sessions-Cy-_zIh6.js.map +1 -0
  61. package/dist/sessions-DZgPENb6.cjs +434 -0
  62. package/dist/sessions-DZgPENb6.cjs.map +1 -0
  63. package/dist/sessions-_HBb3nIW.cjs +495 -0
  64. package/dist/sessions-_HBb3nIW.cjs.map +1 -0
  65. package/dist/sessions-tBeR9gKG.js +308 -0
  66. package/dist/sessions-tBeR9gKG.js.map +1 -0
  67. package/dist/utils/copilot.d.ts +27 -0
  68. package/dist/utils/copilot.d.ts.map +1 -0
  69. package/dist/utils/git.d.ts +35 -0
  70. package/dist/utils/git.d.ts.map +1 -0
  71. package/dist/utils/gitignore.d.ts +5 -0
  72. package/dist/utils/gitignore.d.ts.map +1 -0
  73. package/dist/utils/logger.d.ts +14 -0
  74. package/dist/utils/logger.d.ts.map +1 -0
  75. package/dist/utils/sessions.d.ts +48 -0
  76. package/dist/utils/sessions.d.ts.map +1 -0
  77. package/package.json +79 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.cjs","names":["KNOWN_AGENT_FILES","loadConfig","detectAgentFiles","FILE_SELECTION_PAGE_SIZE","KNOWN_AGENT_FILES","SUPPORTED_AI_AGENTS","createDefaultConfig","AGENT_WATCH_DIR","IGNORED_FILE_PATTERNS","loadConfig","processNewSessions","program"],"sources":["../src/utils/git.ts","../src/hooks.ts","../src/utils/copilot.ts","../src/utils/gitignore.ts","../src/commands/init.ts","../src/commands/run.ts","../src/cli.ts"],"sourcesContent":["import { execSync } from \"node:child_process\"\nimport { existsSync } from \"node:fs\"\nimport { join } from \"node:path\"\n\n/**\n * Find the git repository root from a given directory.\n * Returns null if not in a git repository.\n */\nexport function findGitRoot(cwd: string = process.cwd()): string | null {\n\ttry {\n\t\tconst result = execSync(\"git rev-parse --show-toplevel\", {\n\t\t\tcwd,\n\t\t\tencoding: \"utf-8\",\n\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t})\n\t\treturn result.trim()\n\t} catch {\n\t\treturn null\n\t}\n}\n\n/**\n * Check if the given directory is inside a git repository.\n */\nexport function isGitRepo(cwd: string = process.cwd()): boolean {\n\treturn findGitRoot(cwd) !== null\n}\n\n/**\n * Get the path to the .git/hooks directory.\n */\nexport function getGitHooksDir(gitRoot: string): string {\n\treturn join(gitRoot, \".git\", \"hooks\")\n}\n\n/**\n * Check if lefthook is installed in the project.\n */\nexport function hasLefthook(projectRoot: string): boolean {\n\treturn existsSync(join(projectRoot, \"lefthook.yml\")) || existsSync(join(projectRoot, \"lefthook.yaml\"))\n}\n\n/**\n * Check if husky is installed in the project.\n */\nexport function hasHusky(projectRoot: string): boolean {\n\treturn existsSync(join(projectRoot, \".husky\"))\n}\n\n/**\n * Get the path to lefthook.yml or lefthook.yaml.\n * Returns null if not found.\n */\nexport function getLefthookPath(projectRoot: string): string | null {\n\tconst ymlPath = join(projectRoot, \"lefthook.yml\")\n\tconst yamlPath = join(projectRoot, \"lefthook.yaml\")\n\n\tif (existsSync(ymlPath)) {\n\t\treturn ymlPath\n\t}\n\tif (existsSync(yamlPath)) {\n\t\treturn yamlPath\n\t}\n\treturn null\n}\n\n/**\n * Check if lefthook CLI is available.\n */\nexport function isLefthookAvailable(): boolean {\n\ttry {\n\t\texecSync(\"npx lefthook version\", {\n\t\t\tstdio: \"pipe\",\n\t\t\ttimeout: 5000,\n\t\t})\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n\n/**\n * Check if husky CLI is available.\n */\nexport function isHuskyAvailable(): boolean {\n\ttry {\n\t\texecSync(\"npx husky --version\", {\n\t\t\tstdio: \"pipe\",\n\t\t\ttimeout: 5000,\n\t\t})\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n","import { execSync } from \"node:child_process\"\nimport { chmodSync, existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from \"node:fs\"\nimport { join } from \"node:path\"\nimport type { GitHookTrigger } from \"./constants.js\"\nimport {\n\tgetGitHooksDir,\n\tgetLefthookPath,\n\thasHusky,\n\thasLefthook,\n\tisHuskyAvailable,\n\tisLefthookAvailable,\n} from \"./utils/git.js\"\n\nconst HOOK_MARKER_START = \"# >>> agent-watch hook start >>>\"\nconst HOOK_MARKER_END = \"# <<< agent-watch hook end <<<\"\n\nfunction getHookScript(): string {\n\treturn `${HOOK_MARKER_START}\n# agent-watch: auto-update agent configuration files\nnpx agent-watch run 2>/dev/null || true\n${HOOK_MARKER_END}`\n}\n\n/**\n * Validate basic lefthook.yml structure before attempting modification.\n * Checks: not empty, contains colons, no tabs, reasonable line/indentation length.\n */\nfunction isValidLefthookStructure(content: string): boolean {\n\t// Basic sanity checks\n\tif (!content.trim()) return false\n\n\t// Should contain at least one colon (YAML key-value)\n\tif (!content.includes(\":\")) return false\n\n\t// Should not contain tabs (YAML uses spaces)\n\tif (content.includes(\"\\t\")) return false\n\n\t// Should have reasonable line count\n\tconst lines = content.split(\"\\n\")\n\tif (lines.length > 1000) return false\n\n\t// Check for catastrophic indentation issues\n\tfor (const line of lines) {\n\t\tif (line.length > 500) return false\n\t\tconst leadingSpaces = line.search(/\\S/)\n\t\tif (leadingSpaces > 50 && leadingSpaces !== -1) return false\n\t}\n\n\treturn true\n}\n\n/**\n * Remove existing agent-watch hook section from lefthook.yml content.\n * Removes ANY agent-watch: section to prevent duplicates.\n */\nfunction removeExistingAgentWatchHook(lines: string[]): string[] {\n\tconst result: string[] = []\n\tlet inAgentWatchSection = false\n\tlet sectionIndentation = 0\n\n\tfor (const line of lines) {\n\t\tconst trimmed = line.trim()\n\n\t\t// Detect start of ANY agent-watch section (with or without marker)\n\t\tif (trimmed.startsWith(\"agent-watch:\")) {\n\t\t\tinAgentWatchSection = true\n\t\t\tsectionIndentation = line.search(/\\S/)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Skip lines in agent-watch section\n\t\tif (inAgentWatchSection) {\n\t\t\tconst currentIndent = line.search(/\\S/)\n\t\t\tif (currentIndent !== -1 && currentIndent <= sectionIndentation && trimmed.length > 0) {\n\t\t\t\tinAgentWatchSection = false\n\t\t\t\tresult.push(line)\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\tresult.push(line)\n\t}\n\n\treturn result\n}\n\n/**\n * Insert agent-watch command into lefthook.yml content.\n * Handles: missing hook section, missing commands section, proper indentation.\n */\nfunction insertAgentWatchCommand(\n\tlines: string[],\n\thookName: string\n): { success: boolean; content?: string; error?: string } {\n\tconst result: string[] = []\n\tlet inserted = false\n\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tconst line = lines[i]\n\t\tresult.push(line)\n\n\t\t// Look for hook section\n\t\tif (line.trim() === `${hookName}:`) {\n\t\t\t// Look ahead for \"commands:\" section\n\t\t\tlet commandsLineIndex = -1\n\t\t\tfor (let j = i + 1; j < lines.length; j++) {\n\t\t\t\tconst trimmedLine = lines[j].trim()\n\t\t\t\tif (trimmedLine.startsWith(\"commands:\")) {\n\t\t\t\t\tcommandsLineIndex = j\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tif (trimmedLine && !lines[j].startsWith(\" \")) {\n\t\t\t\t\t// Reached next section\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (commandsLineIndex === -1) {\n\t\t\t\t// Need to add commands section\n\t\t\t\tresult.push(\" commands:\", \" agent-watch:\", \" run: npx agent-watch run\")\n\t\t\t\tinserted = true\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// Commands section exists, will insert after it\n\t\t\t// Continue to that line\n\t\t\tfor (let j = i + 1; j <= commandsLineIndex; j++) {\n\t\t\t\tresult.push(lines[j])\n\t\t\t}\n\t\t\tresult.push(\" agent-watch:\", \" run: npx agent-watch run\")\n\t\t\tinserted = true\n\t\t\ti = commandsLineIndex\n\t\t}\n\t}\n\n\tif (!inserted) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: `Could not find proper insertion point in lefthook.yml for ${hookName}`,\n\t\t}\n\t}\n\n\treturn { success: true, content: result.join(\"\\n\") }\n}\n\n/**\n * Update lefthook.yml content by adding/replacing agent-watch hook.\n * Coordinates removal and insertion, handles edge cases.\n */\nfunction updateLefthookContent(\n\tcontent: string,\n\thookName: string\n): { success: boolean; content?: string; error?: string } {\n\tconst lines = content.split(\"\\n\")\n\n\t// Check if hook section exists\n\tconst hookSectionRegex = new RegExp(`^${hookName}:\\\\s*$`, \"m\")\n\tconst hasHookSection = hookSectionRegex.test(content)\n\n\t// Remove existing agent-watch hook if present\n\tconst withoutOldHook = removeExistingAgentWatchHook(lines)\n\n\tif (!hasHookSection) {\n\t\t// Add entire hook section\n\t\tconst newSection = `\n${hookName}:\n commands:\n agent-watch:\n run: npx agent-watch run\n`\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tcontent: withoutOldHook.join(\"\\n\") + newSection,\n\t\t}\n\t}\n\n\t// Hook section exists, find insertion point\n\tconst result = insertAgentWatchCommand(withoutOldHook, hookName)\n\treturn result\n}\n\n/**\n * Map the trigger name to the git hook file name.\n */\nfunction getGitHookName(trigger: GitHookTrigger): string {\n\tswitch (trigger) {\n\t\tcase \"commit\":\n\t\t\treturn \"post-commit\"\n\t\tcase \"push\":\n\t\t\treturn \"pre-push\"\n\t}\n}\n\n/**\n * Install agent-watch hook into lefthook.yml.\n * Flow: read file → validate → update content → write → run lefthook install\n */\nfunction installLefthookHook(projectRoot: string, hookName: string): HookInstallResult {\n\t// 1. Find lefthook.yml or lefthook.yaml\n\tconst lefthookPath = getLefthookPath(projectRoot)\n\tif (!lefthookPath) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: \"lefthook.yml not found\",\n\t\t\tmethod: \"manual\",\n\t\t}\n\t}\n\n\t// 2. Read current content\n\tlet currentContent: string\n\ttry {\n\t\tcurrentContent = readFileSync(lefthookPath, \"utf-8\")\n\t} catch (error) {\n\t\tconst msg = error instanceof Error ? error.message : String(error)\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Cannot read lefthook.yml: ${msg}. Please add manually:\\n\\n${hookName}:\\n commands:\\n agent-watch:\\n run: npx agent-watch run`,\n\t\t\tmethod: \"manual\",\n\t\t}\n\t}\n\n\t// 3. Validate structure (basic sanity check)\n\t// Empty files are valid - we'll create the structure\n\tconst isEmpty = currentContent.trim().length === 0\n\tif (!isEmpty && !isValidLefthookStructure(currentContent)) {\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tmessage: `lefthook.yml has complex structure. Please add manually:\\n\\n${hookName}:\\n commands:\\n agent-watch:\\n run: npx agent-watch run`,\n\t\t\tmethod: \"lefthook\",\n\t\t}\n\t}\n\n\t// 4. Update content (handles both new and existing hooks)\n\tconst result = updateLefthookContent(currentContent, hookName)\n\tif (!result.success || !result.content) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: result.error || \"Failed to update lefthook.yml\",\n\t\t\tmethod: \"manual\",\n\t\t}\n\t}\n\n\t// 5. Write updated content (atomic write)\n\ttry {\n\t\tconst tempPath = `${lefthookPath}.tmp`\n\t\twriteFileSync(tempPath, result.content, \"utf-8\")\n\t\trenameSync(tempPath, lefthookPath)\n\t} catch (error) {\n\t\tconst msg = error instanceof Error ? error.message : String(error)\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Failed to write lefthook.yml: ${msg}`,\n\t\t\tmethod: \"manual\",\n\t\t}\n\t}\n\n\t// 6. Run lefthook install (if available)\n\tif (isLefthookAvailable()) {\n\t\ttry {\n\t\t\texecSync(\"npx lefthook install\", {\n\t\t\t\tcwd: projectRoot,\n\t\t\t\tstdio: \"inherit\",\n\t\t\t\ttimeout: 30000,\n\t\t\t})\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tmessage: `Lefthook hook installed successfully in ${hookName}`,\n\t\t\t\tmethod: \"lefthook\",\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconst msg = error instanceof Error ? error.message : String(error)\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tmessage: `Hook added to lefthook.yml. Failed to run lefthook install: ${msg}\\nPlease run: npx lefthook install`,\n\t\t\t\tmethod: \"lefthook\",\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tsuccess: true,\n\t\tmessage: \"Hook added to lefthook.yml. Please run: npx lefthook install\",\n\t\tmethod: \"lefthook\",\n\t}\n}\n\n/**\n * Install agent-watch hook using husky CLI.\n * Runs: npx husky add .husky/{hookName} \"npx agent-watch run\"\n */\nfunction installHuskyHook(projectRoot: string, hookName: string): HookInstallResult {\n\tconst huskyDir = join(projectRoot, \".husky\")\n\n\t// Verify husky directory exists\n\tif (!existsSync(huskyDir)) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: \".husky directory not found. Initialize husky first with: npx husky init\",\n\t\t\tmethod: \"manual\",\n\t\t}\n\t}\n\n\t// Check if hook already exists and contains agent-watch\n\tconst hookPath = join(huskyDir, hookName)\n\tif (existsSync(hookPath)) {\n\t\ttry {\n\t\t\tconst content = readFileSync(hookPath, \"utf-8\")\n\t\t\tif (content.includes(\"agent-watch run\")) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tmessage: `Husky hook already configured in .husky/${hookName}`,\n\t\t\t\t\tmethod: \"husky\",\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore read errors, will try to add anyway\n\t\t}\n\t}\n\n\t// Try to add hook using husky CLI\n\tif (isHuskyAvailable()) {\n\t\ttry {\n\t\t\tconst command = `npx husky add .husky/${hookName} \"npx agent-watch run\"`\n\t\t\texecSync(command, {\n\t\t\t\tcwd: projectRoot,\n\t\t\t\tstdio: \"pipe\",\n\t\t\t\ttimeout: 30000,\n\t\t\t})\n\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tmessage: `Husky hook installed successfully in .husky/${hookName}`,\n\t\t\t\tmethod: \"husky\",\n\t\t\t}\n\t\t} catch {\n\t\t\t// Fall back to manual instructions\n\t\t}\n\t}\n\n\t// Fall back to manual instructions\n\treturn {\n\t\tsuccess: true,\n\t\tmessage: `Husky detected. Run: npx husky add .husky/${hookName} \"npx agent-watch run\"`,\n\t\tmethod: \"husky\",\n\t}\n}\n\nexport interface HookInstallResult {\n\tsuccess: boolean\n\tmessage: string\n\tmethod: \"direct\" | \"lefthook\" | \"husky\" | \"manual\"\n}\n\n/**\n * Install the agent-watch hook into the git hooks directory.\n * If a hook file already exists, appends our section.\n * If lefthook or husky is detected, provides instructions instead.\n */\nexport function installGitHook(projectRoot: string, gitRoot: string, trigger: GitHookTrigger): HookInstallResult {\n\tconst hookName = getGitHookName(trigger)\n\n\t// Try automatic installation for lefthook\n\tif (hasLefthook(projectRoot)) {\n\t\treturn installLefthookHook(projectRoot, hookName)\n\t}\n\n\t// Try automatic installation for husky\n\tif (hasHusky(projectRoot)) {\n\t\treturn installHuskyHook(projectRoot, hookName)\n\t}\n\n\tconst hooksDir = getGitHooksDir(gitRoot)\n\tconst hookPath = join(hooksDir, hookName)\n\n\ttry {\n\t\tif (!existsSync(hooksDir)) {\n\t\t\tmkdirSync(hooksDir, { recursive: true })\n\t\t}\n\n\t\tlet hookContent: string\n\t\tif (existsSync(hookPath)) {\n\t\t\tconst existing = readFileSync(hookPath, \"utf-8\")\n\t\t\tif (existing.includes(HOOK_MARKER_START)) {\n\t\t\t\tconst regex = new RegExp(`${escapeRegex(HOOK_MARKER_START)}[\\\\s\\\\S]*?${escapeRegex(HOOK_MARKER_END)}`)\n\t\t\t\thookContent = existing.replace(regex, getHookScript())\n\t\t\t} else {\n\t\t\t\thookContent = `${existing.trimEnd()}\\n\\n${getHookScript()}\\n`\n\t\t\t}\n\t\t} else {\n\t\t\thookContent = `#!/bin/sh\\n\\n${getHookScript()}\\n`\n\t\t}\n\n\t\twriteFileSync(hookPath, hookContent, \"utf-8\")\n\t\tchmodSync(hookPath, 0o755)\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tmessage: `Git ${hookName} hook installed successfully.`,\n\t\t\tmethod: \"direct\",\n\t\t}\n\t} catch (error) {\n\t\tconst msg = error instanceof Error ? error.message : String(error)\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Failed to install git hook: ${msg}`,\n\t\t\tmethod: \"manual\",\n\t\t}\n\t}\n}\n\nfunction escapeRegex(str: string): string {\n\treturn str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n}\n","import { execSync } from \"node:child_process\"\nimport { existsSync, readFileSync } from \"node:fs\"\nimport { homedir } from \"node:os\"\nimport { join } from \"node:path\"\nimport { KNOWN_AGENT_FILES } from \"../constants.js\"\nimport type { AgentFileInfo } from \"../detect.js\"\nimport { logger } from \"./logger.js\"\n\ninterface CopilotStatus {\n\tinstalled: boolean\n\tauthenticated: boolean\n\tversion?: string\n\tusername?: string\n}\n\ninterface CopilotConfig {\n\tlast_logged_in_user?: { host: string; login: string }\n\tlogged_in_users?: Array<{ host: string; login: string }>\n}\n\nconst COPILOT_CONFIG_DIR = join(homedir(), \".copilot\")\nconst COPILOT_CONFIG_FILE = join(COPILOT_CONFIG_DIR, \"config.json\")\n\n/**\n * Check if the standalone GitHub Copilot CLI is installed\n */\nfunction isCopilotInstalled(): { installed: boolean; version?: string } {\n\ttry {\n\t\tconst output = execSync(\"copilot -v\", { encoding: \"utf-8\", stdio: \"pipe\" })\n\t\tconst match = /(\\d+\\.\\d+\\.\\d+)/.exec(output)\n\t\treturn { installed: true, version: match?.[1] }\n\t} catch {\n\t\treturn { installed: false }\n\t}\n}\n\n/**\n * Check if the user is authenticated with GitHub Copilot CLI\n * by reading the config file at ~/.copilot/config.json\n */\nfunction getCopilotAuth(): { authenticated: boolean; username?: string } {\n\ttry {\n\t\tif (!existsSync(COPILOT_CONFIG_FILE)) {\n\t\t\treturn { authenticated: false }\n\t\t}\n\n\t\tconst configContent = readFileSync(COPILOT_CONFIG_FILE, \"utf-8\")\n\t\tconst config: CopilotConfig = JSON.parse(configContent)\n\n\t\tif (config.logged_in_users && config.logged_in_users.length > 0) {\n\t\t\tconst user = config.last_logged_in_user ?? config.logged_in_users[0]\n\t\t\treturn { authenticated: true, username: user.login }\n\t\t}\n\n\t\treturn { authenticated: false }\n\t} catch {\n\t\treturn { authenticated: false }\n\t}\n}\n\n/**\n * Check the status of GitHub Copilot CLI\n */\nexport function checkCopilotStatus(): CopilotStatus {\n\tconst { installed, version } = isCopilotInstalled()\n\tconst { authenticated, username } = getCopilotAuth()\n\n\treturn { installed, authenticated, version, username }\n}\n\n/**\n * Prompt the user to install GitHub Copilot CLI\n */\nasync function promptInstallCopilot(): Promise<boolean> {\n\tlogger.step(\"GitHub Copilot CLI is not installed. Please install it first:\")\n\tlogger.info(\" macOS: brew install gh-copilot\")\n\tlogger.info(\" npm: npm install -g @githubnext/github-copilot-cli\")\n\tlogger.info(\" See: https://docs.github.com/en/copilot/how-tos/copilot-cli\")\n\tlogger.blank()\n\tlogger.info(\"After installation, please run 'agent-watch init' again.\")\n\treturn false\n}\n\n/**\n * Authenticate with GitHub Copilot CLI\n */\nasync function authenticateCopilot(): Promise<boolean> {\n\ttry {\n\t\tlogger.step(\"Authenticating with GitHub Copilot CLI...\")\n\t\tlogger.info(\"Follow the prompts to authenticate:\")\n\t\texecSync(\"copilot login\", { stdio: \"inherit\" })\n\t\tlogger.success(\"GitHub Copilot CLI authenticated successfully!\")\n\t\treturn true\n\t} catch (error) {\n\t\tlogger.error(\"Failed to authenticate with GitHub Copilot CLI\")\n\t\tlogger.error(error instanceof Error ? error.message : String(error))\n\t\treturn false\n\t}\n}\n\n/**\n * Setup GitHub Copilot CLI - install and configure if needed\n */\nexport async function setupGithubCopilotCli(): Promise<boolean> {\n\tconst status = checkCopilotStatus()\n\n\t// Check Copilot CLI installation\n\tif (!status.installed) {\n\t\treturn await promptInstallCopilot()\n\t}\n\n\t// Check authentication\n\tif (!status.authenticated) {\n\t\tlogger.warn(\"GitHub Copilot CLI is not authenticated\")\n\t\tconst authSuccess = await authenticateCopilot()\n\t\tif (!authSuccess) {\n\t\t\treturn false\n\t\t}\n\t} else {\n\t\tlogger.success(`Copilot CLI authenticated as ${status.username}`)\n\t}\n\n\treturn true\n}\n\n/**\n * Verify GitHub Copilot CLI is properly configured\n */\nexport function verifyCopilotSetup(): boolean {\n\tconst status = checkCopilotStatus()\n\treturn status.installed && status.authenticated\n}\n\n/**\n * Create missing agent files using Copilot CLI.\n * For .github/copilot-instructions.md, uses `copilot init`.\n * For other files, uses `copilot -p` to generate content based on the codebase.\n */\nexport function createMissingAgentFiles(\n\tprojectRoot: string,\n\tselectedFiles: string[],\n\tdetectedFiles: AgentFileInfo[]\n): void {\n\tconst missingFiles = selectedFiles.filter((filePath) => {\n\t\tconst detected = detectedFiles.find((d) => d.pattern.path === filePath)\n\t\treturn !detected?.exists\n\t})\n\n\tif (missingFiles.length === 0) {\n\t\treturn\n\t}\n\n\tfor (const filePath of missingFiles) {\n\t\tconst agentFile = KNOWN_AGENT_FILES.find((f) => f.path === filePath)\n\t\tconst label = agentFile?.label ?? filePath\n\n\t\ttry {\n\t\t\tlogger.step(`Creating ${label}...`)\n\t\t\tif (filePath === \".github/copilot-instructions.md\") {\n\t\t\t\texecSync(\"copilot init\", {\n\t\t\t\t\tcwd: projectRoot,\n\t\t\t\t\tstdio: \"pipe\",\n\t\t\t\t\ttimeout: 120_000,\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\texecSync(\n\t\t\t\t\t`copilot -p \"Create a ${filePath} file for this project. Analyze the codebase to understand the project structure, tech stack, and conventions. Write the file directly.\" --allow-all-tools -s`,\n\t\t\t\t\t{\n\t\t\t\t\t\tcwd: projectRoot,\n\t\t\t\t\t\tstdio: \"pipe\",\n\t\t\t\t\t\ttimeout: 120_000,\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t}\n\t\t\tlogger.success(`Created ${label}`)\n\t\t} catch {\n\t\t\tlogger.warn(`Failed to create ${label}`)\n\t\t}\n\t}\n}\n","import { existsSync, readFileSync, writeFileSync } from \"node:fs\"\nimport { join } from \"node:path\"\n\n/**\n * Add entries to .gitignore if they don't already exist\n */\nexport function addToGitignore(projectRoot: string, entries: string[]): void {\n\tconst gitignorePath = join(projectRoot, \".gitignore\")\n\n\t// Check if project root exists\n\tif (!existsSync(projectRoot)) {\n\t\treturn\n\t}\n\n\tlet content = \"\"\n\tif (existsSync(gitignorePath)) {\n\t\tcontent = readFileSync(gitignorePath, \"utf-8\")\n\t}\n\n\tconst lines = content.split(\"\\n\")\n\tconst entriesToAdd: string[] = []\n\n\tfor (const entry of entries) {\n\t\t// Check if entry already exists (exact match or pattern match)\n\t\tconst exists = lines.some((line) => {\n\t\t\tconst trimmed = line.trim()\n\t\t\treturn trimmed === entry || trimmed === `/${entry}`\n\t\t})\n\n\t\tif (!exists) {\n\t\t\tentriesToAdd.push(entry)\n\t\t}\n\t}\n\n\tif (entriesToAdd.length === 0) {\n\t\treturn\n\t}\n\n\t// Add entries with a comment\n\tconst newContent = `${content.trim()}\\n\\n# agent-watch\\n${entriesToAdd.join(\"\\n\")}\\n`\n\n\ttry {\n\t\twriteFileSync(gitignorePath, newContent, \"utf-8\")\n\t} catch {\n\t\t// Silently fail if we can't write (e.g., in test environments)\n\t}\n}\n","import { checkbox, confirm, select } from \"@inquirer/prompts\"\nimport { createDefaultConfig, loadConfig, saveConfig } from \"../config.js\"\nimport {\n\tAGENT_WATCH_DIR,\n\tFILE_SELECTION_PAGE_SIZE,\n\ttype GitHookTrigger,\n\tKNOWN_AGENT_FILES,\n\tSUPPORTED_AI_AGENTS,\n} from \"../constants.js\"\nimport { detectAgentFiles } from \"../detect.js\"\nimport { installGitHook } from \"../hooks.js\"\nimport { createMissingAgentFiles, setupGithubCopilotCli } from \"../utils/copilot.js\"\nimport { findGitRoot } from \"../utils/git.js\"\nimport { addToGitignore } from \"../utils/gitignore.js\"\nimport { logger } from \"../utils/logger.js\"\n\nexport async function initCommand(): Promise<void> {\n\tlogger.asciiArt()\n\n\t// 1. Check we are in a git repository\n\tconst cwd = process.cwd()\n\tconst gitRoot = findGitRoot(cwd)\n\n\tif (!gitRoot) {\n\t\tlogger.error(\"Not inside a git repository. Please run this command from a git repository.\")\n\t\tprocess.exit(1)\n\t}\n\n\tconst projectRoot = gitRoot\n\n\t// 2. Check for existing configuration\n\tconst existingConfig = loadConfig(projectRoot)\n\tif (existingConfig) {\n\t\tconst overwrite = await confirm({\n\t\t\tmessage: \"An existing agent-watch configuration was found. Do you want to overwrite it?\",\n\t\t\tdefault: false,\n\t\t})\n\t\tif (!overwrite) {\n\t\t\tlogger.info(\"Init cancelled. Existing configuration preserved.\")\n\t\t\treturn\n\t\t}\n\t}\n\n\t// 3. Detect existing agent files\n\tconst detectedFiles = detectAgentFiles(projectRoot)\n\tconst existingFiles = detectedFiles.filter((f) => f.exists)\n\n\tif (existingFiles.length > 0) {\n\t\tlogger.success(`Found ${existingFiles.length} existing agent file(s)`)\n\t}\n\n\t// 4. Ask which agent files to manage\n\tconst selectedFiles = await checkbox({\n\t\tmessage: \"Which agent files should agent-watch manage?\",\n\t\tpageSize: FILE_SELECTION_PAGE_SIZE,\n\t\tchoices: KNOWN_AGENT_FILES.map((pattern) => {\n\t\t\tconst detected = detectedFiles.find((d) => d.pattern.path === pattern.path)\n\t\t\tconst exists = detected?.exists ?? false\n\t\t\treturn {\n\t\t\t\tname: exists ? ` ${pattern.label} ✓` : ` ${pattern.label}`,\n\t\t\t\tvalue: pattern.path,\n\t\t\t\tchecked: exists,\n\t\t\t}\n\t\t}),\n\t})\n\n\tif (selectedFiles.length === 0) {\n\t\tlogger.warn(\"No files selected. You can re-run 'agent-watch init' to configure.\")\n\t\treturn\n\t}\n\n\t// 4b. Create missing agent files using Copilot CLI\n\tcreateMissingAgentFiles(projectRoot, selectedFiles, detectedFiles)\n\n\t// 5. Ask about context options\n\tconst contextOptions = await checkbox({\n\t\tmessage: \"What should agent-watch track?\",\n\t\tchoices: [\n\t\t\t{\n\t\t\t\tname: \" File changes (git diff, modified files)\",\n\t\t\t\tvalue: \"watchFileChanges\",\n\t\t\t\tchecked: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \" Chat sessions (Copilot conversation context)\",\n\t\t\t\tvalue: \"includeChatSession\",\n\t\t\t\tchecked: true,\n\t\t\t},\n\t\t],\n\t})\n\n\tconst watchFileChanges = contextOptions.includes(\"watchFileChanges\")\n\tconst includeChatSession = contextOptions.includes(\"includeChatSession\")\n\n\t// 6. Ask about hook trigger\n\tconst hookTrigger = await select<GitHookTrigger>({\n\t\tmessage: \"When should agent-watch trigger?\",\n\t\tchoices: [\n\t\t\t{ name: \"After git commit (post-commit hook)\", value: \"commit\" as const },\n\t\t\t{ name: \"Before git push (pre-push hook)\", value: \"push\" as const },\n\t\t],\n\t\tdefault: \"commit\" as const,\n\t})\n\n\t// 7. Ask which AI agents to configure\n\tconst selectedAgents = await checkbox({\n\t\tmessage: \"Which AI agents would you like to configure?\",\n\t\tchoices: SUPPORTED_AI_AGENTS.map((agent) => ({\n\t\t\tname: ` ${agent.name}`,\n\t\t\tvalue: agent.value,\n\t\t\tchecked: true,\n\t\t})),\n\t})\n\n\t// 8. Setup GitHub Copilot CLI if selected\n\tif (selectedAgents.includes(\"github-copilot-cli\")) {\n\t\tconst setupSuccess = await setupGithubCopilotCli()\n\t\tif (!setupSuccess) {\n\t\t\tlogger.warn(\"Copilot CLI setup incomplete. You can set it up manually later.\")\n\t\t}\n\t}\n\n\t// 9. Build and save configuration\n\tconst config = createDefaultConfig({\n\t\tagentFiles: selectedFiles,\n\t\twatchFileChanges,\n\t\tincludeChatSession,\n\t\thookTrigger,\n\t\tagents: selectedAgents,\n\t})\n\n\tsaveConfig(projectRoot, config)\n\n\t// 9b. Add .agent-watch directory to .gitignore\n\taddToGitignore(projectRoot, [AGENT_WATCH_DIR])\n\n\t// 10. Install git hook\n\tconst hookResult = installGitHook(projectRoot, gitRoot, hookTrigger)\n\n\tif (hookResult.success) {\n\t\t// Show warning only for manual instructions, success otherwise\n\t\tif (hookResult.message.includes(\"Please run:\") || hookResult.message.includes(\"please add manually\")) {\n\t\t\tlogger.warn(hookResult.message)\n\t\t} else {\n\t\t\tlogger.success(hookResult.message)\n\t\t}\n\t} else {\n\t\tlogger.error(hookResult.message)\n\t}\n\n\t// 11. Summary\n\tlogger.blank()\n\tlogger.success(\"Setup complete!\")\n\tlogger.info(`Files: ${selectedFiles.join(\", \")} • Hook: ${hookTrigger} • Agents: ${selectedAgents.join(\", \")}`)\n\tlogger.blank()\n}\n","import { execSync } from \"node:child_process\"\nimport { readFileSync, writeFileSync } from \"node:fs\"\nimport { join } from \"node:path\"\nimport { loadConfig } from \"../config.js\"\nimport { IGNORED_FILE_PATTERNS } from \"../constants.js\"\nimport { findGitRoot } from \"../utils/git.js\"\nimport { logger } from \"../utils/logger.js\"\nimport { processNewSessions } from \"../utils/sessions.js\"\n\n/**\n * Get git commit message\n */\nfunction getCommitMessage(): string {\n\ttry {\n\t\tconst message = execSync(\"git log -1 --pretty=%B\", {\n\t\t\tencoding: \"utf-8\",\n\t\t\tstdio: \"pipe\",\n\t\t})\n\t\treturn message.trim()\n\t} catch {\n\t\treturn \"\"\n\t}\n}\n\n/**\n * Get git diff stats (summary, not full diff)\n */\nfunction getGitDiffStats(): string {\n\ttry {\n\t\tconst stats = execSync(\"git diff HEAD~1..HEAD --stat\", {\n\t\t\tencoding: \"utf-8\",\n\t\t\tstdio: \"pipe\",\n\t\t})\n\t\treturn stats.trim()\n\t} catch {\n\t\treturn \"\"\n\t}\n}\n\n/**\n * Get list of modified files\n */\nfunction getModifiedFiles(): string[] {\n\ttry {\n\t\tconst output = execSync(\"git diff --name-only HEAD~1..HEAD\", {\n\t\t\tencoding: \"utf-8\",\n\t\t\tstdio: \"pipe\",\n\t\t})\n\t\treturn output.trim().split(\"\\n\").filter(Boolean)\n\t} catch {\n\t\treturn []\n\t}\n}\n\n/**\n * Check if a file path should be ignored (doesn't trigger agent-watch analysis)\n */\nfunction shouldIgnoreFile(filePath: string): boolean {\n\tconst normalizedPath = filePath.replace(/\\\\/g, \"/\")\n\n\tfor (const pattern of IGNORED_FILE_PATTERNS) {\n\t\tconst normalizedPattern = pattern.replace(/\\\\/g, \"/\")\n\n\t\t// Exact match\n\t\tif (normalizedPath === normalizedPattern) {\n\t\t\treturn true\n\t\t}\n\n\t\t// Directory match (e.g., \".github/workflows\" matches \".github/workflows/test.yml\")\n\t\tif (normalizedPath.startsWith(`${normalizedPattern}/`)) {\n\t\t\treturn true\n\t\t}\n\n\t\t// Filename match anywhere in path (e.g., \"README.md\" matches \"docs/README.md\")\n\t\tconst fileName = normalizedPath.split(\"/\").pop()\n\t\tif (fileName === normalizedPattern) {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n\n/**\n * Check if all modified files should be ignored\n */\nfunction shouldSkipAnalysis(modifiedFiles: string[]): boolean {\n\tif (modifiedFiles.length === 0) {\n\t\treturn true\n\t}\n\n\t// If ALL files are ignored, skip analysis\n\treturn modifiedFiles.every(shouldIgnoreFile)\n}\n\n/**\n * Use Copilot CLI to intelligently update agent file content\n */\nfunction updateAgentFileWithCopilot(\n\tprojectRoot: string,\n\tcontext: string,\n\tagentFilePath: string,\n\tcurrentContent: string\n): string | null {\n\ttry {\n\t\tconst prompt = `You are maintaining ${agentFilePath}, a living document of patterns, conventions, and code rules.\n\nYour task:\n1. Read the CURRENT content of this file carefully\n2. Analyze the RECENT changes and conversations below\n3. Determine if there are new patterns, rules, or conventions to document\n4. If updates are needed, output the COMPLETE UPDATED file content\n5. If no meaningful updates needed, output exactly: NO_UPDATE\n\nGuidelines:\n- Intelligently merge new insights into existing sections\n- Update or refine existing rules if patterns have evolved\n- Remove outdated information\n- Keep it concise - no code snippets unless absolutely necessary\n- Maintain the file's existing structure and tone\n- Focus on patterns, conventions, and learnings - not changelogs\n\nCURRENT FILE CONTENT:\n${currentContent}\n\nRECENT CONTEXT:\n${context}\n\nOutput the complete updated file, or NO_UPDATE if nothing significant to add:`\n\n\t\tconst escapedPrompt = prompt.replaceAll('\"', String.raw`\\\"`)\n\t\tconst command = `copilot -p \"${escapedPrompt}\" -s`\n\n\t\tconst result = execSync(command, {\n\t\t\tcwd: projectRoot,\n\t\t\tencoding: \"utf-8\",\n\t\t\tstdio: \"pipe\",\n\t\t\ttimeout: 90_000,\n\t\t})\n\n\t\tconst output = result.trim()\n\t\tif (output === \"NO_UPDATE\" || output.length === 0 || output === currentContent) {\n\t\t\treturn null\n\t\t}\n\n\t\treturn output\n\t} catch {\n\t\treturn null\n\t}\n}\n\n/**\n * Run command - update agent files with extracted patterns and learnings\n */\nexport async function runCommand(): Promise<void> {\n\tconst cwd = process.cwd()\n\tconst gitRoot = findGitRoot(cwd)\n\n\tif (!gitRoot) {\n\t\tlogger.error(\"Not inside a git repository\")\n\t\tprocess.exit(1)\n\t}\n\n\tconst config = loadConfig(gitRoot)\n\tif (!config) {\n\t\tlogger.error(\"No agent-watch configuration found. Run 'agent-watch init' first.\")\n\t\tprocess.exit(1)\n\t}\n\n\tif (config.agentFiles.length === 0) {\n\t\tlogger.warn(\"No agent files configured\")\n\t\treturn\n\t}\n\n\tconst contextParts: string[] = []\n\n\t// Collect file changes context (summary, not full diff)\n\tif (config.watchFileChanges) {\n\t\tconst modifiedFiles = getModifiedFiles()\n\n\t\t// Skip analysis if only non-relevant files were changed\n\t\tif (shouldSkipAnalysis(modifiedFiles)) {\n\t\t\tlogger.info(\"Skipping analysis - only config/documentation files changed\")\n\t\t\treturn\n\t\t}\n\n\t\tconst commitMessage = getCommitMessage()\n\t\tconst diffStats = getGitDiffStats()\n\n\t\tif (modifiedFiles.length > 0) {\n\t\t\tconst fileContext = [\n\t\t\t\tcommitMessage ? `Commit: ${commitMessage}` : \"\",\n\t\t\t\t`Files changed: ${modifiedFiles.join(\", \")}`,\n\t\t\t\tdiffStats ? `Stats:\\n${diffStats}` : \"\",\n\t\t\t]\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.join(\"\\n\")\n\n\t\t\tcontextParts.push(fileContext)\n\t\t}\n\t}\n\n\t// Collect chat session context\n\tif (config.includeChatSession) {\n\t\tconst sessionContext = processNewSessions(gitRoot)\n\t\tif (sessionContext) {\n\t\t\tcontextParts.push(`Conversations:\\n${sessionContext}`)\n\t\t}\n\t}\n\n\tif (contextParts.length === 0) {\n\t\tlogger.info(\"No new context to analyze\")\n\t\treturn\n\t}\n\n\tconst context = contextParts.join(\"\\n\\n\")\n\n\tlogger.step(\"Analyzing context for patterns and rules...\")\n\n\t// Update each configured agent file\n\tlet updatedCount = 0\n\tfor (const filePath of config.agentFiles) {\n\t\tconst fullPath = join(gitRoot, filePath)\n\t\tconst currentContent = readFileSync(fullPath, \"utf-8\")\n\n\t\tconst updatedContent = updateAgentFileWithCopilot(gitRoot, context, filePath, currentContent)\n\t\tif (updatedContent) {\n\t\t\twriteFileSync(fullPath, updatedContent, \"utf-8\")\n\t\t\tlogger.success(`Updated ${filePath}`)\n\t\t\tupdatedCount++\n\t\t}\n\t}\n\n\tif (updatedCount > 0) {\n\t\tlogger.success(`Updated ${updatedCount} agent file(s) with new insights`)\n\t} else {\n\t\tlogger.info(\"No significant patterns found to update\")\n\t}\n}\n","#!/usr/bin/env node\nimport { createRequire } from \"node:module\"\nimport { program } from \"commander\"\nimport { initCommand } from \"./commands/init.js\"\nimport { runCommand } from \"./commands/run.js\"\n\nconst require = createRequire(import.meta.url)\nconst { version } = require(\"../package.json\") as { version: string }\n\nprogram\n\t.name(\"agent-watch\")\n\t.description(\"Keep your AI agent configuration files in sync with your codebase\")\n\t.version(version)\n\nprogram\n\t.command(\"init\")\n\t.description(\"Initialize agent-watch in the current project\")\n\t.action(async () => {\n\t\tawait initCommand()\n\t})\n\nprogram\n\t.command(\"run\")\n\t.description(\"Update agent files with recent changes and chat sessions\")\n\t.action(async () => {\n\t\tawait runCommand()\n\t})\n\nprogram.parse()\n"],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}