am-i-vibing 0.1.0 → 0.1.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.
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import { detectAgenticEnvironment, isAgent, isHybrid, isInteractive } from "./detector-LEsE74_L.js";
3
- import { parseArgs } from "node:util";
2
+ import { i as isInteractive, n as isAgent, r as isHybrid, t as detectAgenticEnvironment } from "./detector-CddkGnEB.mjs";
4
3
  import { getProcessAncestry } from "process-ancestry";
4
+ import { parseArgs } from "node:util";
5
5
 
6
6
  //#region src/cli.ts
7
7
  function parseCliArgs() {
@@ -110,10 +110,7 @@ function formatOutput(result, options) {
110
110
  if (options.check) return checkEnvironmentType(options.check) ? "true" : "false";
111
111
  return result.isAgentic ? `${result.name}` : "none";
112
112
  }
113
- if (options.check) {
114
- const matches = checkEnvironmentType(options.check);
115
- return matches ? `✓ Running in ${options.check} environment: ${result.name}` : `✗ Not running in ${options.check} environment`;
116
- }
113
+ if (options.check) return checkEnvironmentType(options.check) ? `✓ Running in ${options.check} environment: ${result.name}` : `✗ Not running in ${options.check} environment`;
117
114
  if (!result.isAgentic) return "✗ No agentic environment detected";
118
115
  return `✓ Detected: [${result.id}] ${result.name} (${result.type})`;
119
116
  }
@@ -134,4 +131,5 @@ function main() {
134
131
  main();
135
132
 
136
133
  //#endregion
137
- //# sourceMappingURL=cli.js.map
134
+ export { };
135
+ //# sourceMappingURL=cli.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.mjs","names":[],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { parseArgs } from \"node:util\";\nimport { getProcessAncestry } from \"process-ancestry\";\nimport {\n detectAgenticEnvironment,\n isAgent,\n isInteractive,\n isHybrid,\n} from \"./detector.js\";\n\ninterface CliOptions {\n format?: \"json\" | \"text\";\n check?: \"agent\" | \"interactive\" | \"hybrid\";\n quiet?: boolean;\n help?: boolean;\n debug?: boolean;\n}\n\nfunction parseCliArgs(): CliOptions {\n const { values } = parseArgs({\n args: process.argv.slice(2),\n options: {\n format: {\n type: \"string\",\n short: \"f\",\n default: \"text\",\n },\n check: {\n type: \"string\",\n short: \"c\",\n },\n quiet: {\n type: \"boolean\",\n short: \"q\",\n default: false,\n },\n help: {\n type: \"boolean\",\n short: \"h\",\n default: false,\n },\n debug: {\n type: \"boolean\",\n short: \"d\",\n default: false,\n },\n },\n allowPositionals: false,\n });\n\n // Validate format option\n if (values.format && ![\"json\", \"text\"].includes(values.format)) {\n console.error(\n `Error: Invalid format '${values.format}'. Must be 'json' or 'text'.`,\n );\n process.exit(1);\n }\n\n // Validate check option\n if (values.check && ![\"agent\", \"interactive\", \"hybrid\"].includes(values.check)) {\n console.error(\n `Error: Invalid check type '${values.check}'. Must be 'agent', 'interactive', or 'hybrid'.`,\n );\n process.exit(1);\n }\n\n return {\n format: values.format as \"json\" | \"text\",\n check: values.check as \"agent\" | \"interactive\" | \"hybrid\",\n quiet: values.quiet,\n help: values.help,\n debug: values.debug,\n };\n}\n\nfunction showHelp(): void {\n console.log(`\nam-i-vibing - Detect agentic coding environments\n\nUSAGE:\n npx am-i-vibing [OPTIONS]\n\nOPTIONS:\n -f, --format <json|text> Output format (default: text)\n -c, --check <agent|interactive|hybrid> Check for specific environment type\n -q, --quiet Only output result, no labels\n -d, --debug Debug output with environment and process info\n -h, --help Show this help message\n\nEXAMPLES:\n npx am-i-vibing # Detect current environment\n npx am-i-vibing --format json # JSON output\n npx am-i-vibing --check agent # Check if running under agent\n npx am-i-vibing --check hybrid # Check if running under hybrid\n npx am-i-vibing --quiet # Minimal output\n npx am-i-vibing --debug # Debug with full environment info\n\nEXIT CODES:\n 0 Agentic environment detected (or specific check passed)\n 1 No agentic environment detected (or specific check failed)\n`);\n}\n\nfunction checkEnvironmentType(checkType: string): boolean {\n switch (checkType) {\n case \"agent\":\n return isAgent();\n case \"interactive\":\n return isInteractive();\n case \"hybrid\":\n return isHybrid();\n default:\n return false;\n }\n}\n\nfunction formatOutput(\n result: ReturnType<typeof detectAgenticEnvironment>,\n options: CliOptions,\n): string {\n if (options.debug) {\n let processAncestry: any[] = [];\n try {\n processAncestry = getProcessAncestry();\n } catch (error) {\n processAncestry = [{ error: \"Failed to get process ancestry\" }];\n }\n\n const debugOutput = {\n detection: result,\n environment: process.env,\n processAncestry,\n };\n return JSON.stringify(debugOutput, null, 2);\n }\n\n if (options.format === \"json\") {\n return JSON.stringify(result, null, 2);\n }\n\n if (options.quiet) {\n if (options.check) {\n return checkEnvironmentType(options.check) ? \"true\" : \"false\";\n }\n return result.isAgentic ? `${result.name}` : \"none\";\n }\n\n if (options.check) {\n const matches = checkEnvironmentType(options.check);\n return matches\n ? `✓ Running in ${options.check} environment: ${result.name}`\n : `✗ Not running in ${options.check} environment`;\n }\n\n if (!result.isAgentic) {\n return \"✗ No agentic environment detected\";\n }\n\n return `✓ Detected: [${result.id}] ${result.name} (${result.type})`;\n}\n\nfunction main(): void {\n const options = parseCliArgs();\n\n if (options.help) {\n showHelp();\n process.exit(0);\n }\n\n const result = detectAgenticEnvironment();\n let exitCode = 1;\n\n if (options.check) {\n exitCode = checkEnvironmentType(options.check) ? 0 : 1;\n } else {\n exitCode = result.isAgentic ? 0 : 1;\n }\n\n const output = formatOutput(result, options);\n console.log(output);\n\n process.exit(exitCode);\n}\n\nmain();\n"],"mappings":";;;;;;AAmBA,SAAS,eAA2B;CAClC,MAAM,EAAE,WAAW,UAAU;EAC3B,MAAM,QAAQ,KAAK,MAAM,EAAE;EAC3B,SAAS;GACP,QAAQ;IACN,MAAM;IACN,OAAO;IACP,SAAS;IACV;GACD,OAAO;IACL,MAAM;IACN,OAAO;IACR;GACD,OAAO;IACL,MAAM;IACN,OAAO;IACP,SAAS;IACV;GACD,MAAM;IACJ,MAAM;IACN,OAAO;IACP,SAAS;IACV;GACD,OAAO;IACL,MAAM;IACN,OAAO;IACP,SAAS;IACV;GACF;EACD,kBAAkB;EACnB,CAAC;AAGF,KAAI,OAAO,UAAU,CAAC,CAAC,QAAQ,OAAO,CAAC,SAAS,OAAO,OAAO,EAAE;AAC9D,UAAQ,MACN,0BAA0B,OAAO,OAAO,8BACzC;AACD,UAAQ,KAAK,EAAE;;AAIjB,KAAI,OAAO,SAAS,CAAC;EAAC;EAAS;EAAe;EAAS,CAAC,SAAS,OAAO,MAAM,EAAE;AAC9E,UAAQ,MACN,8BAA8B,OAAO,MAAM,iDAC5C;AACD,UAAQ,KAAK,EAAE;;AAGjB,QAAO;EACL,QAAQ,OAAO;EACf,OAAO,OAAO;EACd,OAAO,OAAO;EACd,MAAM,OAAO;EACb,OAAO,OAAO;EACf;;AAGH,SAAS,WAAiB;AACxB,SAAQ,IAAI;;;;;;;;;;;;;;;;;;;;;;;;EAwBZ;;AAGF,SAAS,qBAAqB,WAA4B;AACxD,SAAQ,WAAR;EACE,KAAK,QACH,QAAO,SAAS;EAClB,KAAK,cACH,QAAO,eAAe;EACxB,KAAK,SACH,QAAO,UAAU;EACnB,QACE,QAAO;;;AAIb,SAAS,aACP,QACA,SACQ;AACR,KAAI,QAAQ,OAAO;EACjB,IAAI,kBAAyB,EAAE;AAC/B,MAAI;AACF,qBAAkB,oBAAoB;WAC/B,OAAO;AACd,qBAAkB,CAAC,EAAE,OAAO,kCAAkC,CAAC;;EAGjE,MAAM,cAAc;GAClB,WAAW;GACX,aAAa,QAAQ;GACrB;GACD;AACD,SAAO,KAAK,UAAU,aAAa,MAAM,EAAE;;AAG7C,KAAI,QAAQ,WAAW,OACrB,QAAO,KAAK,UAAU,QAAQ,MAAM,EAAE;AAGxC,KAAI,QAAQ,OAAO;AACjB,MAAI,QAAQ,MACV,QAAO,qBAAqB,QAAQ,MAAM,GAAG,SAAS;AAExD,SAAO,OAAO,YAAY,GAAG,OAAO,SAAS;;AAG/C,KAAI,QAAQ,MAEV,QADgB,qBAAqB,QAAQ,MAAM,GAE/C,gBAAgB,QAAQ,MAAM,gBAAgB,OAAO,SACrD,oBAAoB,QAAQ,MAAM;AAGxC,KAAI,CAAC,OAAO,UACV,QAAO;AAGT,QAAO,gBAAgB,OAAO,GAAG,IAAI,OAAO,KAAK,IAAI,OAAO,KAAK;;AAGnE,SAAS,OAAa;CACpB,MAAM,UAAU,cAAc;AAE9B,KAAI,QAAQ,MAAM;AAChB,YAAU;AACV,UAAQ,KAAK,EAAE;;CAGjB,MAAM,SAAS,0BAA0B;CACzC,IAAI,WAAW;AAEf,KAAI,QAAQ,MACV,YAAW,qBAAqB,QAAQ,MAAM,GAAG,IAAI;KAErD,YAAW,OAAO,YAAY,IAAI;CAGpC,MAAM,SAAS,aAAa,QAAQ,QAAQ;AAC5C,SAAQ,IAAI,OAAO;AAEnB,SAAQ,KAAK,SAAS;;AAGxB,MAAM"}
@@ -6,10 +6,11 @@ import { getProcessAncestry } from "process-ancestry";
6
6
  */
7
7
  const providers = [
8
8
  {
9
- id: "sst-opencode",
10
- name: "SST OpenCode",
9
+ id: "opencode",
10
+ name: "OpenCode",
11
11
  type: "agent",
12
12
  envVars: [{ any: [
13
+ "OPENCODE",
13
14
  "OPENCODE_BIN_PATH",
14
15
  "OPENCODE_SERVER",
15
16
  "OPENCODE_APP_INFO",
@@ -212,11 +213,18 @@ function createDetectedResult(provider) {
212
213
  * Detect agentic coding environment
213
214
  */
214
215
  function detectAgenticEnvironment(env = process.env, processAncestry) {
215
- for (const provider of providers) {
216
- if (provider.envVars?.some((group) => checkEnvVars(group, env))) return createDetectedResult(provider);
217
- if (provider.processChecks?.some((processName) => checkProcess(processName, processAncestry))) return createDetectedResult(provider);
218
- if (runCustomDetectors(provider)) return createDetectedResult(provider);
219
- }
216
+ for (const provider of providers) if (provider.envVars?.some((group) => checkEnvVars(group, env))) return createDetectedResult(provider);
217
+ let cachedAncestry = processAncestry;
218
+ const getAncestry = () => {
219
+ if (cachedAncestry === void 0) try {
220
+ cachedAncestry = getProcessAncestry();
221
+ } catch {
222
+ cachedAncestry = [];
223
+ }
224
+ return cachedAncestry;
225
+ };
226
+ for (const provider of providers) if (provider.processChecks?.some((processName) => checkProcess(processName, getAncestry()))) return createDetectedResult(provider);
227
+ for (const provider of providers) if (runCustomDetectors(provider)) return createDetectedResult(provider);
220
228
  return {
221
229
  isAgentic: false,
222
230
  id: null,
@@ -242,10 +250,9 @@ function isInteractive(env = process.env, processAncestry) {
242
250
  * Check if currently running in any hybrid AI environment
243
251
  */
244
252
  function isHybrid(env = process.env, processAncestry) {
245
- const result = detectAgenticEnvironment(env, processAncestry);
246
- return result.type === "hybrid";
253
+ return detectAgenticEnvironment(env, processAncestry).type === "hybrid";
247
254
  }
248
255
 
249
256
  //#endregion
250
- export { detectAgenticEnvironment, getProvider, getProvidersByType, isAgent, isHybrid, isInteractive, providers };
251
- //# sourceMappingURL=detector-LEsE74_L.js.map
257
+ export { getProvider as a, isInteractive as i, isAgent as n, getProvidersByType as o, isHybrid as r, providers as s, detectAgenticEnvironment as t };
258
+ //# sourceMappingURL=detector-CddkGnEB.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector-CddkGnEB.mjs","names":[],"sources":["../src/providers.ts","../src/detector.ts"],"sourcesContent":["import type { ProviderConfig } from \"./types.js\";\n\n/**\n * Provider configurations for major AI coding tools\n */\nexport const providers: ProviderConfig[] = [\n {\n id: \"opencode\",\n name: \"OpenCode\",\n type: \"agent\",\n envVars: [\n {\n any: [\n \"OPENCODE\",\n \"OPENCODE_BIN_PATH\",\n \"OPENCODE_SERVER\",\n \"OPENCODE_APP_INFO\",\n \"OPENCODE_MODES\",\n ],\n },\n ],\n },\n {\n id: \"jules\",\n name: \"Jules\",\n type: \"agent\",\n envVars: [\n {\n all: [\n [\"HOME\", \"/home/jules\"],\n [\"USER\", \"swebot\"],\n ],\n },\n ],\n },\n {\n id: \"claude-code\",\n name: \"Claude Code\",\n type: \"agent\",\n envVars: [\"CLAUDECODE\"],\n },\n {\n id: \"cursor-agent\",\n name: \"Cursor Agent\",\n type: \"agent\",\n envVars: [\n {\n all: [\"CURSOR_TRACE_ID\", [\"PAGER\", \"head -n 10000 | cat\"]],\n },\n ],\n },\n {\n id: \"cursor\",\n name: \"Cursor\",\n type: \"interactive\",\n envVars: [\"CURSOR_TRACE_ID\"],\n },\n {\n id: \"gemini-agent\",\n name: \"Gemini Agent\",\n type: \"agent\",\n processChecks: [\"gemini\"],\n },\n {\n id: \"codex\",\n name: \"OpenAI Codex\",\n type: \"agent\",\n processChecks: [\"codex\"],\n },\n {\n id: \"replit\",\n name: \"Replit\",\n type: \"agent\",\n envVars: [\"REPL_ID\"],\n },\n {\n id: \"aider\",\n name: \"Aider\",\n type: \"agent\",\n envVars: [\"AIDER_API_KEY\"],\n processChecks: [\"aider\"],\n },\n {\n id: \"bolt-agent\",\n name: \"Bolt.new Agent\",\n type: \"agent\",\n envVars: [\n {\n all: [[\"SHELL\", \"/bin/jsh\"], \"npm_config_yes\"],\n },\n ],\n },\n {\n id: \"bolt\",\n name: \"Bolt.new\",\n type: \"interactive\",\n envVars: [\n {\n all: [[\"SHELL\", \"/bin/jsh\"]],\n none: [\"npm_config_yes\"],\n },\n ],\n },\n {\n id: \"zed-agent\",\n name: \"Zed Agent\",\n type: \"agent\",\n envVars: [\n {\n all: [\n [\"TERM_PROGRAM\", \"zed\"],\n [\"PAGER\", \"cat\"],\n ],\n },\n ],\n },\n {\n id: \"zed\",\n name: \"Zed\",\n type: \"interactive\",\n envVars: [\n {\n all: [[\"TERM_PROGRAM\", \"zed\"]],\n none: [[\"PAGER\", \"cat\"]],\n },\n ],\n },\n {\n id: \"replit-assistant\",\n name: \"Replit Assistant\",\n type: \"agent\",\n envVars: [\n {\n all: [\"REPL_ID\", [\"REPLIT_MODE\", \"assistant\"]],\n },\n ],\n },\n {\n id: \"replit\",\n name: \"Replit\",\n type: \"interactive\",\n envVars: [\n {\n all: [\"REPL_ID\"],\n none: [[\"REPLIT_MODE\", \"assistant\"]],\n },\n ],\n },\n {\n id: \"windsurf\",\n name: \"Windsurf\",\n type: \"agent\",\n envVars: [\"CODEIUM_EDITOR_APP_ROOT\"],\n },\n {\n id: \"crush\",\n name: \"Crush\",\n type: \"agent\",\n processChecks: [\"crush\"],\n },\n {\n id: \"vscode-copilot-agent\",\n name: \"GitHub Copilot in VS Code\",\n type: \"agent\",\n envVars: [\n {\n all: [\n [\"TERM_PROGRAM\", \"vscode\"],\n [\"GIT_PAGER\", \"cat\"],\n ],\n },\n ],\n },\n {\n id: \"warp\",\n name: \"Warp Terminal\",\n type: \"hybrid\",\n envVars: [\n {\n all: [[\"TERM_PROGRAM\", \"WarpTerminal\"]],\n },\n ],\n },\n {\n id: \"octofriend\",\n name: \"Octofriend\",\n type: \"agent\",\n processChecks: [\"octofriend\"],\n },\n];\n\n/**\n * Get provider configuration by name\n */\nexport function getProvider(name: string): ProviderConfig | undefined {\n return providers.find((p) => p.name === name);\n}\n\n/**\n * Get all providers of a specific type\n */\nexport function getProvidersByType(\n type: \"agent\" | \"interactive\" | \"hybrid\",\n): ProviderConfig[] {\n return providers.filter((p) => p.type === type);\n}\n","import type {\n DetectionResult,\n ProviderConfig,\n EnvVarDefinition,\n EnvVarGroup,\n} from \"./types.js\";\nimport { providers } from \"./providers.js\";\nimport { getProcessAncestry } from \"process-ancestry\";\n\n/**\n * Check if a specific environment variable exists (handles both strings and tuples)\n */\nfunction checkEnvVar(\n envVarDef: EnvVarDefinition,\n env: Record<string, string | undefined> = process.env,\n): boolean {\n const [envVar, expectedValue] =\n typeof envVarDef === \"string\" ? [envVarDef, undefined] : envVarDef;\n\n const actualValue = env[envVar];\n return Boolean(\n actualValue && (!expectedValue || actualValue === expectedValue),\n );\n}\n\n/**\n * Check if a process is running in the process tree\n */\nfunction checkProcess(\n processName: string,\n processAncestry?: Array<{ command?: string }>,\n): boolean {\n try {\n const ancestry = processAncestry ?? getProcessAncestry();\n for (const ancestorProcess of ancestry) {\n if (ancestorProcess.command?.includes(processName)) {\n return true;\n }\n }\n } catch (error) {\n // Ignore process check errors\n }\n return false;\n}\n\n/**\n * Check if an environment variable group matches based on its properties\n */\nfunction checkEnvVars(\n definition: EnvVarGroup | EnvVarDefinition,\n env: Record<string, string | undefined> = process.env,\n): boolean {\n if (typeof definition === \"string\" || Array.isArray(definition)) {\n return checkEnvVar(definition, env);\n }\n\n const { any, all, none } = definition;\n\n // Check ANY conditions (OR logic) - at least one must pass\n const anyResult =\n !any?.length || any.some((envVar) => checkEnvVar(envVar, env));\n\n // Check ALL conditions (AND logic) - all must pass\n const allResult =\n !all?.length || all.every((envVar) => checkEnvVar(envVar, env));\n\n // Check NONE conditions (NOT logic) - none should pass\n const noneResult =\n !none?.length || !none.some((envVar) => checkEnvVar(envVar, env));\n\n return anyResult && allResult && noneResult;\n}\n\n/**\n * Run custom detectors for a provider\n */\nfunction runCustomDetectors(provider: ProviderConfig): boolean {\n return (\n provider.customDetectors?.some((detector) => {\n try {\n return detector();\n } catch {\n return false;\n }\n }) ?? false\n );\n}\n\n/**\n * Create a positive detection result\n */\nfunction createDetectedResult(provider: ProviderConfig): DetectionResult {\n return {\n isAgentic: true,\n id: provider.id,\n name: provider.name,\n type: provider.type,\n };\n}\n\n/**\n * Detect agentic coding environment\n */\nexport function detectAgenticEnvironment(\n env: Record<string, string | undefined> = process.env,\n processAncestry?: Array<{ command?: string }>,\n): DetectionResult {\n // Fast path: check all environment variables first\n for (const provider of providers) {\n if (provider.envVars?.some((group) => checkEnvVars(group, env))) {\n return createDetectedResult(provider);\n }\n }\n\n // Slow path: check processes only if no env var match found\n // Lazy evaluation: compute process ancestry only once when needed\n let cachedAncestry = processAncestry;\n const getAncestry = () => {\n if (cachedAncestry === undefined) {\n try {\n cachedAncestry = getProcessAncestry();\n } catch {\n cachedAncestry = []; // Fallback to empty on error\n }\n }\n return cachedAncestry;\n };\n\n for (const provider of providers) {\n if (provider.processChecks?.some((processName) => checkProcess(processName, getAncestry()))) {\n return createDetectedResult(provider);\n }\n }\n\n // Custom detectors last\n for (const provider of providers) {\n if (runCustomDetectors(provider)) {\n return createDetectedResult(provider);\n }\n }\n\n // No provider detected\n return {\n isAgentic: false,\n id: null,\n name: null,\n type: null,\n };\n}\n\n/**\n * Check if currently running in a specific provider\n */\nexport function isProvider(\n providerName: string,\n env: Record<string, string | undefined> = process.env,\n processAncestry?: Array<{ command?: string }>,\n): boolean {\n const result = detectAgenticEnvironment(env, processAncestry);\n return result.name === providerName;\n}\n\n/**\n * Check if currently running in any agent environment\n */\nexport function isAgent(\n env: Record<string, string | undefined> = process.env,\n processAncestry?: Array<{ command?: string }>,\n): boolean {\n const result = detectAgenticEnvironment(env, processAncestry);\n return result.type === \"agent\" || result.type === \"hybrid\";\n}\n\n/**\n * Check if currently running in any interactive AI environment\n */\nexport function isInteractive(\n env: Record<string, string | undefined> = process.env,\n processAncestry?: Array<{ command?: string }>,\n): boolean {\n const result = detectAgenticEnvironment(env, processAncestry);\n return result.type === \"interactive\" || result.type === \"hybrid\";\n}\n\n/**\n * Check if currently running in any hybrid AI environment\n */\nexport function isHybrid(\n env: Record<string, string | undefined> = process.env,\n processAncestry?: Array<{ command?: string }>,\n): boolean {\n const result = detectAgenticEnvironment(env, processAncestry);\n return result.type === \"hybrid\";\n}\n"],"mappings":"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"}
@@ -70,10 +70,6 @@ declare function getProvidersByType(type: "agent" | "interactive" | "hybrid"): P
70
70
  declare function detectAgenticEnvironment(env?: Record<string, string | undefined>, processAncestry?: Array<{
71
71
  command?: string;
72
72
  }>): DetectionResult;
73
- /**
74
- * Check if currently running in a specific provider
75
- */
76
-
77
73
  /**
78
74
  * Check if currently running in any agent environment
79
75
  */
@@ -94,4 +90,4 @@ declare function isHybrid(env?: Record<string, string | undefined>, processAnces
94
90
  }>): boolean;
95
91
  //#endregion
96
92
  export { type AgenticType, type DetectionResult, type ProviderConfig, detectAgenticEnvironment as default, detectAgenticEnvironment, getProvider, getProvidersByType, isAgent, isHybrid, isInteractive, providers };
97
- //# sourceMappingURL=index.d.ts.map
93
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/providers.ts","../src/detector.ts"],"mappings":";;AAGA;;KAAY,WAAA;;;AAKZ;KAAY,gBAAA;;;;UAKK,WAAA;EAAW;EAE1B,GAAA,GAAM,gBAAA;EAAA;EAGN,GAAA,GAAM,gBAAA;EAGC;EAAP,IAAA,GAAO,gBAAA;AAAA;;;;UAMQ,cAAA;EANf;EAQA,EAAA;EARuB;EAWvB,IAAA;EALe;EAQf,IAAA,EAAM,WAAA;;EAGN,OAAA,GAAU,KAAA,CAAM,WAAA,GAAc,gBAAA;EAAd;EAGhB,aAAA;EAHU;EAMV,eAAA;AAAA;;;;UAMe,eAAA;EAZf;EAcA,SAAA;EAdgB;EAiBhB,EAAA;EAdA;EAiBA,IAAA;EAde;EAiBf,IAAA,EAAM,WAAA;AAAA;;;AA1DR;;;AAAA,cCEa,SAAA,EAAW,cAAA;;ADGxB;;iBC0LgB,WAAA,CAAY,IAAA,WAAe,cAAA;;;ADrL3C;iBC4LgB,kBAAA,CACd,IAAA,uCACC,cAAA;;;ADxMH;;;AAAA,iBEoGgB,wBAAA,CACd,GAAA,GAAK,MAAA,8BACL,eAAA,GAAkB,KAAA;EAAQ,OAAA;AAAA,KACzB,eAAA;;;;iBA2Da,OAAA,CACd,GAAA,GAAK,MAAA,8BACL,eAAA,GAAkB,KAAA;EAAQ,OAAA;AAAA;;;;iBASZ,aAAA,CACd,GAAA,GAAK,MAAA,8BACL,eAAA,GAAkB,KAAA;EAAQ,OAAA;AAAA;;;AFvJ5B;iBEgKgB,QAAA,CACd,GAAA,GAAK,MAAA,8BACL,eAAA,GAAkB,KAAA;EAAQ,OAAA;AAAA"}
@@ -1,8 +1,8 @@
1
- import { detectAgenticEnvironment, getProvider, getProvidersByType, isAgent, isHybrid, isInteractive, providers } from "./detector-LEsE74_L.js";
1
+ import { a as getProvider, i as isInteractive, n as isAgent, o as getProvidersByType, r as isHybrid, s as providers, t as detectAgenticEnvironment } from "./detector-CddkGnEB.mjs";
2
2
 
3
3
  //#region src/index.ts
4
4
  var src_default = detectAgenticEnvironment;
5
5
 
6
6
  //#endregion
7
7
  export { src_default as default, detectAgenticEnvironment, getProvider, getProvidersByType, isAgent, isHybrid, isInteractive, providers };
8
- //# sourceMappingURL=index.js.map
8
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["/**\n * am-i-vibing - Detect agentic coding environments and AI assistant tools\n */\n\n// Export types\nexport type { AgenticType, ProviderConfig, DetectionResult } from \"./types.js\";\n\n// Export providers\nexport { providers, getProvider, getProvidersByType } from \"./providers.js\";\n\n// Export detection functions\nexport {\n detectAgenticEnvironment,\n isAgent,\n isInteractive,\n isHybrid,\n} from \"./detector.js\";\n\n// Import for default export\nimport { detectAgenticEnvironment } from \"./detector.js\";\n\n// Convenience export for the main function\nexport default detectAgenticEnvironment;\n"],"mappings":";;;AAsBA,kBAAe"}
package/package.json CHANGED
@@ -1,25 +1,25 @@
1
1
  {
2
2
  "name": "am-i-vibing",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Detect agentic coding environments and AI assistant tools",
5
5
  "type": "module",
6
- "main": "dist/index.js",
6
+ "main": "dist/index.mjs",
7
7
  "bin": {
8
- "am-i-vibing": "dist/cli.js"
8
+ "am-i-vibing": "dist/cli.mjs"
9
9
  },
10
10
  "files": [
11
11
  "dist"
12
12
  ],
13
13
  "exports": {
14
- ".": "./dist/index.js"
14
+ ".": "./dist/index.mjs"
15
15
  },
16
16
  "devDependencies": {
17
17
  "@arethetypeswrong/cli": "^0.18.2",
18
- "@types/node": "^22.17.0",
19
- "publint": "^0.3.12",
20
- "tsdown": "^0.13.3",
21
- "typescript": "^5.9.2",
22
- "vitest": "^3.2.4"
18
+ "@types/node": "^24.10.15",
19
+ "publint": "^0.3.17",
20
+ "tsdown": "^0.20.3",
21
+ "typescript": "^5.9.3",
22
+ "vitest": "^4.0.18"
23
23
  },
24
24
  "repository": {
25
25
  "type": "git",
@@ -38,7 +38,7 @@
38
38
  "author": "Matt Kane",
39
39
  "license": "MIT",
40
40
  "dependencies": {
41
- "process-ancestry": "^0.0.2"
41
+ "process-ancestry": "^0.1.0"
42
42
  },
43
43
  "scripts": {
44
44
  "build": "tsdown src/index.ts src/cli.ts --format esm --dts --clean",
package/dist/cli.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.js","names":["checkType: string","result: ReturnType<typeof detectAgenticEnvironment>","options: CliOptions","processAncestry: any[]"],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { parseArgs } from \"node:util\";\nimport { getProcessAncestry } from \"process-ancestry\";\nimport {\n detectAgenticEnvironment,\n isAgent,\n isInteractive,\n isHybrid,\n} from \"./detector.js\";\n\ninterface CliOptions {\n format?: \"json\" | \"text\";\n check?: \"agent\" | \"interactive\" | \"hybrid\";\n quiet?: boolean;\n help?: boolean;\n debug?: boolean;\n}\n\nfunction parseCliArgs(): CliOptions {\n const { values } = parseArgs({\n args: process.argv.slice(2),\n options: {\n format: {\n type: \"string\",\n short: \"f\",\n default: \"text\",\n },\n check: {\n type: \"string\",\n short: \"c\",\n },\n quiet: {\n type: \"boolean\",\n short: \"q\",\n default: false,\n },\n help: {\n type: \"boolean\",\n short: \"h\",\n default: false,\n },\n debug: {\n type: \"boolean\",\n short: \"d\",\n default: false,\n },\n },\n allowPositionals: false,\n });\n\n // Validate format option\n if (values.format && ![\"json\", \"text\"].includes(values.format)) {\n console.error(\n `Error: Invalid format '${values.format}'. Must be 'json' or 'text'.`,\n );\n process.exit(1);\n }\n\n // Validate check option\n if (values.check && ![\"agent\", \"interactive\", \"hybrid\"].includes(values.check)) {\n console.error(\n `Error: Invalid check type '${values.check}'. Must be 'agent', 'interactive', or 'hybrid'.`,\n );\n process.exit(1);\n }\n\n return {\n format: values.format as \"json\" | \"text\",\n check: values.check as \"agent\" | \"interactive\" | \"hybrid\",\n quiet: values.quiet,\n help: values.help,\n debug: values.debug,\n };\n}\n\nfunction showHelp(): void {\n console.log(`\nam-i-vibing - Detect agentic coding environments\n\nUSAGE:\n npx am-i-vibing [OPTIONS]\n\nOPTIONS:\n -f, --format <json|text> Output format (default: text)\n -c, --check <agent|interactive|hybrid> Check for specific environment type\n -q, --quiet Only output result, no labels\n -d, --debug Debug output with environment and process info\n -h, --help Show this help message\n\nEXAMPLES:\n npx am-i-vibing # Detect current environment\n npx am-i-vibing --format json # JSON output\n npx am-i-vibing --check agent # Check if running under agent\n npx am-i-vibing --check hybrid # Check if running under hybrid\n npx am-i-vibing --quiet # Minimal output\n npx am-i-vibing --debug # Debug with full environment info\n\nEXIT CODES:\n 0 Agentic environment detected (or specific check passed)\n 1 No agentic environment detected (or specific check failed)\n`);\n}\n\nfunction checkEnvironmentType(checkType: string): boolean {\n switch (checkType) {\n case \"agent\":\n return isAgent();\n case \"interactive\":\n return isInteractive();\n case \"hybrid\":\n return isHybrid();\n default:\n return false;\n }\n}\n\nfunction formatOutput(\n result: ReturnType<typeof detectAgenticEnvironment>,\n options: CliOptions,\n): string {\n if (options.debug) {\n let processAncestry: any[] = [];\n try {\n processAncestry = getProcessAncestry();\n } catch (error) {\n processAncestry = [{ error: \"Failed to get process ancestry\" }];\n }\n\n const debugOutput = {\n detection: result,\n environment: process.env,\n processAncestry,\n };\n return JSON.stringify(debugOutput, null, 2);\n }\n\n if (options.format === \"json\") {\n return JSON.stringify(result, null, 2);\n }\n\n if (options.quiet) {\n if (options.check) {\n return checkEnvironmentType(options.check) ? \"true\" : \"false\";\n }\n return result.isAgentic ? `${result.name}` : \"none\";\n }\n\n if (options.check) {\n const matches = checkEnvironmentType(options.check);\n return matches\n ? `✓ Running in ${options.check} environment: ${result.name}`\n : `✗ Not running in ${options.check} environment`;\n }\n\n if (!result.isAgentic) {\n return \"✗ No agentic environment detected\";\n }\n\n return `✓ Detected: [${result.id}] ${result.name} (${result.type})`;\n}\n\nfunction main(): void {\n const options = parseCliArgs();\n\n if (options.help) {\n showHelp();\n process.exit(0);\n }\n\n const result = detectAgenticEnvironment();\n let exitCode = 1;\n\n if (options.check) {\n exitCode = checkEnvironmentType(options.check) ? 0 : 1;\n } else {\n exitCode = result.isAgentic ? 0 : 1;\n }\n\n const output = formatOutput(result, options);\n console.log(output);\n\n process.exit(exitCode);\n}\n\nmain();\n"],"mappings":";;;;;;AAmBA,SAAS,eAA2B;CAClC,MAAM,EAAE,QAAQ,GAAG,UAAU;EAC3B,MAAM,QAAQ,KAAK,MAAM,EAAE;EAC3B,SAAS;GACP,QAAQ;IACN,MAAM;IACN,OAAO;IACP,SAAS;GACV;GACD,OAAO;IACL,MAAM;IACN,OAAO;GACR;GACD,OAAO;IACL,MAAM;IACN,OAAO;IACP,SAAS;GACV;GACD,MAAM;IACJ,MAAM;IACN,OAAO;IACP,SAAS;GACV;GACD,OAAO;IACL,MAAM;IACN,OAAO;IACP,SAAS;GACV;EACF;EACD,kBAAkB;CACnB,EAAC;AAGF,KAAI,OAAO,UAAU,CAAC,CAAC,QAAQ,MAAO,EAAC,SAAS,OAAO,OAAO,EAAE;EAC9D,QAAQ,MACN,CAAC,uBAAuB,EAAE,OAAO,OAAO,4BAA4B,CAAC,CACtE;EACD,QAAQ,KAAK,EAAE;CAChB;AAGD,KAAI,OAAO,SAAS,CAAC;EAAC;EAAS;EAAe;CAAS,EAAC,SAAS,OAAO,MAAM,EAAE;EAC9E,QAAQ,MACN,CAAC,2BAA2B,EAAE,OAAO,MAAM,+CAA+C,CAAC,CAC5F;EACD,QAAQ,KAAK,EAAE;CAChB;AAED,QAAO;EACL,QAAQ,OAAO;EACf,OAAO,OAAO;EACd,OAAO,OAAO;EACd,MAAM,OAAO;EACb,OAAO,OAAO;CACf;AACF;AAED,SAAS,WAAiB;CACxB,QAAQ,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;AAwBf,CAAC,CAAC;AACD;AAED,SAAS,qBAAqBA,WAA4B;AACxD,SAAQ,WAAR;EACE,KAAK,QACH,QAAO,SAAS;EAClB,KAAK,cACH,QAAO,eAAe;EACxB,KAAK,SACH,QAAO,UAAU;EACnB,QACE,QAAO;CACV;AACF;AAED,SAAS,aACPC,QACAC,SACQ;AACR,KAAI,QAAQ,OAAO;EACjB,IAAIC,kBAAyB,CAAE;AAC/B,MAAI;GACF,kBAAkB,oBAAoB;EACvC,SAAQ,OAAO;GACd,kBAAkB,CAAC,EAAE,OAAO,iCAAkC,CAAC;EAChE;EAED,MAAM,cAAc;GAClB,WAAW;GACX,aAAa,QAAQ;GACrB;EACD;AACD,SAAO,KAAK,UAAU,aAAa,MAAM,EAAE;CAC5C;AAED,KAAI,QAAQ,WAAW,OACrB,QAAO,KAAK,UAAU,QAAQ,MAAM,EAAE;AAGxC,KAAI,QAAQ,OAAO;AACjB,MAAI,QAAQ,MACV,QAAO,qBAAqB,QAAQ,MAAM,GAAG,SAAS;AAExD,SAAO,OAAO,YAAY,GAAG,OAAO,MAAM,GAAG;CAC9C;AAED,KAAI,QAAQ,OAAO;EACjB,MAAM,UAAU,qBAAqB,QAAQ,MAAM;AACnD,SAAO,UACH,CAAC,aAAa,EAAE,QAAQ,MAAM,cAAc,EAAE,OAAO,MAAM,GAC3D,CAAC,iBAAiB,EAAE,QAAQ,MAAM,YAAY,CAAC;CACpD;AAED,KAAI,CAAC,OAAO,UACV,QAAO;AAGT,QAAO,CAAC,aAAa,EAAE,OAAO,GAAG,EAAE,EAAE,OAAO,KAAK,EAAE,EAAE,OAAO,KAAK,CAAC,CAAC;AACpE;AAED,SAAS,OAAa;CACpB,MAAM,UAAU,cAAc;AAE9B,KAAI,QAAQ,MAAM;EAChB,UAAU;EACV,QAAQ,KAAK,EAAE;CAChB;CAED,MAAM,SAAS,0BAA0B;CACzC,IAAI,WAAW;AAEf,KAAI,QAAQ,OACV,WAAW,qBAAqB,QAAQ,MAAM,GAAG,IAAI;MAErD,WAAW,OAAO,YAAY,IAAI;CAGpC,MAAM,SAAS,aAAa,QAAQ,QAAQ;CAC5C,QAAQ,IAAI,OAAO;CAEnB,QAAQ,KAAK,SAAS;AACvB;AAED,MAAM"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"detector-LEsE74_L.js","names":["providers: ProviderConfig[]","name: string","type: \"agent\" | \"interactive\" | \"hybrid\"","envVarDef: EnvVarDefinition","env: Record<string, string | undefined>","processName: string","processAncestry?: Array<{ command?: string }>","definition: EnvVarGroup | EnvVarDefinition","provider: ProviderConfig"],"sources":["../src/providers.ts","../src/detector.ts"],"sourcesContent":["import type { ProviderConfig } from \"./types.js\";\n\n/**\n * Provider configurations for major AI coding tools\n */\nexport const providers: ProviderConfig[] = [\n {\n id: \"sst-opencode\",\n name: \"SST OpenCode\",\n type: \"agent\",\n envVars: [\n {\n any: [\n \"OPENCODE_BIN_PATH\",\n \"OPENCODE_SERVER\",\n \"OPENCODE_APP_INFO\",\n \"OPENCODE_MODES\",\n ],\n },\n ],\n },\n {\n id: \"jules\",\n name: \"Jules\",\n type: \"agent\",\n envVars: [{ all: [[\"HOME\", \"/home/jules\"], [\"USER\", \"swebot\"]] }],\n },\n {\n id: \"claude-code\",\n name: \"Claude Code\",\n type: \"agent\",\n envVars: [\"CLAUDECODE\"],\n },\n {\n id: \"cursor-agent\",\n name: \"Cursor Agent\",\n type: \"agent\",\n envVars: [\n {\n all: [\"CURSOR_TRACE_ID\", [\"PAGER\", \"head -n 10000 | cat\"]],\n },\n ],\n },\n {\n id: \"cursor\",\n name: \"Cursor\",\n type: \"interactive\",\n envVars: [\"CURSOR_TRACE_ID\"],\n },\n {\n id: \"gemini-agent\",\n name: \"Gemini Agent\",\n type: \"agent\",\n processChecks: [\"gemini\"],\n },\n {\n id: \"codex\",\n name: \"OpenAI Codex\",\n type: \"agent\",\n processChecks: [\"codex\"],\n },\n {\n id: \"replit\",\n name: \"Replit\",\n type: \"agent\",\n envVars: [\"REPL_ID\"],\n },\n {\n id: \"aider\",\n name: \"Aider\",\n type: \"agent\",\n envVars: [\"AIDER_API_KEY\"],\n processChecks: [\"aider\"],\n },\n {\n id: \"bolt-agent\",\n name: \"Bolt.new Agent\",\n type: \"agent\",\n envVars: [\n {\n all: [[\"SHELL\", \"/bin/jsh\"], \"npm_config_yes\"],\n },\n ],\n },\n {\n id: \"bolt\",\n name: \"Bolt.new\",\n type: \"interactive\",\n envVars: [\n {\n all: [[\"SHELL\", \"/bin/jsh\"]],\n none: [\"npm_config_yes\"],\n },\n ],\n },\n {\n id: \"zed-agent\",\n name: \"Zed Agent\",\n type: \"agent\",\n envVars: [\n {\n all: [\n [\"TERM_PROGRAM\", \"zed\"],\n [\"PAGER\", \"cat\"],\n ],\n },\n ],\n },\n {\n id: \"zed\",\n name: \"Zed\",\n type: \"interactive\",\n envVars: [\n {\n all: [[\"TERM_PROGRAM\", \"zed\"]],\n none: [[\"PAGER\", \"cat\"]],\n },\n ],\n },\n {\n id: \"replit-assistant\",\n name: \"Replit Assistant\",\n type: \"agent\",\n envVars: [\n {\n all: [\"REPL_ID\", [\"REPLIT_MODE\", \"assistant\"]],\n },\n ],\n },\n {\n id: \"replit\",\n name: \"Replit\",\n type: \"interactive\",\n envVars: [\n {\n all: [\"REPL_ID\"],\n none: [[\"REPLIT_MODE\", \"assistant\"]],\n },\n ],\n },\n {\n id: \"windsurf\",\n name: \"Windsurf\",\n type: \"agent\",\n envVars: [\"CODEIUM_EDITOR_APP_ROOT\"],\n },\n {\n id: \"crush\",\n name: \"Crush\",\n type: \"agent\",\n processChecks: [\"crush\"],\n },\n {\n id: \"vscode-copilot-agent\",\n name: \"GitHub Copilot in VS Code\",\n type: \"agent\",\n envVars: [\n {\n all: [\n [\"TERM_PROGRAM\", \"vscode\"],\n [\"GIT_PAGER\", \"cat\"],\n ],\n },\n ],\n },\n {\n id: \"warp\",\n name: \"Warp Terminal\",\n type: \"hybrid\",\n envVars: [\n {\n all: [\n [\"TERM_PROGRAM\", \"WarpTerminal\"],\n ],\n },\n ],\n },\n {\n id: \"octofriend\",\n name: \"Octofriend\",\n type: \"agent\",\n processChecks: [\"octofriend\"],\n },\n];\n\n/**\n * Get provider configuration by name\n */\nexport function getProvider(name: string): ProviderConfig | undefined {\n return providers.find((p) => p.name === name);\n}\n\n/**\n * Get all providers of a specific type\n */\nexport function getProvidersByType(\n type: \"agent\" | \"interactive\" | \"hybrid\",\n): ProviderConfig[] {\n return providers.filter((p) => p.type === type);\n}\n","import type {\n DetectionResult,\n ProviderConfig,\n EnvVarDefinition,\n EnvVarGroup,\n} from \"./types.js\";\nimport { providers } from \"./providers.js\";\nimport { getProcessAncestry } from \"process-ancestry\";\n\n/**\n * Check if a specific environment variable exists (handles both strings and tuples)\n */\nfunction checkEnvVar(\n envVarDef: EnvVarDefinition,\n env: Record<string, string | undefined> = process.env,\n): boolean {\n const [envVar, expectedValue] =\n typeof envVarDef === \"string\" ? [envVarDef, undefined] : envVarDef;\n\n const actualValue = env[envVar];\n return Boolean(\n actualValue && (!expectedValue || actualValue === expectedValue),\n );\n}\n\n/**\n * Check if a process is running in the process tree\n */\nfunction checkProcess(\n processName: string,\n processAncestry?: Array<{ command?: string }>,\n): boolean {\n try {\n const ancestry = processAncestry ?? getProcessAncestry();\n for (const ancestorProcess of ancestry) {\n if (ancestorProcess.command?.includes(processName)) {\n return true;\n }\n }\n } catch (error) {\n // Ignore process check errors\n }\n return false;\n}\n\n/**\n * Check if an environment variable group matches based on its properties\n */\nfunction checkEnvVars(\n definition: EnvVarGroup | EnvVarDefinition,\n env: Record<string, string | undefined> = process.env,\n): boolean {\n if (typeof definition === \"string\" || Array.isArray(definition)) {\n return checkEnvVar(definition, env);\n }\n\n const { any, all, none } = definition;\n\n // Check ANY conditions (OR logic) - at least one must pass\n const anyResult =\n !any?.length || any.some((envVar) => checkEnvVar(envVar, env));\n\n // Check ALL conditions (AND logic) - all must pass\n const allResult =\n !all?.length || all.every((envVar) => checkEnvVar(envVar, env));\n\n // Check NONE conditions (NOT logic) - none should pass\n const noneResult =\n !none?.length || !none.some((envVar) => checkEnvVar(envVar, env));\n\n return anyResult && allResult && noneResult;\n}\n\n/**\n * Run custom detectors for a provider\n */\nfunction runCustomDetectors(provider: ProviderConfig): boolean {\n return (\n provider.customDetectors?.some((detector) => {\n try {\n return detector();\n } catch {\n return false;\n }\n }) ?? false\n );\n}\n\n/**\n * Create a positive detection result\n */\nfunction createDetectedResult(provider: ProviderConfig): DetectionResult {\n return {\n isAgentic: true,\n id: provider.id,\n name: provider.name,\n type: provider.type,\n };\n}\n\n/**\n * Detect agentic coding environment\n */\nexport function detectAgenticEnvironment(\n env: Record<string, string | undefined> = process.env,\n processAncestry?: Array<{ command?: string }>,\n): DetectionResult {\n for (const provider of providers) {\n // Check environment variables\n if (provider.envVars?.some((group) => checkEnvVars(group, env))) {\n return createDetectedResult(provider);\n }\n\n // Check processes\n if (provider.processChecks?.some((processName) => checkProcess(processName, processAncestry))) {\n return createDetectedResult(provider);\n }\n\n // Run custom detectors\n if (runCustomDetectors(provider)) {\n return createDetectedResult(provider);\n }\n }\n\n // No provider detected\n return {\n isAgentic: false,\n id: null,\n name: null,\n type: null,\n };\n}\n\n/**\n * Check if currently running in a specific provider\n */\nexport function isProvider(\n providerName: string,\n env: Record<string, string | undefined> = process.env,\n processAncestry?: Array<{ command?: string }>,\n): boolean {\n const result = detectAgenticEnvironment(env, processAncestry);\n return result.name === providerName;\n}\n\n/**\n * Check if currently running in any agent environment\n */\nexport function isAgent(\n env: Record<string, string | undefined> = process.env,\n processAncestry?: Array<{ command?: string }>,\n): boolean {\n const result = detectAgenticEnvironment(env, processAncestry);\n return result.type === \"agent\" || result.type === \"hybrid\";\n}\n\n/**\n * Check if currently running in any interactive AI environment\n */\nexport function isInteractive(\n env: Record<string, string | undefined> = process.env,\n processAncestry?: Array<{ command?: string }>,\n): boolean {\n const result = detectAgenticEnvironment(env, processAncestry);\n return result.type === \"interactive\" || result.type === \"hybrid\";\n}\n\n/**\n * Check if currently running in any hybrid AI environment\n */\nexport function isHybrid(\n env: Record<string, string | undefined> = process.env,\n processAncestry?: Array<{ command?: string }>,\n): boolean {\n const result = detectAgenticEnvironment(env, processAncestry);\n return result.type === \"hybrid\";\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/providers.ts","../src/detector.ts"],"sourcesContent":[],"mappings":";;AAGA;AAKA;AAKiB,KAVL,WAAA,GAUgB,OAAA,GAAA,aAAA,GAAA,QAAA;;;;AAQnB,KAbG,gBAAA,GAaH,MAAA,GAAA,CAAA,MAAA,EAAA,MAAA,CAAA;AAAgB;AAMzB;;AAQQ,UAtBS,WAAA,CAsBT;EAAW;EAGU,GAAG,CAAA,EAvBxB,gBAuBwB,EAAA;EAAgB;EAA/B,GAAA,CAAA,EApBT,gBAoBS,EAAA;EAYA;SA7BR;;;AChBT;AAuLA;AAOgB,UDxKC,cAAA,CCwKiB;;;;EC5FlB,IAAA,EAAA,MAAA;EAAwB;EAAA,IACjC,EFrEC,WEqED;EAAM;EACY,OACtB,CAAA,EFpES,KEoET,CFpEe,WEoEf,GFpE6B,gBEoE7B,CAAA;EAAe;EA0CF,aAAO,CAAA,EAAA,MAAA,EAAA;EAAA;EAAA,eAChB,CAAA,EAAA,CAAA,GAAA,GAAA,OAAA,CAAA,EAAA;;AACkB;AASzB;;AACO,UF9GU,eAAA,CE8GV;EAAM;EACY,SAAA,EAAA,OAAA;EAST;EAAQ,EAAA,EAAA,MAAA,GAAA,IAAA;EAAA;EACX,IACO,EAAA,MAAA,GAAA,IAAA;EAAK;QF/GjB;;;;AA1DR;AAKA;AAKA;AAA4B,cCRf,SDQe,ECRJ,cDQI,EAAA;;;;AAQH,iBCuKT,WAAA,CDvKS,IAAA,EAAA,MAAA,CAAA,ECuKkB,cDvKlB,GAAA,SAAA;AAMzB;;;AAWkB,iBC6JF,kBAAA,CD7JE,IAAA,EAAA,OAAA,GAAA,aAAA,GAAA,QAAA,CAAA,EC+Jf,cD/Je,EAAA;;;AAnClB;AAKA;AAKA;AAA4B,iBE0FZ,wBAAA,CF1FY,GAAA,CAAA,EE2FrB,MF3FqB,CAAA,MAAA,EAAA,MAAA,GAAA,SAAA,CAAA,EAAA,eAEJ,CAFI,EE4FR,KF5FQ,CAAA;EAAA,OAEpB,CAAA,EAAA,MAAA;CAAgB,CAAA,CAAA,EE2FrB,eFxFK;;AAGiB;AAMzB;;;;AAWiB;AAYA,iBEkGD,OAAA,CFlGgB,GAWb,CAAX,EEwFD,MFxFY,CAAA,MAAA,EAAA,MAAA,GAAA,SAAA,CAAA,EAAA,gBAAA,EEyFC,KFzFD,CAAA;;;;ACxDnB;AAuLA;AAOgB,iBCpCA,aAAA,CDsCb,GAAc,CAAd,ECrCI,MDqCU,CAAA,MAAA,EAAA,MAAA,GAAA,SAAA,CAAA,EAAA,gBAAA,ECpCG,KDoCH,CAAA;;;;AC9FjB;;AACO,iBAkES,QAAA,CAlET,GAAA,CAAA,EAmEA,MAnEA,CAAA,MAAA,EAAA,MAAA,GAAA,SAAA,CAAA,EAAA,eACkB,CADlB,EAoEa,KApEb,CAAA;EAAM,OACO,CAAA,EAAA,MAAA;CAAK,CAAA,CAAA,EAAA,OACtB"}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["/**\n * am-i-vibing - Detect agentic coding environments and AI assistant tools\n */\n\n// Export types\nexport type { AgenticType, ProviderConfig, DetectionResult } from \"./types.js\";\n\n// Export providers\nexport { providers, getProvider, getProvidersByType } from \"./providers.js\";\n\n// Export detection functions\nexport {\n detectAgenticEnvironment,\n isAgent,\n isInteractive,\n isHybrid,\n} from \"./detector.js\";\n\n// Import for default export\nimport { detectAgenticEnvironment } from \"./detector.js\";\n\n// Convenience export for the main function\nexport default detectAgenticEnvironment;\n"],"mappings":";;;AAsBA,kBAAe"}
File without changes