@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/BUG_TREE_PUBLISH_CONFIG_DIR.md +79 -0
- package/README.md +76 -3
- package/dist/application.js +51 -6
- package/dist/application.js.map +1 -1
- package/dist/arguments.js +52 -11
- package/dist/arguments.js.map +1 -1
- package/dist/constants.js +6 -2
- package/dist/constants.js.map +1 -1
- package/dist/logging.js +63 -58
- package/dist/logging.js.map +1 -1
- package/dist/mcp/prompts/check_development.md +169 -0
- package/dist/mcp/prompts/dependency_update.md +62 -0
- package/dist/mcp/prompts/fix_and_commit.md +53 -0
- package/dist/mcp/prompts/publish.md +100 -0
- package/dist/mcp/prompts/tree_fix_and_commit.md +102 -0
- package/dist/mcp/prompts/tree_publish.md +118 -0
- package/dist/mcp-server.js +15601 -0
- package/dist/mcp-server.js.map +7 -0
- package/dist/types.js +23 -3
- package/dist/types.js.map +1 -1
- package/guide/index.md +9 -0
- package/guide/quickstart.md +23 -0
- package/package.json +29 -19
- package/packages/components/package.json +4 -1
- package/packages/tools/package.json +4 -1
- package/packages/utils/package.json +4 -1
- package/scripts/build-mcp.js +111 -0
- package/scripts/test-get-version-tool.js +102 -0
- package/scripts/test-mcp-compliance.js +254 -0
- package/AI-GUIDE.md +0 -837
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.
|
|
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
|
package/dist/constants.js.map
CHANGED
|
@@ -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
|
-
//
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
|
101
|
-
return `${timestamp}
|
|
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)=>{
|
package/dist/logging.js.map
CHANGED
|
@@ -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
|