@eldrforge/kodrdriv 1.2.137 → 1.3.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.
package/dist/constants.js CHANGED
@@ -1,7 +1,9 @@
1
1
  import os from 'os';
2
2
  import path from 'path';
3
3
 
4
- const VERSION = '1.2.137 (HEAD/1a2e5be T:v1.2.137 2026-01-10 23:25:09 -0800) linux x64 v22.21.1';
4
+ const VERSION = '1.3.0 (HEAD/8fd2dfd T:v1.3.0 2026-01-21 09:37:44 -0800) linux x64 v24.12.0';
5
+ const BUILD_HOSTNAME = 'runnervmmtnos';
6
+ const BUILD_TIMESTAMP = '2026-01-21T17:40:52.231Z';
5
7
  const PROGRAM_NAME = 'kodrdriv';
6
8
  const DEFAULT_OVERRIDES = false;
7
9
  const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS = 'YYYY-MM-DD-HHmmss.SSS';
@@ -75,6 +77,7 @@ const COMMAND_TREE = 'tree';
75
77
  const COMMAND_LINK = 'link';
76
78
  const COMMAND_UNLINK = 'unlink';
77
79
  const COMMAND_CLEAN = 'clean';
80
+ const COMMAND_PULL = 'pull';
78
81
  const COMMAND_PRECOMMIT = 'precommit';
79
82
  const COMMAND_DEVELOPMENT = 'development';
80
83
  const COMMAND_VERSIONS = 'versions';
@@ -93,6 +96,7 @@ const ALLOWED_COMMANDS = [
93
96
  COMMAND_LINK,
94
97
  COMMAND_UNLINK,
95
98
  COMMAND_CLEAN,
99
+ COMMAND_PULL,
96
100
  COMMAND_PRECOMMIT,
97
101
  COMMAND_DEVELOPMENT,
98
102
  COMMAND_VERSIONS,
@@ -247,5 +251,5 @@ const KODRDRIV_DEFAULTS = {
247
251
  }
248
252
  };
249
253
 
250
- export { ALLOWED_COMMANDS, COMMAND_AUDIO_COMMIT, COMMAND_AUDIO_REVIEW, COMMAND_CHECK_CONFIG, COMMAND_CLEAN, COMMAND_COMMIT, COMMAND_DEVELOPMENT, COMMAND_INIT_CONFIG, COMMAND_LINK, COMMAND_PRECOMMIT, COMMAND_PUBLISH, COMMAND_RELEASE, COMMAND_REVIEW, COMMAND_SELECT_AUDIO, COMMAND_TREE, COMMAND_UNLINK, COMMAND_UPDATES, COMMAND_VERSIONS, DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS, DEFAULT_ADD, DEFAULT_AMEND_MODE, DEFAULT_CACHED, DEFAULT_COMMAND, DEFAULT_CONFIG_DIR, DEFAULT_CONTEXT_DIRECTORIES, DEFAULT_DEBUG, DEFAULT_DRY_RUN, DEFAULT_EXCLUDED_PATTERNS, DEFAULT_FROM_COMMIT_ALIAS, DEFAULT_INTERACTIVE_MODE, DEFAULT_MAX_DIFF_BYTES, DEFAULT_MERGE_METHOD, DEFAULT_MESSAGE_LIMIT, DEFAULT_MODEL, DEFAULT_OPENAI_MAX_OUTPUT_TOKENS, DEFAULT_OPENAI_REASONING, DEFAULT_OUTPUT_DIRECTORY, DEFAULT_OVERRIDES, DEFAULT_PREFERENCES_DIRECTORY, DEFAULT_SENDIT_MODE, DEFAULT_TO_COMMIT_ALIAS, DEFAULT_VERBOSE, KODRDRIV_DEFAULTS, PROGRAM_NAME, VERSION };
254
+ export { ALLOWED_COMMANDS, BUILD_HOSTNAME, BUILD_TIMESTAMP, COMMAND_AUDIO_COMMIT, COMMAND_AUDIO_REVIEW, COMMAND_CHECK_CONFIG, COMMAND_CLEAN, COMMAND_COMMIT, COMMAND_DEVELOPMENT, COMMAND_INIT_CONFIG, COMMAND_LINK, COMMAND_PRECOMMIT, COMMAND_PUBLISH, COMMAND_PULL, COMMAND_RELEASE, COMMAND_REVIEW, COMMAND_SELECT_AUDIO, COMMAND_TREE, COMMAND_UNLINK, COMMAND_UPDATES, COMMAND_VERSIONS, DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS, DEFAULT_ADD, DEFAULT_AMEND_MODE, DEFAULT_CACHED, DEFAULT_COMMAND, DEFAULT_CONFIG_DIR, DEFAULT_CONTEXT_DIRECTORIES, DEFAULT_DEBUG, DEFAULT_DRY_RUN, DEFAULT_EXCLUDED_PATTERNS, DEFAULT_FROM_COMMIT_ALIAS, DEFAULT_INTERACTIVE_MODE, DEFAULT_MAX_DIFF_BYTES, DEFAULT_MERGE_METHOD, DEFAULT_MESSAGE_LIMIT, DEFAULT_MODEL, DEFAULT_OPENAI_MAX_OUTPUT_TOKENS, DEFAULT_OPENAI_REASONING, DEFAULT_OUTPUT_DIRECTORY, DEFAULT_OVERRIDES, DEFAULT_PREFERENCES_DIRECTORY, DEFAULT_SENDIT_MODE, DEFAULT_TO_COMMIT_ALIAS, DEFAULT_VERBOSE, KODRDRIV_DEFAULTS, PROGRAM_NAME, VERSION };
251
255
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sources":["../src/constants.ts"],"sourcesContent":["import { MergeMethod } from './types';\nimport os from 'os';\nimport path from 'path';\n\nexport const VERSION = '__VERSION__ (__GIT_BRANCH__/__GIT_COMMIT__ __GIT_TAGS__ __GIT_COMMIT_DATE__) __SYSTEM_INFO__';\nexport const PROGRAM_NAME = 'kodrdriv';\nexport const DEFAULT_CHARACTER_ENCODING = 'utf-8';\nexport const DEFAULT_BINARY_TO_TEXT_ENCODING = 'base64';\nexport const DEFAULT_DIFF = true;\nexport const DEFAULT_LOG = false;\nexport const DEFAULT_OVERRIDES = false;\nexport const DATE_FORMAT_MONTH_DAY = 'MM-DD';\nexport const DATE_FORMAT_YEAR = 'YYYY';\nexport const DATE_FORMAT_YEAR_MONTH = 'YYYY-MM';\nexport const DATE_FORMAT_YEAR_MONTH_DAY = 'YYYY-MM-DD';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_SLASH = 'YYYY/MM/DD';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES = 'YYYY-MM-DD-HHmm';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS = 'YYYY-MM-DD-HHmmss';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS = 'YYYY-MM-DD-HHmmss.SSS';\nexport const DATE_FORMAT_SHORT_TIMESTAMP = 'YYMMdd-HHmm';\nexport const DATE_FORMAT_MONTH = 'MM';\nexport const DATE_FORMAT_DAY = 'DD';\nexport const DATE_FORMAT_HOURS = 'HHmm';\nexport const DATE_FORMAT_MINUTES = 'mm';\nexport const DATE_FORMAT_SECONDS = 'ss';\nexport const DATE_FORMAT_MILLISECONDS = 'SSS';\nexport const DEFAULT_VERBOSE = false;\nexport const DEFAULT_DRY_RUN = false;\nexport const DEFAULT_DEBUG = false;\nexport const DEFAULT_MODEL = 'gpt-4o-mini';\nexport const DEFAULT_MODEL_STRONG = 'gpt-4o';\nexport const DEFAULT_OPENAI_REASONING = 'low';\nexport const DEFAULT_OPENAI_MAX_OUTPUT_TOKENS = 10000;\nexport const DEFAULT_OUTPUT_DIRECTORY = 'output/kodrdriv';\n\n// Buffer size for git commands that may produce large output (like git log)\nexport const DEFAULT_GIT_COMMAND_MAX_BUFFER = 50 * 1024 * 1024; // 50MB\n\nexport const DEFAULT_CONTEXT_DIRECTORIES: string[] = [];\n\nexport const DEFAULT_CONFIG_DIR = '.kodrdriv';\nexport const DEFAULT_PREFERENCES_DIRECTORY = path.join(os.homedir(), '.kodrdriv');\n\nexport const DEFAULT_FROM_COMMIT_ALIAS = 'main';\nexport const DEFAULT_TO_COMMIT_ALIAS = 'HEAD';\n\nexport const DEFAULT_ADD = false;\nexport const DEFAULT_CACHED = false;\nexport const DEFAULT_SENDIT_MODE = false;\nexport const DEFAULT_INTERACTIVE_MODE = false;\nexport const DEFAULT_AMEND_MODE = false;\n// CRITICAL: Keep this low (3-5) to prevent log context contamination.\n// The LLM tends to pattern-match against recent commits instead of describing\n// the actual diff when it sees too much commit history. Set to 0 to disable.\nexport const DEFAULT_MESSAGE_LIMIT = 3;\nexport const DEFAULT_MAX_DIFF_BYTES = 20480; // 20KB limit per file\n\nexport const DEFAULT_MERGE_METHOD: MergeMethod = 'squash';\n\nexport const DEFAULT_EXCLUDED_PATTERNS = [\n 'node_modules', 'package-lock.json', 'yarn.lock', 'bun.lockb',\n 'composer.lock', 'Cargo.lock', 'Gemfile.lock',\n 'dist', 'build', 'out', '.next', '.nuxt', 'coverage',\n '.vscode', '.idea', '.DS_Store', '.git', '.gitignore',\n 'logs', 'tmp', '.cache', '*.log', '.env', '.env.*',\n '*.pem', '*.crt', '*.key', '*.sqlite', '*.db',\n '*.zip', '*.tar', '*.gz', '*.exe', '*.bin'\n];\n\nexport const COMMAND_COMMIT = 'commit';\nexport const COMMAND_AUDIO_COMMIT = 'audio-commit';\nexport const COMMAND_SELECT_AUDIO = 'select-audio';\nexport const COMMAND_RELEASE = 'release';\nexport const COMMAND_REVIEW = 'review';\nexport const COMMAND_AUDIO_REVIEW = 'audio-review';\nexport const COMMAND_PUBLISH = 'publish';\nexport const COMMAND_TREE = 'tree';\nexport const COMMAND_LINK = 'link';\nexport const COMMAND_UNLINK = 'unlink';\nexport const COMMAND_CLEAN = 'clean';\nexport const COMMAND_PRECOMMIT = 'precommit';\nexport const COMMAND_DEVELOPMENT = 'development';\nexport const COMMAND_VERSIONS = 'versions';\nexport const COMMAND_UPDATES = 'updates';\nexport const COMMAND_CHECK_CONFIG = 'check-config';\nexport const COMMAND_INIT_CONFIG = 'init-config';\n\nexport const ALLOWED_COMMANDS = [\n COMMAND_COMMIT,\n COMMAND_AUDIO_COMMIT,\n COMMAND_SELECT_AUDIO,\n COMMAND_RELEASE,\n COMMAND_REVIEW,\n COMMAND_AUDIO_REVIEW,\n COMMAND_PUBLISH,\n COMMAND_TREE,\n COMMAND_LINK,\n COMMAND_UNLINK,\n COMMAND_CLEAN,\n COMMAND_PRECOMMIT,\n COMMAND_DEVELOPMENT,\n COMMAND_VERSIONS,\n COMMAND_UPDATES\n];\n\nexport const DEFAULT_COMMAND = COMMAND_COMMIT;\n\nexport const DEFAULT_INSTRUCTIONS_DIR = `instructions`;\n\nexport const DEFAULT_PERSONA_DIR = `personas`;\n\nexport const DEFAULT_INSTRUCTIONS_COMMIT_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/commit.md`;\nexport const DEFAULT_INSTRUCTIONS_RELEASE_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/release.md`;\nexport const DEFAULT_INSTRUCTIONS_REVIEW_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/review.md`;\n\nexport const DEFAULT_PERSONA_RELEASER_FILE = `${DEFAULT_PERSONA_DIR}/releaser.md`;\nexport const DEFAULT_PERSONA_YOU_FILE = `${DEFAULT_PERSONA_DIR}/you.md`;\n\n// Default instructions for each persona\nexport const DEFAULT_INSTRUCTIONS_MAP = {\n [COMMAND_COMMIT]: DEFAULT_INSTRUCTIONS_COMMIT_FILE,\n [COMMAND_AUDIO_COMMIT]: DEFAULT_INSTRUCTIONS_COMMIT_FILE, // Reuse commit instructions\n [COMMAND_RELEASE]: DEFAULT_INSTRUCTIONS_RELEASE_FILE,\n [COMMAND_REVIEW]: DEFAULT_INSTRUCTIONS_REVIEW_FILE, // Reuse audio-review instructions for now\n [COMMAND_AUDIO_REVIEW]: DEFAULT_INSTRUCTIONS_REVIEW_FILE,\n};\n\n// Default personas for each command\nexport const DEFAULT_PERSONA_MAP = {\n [COMMAND_COMMIT]: DEFAULT_PERSONA_YOU_FILE,\n [COMMAND_AUDIO_COMMIT]: DEFAULT_PERSONA_YOU_FILE, // Use You persona\n [COMMAND_RELEASE]: DEFAULT_PERSONA_RELEASER_FILE,\n [COMMAND_REVIEW]: DEFAULT_PERSONA_YOU_FILE, // Use You persona\n [COMMAND_AUDIO_REVIEW]: DEFAULT_PERSONA_YOU_FILE,\n};\n\n// Used by child process to create paths\nexport const DEFAULT_PATH_SEPARATOR = '/';\n\n// Used by util/general for file filtering\nexport const DEFAULT_IGNORE_PATTERNS = [\n 'node_modules/**',\n '**/*.log',\n '.git/**',\n 'dist/**',\n 'build/**',\n 'coverage/**',\n 'output/**',\n '.DS_Store',\n '*.tmp',\n '*.cache',\n '**/.kodrdriv-*.json', // Internal kodrdriv cache and state files\n];\n\n// Used by util/storage for directory names\nexport const DEFAULT_DIRECTORY_PREFIX = '.kodrdriv';\n\n// Used by other commands but not exposed in CLI\nexport const INTERNAL_DEFAULT_OUTPUT_FILE = 'output.txt';\n\nexport const INTERNAL_DATETIME_FORMAT = 'YYYY-MM-DD_HH-mm-ss';\n\n// Define defaults in one place\nexport const KODRDRIV_DEFAULTS = {\n dryRun: DEFAULT_DRY_RUN,\n verbose: DEFAULT_VERBOSE,\n debug: DEFAULT_DEBUG,\n overrides: DEFAULT_OVERRIDES,\n model: DEFAULT_MODEL,\n openaiReasoning: DEFAULT_OPENAI_REASONING as 'low' | 'medium' | 'high',\n openaiMaxOutputTokens: DEFAULT_OPENAI_MAX_OUTPUT_TOKENS,\n contextDirectories: DEFAULT_CONTEXT_DIRECTORIES,\n commandName: DEFAULT_COMMAND,\n configDirectory: DEFAULT_CONFIG_DIR,\n outputDirectory: DEFAULT_OUTPUT_DIRECTORY,\n preferencesDirectory: DEFAULT_PREFERENCES_DIRECTORY,\n commit: {\n add: DEFAULT_ADD,\n cached: DEFAULT_CACHED,\n sendit: DEFAULT_SENDIT_MODE,\n interactive: DEFAULT_INTERACTIVE_MODE,\n amend: DEFAULT_AMEND_MODE,\n messageLimit: DEFAULT_MESSAGE_LIMIT,\n skipFileCheck: false,\n maxDiffBytes: DEFAULT_MAX_DIFF_BYTES,\n contextFiles: undefined,\n openaiReasoning: DEFAULT_OPENAI_REASONING as 'low' | 'medium' | 'high',\n openaiMaxOutputTokens: DEFAULT_OPENAI_MAX_OUTPUT_TOKENS,\n },\n release: {\n from: DEFAULT_FROM_COMMIT_ALIAS,\n to: DEFAULT_TO_COMMIT_ALIAS,\n messageLimit: DEFAULT_MESSAGE_LIMIT,\n interactive: DEFAULT_INTERACTIVE_MODE,\n maxDiffBytes: DEFAULT_MAX_DIFF_BYTES,\n contextFiles: undefined,\n noMilestones: false,\n openaiReasoning: DEFAULT_OPENAI_REASONING as 'low' | 'medium' | 'high',\n openaiMaxOutputTokens: DEFAULT_OPENAI_MAX_OUTPUT_TOKENS,\n },\n audioCommit: {\n maxRecordingTime: 300, // 5 minutes default\n audioDevice: undefined, // Auto-detect by default\n openaiReasoning: DEFAULT_OPENAI_REASONING as 'low' | 'medium' | 'high',\n openaiMaxOutputTokens: DEFAULT_OPENAI_MAX_OUTPUT_TOKENS,\n },\n review: {\n includeCommitHistory: true,\n includeRecentDiffs: true,\n includeReleaseNotes: false,\n includeGithubIssues: true,\n commitHistoryLimit: 10,\n diffHistoryLimit: 5,\n releaseNotesLimit: 3,\n githubIssuesLimit: 20,\n sendit: DEFAULT_SENDIT_MODE,\n openaiReasoning: DEFAULT_OPENAI_REASONING as 'low' | 'medium' | 'high',\n openaiMaxOutputTokens: DEFAULT_OPENAI_MAX_OUTPUT_TOKENS,\n },\n audioReview: {\n includeCommitHistory: true,\n includeRecentDiffs: true,\n includeReleaseNotes: false,\n includeGithubIssues: true,\n commitHistoryLimit: 10,\n diffHistoryLimit: 5,\n releaseNotesLimit: 3,\n githubIssuesLimit: 20,\n sendit: DEFAULT_SENDIT_MODE,\n maxRecordingTime: 300, // 5 minutes default\n audioDevice: undefined, // Auto-detect by default\n directory: undefined, // No default directory\n openaiReasoning: DEFAULT_OPENAI_REASONING as 'low' | 'medium' | 'high',\n openaiMaxOutputTokens: DEFAULT_OPENAI_MAX_OUTPUT_TOKENS,\n },\n publish: {\n mergeMethod: DEFAULT_MERGE_METHOD,\n from: DEFAULT_FROM_COMMIT_ALIAS,\n targetVersion: 'patch',\n interactive: DEFAULT_INTERACTIVE_MODE,\n requiredEnvVars: ['GITHUB_TOKEN', 'OPENAI_API_KEY'],\n linkWorkspacePackages: true,\n unlinkWorkspacePackages: true,\n sendit: DEFAULT_SENDIT_MODE,\n targetBranch: 'main',\n noMilestones: false,\n checksTimeout: 3600000, // 1 hour default for PR checks\n releaseWorkflowsTimeout: 1800000, // 30 minutes default for release workflows\n },\n link: {\n scopeRoots: {},\n dryRun: false,\n packageArgument: undefined,\n externals: [],\n },\n unlink: {\n scopeRoots: {},\n workspaceFile: undefined,\n dryRun: false,\n cleanNodeModules: false,\n packageArgument: undefined,\n externals: [],\n },\n tree: {\n directories: undefined,\n exclude: undefined,\n startFrom: undefined,\n stopAt: undefined,\n cmd: undefined,\n\n builtInCommand: undefined,\n continue: false,\n packageArgument: undefined,\n cleanNodeModules: false,\n externals: [],\n },\n development: {\n targetVersion: 'patch',\n noMilestones: false,\n },\n versions: {\n subcommand: undefined,\n directories: undefined,\n },\n updates: {\n scope: undefined,\n directories: undefined,\n },\n excludedPatterns: DEFAULT_EXCLUDED_PATTERNS,\n branches: {\n working: {\n targetBranch: 'main',\n developmentBranch: true,\n version: {\n type: 'prerelease' as const,\n increment: true,\n incrementLevel: 'patch' as const,\n tag: 'dev'\n }\n },\n main: {\n version: {\n type: 'release' as const\n }\n }\n }\n};\n"],"names":["VERSION","PROGRAM_NAME","DEFAULT_OVERRIDES","DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS","DEFAULT_VERBOSE","DEFAULT_DRY_RUN","DEFAULT_DEBUG","DEFAULT_MODEL","DEFAULT_OPENAI_REASONING","DEFAULT_OPENAI_MAX_OUTPUT_TOKENS","DEFAULT_OUTPUT_DIRECTORY","DEFAULT_CONTEXT_DIRECTORIES","DEFAULT_CONFIG_DIR","DEFAULT_PREFERENCES_DIRECTORY","path","join","os","homedir","DEFAULT_FROM_COMMIT_ALIAS","DEFAULT_TO_COMMIT_ALIAS","DEFAULT_ADD","DEFAULT_CACHED","DEFAULT_SENDIT_MODE","DEFAULT_INTERACTIVE_MODE","DEFAULT_AMEND_MODE","DEFAULT_MESSAGE_LIMIT","DEFAULT_MAX_DIFF_BYTES","DEFAULT_MERGE_METHOD","DEFAULT_EXCLUDED_PATTERNS","COMMAND_COMMIT","COMMAND_AUDIO_COMMIT","COMMAND_SELECT_AUDIO","COMMAND_RELEASE","COMMAND_REVIEW","COMMAND_AUDIO_REVIEW","COMMAND_PUBLISH","COMMAND_TREE","COMMAND_LINK","COMMAND_UNLINK","COMMAND_CLEAN","COMMAND_PRECOMMIT","COMMAND_DEVELOPMENT","COMMAND_VERSIONS","COMMAND_UPDATES","COMMAND_CHECK_CONFIG","COMMAND_INIT_CONFIG","ALLOWED_COMMANDS","DEFAULT_COMMAND","KODRDRIV_DEFAULTS","dryRun","verbose","debug","overrides","model","openaiReasoning","openaiMaxOutputTokens","contextDirectories","commandName","configDirectory","outputDirectory","preferencesDirectory","commit","add","cached","sendit","interactive","amend","messageLimit","skipFileCheck","maxDiffBytes","contextFiles","undefined","release","from","to","noMilestones","audioCommit","maxRecordingTime","audioDevice","review","includeCommitHistory","includeRecentDiffs","includeReleaseNotes","includeGithubIssues","commitHistoryLimit","diffHistoryLimit","releaseNotesLimit","githubIssuesLimit","audioReview","directory","publish","mergeMethod","targetVersion","requiredEnvVars","linkWorkspacePackages","unlinkWorkspacePackages","targetBranch","checksTimeout","releaseWorkflowsTimeout","link","scopeRoots","packageArgument","externals","unlink","workspaceFile","cleanNodeModules","tree","directories","exclude","startFrom","stopAt","cmd","builtInCommand","continue","development","versions","subcommand","updates","scope","excludedPatterns","branches","working","developmentBranch","version","type","increment","incrementLevel","tag","main"],"mappings":"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"}
1
+ {"version":3,"file":"constants.js","sources":["../src/constants.ts"],"sourcesContent":["import { MergeMethod } from './types';\nimport os from 'os';\nimport path from 'path';\n\nexport const VERSION = '__VERSION__ (__GIT_BRANCH__/__GIT_COMMIT__ __GIT_TAGS__ __GIT_COMMIT_DATE__) __SYSTEM_INFO__';\nexport const BUILD_HOSTNAME = '__BUILD_HOSTNAME__';\nexport const BUILD_TIMESTAMP = '__BUILD_TIMESTAMP__';\nexport const PROGRAM_NAME = 'kodrdriv';\nexport const DEFAULT_CHARACTER_ENCODING = 'utf-8';\nexport const DEFAULT_BINARY_TO_TEXT_ENCODING = 'base64';\nexport const DEFAULT_DIFF = true;\nexport const DEFAULT_LOG = false;\nexport const DEFAULT_OVERRIDES = false;\nexport const DATE_FORMAT_MONTH_DAY = 'MM-DD';\nexport const DATE_FORMAT_YEAR = 'YYYY';\nexport const DATE_FORMAT_YEAR_MONTH = 'YYYY-MM';\nexport const DATE_FORMAT_YEAR_MONTH_DAY = 'YYYY-MM-DD';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_SLASH = 'YYYY/MM/DD';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES = 'YYYY-MM-DD-HHmm';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS = 'YYYY-MM-DD-HHmmss';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS = 'YYYY-MM-DD-HHmmss.SSS';\nexport const DATE_FORMAT_SHORT_TIMESTAMP = 'YYMMdd-HHmm';\nexport const DATE_FORMAT_MONTH = 'MM';\nexport const DATE_FORMAT_DAY = 'DD';\nexport const DATE_FORMAT_HOURS = 'HHmm';\nexport const DATE_FORMAT_MINUTES = 'mm';\nexport const DATE_FORMAT_SECONDS = 'ss';\nexport const DATE_FORMAT_MILLISECONDS = 'SSS';\nexport const DEFAULT_VERBOSE = false;\nexport const DEFAULT_DRY_RUN = false;\nexport const DEFAULT_DEBUG = false;\nexport const DEFAULT_MODEL = 'gpt-4o-mini';\nexport const DEFAULT_MODEL_STRONG = 'gpt-4o';\nexport const DEFAULT_OPENAI_REASONING = 'low';\nexport const DEFAULT_OPENAI_MAX_OUTPUT_TOKENS = 10000;\nexport const DEFAULT_OUTPUT_DIRECTORY = 'output/kodrdriv';\n\n// Buffer size for git commands that may produce large output (like git log)\nexport const DEFAULT_GIT_COMMAND_MAX_BUFFER = 50 * 1024 * 1024; // 50MB\n\nexport const DEFAULT_CONTEXT_DIRECTORIES: string[] = [];\n\nexport const DEFAULT_CONFIG_DIR = '.kodrdriv';\nexport const DEFAULT_PREFERENCES_DIRECTORY = path.join(os.homedir(), '.kodrdriv');\n\nexport const DEFAULT_FROM_COMMIT_ALIAS = 'main';\nexport const DEFAULT_TO_COMMIT_ALIAS = 'HEAD';\n\nexport const DEFAULT_ADD = false;\nexport const DEFAULT_CACHED = false;\nexport const DEFAULT_SENDIT_MODE = false;\nexport const DEFAULT_INTERACTIVE_MODE = false;\nexport const DEFAULT_AMEND_MODE = false;\n// CRITICAL: Keep this low (3-5) to prevent log context contamination.\n// The LLM tends to pattern-match against recent commits instead of describing\n// the actual diff when it sees too much commit history. Set to 0 to disable.\nexport const DEFAULT_MESSAGE_LIMIT = 3;\nexport const DEFAULT_MAX_DIFF_BYTES = 20480; // 20KB limit per file\n\nexport const DEFAULT_MERGE_METHOD: MergeMethod = 'squash';\n\nexport const DEFAULT_EXCLUDED_PATTERNS = [\n 'node_modules', 'package-lock.json', 'yarn.lock', 'bun.lockb',\n 'composer.lock', 'Cargo.lock', 'Gemfile.lock',\n 'dist', 'build', 'out', '.next', '.nuxt', 'coverage',\n '.vscode', '.idea', '.DS_Store', '.git', '.gitignore',\n 'logs', 'tmp', '.cache', '*.log', '.env', '.env.*',\n '*.pem', '*.crt', '*.key', '*.sqlite', '*.db',\n '*.zip', '*.tar', '*.gz', '*.exe', '*.bin'\n];\n\nexport const COMMAND_COMMIT = 'commit';\nexport const COMMAND_AUDIO_COMMIT = 'audio-commit';\nexport const COMMAND_SELECT_AUDIO = 'select-audio';\nexport const COMMAND_RELEASE = 'release';\nexport const COMMAND_REVIEW = 'review';\nexport const COMMAND_AUDIO_REVIEW = 'audio-review';\nexport const COMMAND_PUBLISH = 'publish';\nexport const COMMAND_TREE = 'tree';\nexport const COMMAND_LINK = 'link';\nexport const COMMAND_UNLINK = 'unlink';\nexport const COMMAND_CLEAN = 'clean';\nexport const COMMAND_PULL = 'pull';\nexport const COMMAND_PRECOMMIT = 'precommit';\nexport const COMMAND_DEVELOPMENT = 'development';\nexport const COMMAND_VERSIONS = 'versions';\nexport const COMMAND_UPDATES = 'updates';\nexport const COMMAND_CHECK_CONFIG = 'check-config';\nexport const COMMAND_INIT_CONFIG = 'init-config';\n\nexport const ALLOWED_COMMANDS = [\n COMMAND_COMMIT,\n COMMAND_AUDIO_COMMIT,\n COMMAND_SELECT_AUDIO,\n COMMAND_RELEASE,\n COMMAND_REVIEW,\n COMMAND_AUDIO_REVIEW,\n COMMAND_PUBLISH,\n COMMAND_TREE,\n COMMAND_LINK,\n COMMAND_UNLINK,\n COMMAND_CLEAN,\n COMMAND_PULL,\n COMMAND_PRECOMMIT,\n COMMAND_DEVELOPMENT,\n COMMAND_VERSIONS,\n COMMAND_UPDATES\n];\n\nexport const DEFAULT_COMMAND = COMMAND_COMMIT;\n\nexport const DEFAULT_INSTRUCTIONS_DIR = `instructions`;\n\nexport const DEFAULT_PERSONA_DIR = `personas`;\n\nexport const DEFAULT_INSTRUCTIONS_COMMIT_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/commit.md`;\nexport const DEFAULT_INSTRUCTIONS_RELEASE_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/release.md`;\nexport const DEFAULT_INSTRUCTIONS_REVIEW_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/review.md`;\n\nexport const DEFAULT_PERSONA_RELEASER_FILE = `${DEFAULT_PERSONA_DIR}/releaser.md`;\nexport const DEFAULT_PERSONA_YOU_FILE = `${DEFAULT_PERSONA_DIR}/you.md`;\n\n// Default instructions for each persona\nexport const DEFAULT_INSTRUCTIONS_MAP = {\n [COMMAND_COMMIT]: DEFAULT_INSTRUCTIONS_COMMIT_FILE,\n [COMMAND_AUDIO_COMMIT]: DEFAULT_INSTRUCTIONS_COMMIT_FILE, // Reuse commit instructions\n [COMMAND_RELEASE]: DEFAULT_INSTRUCTIONS_RELEASE_FILE,\n [COMMAND_REVIEW]: DEFAULT_INSTRUCTIONS_REVIEW_FILE, // Reuse audio-review instructions for now\n [COMMAND_AUDIO_REVIEW]: DEFAULT_INSTRUCTIONS_REVIEW_FILE,\n};\n\n// Default personas for each command\nexport const DEFAULT_PERSONA_MAP = {\n [COMMAND_COMMIT]: DEFAULT_PERSONA_YOU_FILE,\n [COMMAND_AUDIO_COMMIT]: DEFAULT_PERSONA_YOU_FILE, // Use You persona\n [COMMAND_RELEASE]: DEFAULT_PERSONA_RELEASER_FILE,\n [COMMAND_REVIEW]: DEFAULT_PERSONA_YOU_FILE, // Use You persona\n [COMMAND_AUDIO_REVIEW]: DEFAULT_PERSONA_YOU_FILE,\n};\n\n// Used by child process to create paths\nexport const DEFAULT_PATH_SEPARATOR = '/';\n\n// Used by util/general for file filtering\nexport const DEFAULT_IGNORE_PATTERNS = [\n 'node_modules/**',\n '**/*.log',\n '.git/**',\n 'dist/**',\n 'build/**',\n 'coverage/**',\n 'output/**',\n '.DS_Store',\n '*.tmp',\n '*.cache',\n '**/.kodrdriv-*.json', // Internal kodrdriv cache and state files\n];\n\n// Used by util/storage for directory names\nexport const DEFAULT_DIRECTORY_PREFIX = '.kodrdriv';\n\n// Used by other commands but not exposed in CLI\nexport const INTERNAL_DEFAULT_OUTPUT_FILE = 'output.txt';\n\nexport const INTERNAL_DATETIME_FORMAT = 'YYYY-MM-DD_HH-mm-ss';\n\n// Define defaults in one place\nexport const KODRDRIV_DEFAULTS = {\n dryRun: DEFAULT_DRY_RUN,\n verbose: DEFAULT_VERBOSE,\n debug: DEFAULT_DEBUG,\n overrides: DEFAULT_OVERRIDES,\n model: DEFAULT_MODEL,\n openaiReasoning: DEFAULT_OPENAI_REASONING as 'low' | 'medium' | 'high',\n openaiMaxOutputTokens: DEFAULT_OPENAI_MAX_OUTPUT_TOKENS,\n contextDirectories: DEFAULT_CONTEXT_DIRECTORIES,\n commandName: DEFAULT_COMMAND,\n configDirectory: DEFAULT_CONFIG_DIR,\n outputDirectory: DEFAULT_OUTPUT_DIRECTORY,\n preferencesDirectory: DEFAULT_PREFERENCES_DIRECTORY,\n commit: {\n add: DEFAULT_ADD,\n cached: DEFAULT_CACHED,\n sendit: DEFAULT_SENDIT_MODE,\n interactive: DEFAULT_INTERACTIVE_MODE,\n amend: DEFAULT_AMEND_MODE,\n messageLimit: DEFAULT_MESSAGE_LIMIT,\n skipFileCheck: false,\n maxDiffBytes: DEFAULT_MAX_DIFF_BYTES,\n contextFiles: undefined,\n openaiReasoning: DEFAULT_OPENAI_REASONING as 'low' | 'medium' | 'high',\n openaiMaxOutputTokens: DEFAULT_OPENAI_MAX_OUTPUT_TOKENS,\n },\n release: {\n from: DEFAULT_FROM_COMMIT_ALIAS,\n to: DEFAULT_TO_COMMIT_ALIAS,\n messageLimit: DEFAULT_MESSAGE_LIMIT,\n interactive: DEFAULT_INTERACTIVE_MODE,\n maxDiffBytes: DEFAULT_MAX_DIFF_BYTES,\n contextFiles: undefined,\n noMilestones: false,\n openaiReasoning: DEFAULT_OPENAI_REASONING as 'low' | 'medium' | 'high',\n openaiMaxOutputTokens: DEFAULT_OPENAI_MAX_OUTPUT_TOKENS,\n },\n audioCommit: {\n maxRecordingTime: 300, // 5 minutes default\n audioDevice: undefined, // Auto-detect by default\n openaiReasoning: DEFAULT_OPENAI_REASONING as 'low' | 'medium' | 'high',\n openaiMaxOutputTokens: DEFAULT_OPENAI_MAX_OUTPUT_TOKENS,\n },\n review: {\n includeCommitHistory: true,\n includeRecentDiffs: true,\n includeReleaseNotes: false,\n includeGithubIssues: true,\n commitHistoryLimit: 10,\n diffHistoryLimit: 5,\n releaseNotesLimit: 3,\n githubIssuesLimit: 20,\n sendit: DEFAULT_SENDIT_MODE,\n openaiReasoning: DEFAULT_OPENAI_REASONING as 'low' | 'medium' | 'high',\n openaiMaxOutputTokens: DEFAULT_OPENAI_MAX_OUTPUT_TOKENS,\n },\n audioReview: {\n includeCommitHistory: true,\n includeRecentDiffs: true,\n includeReleaseNotes: false,\n includeGithubIssues: true,\n commitHistoryLimit: 10,\n diffHistoryLimit: 5,\n releaseNotesLimit: 3,\n githubIssuesLimit: 20,\n sendit: DEFAULT_SENDIT_MODE,\n maxRecordingTime: 300, // 5 minutes default\n audioDevice: undefined, // Auto-detect by default\n directory: undefined, // No default directory\n openaiReasoning: DEFAULT_OPENAI_REASONING as 'low' | 'medium' | 'high',\n openaiMaxOutputTokens: DEFAULT_OPENAI_MAX_OUTPUT_TOKENS,\n },\n publish: {\n mergeMethod: DEFAULT_MERGE_METHOD,\n from: DEFAULT_FROM_COMMIT_ALIAS,\n targetVersion: 'patch',\n interactive: DEFAULT_INTERACTIVE_MODE,\n requiredEnvVars: ['GITHUB_TOKEN', 'OPENAI_API_KEY'],\n linkWorkspacePackages: true,\n unlinkWorkspacePackages: true,\n sendit: DEFAULT_SENDIT_MODE,\n targetBranch: 'main',\n noMilestones: false,\n checksTimeout: 3600000, // 1 hour default for PR checks\n releaseWorkflowsTimeout: 1800000, // 30 minutes default for release workflows\n },\n link: {\n scopeRoots: {},\n dryRun: false,\n packageArgument: undefined,\n externals: [],\n },\n unlink: {\n scopeRoots: {},\n workspaceFile: undefined,\n dryRun: false,\n cleanNodeModules: false,\n packageArgument: undefined,\n externals: [],\n },\n tree: {\n directories: undefined,\n exclude: undefined,\n startFrom: undefined,\n stopAt: undefined,\n cmd: undefined,\n\n builtInCommand: undefined,\n continue: false,\n packageArgument: undefined,\n cleanNodeModules: false,\n externals: [],\n },\n development: {\n targetVersion: 'patch',\n noMilestones: false,\n },\n versions: {\n subcommand: undefined,\n directories: undefined,\n },\n updates: {\n scope: undefined,\n directories: undefined,\n },\n excludedPatterns: DEFAULT_EXCLUDED_PATTERNS,\n branches: {\n working: {\n targetBranch: 'main',\n developmentBranch: true,\n version: {\n type: 'prerelease' as const,\n increment: true,\n incrementLevel: 'patch' as const,\n tag: 'dev'\n }\n },\n main: {\n version: {\n type: 'release' as const\n }\n }\n }\n};\n"],"names":["VERSION","BUILD_HOSTNAME","BUILD_TIMESTAMP","PROGRAM_NAME","DEFAULT_OVERRIDES","DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS","DEFAULT_VERBOSE","DEFAULT_DRY_RUN","DEFAULT_DEBUG","DEFAULT_MODEL","DEFAULT_OPENAI_REASONING","DEFAULT_OPENAI_MAX_OUTPUT_TOKENS","DEFAULT_OUTPUT_DIRECTORY","DEFAULT_CONTEXT_DIRECTORIES","DEFAULT_CONFIG_DIR","DEFAULT_PREFERENCES_DIRECTORY","path","join","os","homedir","DEFAULT_FROM_COMMIT_ALIAS","DEFAULT_TO_COMMIT_ALIAS","DEFAULT_ADD","DEFAULT_CACHED","DEFAULT_SENDIT_MODE","DEFAULT_INTERACTIVE_MODE","DEFAULT_AMEND_MODE","DEFAULT_MESSAGE_LIMIT","DEFAULT_MAX_DIFF_BYTES","DEFAULT_MERGE_METHOD","DEFAULT_EXCLUDED_PATTERNS","COMMAND_COMMIT","COMMAND_AUDIO_COMMIT","COMMAND_SELECT_AUDIO","COMMAND_RELEASE","COMMAND_REVIEW","COMMAND_AUDIO_REVIEW","COMMAND_PUBLISH","COMMAND_TREE","COMMAND_LINK","COMMAND_UNLINK","COMMAND_CLEAN","COMMAND_PULL","COMMAND_PRECOMMIT","COMMAND_DEVELOPMENT","COMMAND_VERSIONS","COMMAND_UPDATES","COMMAND_CHECK_CONFIG","COMMAND_INIT_CONFIG","ALLOWED_COMMANDS","DEFAULT_COMMAND","KODRDRIV_DEFAULTS","dryRun","verbose","debug","overrides","model","openaiReasoning","openaiMaxOutputTokens","contextDirectories","commandName","configDirectory","outputDirectory","preferencesDirectory","commit","add","cached","sendit","interactive","amend","messageLimit","skipFileCheck","maxDiffBytes","contextFiles","undefined","release","from","to","noMilestones","audioCommit","maxRecordingTime","audioDevice","review","includeCommitHistory","includeRecentDiffs","includeReleaseNotes","includeGithubIssues","commitHistoryLimit","diffHistoryLimit","releaseNotesLimit","githubIssuesLimit","audioReview","directory","publish","mergeMethod","targetVersion","requiredEnvVars","linkWorkspacePackages","unlinkWorkspacePackages","targetBranch","checksTimeout","releaseWorkflowsTimeout","link","scopeRoots","packageArgument","externals","unlink","workspaceFile","cleanNodeModules","tree","directories","exclude","startFrom","stopAt","cmd","builtInCommand","continue","development","versions","subcommand","updates","scope","excludedPatterns","branches","working","developmentBranch","version","type","increment","incrementLevel","tag","main"],"mappings":"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"}
package/dist/logging.js CHANGED
@@ -25,69 +25,41 @@ const generateDebugLogFilename = ()=>{
25
25
  };
26
26
  const createTransports = (level)=>{
27
27
  const transports = [];
28
- // Always add console transport for info level and above
29
- if (level === 'info') {
30
- transports.push(new winston.transports.Console({
31
- format: winston.format.combine(winston.format.colorize(), winston.format.printf(({ level, message, dryRun })=>{
32
- const dryRunPrefix = dryRun ? '🔍 DRY RUN: ' : '';
33
- // For info level messages, don't show the level prefix
34
- if (level.includes('info')) {
35
- return `${dryRunPrefix}${String(message)}`;
36
- }
37
- // For warn, error, etc., show the level prefix
38
- return `${level}: ${dryRunPrefix}${String(message)}`;
39
- }))
40
- }));
41
- } else {
42
- // For debug/verbose levels, add console transport that shows info and above
43
- transports.push(new winston.transports.Console({
44
- level: 'info',
45
- format: winston.format.combine(winston.format.colorize(), winston.format.printf(({ timestamp, level, message, dryRun, ...meta })=>{
46
- // For info level messages, use simpler format without timestamp
47
- if (level.includes('info')) {
28
+ // When running as MCP server, NEVER add console transports as they interfere with the protocol
29
+ // All output must go through log capture mechanism instead
30
+ const isMcpServer = process.env.KODRDRIV_MCP_SERVER === 'true';
31
+ if (!isMcpServer) {
32
+ // Always add console transport for info level and above (only when NOT in MCP mode)
33
+ if (level === 'info') {
34
+ transports.push(new winston.transports.Console({
35
+ format: winston.format.combine(winston.format.colorize(), winston.format.printf(({ level, message, dryRun })=>{
48
36
  const dryRunPrefix = dryRun ? '🔍 DRY RUN: ' : '';
49
- return `${dryRunPrefix}${String(message)}`;
50
- }
51
- // Filter out winston internal metadata
52
- const filteredMeta = Object.keys(meta).reduce((acc, key)=>{
53
- if (![
54
- 'level',
55
- 'message',
56
- 'timestamp',
57
- 'dryRun',
58
- 'service',
59
- 'splat',
60
- 'Symbol(level)',
61
- 'Symbol(message)'
62
- ].includes(key)) {
63
- acc[key] = meta[key];
37
+ // For info level messages, don't show the level prefix
38
+ if (level.includes('info')) {
39
+ return `${dryRunPrefix}${String(message)}`;
64
40
  }
65
- return acc;
66
- }, {});
67
- const metaStr = Object.keys(filteredMeta).length ? ` ${JSON.stringify(filteredMeta, null, 2)}` : '';
68
- const dryRunPrefix = dryRun ? '🔍 DRY RUN: ' : '';
69
- return `${timestamp} ${level}: ${dryRunPrefix}${String(message)}${metaStr}`;
70
- }))
71
- }));
72
- // Add file transport for debug levels (debug and silly)
73
- if (level === 'debug' || level === 'silly') {
74
- ensureDebugDirectory();
75
- const debugLogPath = path.join(DEFAULT_OUTPUT_DIRECTORY, 'debug', generateDebugLogFilename());
76
- transports.push(new winston.transports.File({
77
- filename: debugLogPath,
78
- level: 'debug',
79
- format: winston.format.combine(winston.format.timestamp({
80
- format: DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS
81
- }), winston.format.errors({
82
- stack: true
83
- }), winston.format.splat(), winston.format.printf(({ timestamp, level, message, service, ...meta })=>{
84
- // Filter out winston internal metadata and properly format remaining meta
41
+ // For warn, error, etc., show the level prefix
42
+ return `${level}: ${dryRunPrefix}${String(message)}`;
43
+ }))
44
+ }));
45
+ } else {
46
+ // For debug/verbose levels, add console transport that shows info and above
47
+ transports.push(new winston.transports.Console({
48
+ level: 'info',
49
+ format: winston.format.combine(winston.format.colorize(), winston.format.printf(({ timestamp, level, message, dryRun, ...meta })=>{
50
+ // For info level messages, use simpler format without timestamp
51
+ if (level.includes('info')) {
52
+ const dryRunPrefix = dryRun ? '🔍 DRY RUN: ' : '';
53
+ return `${dryRunPrefix}${String(message)}`;
54
+ }
55
+ // Filter out winston internal metadata
85
56
  const filteredMeta = Object.keys(meta).reduce((acc, key)=>{
86
- // Skip internal winston fields
87
57
  if (![
88
58
  'level',
89
59
  'message',
90
60
  'timestamp',
61
+ 'dryRun',
62
+ 'service',
91
63
  'splat',
92
64
  'Symbol(level)',
93
65
  'Symbol(message)'
@@ -97,12 +69,45 @@ const createTransports = (level)=>{
97
69
  return acc;
98
70
  }, {});
99
71
  const metaStr = Object.keys(filteredMeta).length ? ` ${JSON.stringify(filteredMeta, null, 2)}` : '';
100
- const serviceStr = service ? ` [${service}]` : '';
101
- return `${timestamp}${serviceStr} ${level}: ${message}${metaStr}`;
72
+ const dryRunPrefix = dryRun ? '🔍 DRY RUN: ' : '';
73
+ return `${timestamp} ${level}: ${dryRunPrefix}${String(message)}${metaStr}`;
102
74
  }))
103
75
  }));
104
76
  }
105
77
  }
78
+ // Add file transport for debug levels (debug and silly)
79
+ if (level === 'debug' || level === 'silly') {
80
+ ensureDebugDirectory();
81
+ const debugLogPath = path.join(DEFAULT_OUTPUT_DIRECTORY, 'debug', generateDebugLogFilename());
82
+ transports.push(new winston.transports.File({
83
+ filename: debugLogPath,
84
+ level: 'debug',
85
+ format: winston.format.combine(winston.format.timestamp({
86
+ format: DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS
87
+ }), winston.format.errors({
88
+ stack: true
89
+ }), winston.format.splat(), winston.format.printf(({ timestamp, level, message, service, ...meta })=>{
90
+ // Filter out winston internal metadata and properly format remaining meta
91
+ const filteredMeta = Object.keys(meta).reduce((acc, key)=>{
92
+ // Skip internal winston fields
93
+ if (![
94
+ 'level',
95
+ 'message',
96
+ 'timestamp',
97
+ 'splat',
98
+ 'Symbol(level)',
99
+ 'Symbol(message)'
100
+ ].includes(key)) {
101
+ acc[key] = meta[key];
102
+ }
103
+ return acc;
104
+ }, {});
105
+ const metaStr = Object.keys(filteredMeta).length ? ` ${JSON.stringify(filteredMeta, null, 2)}` : '';
106
+ const serviceStr = service ? ` [${service}]` : '';
107
+ return `${timestamp}${serviceStr} ${level}: ${message}${metaStr}`;
108
+ }))
109
+ }));
110
+ }
106
111
  return transports;
107
112
  };
108
113
  const createFormat = (level)=>{
@@ -1 +1 @@
1
- {"version":3,"file":"logging.js","sources":["../src/logging.ts"],"sourcesContent":["import winston from 'winston';\n// eslint-disable-next-line no-restricted-imports\nimport * as fs from 'fs';\nimport path from 'path';\nimport { DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS, PROGRAM_NAME, DEFAULT_OUTPUT_DIRECTORY } from './constants';\n\nexport interface LogContext {\n [key: string]: any;\n}\n\n// Track if debug directory has been ensured for this session\nlet debugDirectoryEnsured = false;\n\nconst ensureDebugDirectory = () => {\n if (debugDirectoryEnsured) return;\n\n const debugDir = path.join(DEFAULT_OUTPUT_DIRECTORY, 'debug');\n\n try {\n fs.mkdirSync(debugDir, { recursive: true });\n debugDirectoryEnsured = true;\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(`Failed to create debug directory ${debugDir}:`, error);\n }\n};\n\nconst generateDebugLogFilename = () => {\n const now = new Date();\n const timestamp = now.toISOString()\n .replace(/[-:]/g, '')\n .replace(/\\./g, '')\n .replace('T', '-')\n .replace('Z', '');\n\n return `${timestamp}-debug.log`;\n};\n\nconst createTransports = (level: string) => {\n const transports: winston.transport[] = [];\n\n // Always add console transport for info level and above\n if (level === 'info') {\n transports.push(\n new winston.transports.Console({\n format: winston.format.combine(\n winston.format.colorize(),\n winston.format.printf(({ level, message, dryRun }): string => {\n const dryRunPrefix = dryRun ? '🔍 DRY RUN: ' : '';\n // For info level messages, don't show the level prefix\n if (level.includes('info')) {\n return `${dryRunPrefix}${String(message)}`;\n }\n // For warn, error, etc., show the level prefix\n return `${level}: ${dryRunPrefix}${String(message)}`;\n })\n )\n })\n );\n } else {\n // For debug/verbose levels, add console transport that shows info and above\n transports.push(\n new winston.transports.Console({\n level: 'info', // Show info, warn, and error on console\n format: winston.format.combine(\n winston.format.colorize(),\n winston.format.printf(({ timestamp, level, message, dryRun, ...meta }): string => {\n // For info level messages, use simpler format without timestamp\n if (level.includes('info')) {\n const dryRunPrefix = dryRun ? '🔍 DRY RUN: ' : '';\n return `${dryRunPrefix}${String(message)}`;\n }\n\n // Filter out winston internal metadata\n const filteredMeta = Object.keys(meta).reduce((acc, key) => {\n if (!['level', 'message', 'timestamp', 'dryRun', 'service', 'splat', 'Symbol(level)', 'Symbol(message)'].includes(key)) {\n acc[key] = meta[key];\n }\n return acc;\n }, {} as Record<string, any>);\n\n const metaStr = Object.keys(filteredMeta).length ? ` ${JSON.stringify(filteredMeta, null, 2)}` : '';\n const dryRunPrefix = dryRun ? '🔍 DRY RUN: ' : '';\n return `${timestamp} ${level}: ${dryRunPrefix}${String(message)}${metaStr}`;\n })\n )\n })\n );\n\n // Add file transport for debug levels (debug and silly)\n if (level === 'debug' || level === 'silly') {\n ensureDebugDirectory();\n\n const debugLogPath = path.join(DEFAULT_OUTPUT_DIRECTORY, 'debug', generateDebugLogFilename());\n\n transports.push(\n new winston.transports.File({\n filename: debugLogPath,\n level: 'debug', // Capture debug and above in the file\n format: winston.format.combine(\n winston.format.timestamp({ format: DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS }),\n winston.format.errors({ stack: true }),\n winston.format.splat(),\n winston.format.printf(({ timestamp, level, message, service, ...meta }) => {\n // Filter out winston internal metadata and properly format remaining meta\n const filteredMeta = Object.keys(meta).reduce((acc, key) => {\n // Skip internal winston fields\n if (!['level', 'message', 'timestamp', 'splat', 'Symbol(level)', 'Symbol(message)'].includes(key)) {\n acc[key] = meta[key];\n }\n return acc;\n }, {} as Record<string, any>);\n\n const metaStr = Object.keys(filteredMeta).length\n ? ` ${JSON.stringify(filteredMeta, null, 2)}`\n : '';\n const serviceStr = service ? ` [${service}]` : '';\n return `${timestamp}${serviceStr} ${level}: ${message}${metaStr}`;\n })\n )\n })\n );\n }\n }\n\n return transports;\n};\n\nconst createFormat = (level: string) => {\n const baseFormats = [\n winston.format.errors({ stack: true }),\n winston.format.splat(),\n ];\n\n if (level === 'info') {\n return winston.format.combine(\n ...baseFormats,\n winston.format.printf(({ message, dryRun, ..._meta }): string => {\n // Auto-format dry-run messages\n if (dryRun) {\n return `🔍 DRY RUN: ${message}`;\n }\n return String(message);\n })\n );\n }\n\n return winston.format.combine(\n winston.format.timestamp({ format: DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS }),\n ...baseFormats,\n winston.format.printf(({ timestamp, level, message, dryRun, ...meta }): string => {\n // Filter out winston internal metadata\n const filteredMeta = Object.keys(meta).reduce((acc, key) => {\n if (!['level', 'message', 'timestamp', 'dryRun', 'service', 'splat', 'Symbol(level)', 'Symbol(message)'].includes(key)) {\n acc[key] = meta[key];\n }\n return acc;\n }, {} as Record<string, any>);\n\n const metaStr = Object.keys(filteredMeta).length ? ` ${JSON.stringify(filteredMeta, null, 2)}` : '';\n const dryRunPrefix = dryRun ? '🔍 DRY RUN: ' : '';\n return `${timestamp} ${level}: ${dryRunPrefix}${String(message)}${metaStr}`;\n })\n );\n};\n\n// Create the logger instance once\nconst logger = winston.createLogger({\n level: 'info',\n format: createFormat('info'),\n defaultMeta: { service: PROGRAM_NAME },\n transports: createTransports('info'),\n});\n\nexport const setLogLevel = (level: string) => {\n // Reconfigure the existing logger instead of creating a new one\n logger.configure({\n level,\n format: createFormat(level),\n defaultMeta: { service: PROGRAM_NAME },\n transports: createTransports(level),\n });\n};\n\nexport const getLogger = () => logger;\n\n/**\n * Get a logger that automatically formats messages for dry-run mode\n */\nexport const getDryRunLogger = (isDryRun: boolean) => {\n if (!isDryRun) {\n return logger;\n }\n\n // Return a wrapper that adds dry-run context to all log calls\n return {\n info: (message: string, ...args: any[]) => logger.info(message, { dryRun: true }, ...args),\n warn: (message: string, ...args: any[]) => logger.warn(message, { dryRun: true }, ...args),\n error: (message: string, ...args: any[]) => logger.error(message, { dryRun: true }, ...args),\n debug: (message: string, ...args: any[]) => logger.debug(message, { dryRun: true }, ...args),\n verbose: (message: string, ...args: any[]) => logger.verbose(message, { dryRun: true }, ...args),\n silly: (message: string, ...args: any[]) => logger.silly(message, { dryRun: true }, ...args),\n };\n};\n"],"names":["debugDirectoryEnsured","ensureDebugDirectory","debugDir","path","join","DEFAULT_OUTPUT_DIRECTORY","fs","mkdirSync","recursive","error","console","generateDebugLogFilename","now","Date","timestamp","toISOString","replace","createTransports","level","transports","push","winston","Console","format","combine","colorize","printf","message","dryRun","dryRunPrefix","includes","String","meta","filteredMeta","Object","keys","reduce","acc","key","metaStr","length","JSON","stringify","debugLogPath","File","filename","DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS","errors","stack","splat","service","serviceStr","createFormat","baseFormats","_meta","logger","createLogger","defaultMeta","PROGRAM_NAME","setLogLevel","configure","getLogger"],"mappings":"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"}
1
+ {"version":3,"file":"logging.js","sources":["../src/logging.ts"],"sourcesContent":["import winston from 'winston';\n// eslint-disable-next-line no-restricted-imports\nimport * as fs from 'fs';\nimport path from 'path';\nimport { DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS, PROGRAM_NAME, DEFAULT_OUTPUT_DIRECTORY } from './constants';\n\nexport interface LogContext {\n [key: string]: any;\n}\n\n// Track if debug directory has been ensured for this session\nlet debugDirectoryEnsured = false;\n\nconst ensureDebugDirectory = () => {\n if (debugDirectoryEnsured) return;\n\n const debugDir = path.join(DEFAULT_OUTPUT_DIRECTORY, 'debug');\n\n try {\n fs.mkdirSync(debugDir, { recursive: true });\n debugDirectoryEnsured = true;\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(`Failed to create debug directory ${debugDir}:`, error);\n }\n};\n\nconst generateDebugLogFilename = () => {\n const now = new Date();\n const timestamp = now.toISOString()\n .replace(/[-:]/g, '')\n .replace(/\\./g, '')\n .replace('T', '-')\n .replace('Z', '');\n\n return `${timestamp}-debug.log`;\n};\n\nconst createTransports = (level: string) => {\n const transports: winston.transport[] = [];\n\n // When running as MCP server, NEVER add console transports as they interfere with the protocol\n // All output must go through log capture mechanism instead\n const isMcpServer = process.env.KODRDRIV_MCP_SERVER === 'true';\n\n if (!isMcpServer) {\n // Always add console transport for info level and above (only when NOT in MCP mode)\n if (level === 'info') {\n transports.push(\n new winston.transports.Console({\n format: winston.format.combine(\n winston.format.colorize(),\n winston.format.printf(({ level, message, dryRun }): string => {\n const dryRunPrefix = dryRun ? '🔍 DRY RUN: ' : '';\n // For info level messages, don't show the level prefix\n if (level.includes('info')) {\n return `${dryRunPrefix}${String(message)}`;\n }\n // For warn, error, etc., show the level prefix\n return `${level}: ${dryRunPrefix}${String(message)}`;\n })\n )\n })\n );\n } else {\n // For debug/verbose levels, add console transport that shows info and above\n transports.push(\n new winston.transports.Console({\n level: 'info', // Show info, warn, and error on console\n format: winston.format.combine(\n winston.format.colorize(),\n winston.format.printf(({ timestamp, level, message, dryRun, ...meta }): string => {\n // For info level messages, use simpler format without timestamp\n if (level.includes('info')) {\n const dryRunPrefix = dryRun ? '🔍 DRY RUN: ' : '';\n return `${dryRunPrefix}${String(message)}`;\n }\n\n // Filter out winston internal metadata\n const filteredMeta = Object.keys(meta).reduce((acc, key) => {\n if (!['level', 'message', 'timestamp', 'dryRun', 'service', 'splat', 'Symbol(level)', 'Symbol(message)'].includes(key)) {\n acc[key] = meta[key];\n }\n return acc;\n }, {} as Record<string, any>);\n\n const metaStr = Object.keys(filteredMeta).length ? ` ${JSON.stringify(filteredMeta, null, 2)}` : '';\n const dryRunPrefix = dryRun ? '🔍 DRY RUN: ' : '';\n return `${timestamp} ${level}: ${dryRunPrefix}${String(message)}${metaStr}`;\n })\n )\n })\n );\n }\n }\n\n // Add file transport for debug levels (debug and silly)\n if (level === 'debug' || level === 'silly') {\n ensureDebugDirectory();\n\n const debugLogPath = path.join(DEFAULT_OUTPUT_DIRECTORY, 'debug', generateDebugLogFilename());\n\n transports.push(\n new winston.transports.File({\n filename: debugLogPath,\n level: 'debug', // Capture debug and above in the file\n format: winston.format.combine(\n winston.format.timestamp({ format: DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS }),\n winston.format.errors({ stack: true }),\n winston.format.splat(),\n winston.format.printf(({ timestamp, level, message, service, ...meta }) => {\n // Filter out winston internal metadata and properly format remaining meta\n const filteredMeta = Object.keys(meta).reduce((acc, key) => {\n // Skip internal winston fields\n if (!['level', 'message', 'timestamp', 'splat', 'Symbol(level)', 'Symbol(message)'].includes(key)) {\n acc[key] = meta[key];\n }\n return acc;\n }, {} as Record<string, any>);\n\n const metaStr = Object.keys(filteredMeta).length\n ? ` ${JSON.stringify(filteredMeta, null, 2)}`\n : '';\n const serviceStr = service ? ` [${service}]` : '';\n return `${timestamp}${serviceStr} ${level}: ${message}${metaStr}`;\n })\n )\n })\n );\n }\n\n return transports;\n};\n\nconst createFormat = (level: string) => {\n const baseFormats = [\n winston.format.errors({ stack: true }),\n winston.format.splat(),\n ];\n\n if (level === 'info') {\n return winston.format.combine(\n ...baseFormats,\n winston.format.printf(({ message, dryRun, ..._meta }): string => {\n // Auto-format dry-run messages\n if (dryRun) {\n return `🔍 DRY RUN: ${message}`;\n }\n return String(message);\n })\n );\n }\n\n return winston.format.combine(\n winston.format.timestamp({ format: DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS }),\n ...baseFormats,\n winston.format.printf(({ timestamp, level, message, dryRun, ...meta }): string => {\n // Filter out winston internal metadata\n const filteredMeta = Object.keys(meta).reduce((acc, key) => {\n if (!['level', 'message', 'timestamp', 'dryRun', 'service', 'splat', 'Symbol(level)', 'Symbol(message)'].includes(key)) {\n acc[key] = meta[key];\n }\n return acc;\n }, {} as Record<string, any>);\n\n const metaStr = Object.keys(filteredMeta).length ? ` ${JSON.stringify(filteredMeta, null, 2)}` : '';\n const dryRunPrefix = dryRun ? '🔍 DRY RUN: ' : '';\n return `${timestamp} ${level}: ${dryRunPrefix}${String(message)}${metaStr}`;\n })\n );\n};\n\n// Create the logger instance once\nconst logger = winston.createLogger({\n level: 'info',\n format: createFormat('info'),\n defaultMeta: { service: PROGRAM_NAME },\n transports: createTransports('info'),\n});\n\nexport const setLogLevel = (level: string) => {\n // Reconfigure the existing logger instead of creating a new one\n logger.configure({\n level,\n format: createFormat(level),\n defaultMeta: { service: PROGRAM_NAME },\n transports: createTransports(level),\n });\n};\n\nexport const getLogger = () => logger;\n\n/**\n * Get a logger that automatically formats messages for dry-run mode\n */\nexport const getDryRunLogger = (isDryRun: boolean) => {\n if (!isDryRun) {\n return logger;\n }\n\n // Return a wrapper that adds dry-run context to all log calls\n return {\n info: (message: string, ...args: any[]) => logger.info(message, { dryRun: true }, ...args),\n warn: (message: string, ...args: any[]) => logger.warn(message, { dryRun: true }, ...args),\n error: (message: string, ...args: any[]) => logger.error(message, { dryRun: true }, ...args),\n debug: (message: string, ...args: any[]) => logger.debug(message, { dryRun: true }, ...args),\n verbose: (message: string, ...args: any[]) => logger.verbose(message, { dryRun: true }, ...args),\n silly: (message: string, ...args: any[]) => logger.silly(message, { dryRun: true }, ...args),\n };\n};\n"],"names":["debugDirectoryEnsured","ensureDebugDirectory","debugDir","path","join","DEFAULT_OUTPUT_DIRECTORY","fs","mkdirSync","recursive","error","console","generateDebugLogFilename","now","Date","timestamp","toISOString","replace","createTransports","level","transports","isMcpServer","process","env","KODRDRIV_MCP_SERVER","push","winston","Console","format","combine","colorize","printf","message","dryRun","dryRunPrefix","includes","String","meta","filteredMeta","Object","keys","reduce","acc","key","metaStr","length","JSON","stringify","debugLogPath","File","filename","DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS","errors","stack","splat","service","serviceStr","createFormat","baseFormats","_meta","logger","createLogger","defaultMeta","PROGRAM_NAME","setLogLevel","configure","getLogger"],"mappings":"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"}
@@ -0,0 +1,169 @@
1
+ # Check Development Readiness
2
+
3
+ ## Objective
4
+
5
+ Verify that projects are ready for development work. This prompt provides a comprehensive check to ensure:
6
+ 1. No projects are on the main branch
7
+ 2. All repositories have pulled the latest changes from remote
8
+ 3. Packages are on dev tag versions locally
9
+ 4. Local packages are linked via `kodrdriv link` or `kodrdriv tree link`
10
+
11
+ This is a quick verification step before starting development work to ensure you're working with the latest code and proper local dependencies.
12
+
13
+ ## Determining Tree vs Single-Package Operation
14
+
15
+ **Important**: Before proceeding, determine if this is a tree operation or a single-package operation:
16
+
17
+ - **Tree Operation**: If the directory (${directory}) contains subdirectories with `package.json` files, this is a monorepo/tree operation. Check all packages in the tree.
18
+ - **Single-Package Operation**: If the directory is a leaf project (single package without subdirectories containing `package.json`), check only this single package.
19
+
20
+ ## Workflow Steps
21
+
22
+ ### For Tree Operations (Monorepo)
23
+
24
+ 1. **Check Branch Status**
25
+ - For each package in the tree, check the current git branch
26
+ - Use `git branch --show-current` or `getGitStatusSummary()` from `@eldrforge/git-tools` to get the current branch
27
+ - **Fail if any package is on `main` or `master` branch** - these should be on `working` or a feature branch
28
+ - Report which packages are on the wrong branch
29
+
30
+ 2. **Check Remote Sync Status**
31
+ - For each package, check if the local branch is up to date with remote
32
+ - Use `git fetch` first to update remote refs
33
+ - Compare local branch with `origin/{branch}` using `git rev-parse` or `git status`
34
+ - **Fail if any package is behind remote** - run `kodrdriv_tree_pull` to sync
35
+ - Report which packages need to pull changes
36
+
37
+ 3. **Check Dev Version Status**
38
+ - For each package, read `package.json` and check the version field
39
+ - Verify that versions contain a dev tag (e.g., `1.2.3-dev.0`, `0.5.1-dev.2`)
40
+ - Use `isDevelopmentVersion()` from `@eldrforge/core` if available, or check for patterns like `-dev.`, `-alpha`, `-beta`, `-rc`
41
+ - **Fail if any package has a non-dev version** (e.g., `1.2.3` without `-dev.0`) - this suggests the package needs `kodrdriv development` run
42
+ - Report which packages have incorrect version formats
43
+
44
+ 4. **Check Link Status**
45
+ - For each package, check if local dependencies are properly linked
46
+ - Use `getGloballyLinkedPackages()` and `getLinkedDependencies()` from `@eldrforge/git-tools` to check link status
47
+ - Alternatively, check `node_modules` for symlinks pointing to local packages
48
+ - Check `package.json` dependencies - if they reference scoped packages (e.g., `@eldrforge/*`), verify they're linked, not using registry versions
49
+ - **Fail if local dependencies are not linked** - run `kodrdriv_tree_link` to set up local links
50
+ - Report which packages need linking
51
+
52
+ 5. **Summary Report**
53
+ - Provide a clear summary of all checks
54
+ - List any failures with specific packages and what needs to be fixed
55
+ - If all checks pass, confirm that the project is ready for development
56
+
57
+ ### For Single-Package Operations (Leaf Project)
58
+
59
+ 1. **Check Branch Status**
60
+ - Check the current git branch using `git branch --show-current` or `getGitStatusSummary()`
61
+ - **Fail if on `main` or `master` branch** - should be on `working` or a feature branch
62
+ - Report the current branch
63
+
64
+ 2. **Check Remote Sync Status**
65
+ - Run `git fetch` to update remote refs
66
+ - Compare local branch with `origin/{branch}` using `git rev-parse` or `git status`
67
+ - **Fail if behind remote** - run `kodrdriv_pull` to sync
68
+ - Report sync status
69
+
70
+ 3. **Check Dev Version Status**
71
+ - Read `package.json` and check the version field
72
+ - Verify that version contains a dev tag (e.g., `1.2.3-dev.0`)
73
+ - **Fail if version is not a dev version** - run `kodrdriv development` to update
74
+ - Report the current version
75
+
76
+ 4. **Check Link Status**
77
+ - Check if local dependencies are properly linked
78
+ - Use `getLinkedDependencies()` from `@eldrforge/git-tools` to check link status
79
+ - Check `node_modules` for symlinks pointing to local packages
80
+ - Check `package.json` dependencies - if they reference scoped packages, verify they're linked
81
+ - **Fail if local dependencies are not linked** - run `kodrdriv link` to set up local links
82
+ - Report link status
83
+
84
+ 5. **Summary Report**
85
+ - Provide a clear summary of all checks
86
+ - List any failures and what needs to be fixed
87
+ - If all checks pass, confirm that the project is ready for development
88
+
89
+ ## Common Issues and Fixes
90
+
91
+ ### Issue: Package on main branch
92
+ **Fix**: Switch to working branch or create a feature branch
93
+ ```bash
94
+ git checkout working
95
+ # or
96
+ git checkout -b feature/my-feature
97
+ ```
98
+
99
+ ### Issue: Behind remote
100
+ **Fix**: Pull latest changes
101
+ ```bash
102
+ # For tree operations
103
+ kodrdriv tree pull
104
+
105
+ # For single package
106
+ kodrdriv pull
107
+ ```
108
+
109
+ ### Issue: Not on dev version
110
+ **Fix**: Run development command to bump to dev version
111
+ ```bash
112
+ # For tree operations (if supported)
113
+ kodrdriv development
114
+
115
+ # For single package
116
+ kodrdriv development
117
+ ```
118
+
119
+ ### Issue: Local dependencies not linked
120
+ **Fix**: Run link command
121
+ ```bash
122
+ # For tree operations
123
+ kodrdriv tree link
124
+
125
+ # For single package
126
+ kodrdriv link
127
+ ```
128
+
129
+ ## Expected End State
130
+
131
+ After all checks pass, you should have:
132
+ - All packages on `working` or feature branches (not `main`)
133
+ - All repositories synced with remote
134
+ - All packages with dev versions (e.g., `1.2.3-dev.0`)
135
+ - All local dependencies properly linked via `kodrdriv link`
136
+
137
+ ## Important Notes
138
+
139
+ - **Branch Check**: The main branch check is critical - you should never develop directly on `main`
140
+ - **Remote Sync**: Always ensure you have the latest changes before starting work
141
+ - **Dev Versions**: Working branches should always have dev versions to distinguish from release versions
142
+ - **Link Status**: Local development requires linking to test changes across packages
143
+ - **Efficiency**: For large monorepos, checks can be done in parallel where possible
144
+
145
+ ## Example Output
146
+
147
+ ```
148
+ ✅ Branch Check: All packages on working branch
149
+ ✅ Remote Sync: All packages up to date with remote
150
+ ✅ Dev Versions: All packages have dev versions (e.g., 1.2.3-dev.0)
151
+ ✅ Link Status: All local dependencies properly linked
152
+
153
+ Project is ready for development!
154
+ ```
155
+
156
+ Or if issues are found:
157
+
158
+ ```
159
+ ❌ Branch Check: @eldrforge/core is on main branch
160
+ ⚠️ Remote Sync: @eldrforge/git-tools is 3 commits behind origin/working
161
+ ❌ Dev Versions: @eldrforge/core has version 1.2.3 (should be 1.2.3-dev.0)
162
+ ⚠️ Link Status: @eldrforge/commands-git is not linked locally
163
+
164
+ Actions needed:
165
+ 1. Switch @eldrforge/core to working branch
166
+ 2. Run kodrdriv tree pull to sync @eldrforge/git-tools
167
+ 3. Run kodrdriv development in @eldrforge/core
168
+ 4. Run kodrdriv tree link to link local dependencies
169
+ ```
@@ -0,0 +1,62 @@
1
+ Update dependencies to the latest published versions from npmjs for configured scopes and the package's own scope.
2
+
3
+ **CRITICAL RULES:**
4
+ - NEVER update to dev-tagged versions (e.g., `-dev.0`, `-dev.1`, `-alpha`, `-beta`, `-rc`)
5
+ - Projects should NEVER depend on dev versions - they should use `kodrdriv link` for local development
6
+ - Only update to stable, published versions available on npmjs
7
+
8
+ ## Determining Tree vs Single-Package Operation
9
+
10
+ **Important**: Before proceeding, determine if this is a tree operation or a single-package operation:
11
+
12
+ - **Tree Operation**: If the current directory contains subdirectories with `package.json` files, this is a monorepo/tree operation. Use `kodrdriv_tree_updates` command.
13
+ - **Single-Package Operation**: If the directory is a leaf project (single package without subdirectories containing `package.json`), this is NOT a tree operation. Use `kodrdriv_updates` command instead.
14
+
15
+ **Workflow:**
16
+
17
+ ### For Tree Operations (Monorepo)
18
+
19
+ 1. Determine which scopes to update:
20
+ - Check configuration for `updates.scopes` or `publish.scopedDependencyUpdates`
21
+ - If the current package has a scope (e.g., `@eldrforge/my-package`), include that scope
22
+ - Use all configured scopes plus the package's own scope
23
+
24
+ 2. Run `kodrdriv_tree_updates`:
25
+ - This uses npm-check-updates to find latest versions matching the scope pattern across all packages in the tree
26
+ - Updates only packages published on npmjs (not dev versions)
27
+ - Updates dependencies, devDependencies, and peerDependencies sections
28
+
29
+ 3. After updates:
30
+ - Run `npm install` in each updated package to update package-lock.json
31
+ - Review changes to ensure no dev versions were introduced
32
+ - Run `kodrdriv_tree_precommit` to verify everything still works across the tree
33
+ - **Note**: If precommit fails due to coverage threshold issues and the project uses lcov format, consider using the `brennpunkt` MCP server tools to analyze coverage gaps and prioritize test improvements. Install brennpunkt as an MCP server with: `npx -y -p @redaksjon/brennpunkt brennpunkt-mcp`
34
+ - Commit the changes with `kodrdriv_tree_commit`
35
+
36
+ ### For Single-Package Operations (Leaf Project)
37
+
38
+ 1. Determine which scopes to update:
39
+ - Check configuration for `updates.scopes` or `publish.scopedDependencyUpdates`
40
+ - If the current package has a scope (e.g., `@eldrforge/my-package`), include that scope
41
+ - Use all configured scopes plus the package's own scope
42
+
43
+ 2. Run `kodrdriv_updates`:
44
+ - This uses npm-check-updates to find latest versions matching the scope pattern for the single package
45
+ - Updates only packages published on npmjs (not dev versions)
46
+ - Updates dependencies, devDependencies, and peerDependencies sections
47
+
48
+ 3. After updates:
49
+ - Run `npm install` to update package-lock.json
50
+ - Review changes to ensure no dev versions were introduced
51
+ - Run `kodrdriv_precommit` to verify everything still works
52
+ - **Note**: If precommit fails due to coverage threshold issues and the project uses lcov format, consider using the `brennpunkt` MCP server tools to analyze coverage gaps and prioritize test improvements. Install brennpunkt as an MCP server with: `npx -y -p @redaksjon/brennpunkt brennpunkt-mcp`
53
+ - Commit the changes with `kodrdriv_commit`
54
+
55
+ **Example:**
56
+ If package is `@eldrforge/my-package` and config has `scopedDependencyUpdates: ["@riotprompt"]`, update:
57
+ - `@eldrforge/*` dependencies (package's own scope)
58
+ - `@riotprompt/*` dependencies (configured scope)
59
+
60
+ **Verification:**
61
+ - Check that no dependencies were updated to versions containing `-dev`, `-alpha`, `-beta`, or `-rc`
62
+ - If any dev versions are found, they should be removed and replaced with `kodrdriv link` workflow instead