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,166 @@
1
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import pc from "picocolors";
4
+
5
+ //#region src/constants.ts
6
+ const KNOWN_AGENT_FILES = [
7
+ {
8
+ path: "AGENTS.md",
9
+ label: "AGENTS.md (Recommended)",
10
+ agent: "Generic"
11
+ },
12
+ {
13
+ path: "CLAUDE.md",
14
+ label: "CLAUDE.md (Claude Code)",
15
+ agent: "Claude Code"
16
+ },
17
+ {
18
+ path: ".github/copilot-instructions.md",
19
+ label: ".github/copilot-instructions.md (GitHub Copilot)",
20
+ agent: "GitHub Copilot"
21
+ },
22
+ {
23
+ path: ".cursor/rules",
24
+ label: ".cursor/rules (Cursor)",
25
+ agent: "Cursor"
26
+ },
27
+ {
28
+ path: ".windsurfrules",
29
+ label: ".windsurfrules (Windsurf)",
30
+ agent: "Windsurf"
31
+ },
32
+ {
33
+ path: ".clinerules",
34
+ label: ".clinerules (Cline)",
35
+ agent: "Cline"
36
+ }
37
+ ];
38
+ const CONFIG_FILE_NAME = ".agent-watch.json";
39
+ const SUPPORTED_HOOKS = ["commit", "push"];
40
+ const SUPPORTED_AI_AGENTS = [{
41
+ value: "github-copilot-cli",
42
+ name: "GitHub Copilot CLI"
43
+ }];
44
+ const FILE_SELECTION_PAGE_SIZE = 10;
45
+ const SESSIONS_STATE_FILE = ".agent-watch-sessions.json";
46
+
47
+ //#endregion
48
+ //#region src/config.ts
49
+ /**
50
+ * Load the agent-watch configuration from the project root.
51
+ * Returns null if no config file exists or is invalid.
52
+ */
53
+ function loadConfig(projectRoot) {
54
+ const configPath = join(projectRoot, CONFIG_FILE_NAME);
55
+ if (!existsSync(configPath)) return null;
56
+ try {
57
+ const raw = readFileSync(configPath, "utf-8");
58
+ return JSON.parse(raw);
59
+ } catch {
60
+ return null;
61
+ }
62
+ }
63
+ /**
64
+ * Save the agent-watch configuration to the project root.
65
+ */
66
+ function saveConfig(projectRoot, config) {
67
+ writeFileSync(join(projectRoot, CONFIG_FILE_NAME), `${JSON.stringify(config, null, 2)}\n`, "utf-8");
68
+ }
69
+ /**
70
+ * Create a default configuration with optional overrides.
71
+ */
72
+ function createDefaultConfig(overrides = {}) {
73
+ return {
74
+ version: 1,
75
+ agentFiles: [],
76
+ watchFileChanges: true,
77
+ includeChatSession: true,
78
+ hookTrigger: "commit",
79
+ agents: [],
80
+ ...overrides
81
+ };
82
+ }
83
+
84
+ //#endregion
85
+ //#region src/detect.ts
86
+ /**
87
+ * Scan the project root for known agent configuration files.
88
+ * Returns information about each known file pattern including whether it exists.
89
+ */
90
+ function detectAgentFiles(projectRoot) {
91
+ return KNOWN_AGENT_FILES.map((pattern) => {
92
+ const absolutePath = join(projectRoot, pattern.path);
93
+ return {
94
+ pattern,
95
+ exists: existsSync(absolutePath),
96
+ absolutePath
97
+ };
98
+ });
99
+ }
100
+ /**
101
+ * Get only the agent files that exist in the project.
102
+ */
103
+ function getExistingAgentFiles(projectRoot) {
104
+ return detectAgentFiles(projectRoot).filter((f) => f.exists);
105
+ }
106
+
107
+ //#endregion
108
+ //#region src/utils/logger.ts
109
+ const logger = {
110
+ info(message) {
111
+ console.log(pc.blue("info"), message);
112
+ },
113
+ success(message) {
114
+ console.log(pc.green("✔"), message);
115
+ },
116
+ warn(message) {
117
+ console.log(pc.yellow("⚠"), message);
118
+ },
119
+ error(message) {
120
+ console.error(pc.red("✖"), message);
121
+ },
122
+ step(message) {
123
+ console.log(pc.cyan("▸"), message);
124
+ },
125
+ blank() {
126
+ console.log();
127
+ },
128
+ title(message) {
129
+ console.log();
130
+ console.log(pc.bold(pc.magenta(message)));
131
+ console.log();
132
+ },
133
+ banner(message) {
134
+ const border = "═".repeat(message.length + 4);
135
+ console.log();
136
+ console.log(pc.bold(pc.cyan(`╔${border}╗`)));
137
+ console.log(pc.bold(pc.cyan(`║ ${message} ║`)));
138
+ console.log(pc.bold(pc.cyan(`╚${border}╝`)));
139
+ console.log();
140
+ },
141
+ section(message) {
142
+ console.log();
143
+ console.log(pc.bold(pc.blue(`┌─ ${message}`)));
144
+ console.log(pc.bold(pc.blue("│")));
145
+ },
146
+ sectionEnd() {
147
+ console.log(pc.bold(pc.blue("└─")));
148
+ console.log();
149
+ },
150
+ asciiArt() {
151
+ console.log();
152
+ console.log(pc.bold(pc.cyan(" █████╗ ██████╗ ███████╗███╗ ██╗████████╗ ██╗ ██╗ █████╗ ████████╗ ██████╗██╗ ██╗")));
153
+ console.log(pc.bold(pc.cyan(" ██╔══██╗██╔════╝ ██╔════╝████╗ ██║╚══██╔══╝ ██║ ██║██╔══██╗╚══██╔══╝██╔════╝██║ ██║")));
154
+ console.log(pc.bold(pc.magenta(" ███████║██║ ███╗█████╗ ██╔██╗ ██║ ██║ ██║ █╗ ██║███████║ ██║ ██║ ███████║")));
155
+ console.log(pc.bold(pc.magenta(" ██╔══██║██║ ██║██╔══╝ ██║╚██╗██║ ██║ ██║███╗██║██╔══██║ ██║ ██║ ██╔══██║")));
156
+ console.log(pc.bold(pc.blue(" ██║ ██║╚██████╔╝███████╗██║ ╚████║ ██║ ╚███╔███╔╝██║ ██║ ██║ ╚██████╗██║ ██║")));
157
+ console.log(pc.bold(pc.blue(" ╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═══╝ ╚═╝ ╚══╝╚══╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝")));
158
+ console.log();
159
+ console.log(pc.dim(pc.italic(" Keep your AI agent configuration files in sync")));
160
+ console.log();
161
+ }
162
+ };
163
+
164
+ //#endregion
165
+ export { loadConfig as a, FILE_SELECTION_PAGE_SIZE as c, SUPPORTED_AI_AGENTS as d, SUPPORTED_HOOKS as f, createDefaultConfig as i, KNOWN_AGENT_FILES as l, detectAgentFiles as n, saveConfig as o, getExistingAgentFiles as r, CONFIG_FILE_NAME as s, logger as t, SESSIONS_STATE_FILE as u };
166
+ //# sourceMappingURL=logger-hSIaaw_k.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger-hSIaaw_k.js","names":[],"sources":["../src/constants.ts","../src/config.ts","../src/detect.ts","../src/utils/logger.ts"],"sourcesContent":["export interface AgentFilePattern {\n\t/** Relative path from project root */\n\tpath: string\n\t/** Human-readable label for display */\n\tlabel: string\n\t/** Which AI agent/tool uses this file */\n\tagent: string\n}\n\nexport const KNOWN_AGENT_FILES: AgentFilePattern[] = [\n\t{ path: \"AGENTS.md\", label: \"AGENTS.md (Recommended)\", agent: \"Generic\" },\n\t{ path: \"CLAUDE.md\", label: \"CLAUDE.md (Claude Code)\", agent: \"Claude Code\" },\n\t{\n\t\tpath: \".github/copilot-instructions.md\",\n\t\tlabel: \".github/copilot-instructions.md (GitHub Copilot)\",\n\t\tagent: \"GitHub Copilot\",\n\t},\n\t{ path: \".cursor/rules\", label: \".cursor/rules (Cursor)\", agent: \"Cursor\" },\n\t{ path: \".windsurfrules\", label: \".windsurfrules (Windsurf)\", agent: \"Windsurf\" },\n\t{ path: \".clinerules\", label: \".clinerules (Cline)\", agent: \"Cline\" },\n]\n\nexport const CONFIG_FILE_NAME = \".agent-watch.json\"\n\nexport const SUPPORTED_HOOKS = [\"commit\", \"push\"] as const\nexport type GitHookTrigger = (typeof SUPPORTED_HOOKS)[number]\n\nexport const SUPPORTED_AI_AGENTS = [{ value: \"github-copilot-cli\", name: \"GitHub Copilot CLI\" }] as const\n\n// UI Configuration\nexport const FILE_SELECTION_PAGE_SIZE = 10 // Static scroll limit for file selection\n\n// Session tracking\nexport const SESSIONS_STATE_FILE = \".agent-watch-sessions.json\"\n","import { existsSync, readFileSync, writeFileSync } from \"node:fs\"\nimport { join } from \"node:path\"\nimport { CONFIG_FILE_NAME, type GitHookTrigger } from \"./constants.js\"\n\nexport interface AgentWatchConfig {\n\t/** Version of the config schema */\n\tversion: 1\n\t/** Relative paths to the agent files being managed */\n\tagentFiles: string[]\n\t/** Whether to use git commit messages and chat sessions for context (legacy) */\n\tuseGitContext?: boolean\n\t/** Whether to watch for file changes */\n\twatchFileChanges: boolean\n\t/** Whether to include chat session context */\n\tincludeChatSession: boolean\n\t/** Which git hook triggers the update */\n\thookTrigger: GitHookTrigger\n\t/** Which AI agent integrations to configure */\n\tagents: string[]\n}\n\n/**\n * Load the agent-watch configuration from the project root.\n * Returns null if no config file exists or is invalid.\n */\nexport function loadConfig(projectRoot: string): AgentWatchConfig | null {\n\tconst configPath = join(projectRoot, CONFIG_FILE_NAME)\n\tif (!existsSync(configPath)) {\n\t\treturn null\n\t}\n\ttry {\n\t\tconst raw = readFileSync(configPath, \"utf-8\")\n\t\treturn JSON.parse(raw) as AgentWatchConfig\n\t} catch {\n\t\treturn null\n\t}\n}\n\n/**\n * Save the agent-watch configuration to the project root.\n */\nexport function saveConfig(projectRoot: string, config: AgentWatchConfig): void {\n\tconst configPath = join(projectRoot, CONFIG_FILE_NAME)\n\twriteFileSync(configPath, `${JSON.stringify(config, null, 2)}\\n`, \"utf-8\")\n}\n\n/**\n * Create a default configuration with optional overrides.\n */\nexport function createDefaultConfig(overrides: Partial<AgentWatchConfig> = {}): AgentWatchConfig {\n\treturn {\n\t\tversion: 1,\n\t\tagentFiles: [],\n\t\twatchFileChanges: true,\n\t\tincludeChatSession: true,\n\t\thookTrigger: \"commit\",\n\t\tagents: [],\n\t\t...overrides,\n\t}\n}\n","import { existsSync } from \"node:fs\"\nimport { join } from \"node:path\"\nimport { type AgentFilePattern, KNOWN_AGENT_FILES } from \"./constants.js\"\n\nexport interface AgentFileInfo {\n\tpattern: AgentFilePattern\n\texists: boolean\n\tabsolutePath: string\n}\n\n/**\n * Scan the project root for known agent configuration files.\n * Returns information about each known file pattern including whether it exists.\n */\nexport function detectAgentFiles(projectRoot: string): AgentFileInfo[] {\n\treturn KNOWN_AGENT_FILES.map((pattern) => {\n\t\tconst absolutePath = join(projectRoot, pattern.path)\n\t\treturn {\n\t\t\tpattern,\n\t\t\texists: existsSync(absolutePath),\n\t\t\tabsolutePath,\n\t\t}\n\t})\n}\n\n/**\n * Get only the agent files that exist in the project.\n */\nexport function getExistingAgentFiles(projectRoot: string): AgentFileInfo[] {\n\treturn detectAgentFiles(projectRoot).filter((f) => f.exists)\n}\n","import pc from \"picocolors\"\n\nexport const logger = {\n\tinfo(message: string): void {\n\t\tconsole.log(pc.blue(\"info\"), message)\n\t},\n\n\tsuccess(message: string): void {\n\t\tconsole.log(pc.green(\"✔\"), message)\n\t},\n\n\twarn(message: string): void {\n\t\tconsole.log(pc.yellow(\"⚠\"), message)\n\t},\n\n\terror(message: string): void {\n\t\tconsole.error(pc.red(\"✖\"), message)\n\t},\n\n\tstep(message: string): void {\n\t\tconsole.log(pc.cyan(\"▸\"), message)\n\t},\n\n\tblank(): void {\n\t\tconsole.log()\n\t},\n\n\ttitle(message: string): void {\n\t\tconsole.log()\n\t\tconsole.log(pc.bold(pc.magenta(message)))\n\t\tconsole.log()\n\t},\n\n\tbanner(message: string): void {\n\t\tconst border = \"═\".repeat(message.length + 4)\n\t\tconsole.log()\n\t\tconsole.log(pc.bold(pc.cyan(`╔${border}╗`)))\n\t\tconsole.log(pc.bold(pc.cyan(`║ ${message} ║`)))\n\t\tconsole.log(pc.bold(pc.cyan(`╚${border}╝`)))\n\t\tconsole.log()\n\t},\n\n\tsection(message: string): void {\n\t\tconsole.log()\n\t\tconsole.log(pc.bold(pc.blue(`┌─ ${message}`)))\n\t\tconsole.log(pc.bold(pc.blue(\"│\")))\n\t},\n\n\tsectionEnd(): void {\n\t\tconsole.log(pc.bold(pc.blue(\"└─\")))\n\t\tconsole.log()\n\t},\n\n\tasciiArt(): void {\n\t\tconsole.log()\n\t\tconsole.log(\n\t\t\tpc.bold(\n\t\t\t\tpc.cyan(\n\t\t\t\t\t\" █████╗ ██████╗ ███████╗███╗ ██╗████████╗ ██╗ ██╗ █████╗ ████████╗ ██████╗██╗ ██╗\",\n\t\t\t\t),\n\t\t\t),\n\t\t)\n\t\tconsole.log(\n\t\t\tpc.bold(\n\t\t\t\tpc.cyan(\n\t\t\t\t\t\" ██╔══██╗██╔════╝ ██╔════╝████╗ ██║╚══██╔══╝ ██║ ██║██╔══██╗╚══██╔══╝██╔════╝██║ ██║\",\n\t\t\t\t),\n\t\t\t),\n\t\t)\n\t\tconsole.log(\n\t\t\tpc.bold(\n\t\t\t\tpc.magenta(\n\t\t\t\t\t\" ███████║██║ ███╗█████╗ ██╔██╗ ██║ ██║ ██║ █╗ ██║███████║ ██║ ██║ ███████║\",\n\t\t\t\t),\n\t\t\t),\n\t\t)\n\t\tconsole.log(\n\t\t\tpc.bold(\n\t\t\t\tpc.magenta(\n\t\t\t\t\t\" ██╔══██║██║ ██║██╔══╝ ██║╚██╗██║ ██║ ██║███╗██║██╔══██║ ██║ ██║ ██╔══██║\",\n\t\t\t\t),\n\t\t\t),\n\t\t)\n\t\tconsole.log(\n\t\t\tpc.bold(\n\t\t\t\tpc.blue(\n\t\t\t\t\t\" ██║ ██║╚██████╔╝███████╗██║ ╚████║ ██║ ╚███╔███╔╝██║ ██║ ██║ ╚██████╗██║ ██║\",\n\t\t\t\t),\n\t\t\t),\n\t\t)\n\t\tconsole.log(\n\t\t\tpc.bold(\n\t\t\t\tpc.blue(\n\t\t\t\t\t\" ╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═══╝ ╚═╝ ╚══╝╚══╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝\",\n\t\t\t\t),\n\t\t\t),\n\t\t)\n\t\tconsole.log()\n\t\tconsole.log(\n\t\t\tpc.dim(pc.italic(\" Keep your AI agent configuration files in sync\")),\n\t\t)\n\t\tconsole.log()\n\t},\n}\n"],"mappings":"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"}
@@ -0,0 +1,269 @@
1
+ //#region \0rolldown/runtime.js
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __copyProps = (to, from, except, desc) => {
9
+ if (from && typeof from === "object" || typeof from === "function") {
10
+ for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
11
+ key = keys[i];
12
+ if (!__hasOwnProp.call(to, key) && key !== except) {
13
+ __defProp(to, key, {
14
+ get: ((k) => from[k]).bind(null, key),
15
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
16
+ });
17
+ }
18
+ }
19
+ }
20
+ return to;
21
+ };
22
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
23
+ value: mod,
24
+ enumerable: true
25
+ }) : target, mod));
26
+
27
+ //#endregion
28
+ let node_fs = require("node:fs");
29
+ let node_path = require("node:path");
30
+ let picocolors = require("picocolors");
31
+ picocolors = __toESM(picocolors);
32
+
33
+ //#region src/constants.ts
34
+ const KNOWN_AGENT_FILES = [
35
+ {
36
+ path: "CLAUDE.md",
37
+ label: "CLAUDE.md (Claude Code)",
38
+ agent: "Claude Code"
39
+ },
40
+ {
41
+ path: ".github/copilot-instructions.md",
42
+ label: ".github/copilot-instructions.md (GitHub Copilot)",
43
+ agent: "GitHub Copilot"
44
+ },
45
+ {
46
+ path: "copilot-instructions.md",
47
+ label: "copilot-instructions.md (GitHub Copilot)",
48
+ agent: "GitHub Copilot"
49
+ },
50
+ {
51
+ path: "AGENTS.md",
52
+ label: "AGENTS.md (Generic)",
53
+ agent: "Generic"
54
+ },
55
+ {
56
+ path: ".cursorrules",
57
+ label: ".cursorrules (Cursor)",
58
+ agent: "Cursor"
59
+ },
60
+ {
61
+ path: ".cursor/rules",
62
+ label: ".cursor/rules (Cursor)",
63
+ agent: "Cursor"
64
+ },
65
+ {
66
+ path: ".windsurfrules",
67
+ label: ".windsurfrules (Windsurf)",
68
+ agent: "Windsurf"
69
+ },
70
+ {
71
+ path: ".clinerules",
72
+ label: ".clinerules (Cline)",
73
+ agent: "Cline"
74
+ }
75
+ ];
76
+ const CONFIG_FILE_NAME = ".agent-watch.json";
77
+ const SUPPORTED_HOOKS = ["commit", "push"];
78
+ const SUPPORTED_AI_AGENTS = [{
79
+ value: "github-copilot-cli",
80
+ name: "GitHub Copilot CLI"
81
+ }];
82
+ const FILE_SELECTION_PAGE_SIZE = 10;
83
+ const SESSIONS_STATE_FILE = ".agent-watch-sessions.json";
84
+
85
+ //#endregion
86
+ //#region src/config.ts
87
+ /**
88
+ * Load the agent-watch configuration from the project root.
89
+ * Returns null if no config file exists or is invalid.
90
+ */
91
+ function loadConfig(projectRoot) {
92
+ const configPath = (0, node_path.join)(projectRoot, CONFIG_FILE_NAME);
93
+ if (!(0, node_fs.existsSync)(configPath)) return null;
94
+ try {
95
+ const raw = (0, node_fs.readFileSync)(configPath, "utf-8");
96
+ return JSON.parse(raw);
97
+ } catch {
98
+ return null;
99
+ }
100
+ }
101
+ /**
102
+ * Save the agent-watch configuration to the project root.
103
+ */
104
+ function saveConfig(projectRoot, config) {
105
+ (0, node_fs.writeFileSync)((0, node_path.join)(projectRoot, CONFIG_FILE_NAME), `${JSON.stringify(config, null, 2)}\n`, "utf-8");
106
+ }
107
+ /**
108
+ * Create a default configuration with optional overrides.
109
+ */
110
+ function createDefaultConfig(overrides = {}) {
111
+ return {
112
+ version: 1,
113
+ agentFiles: [],
114
+ watchFileChanges: true,
115
+ includeChatSession: true,
116
+ hookTrigger: "commit",
117
+ agents: [],
118
+ ...overrides
119
+ };
120
+ }
121
+
122
+ //#endregion
123
+ //#region src/detect.ts
124
+ /**
125
+ * Scan the project root for known agent configuration files.
126
+ * Returns information about each known file pattern including whether it exists.
127
+ */
128
+ function detectAgentFiles(projectRoot) {
129
+ return KNOWN_AGENT_FILES.map((pattern) => {
130
+ const absolutePath = (0, node_path.join)(projectRoot, pattern.path);
131
+ return {
132
+ pattern,
133
+ exists: (0, node_fs.existsSync)(absolutePath),
134
+ absolutePath
135
+ };
136
+ });
137
+ }
138
+ /**
139
+ * Get only the agent files that exist in the project.
140
+ */
141
+ function getExistingAgentFiles(projectRoot) {
142
+ return detectAgentFiles(projectRoot).filter((f) => f.exists);
143
+ }
144
+
145
+ //#endregion
146
+ //#region src/utils/logger.ts
147
+ const logger = {
148
+ info(message) {
149
+ console.log(picocolors.default.blue("info"), message);
150
+ },
151
+ success(message) {
152
+ console.log(picocolors.default.green("✔"), message);
153
+ },
154
+ warn(message) {
155
+ console.log(picocolors.default.yellow("⚠"), message);
156
+ },
157
+ error(message) {
158
+ console.error(picocolors.default.red("✖"), message);
159
+ },
160
+ step(message) {
161
+ console.log(picocolors.default.cyan("▸"), message);
162
+ },
163
+ blank() {
164
+ console.log();
165
+ },
166
+ title(message) {
167
+ console.log();
168
+ console.log(picocolors.default.bold(picocolors.default.magenta(message)));
169
+ console.log();
170
+ },
171
+ banner(message) {
172
+ const border = "═".repeat(message.length + 4);
173
+ console.log();
174
+ console.log(picocolors.default.bold(picocolors.default.cyan(`╔${border}╗`)));
175
+ console.log(picocolors.default.bold(picocolors.default.cyan(`║ ${message} ║`)));
176
+ console.log(picocolors.default.bold(picocolors.default.cyan(`╚${border}╝`)));
177
+ console.log();
178
+ },
179
+ section(message) {
180
+ console.log();
181
+ console.log(picocolors.default.bold(picocolors.default.blue(`┌─ ${message}`)));
182
+ console.log(picocolors.default.bold(picocolors.default.blue("│")));
183
+ },
184
+ sectionEnd() {
185
+ console.log(picocolors.default.bold(picocolors.default.blue("└─")));
186
+ console.log();
187
+ }
188
+ };
189
+
190
+ //#endregion
191
+ Object.defineProperty(exports, 'CONFIG_FILE_NAME', {
192
+ enumerable: true,
193
+ get: function () {
194
+ return CONFIG_FILE_NAME;
195
+ }
196
+ });
197
+ Object.defineProperty(exports, 'FILE_SELECTION_PAGE_SIZE', {
198
+ enumerable: true,
199
+ get: function () {
200
+ return FILE_SELECTION_PAGE_SIZE;
201
+ }
202
+ });
203
+ Object.defineProperty(exports, 'KNOWN_AGENT_FILES', {
204
+ enumerable: true,
205
+ get: function () {
206
+ return KNOWN_AGENT_FILES;
207
+ }
208
+ });
209
+ Object.defineProperty(exports, 'SESSIONS_STATE_FILE', {
210
+ enumerable: true,
211
+ get: function () {
212
+ return SESSIONS_STATE_FILE;
213
+ }
214
+ });
215
+ Object.defineProperty(exports, 'SUPPORTED_AI_AGENTS', {
216
+ enumerable: true,
217
+ get: function () {
218
+ return SUPPORTED_AI_AGENTS;
219
+ }
220
+ });
221
+ Object.defineProperty(exports, 'SUPPORTED_HOOKS', {
222
+ enumerable: true,
223
+ get: function () {
224
+ return SUPPORTED_HOOKS;
225
+ }
226
+ });
227
+ Object.defineProperty(exports, '__toESM', {
228
+ enumerable: true,
229
+ get: function () {
230
+ return __toESM;
231
+ }
232
+ });
233
+ Object.defineProperty(exports, 'createDefaultConfig', {
234
+ enumerable: true,
235
+ get: function () {
236
+ return createDefaultConfig;
237
+ }
238
+ });
239
+ Object.defineProperty(exports, 'detectAgentFiles', {
240
+ enumerable: true,
241
+ get: function () {
242
+ return detectAgentFiles;
243
+ }
244
+ });
245
+ Object.defineProperty(exports, 'getExistingAgentFiles', {
246
+ enumerable: true,
247
+ get: function () {
248
+ return getExistingAgentFiles;
249
+ }
250
+ });
251
+ Object.defineProperty(exports, 'loadConfig', {
252
+ enumerable: true,
253
+ get: function () {
254
+ return loadConfig;
255
+ }
256
+ });
257
+ Object.defineProperty(exports, 'logger', {
258
+ enumerable: true,
259
+ get: function () {
260
+ return logger;
261
+ }
262
+ });
263
+ Object.defineProperty(exports, 'saveConfig', {
264
+ enumerable: true,
265
+ get: function () {
266
+ return saveConfig;
267
+ }
268
+ });
269
+ //# sourceMappingURL=logger-oq2Z7oYf.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger-oq2Z7oYf.cjs","names":["pc"],"sources":["../src/constants.ts","../src/config.ts","../src/detect.ts","../src/utils/logger.ts"],"sourcesContent":["export interface AgentFilePattern {\n\t/** Relative path from project root */\n\tpath: string\n\t/** Human-readable label for display */\n\tlabel: string\n\t/** Which AI agent/tool uses this file */\n\tagent: string\n}\n\nexport const KNOWN_AGENT_FILES: AgentFilePattern[] = [\n\t{ path: \"CLAUDE.md\", label: \"CLAUDE.md (Claude Code)\", agent: \"Claude Code\" },\n\t{\n\t\tpath: \".github/copilot-instructions.md\",\n\t\tlabel: \".github/copilot-instructions.md (GitHub Copilot)\",\n\t\tagent: \"GitHub Copilot\",\n\t},\n\t{ path: \"copilot-instructions.md\", label: \"copilot-instructions.md (GitHub Copilot)\", agent: \"GitHub Copilot\" },\n\t{ path: \"AGENTS.md\", label: \"AGENTS.md (Generic)\", agent: \"Generic\" },\n\t{ path: \".cursorrules\", label: \".cursorrules (Cursor)\", agent: \"Cursor\" },\n\t{ path: \".cursor/rules\", label: \".cursor/rules (Cursor)\", agent: \"Cursor\" },\n\t{ path: \".windsurfrules\", label: \".windsurfrules (Windsurf)\", agent: \"Windsurf\" },\n\t{ path: \".clinerules\", label: \".clinerules (Cline)\", agent: \"Cline\" },\n]\n\nexport const CONFIG_FILE_NAME = \".agent-watch.json\"\n\nexport const SUPPORTED_HOOKS = [\"commit\", \"push\"] as const\nexport type GitHookTrigger = (typeof SUPPORTED_HOOKS)[number]\n\nexport const SUPPORTED_AI_AGENTS = [{ value: \"github-copilot-cli\", name: \"GitHub Copilot CLI\" }] as const\n\n// UI Configuration\nexport const FILE_SELECTION_PAGE_SIZE = 10 // Static scroll limit for file selection\n\n// Session tracking\nexport const SESSIONS_STATE_FILE = \".agent-watch-sessions.json\"\n","import { existsSync, readFileSync, writeFileSync } from \"node:fs\"\nimport { join } from \"node:path\"\nimport { CONFIG_FILE_NAME, type GitHookTrigger } from \"./constants.js\"\n\nexport interface AgentWatchConfig {\n\t/** Version of the config schema */\n\tversion: 1\n\t/** Relative paths to the agent files being managed */\n\tagentFiles: string[]\n\t/** Whether to use git commit messages and chat sessions for context (legacy) */\n\tuseGitContext?: boolean\n\t/** Whether to watch for file changes */\n\twatchFileChanges: boolean\n\t/** Whether to include chat session context */\n\tincludeChatSession: boolean\n\t/** Which git hook triggers the update */\n\thookTrigger: GitHookTrigger\n\t/** Which AI agent integrations to configure */\n\tagents: string[]\n}\n\n/**\n * Load the agent-watch configuration from the project root.\n * Returns null if no config file exists or is invalid.\n */\nexport function loadConfig(projectRoot: string): AgentWatchConfig | null {\n\tconst configPath = join(projectRoot, CONFIG_FILE_NAME)\n\tif (!existsSync(configPath)) {\n\t\treturn null\n\t}\n\ttry {\n\t\tconst raw = readFileSync(configPath, \"utf-8\")\n\t\treturn JSON.parse(raw) as AgentWatchConfig\n\t} catch {\n\t\treturn null\n\t}\n}\n\n/**\n * Save the agent-watch configuration to the project root.\n */\nexport function saveConfig(projectRoot: string, config: AgentWatchConfig): void {\n\tconst configPath = join(projectRoot, CONFIG_FILE_NAME)\n\twriteFileSync(configPath, `${JSON.stringify(config, null, 2)}\\n`, \"utf-8\")\n}\n\n/**\n * Create a default configuration with optional overrides.\n */\nexport function createDefaultConfig(overrides: Partial<AgentWatchConfig> = {}): AgentWatchConfig {\n\treturn {\n\t\tversion: 1,\n\t\tagentFiles: [],\n\t\twatchFileChanges: true,\n\t\tincludeChatSession: true,\n\t\thookTrigger: \"commit\",\n\t\tagents: [],\n\t\t...overrides,\n\t}\n}\n","import { existsSync } from \"node:fs\"\nimport { join } from \"node:path\"\nimport { type AgentFilePattern, KNOWN_AGENT_FILES } from \"./constants.js\"\n\nexport interface AgentFileInfo {\n\tpattern: AgentFilePattern\n\texists: boolean\n\tabsolutePath: string\n}\n\n/**\n * Scan the project root for known agent configuration files.\n * Returns information about each known file pattern including whether it exists.\n */\nexport function detectAgentFiles(projectRoot: string): AgentFileInfo[] {\n\treturn KNOWN_AGENT_FILES.map((pattern) => {\n\t\tconst absolutePath = join(projectRoot, pattern.path)\n\t\treturn {\n\t\t\tpattern,\n\t\t\texists: existsSync(absolutePath),\n\t\t\tabsolutePath,\n\t\t}\n\t})\n}\n\n/**\n * Get only the agent files that exist in the project.\n */\nexport function getExistingAgentFiles(projectRoot: string): AgentFileInfo[] {\n\treturn detectAgentFiles(projectRoot).filter((f) => f.exists)\n}\n","import pc from \"picocolors\"\n\nexport const logger = {\n\tinfo(message: string): void {\n\t\tconsole.log(pc.blue(\"info\"), message)\n\t},\n\n\tsuccess(message: string): void {\n\t\tconsole.log(pc.green(\"✔\"), message)\n\t},\n\n\twarn(message: string): void {\n\t\tconsole.log(pc.yellow(\"⚠\"), message)\n\t},\n\n\terror(message: string): void {\n\t\tconsole.error(pc.red(\"✖\"), message)\n\t},\n\n\tstep(message: string): void {\n\t\tconsole.log(pc.cyan(\"▸\"), message)\n\t},\n\n\tblank(): void {\n\t\tconsole.log()\n\t},\n\n\ttitle(message: string): void {\n\t\tconsole.log()\n\t\tconsole.log(pc.bold(pc.magenta(message)))\n\t\tconsole.log()\n\t},\n\n\tbanner(message: string): void {\n\t\tconst border = \"═\".repeat(message.length + 4)\n\t\tconsole.log()\n\t\tconsole.log(pc.bold(pc.cyan(`╔${border}╗`)))\n\t\tconsole.log(pc.bold(pc.cyan(`║ ${message} ║`)))\n\t\tconsole.log(pc.bold(pc.cyan(`╚${border}╝`)))\n\t\tconsole.log()\n\t},\n\n\tsection(message: string): void {\n\t\tconsole.log()\n\t\tconsole.log(pc.bold(pc.blue(`┌─ ${message}`)))\n\t\tconsole.log(pc.bold(pc.blue(\"│\")))\n\t},\n\n\tsectionEnd(): void {\n\t\tconsole.log(pc.bold(pc.blue(\"└─\")))\n\t\tconsole.log()\n\t},\n}\n"],"mappings":"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"}