From 8a6058c4212c1d577c75b2405b1eea71a4736dee Mon Sep 17 00:00:00 2001 From: Juergen Kunz Date: Fri, 8 Aug 2025 12:06:41 +0000 Subject: [PATCH] feat(logging): Enhance logging and module publishing with color-coded output, progress tracking, and improved CLI startup --- .../document_symbols_cache_v23-06-25.pkl | Bin 0 -> 43340 bytes .serena/memories/code_style_conventions.md | 31 ++++++ .serena/memories/logging_improvements_2025.md | 49 +++++++++ .serena/memories/project_overview.md | 45 ++++++++ .serena/memories/suggested_commands.md | 34 ++++++ .serena/memories/task_completion_checklist.md | 29 +++++ .serena/project.yml | 68 ++++++++++++ changelog.md | 8 ++ package.json | 4 +- pnpm-lock.yaml | 19 ++-- ts/00_commitinfo_data.ts | 2 +- ts/classes.publishmodule.ts | 16 +-- ts/classes.tspublish.ts | 22 ++-- ts/index.ts | 3 +- ts/logging.ts | 99 ++++++++++++++++++ ts/plugins.ts | 3 +- 16 files changed, 404 insertions(+), 28 deletions(-) create mode 100644 .serena/cache/typescript/document_symbols_cache_v23-06-25.pkl create mode 100644 .serena/memories/code_style_conventions.md create mode 100644 .serena/memories/logging_improvements_2025.md create mode 100644 .serena/memories/project_overview.md create mode 100644 .serena/memories/suggested_commands.md create mode 100644 .serena/memories/task_completion_checklist.md create mode 100644 .serena/project.yml diff --git a/.serena/cache/typescript/document_symbols_cache_v23-06-25.pkl b/.serena/cache/typescript/document_symbols_cache_v23-06-25.pkl new file mode 100644 index 0000000000000000000000000000000000000000..2ee26de133711075686208bbba9119c81a907536 GIT binary patch literal 43340 zcmeHQX^b4lb(YNg5=q^MCAAcWGb@q3Bz1aq&=e^~mq}WrqqwXG( zD{2xamgNK(2XVYYe%UbuBZ*@K`H>)w69fnh7=aPwfMXztkvNBQ$8n4xNMhtqzE@XQ zRrl<2rEbZxM}V4JJ+G^~zIyfQT~+nr^{*ZI+*SO)!Sc{clgUOWND`L#z5ZOMm4u5? zv)^HUn(RLl_ZdhI+&3Q_cu#}fcmG3&?tfr@ZvG%{9Be%J(ESfS{J_Ec4lK_s*9Xh> z;rec{2>KhIJ|!x8AFt?SFKtELWO=x;$tNmz$9=oQba zn!@dZWD`hs_rqOTX)hkw+z4BpX3VE0&8*vKv1B>i6mAZ;Ji95}N)O7q zcA~C#>AI+NZ@(X2yCTIkptx}c4etebUAi2uA8zhMjetIuH*;M-ZY>X=ns0U3)a2yk zVmF;^25B(aiISwll4NqBmHID5T{f8}vUBj)$o^VZXoj~Aw+C}c)aj?}RFH`GIh+XZ>4*0Y zuQxzY7-@vWI4fk+9TqfH+T}o#r`T9AG>?`G%{3%tz)6CGG$^}zLF0U|z)tt)jz^s) z1V$l1TP%R6bejWEp5oey0eZSzfNpV-$YFJ}OL4s4>2N_&h}l*PGb-(IFw0ZiS}|rX zl#AKjqY%k6+6__?V|IgtS{b?R7IIX&%Rw$raZ|;}HOfWq&O$iyu4b$`l_qgrCt=LUaJembv|e?uTUlSE^qa`qKO{2U3sKsc)@Q< z24zrzXca!AYP6Pa$T6!9d#1%BxjwKSRxO>o`? zmxZkamZBs<9o}OZ=b`ur7(`OZ3PB+MqTdEe>)$ZfhgGKfeWTSUe`@u~pBMBAQS8+H zPNnOGv=iNaZL$c2zczKSQe>UzG05-G=~m1k2>>D}g=HnU5t z(Koouwj%$G*QhK~D!GX7zq6t4{y$&?ⅆ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.ts` +- Test files named as `test..ts` or `*.both.ts`, `*.node.ts`, `*.browser.ts` + +## Import Style +- Module dependencies imported via `ts/plugins.ts` +- Use full path references: `plugins.myModule.myClass()` +- Import TypeScript files directly in tests, never compiled JavaScript + +## Code Patterns +- Async/await preferred over callbacks +- Classes for main logic (TsPublish, PublishModule) +- Centralized logging via `logging.ts` +- Plugins pattern for external dependencies + +## TypeScript Conventions +- Use type annotations +- Export classes and functions explicitly +- Module exports through index.ts +- Interfaces in separate interfaces/ directory + +## File Organization +- Source code in `ts/` directory +- Tests in `test/` directory +- Compiled output in `dist_ts/` +- No uppercase in filenames \ No newline at end of file diff --git a/.serena/memories/logging_improvements_2025.md b/.serena/memories/logging_improvements_2025.md new file mode 100644 index 0000000..db77ca8 --- /dev/null +++ b/.serena/memories/logging_improvements_2025.md @@ -0,0 +1,49 @@ +# Logging Improvements - January 2025 + +## Overview +Enhanced TSPublish logging system with @push.rocks/smartlog and @push.rocks/consolecolor for better visual feedback and user experience. + +## Changes Made + +### 1. Dependencies +- Added @push.rocks/consolecolor (v2.0.3) for colored console output + +### 2. Enhanced logging.ts +- Created color-coded log level indicators with emojis +- Added specialized logging functions: + - `logInfo()` - Cyan info messages + - `logSuccess()` - Green success messages + - `logWarn()` - Orange warning messages + - `logError()` - Red error messages + - `logStart()` - Blue start indicators + - `logDone()` - Green completion indicators + - `logPackage()` - Package-specific messages with icons + - `logBuild()` - Build messages with hammer icon + - `logPublish()` - Publish messages with rocket icon + - `logOngoing()` - Ongoing operations with spinner icon +- Added visual helpers: + - `logSeparator()` - Cyan line separator + - `logHeader()` - Colored section headers + - `logProgress()` - Progress bar with percentage + +### 3. Updated classes.tspublish.ts +- Added colored header at startup +- Module discovery uses colored bullets +- Progress tracking for module processing +- Better visual separation between phases + +### 4. Updated classes.publishmodule.ts +- Added visual indicators for each operation phase +- Build process shows building status and completion +- Publishing shows rocket icon and success message +- NPM registry checks have clearer warnings + +### 5. Updated index.ts +- Replaced console.log with logStart() + +## Benefits +- Clearer visual hierarchy of information +- Easier to track progress through long operations +- Better distinction between info, warnings, and errors +- More professional and polished CLI output +- Semantic icons make status immediately recognizable \ No newline at end of file diff --git a/.serena/memories/project_overview.md b/.serena/memories/project_overview.md new file mode 100644 index 0000000..35afd82 --- /dev/null +++ b/.serena/memories/project_overview.md @@ -0,0 +1,45 @@ +# TSPublish Project Overview + +## Purpose +TSPublish is a tool designed to publish multiple, concise, and small packages from monorepos, specifically for TypeScript projects within a git environment. It helps manage and automate the publishing of individual packages from a monorepo structure. + +## Tech Stack +- **Language**: TypeScript +- **Runtime**: Node.js +- **Package Manager**: pnpm (v10.11.0) +- **Build Tool**: @git.zone/tsbuild +- **Testing**: @git.zone/tstest with @push.rocks/tapbundle +- **CLI Framework**: @push.rocks/smartcli +- **Logging**: @push.rocks/smartlog (currently basic usage) + +## Main Dependencies +- @push.rocks/smartcli - CLI interface +- @push.rocks/smartdelay - Delay utilities +- @push.rocks/smartfile - File operations +- @push.rocks/smartlog - Logging +- @push.rocks/smartnpm - NPM registry interactions +- @push.rocks/smartpath - Path utilities +- @push.rocks/smartrequest - HTTP requests +- @push.rocks/smartshell - Shell command execution + +## Project Structure +- `ts/` - TypeScript source files + - `index.ts` - Main entry point + - `classes.tspublish.ts` - Main TsPublish class + - `classes.publishmodule.ts` - PublishModule class for individual packages + - `classes.giteaassets.ts` - Gitea assets management + - `logging.ts` - Logger configuration + - `plugins.ts` - External dependencies + - `paths.ts` - Path constants + - `interfaces/` - TypeScript interfaces +- `test/` - Test files +- `dist_ts/` - Compiled JavaScript output +- `cli.js` - CLI entry point (bin script) + +## Key Features +1. Scans monorepo for directories starting with "ts" +2. Validates packages via tspublish.json files +3. Creates package.json dynamically for each module +4. Builds TypeScript code before publishing +5. Checks npm registry for version conflicts +6. Publishes packages to npm registry \ No newline at end of file diff --git a/.serena/memories/suggested_commands.md b/.serena/memories/suggested_commands.md new file mode 100644 index 0000000..9414a76 --- /dev/null +++ b/.serena/memories/suggested_commands.md @@ -0,0 +1,34 @@ +# Suggested Commands for TSPublish Development + +## Build & Test Commands +- `pnpm build` - Build the TypeScript project (runs tsbuild --web --allowimplicitany) +- `pnpm test` - Run the test suite (runs tstest test/ --web) +- `pnpm buildDocs` - Generate documentation (runs tsdoc) + +## Development Commands +- `tsx ts/index.ts` - Run the main entry point directly +- `tsx test/test.ts` - Run specific test file +- `tstest test/test.some.ts --verbose` - Run specific test with verbose output +- `tsbuild check test/**/* --skiplibcheck` - Type check test files + +## Package Management +- `pnpm install` - Install dependencies +- `pnpm install --save-dev ` - Install dev dependency +- `pnpm add ` - Add production dependency + +## Git Commands (Linux) +- `git status` - Check repository status +- `git diff` - View changes +- `git log` - View commit history +- `git mv ` - Move/rename files preserving history + +## File System Commands (Linux) +- `ls` - List directory contents +- `cd` - Change directory +- `find` - Find files +- `grep` - Search file contents +- `cat` - Display file contents + +## CLI Usage +- `./cli.js` - Run the tspublish CLI +- `node cli.js` - Alternative way to run CLI \ No newline at end of file diff --git a/.serena/memories/task_completion_checklist.md b/.serena/memories/task_completion_checklist.md new file mode 100644 index 0000000..b895e51 --- /dev/null +++ b/.serena/memories/task_completion_checklist.md @@ -0,0 +1,29 @@ +# Task Completion Checklist + +When completing any development task on TSPublish: + +## 1. Build Verification +- Run `pnpm build` to ensure TypeScript compiles without errors +- No use of --skiplibcheck flag + +## 2. Test Execution +- Run `pnpm test` to verify all tests pass +- For specific test files: `tsx test/test.specific.ts` + +## 3. Type Checking +- Type check test files: `tsbuild check test/**/* --skiplibcheck` +- Type check source files: `pnpm build` + +## 4. Code Quality +- Ensure changes are focused and goal-oriented +- Verify no unnecessary modifications were made +- Check that code follows existing patterns and conventions + +## 5. Documentation +- Update readme.hints.md if new insights discovered +- Update readme.plan.md if working from a plan + +## 6. Version Control +- Use `git mv` for file renames to preserve history +- Make small, focused commits +- Never commit without explicit user request \ No newline at end of file diff --git a/.serena/project.yml b/.serena/project.yml new file mode 100644 index 0000000..13b762d --- /dev/null +++ b/.serena/project.yml @@ -0,0 +1,68 @@ +# language of the project (csharp, python, rust, java, typescript, go, cpp, or ruby) +# * For C, use cpp +# * For JavaScript, use typescript +# Special requirements: +# * csharp: Requires the presence of a .sln file in the project folder. +language: typescript + +# whether to use the project's gitignore file to ignore files +# Added on 2025-04-07 +ignore_all_files_in_gitignore: true +# list of additional paths to ignore +# same syntax as gitignore, so you can use * and ** +# Was previously called `ignored_dirs`, please update your config if you are using that. +# Added (renamed)on 2025-04-07 +ignored_paths: [] + +# whether the project is in read-only mode +# If set to true, all editing tools will be disabled and attempts to use them will result in an error +# Added on 2025-04-18 +read_only: false + + +# list of tool names to exclude. We recommend not excluding any tools, see the readme for more details. +# Below is the complete list of tools for convenience. +# To make sure you have the latest list of tools, and to view their descriptions, +# execute `uv run scripts/print_tool_overview.py`. +# +# * `activate_project`: Activates a project by name. +# * `check_onboarding_performed`: Checks whether project onboarding was already performed. +# * `create_text_file`: Creates/overwrites a file in the project directory. +# * `delete_lines`: Deletes a range of lines within a file. +# * `delete_memory`: Deletes a memory from Serena's project-specific memory store. +# * `execute_shell_command`: Executes a shell command. +# * `find_referencing_code_snippets`: Finds code snippets in which the symbol at the given location is referenced. +# * `find_referencing_symbols`: Finds symbols that reference the symbol at the given location (optionally filtered by type). +# * `find_symbol`: Performs a global (or local) search for symbols with/containing a given name/substring (optionally filtered by type). +# * `get_current_config`: Prints the current configuration of the agent, including the active and available projects, tools, contexts, and modes. +# * `get_symbols_overview`: Gets an overview of the top-level symbols defined in a given file or directory. +# * `initial_instructions`: Gets the initial instructions for the current project. +# Should only be used in settings where the system prompt cannot be set, +# e.g. in clients you have no control over, like Claude Desktop. +# * `insert_after_symbol`: Inserts content after the end of the definition of a given symbol. +# * `insert_at_line`: Inserts content at a given line in a file. +# * `insert_before_symbol`: Inserts content before the beginning of the definition of a given symbol. +# * `list_dir`: Lists files and directories in the given directory (optionally with recursion). +# * `list_memories`: Lists memories in Serena's project-specific memory store. +# * `onboarding`: Performs onboarding (identifying the project structure and essential tasks, e.g. for testing or building). +# * `prepare_for_new_conversation`: Provides instructions for preparing for a new conversation (in order to continue with the necessary context). +# * `read_file`: Reads a file within the project directory. +# * `read_memory`: Reads the memory with the given name from Serena's project-specific memory store. +# * `remove_project`: Removes a project from the Serena configuration. +# * `replace_lines`: Replaces a range of lines within a file with new content. +# * `replace_symbol_body`: Replaces the full definition of a symbol. +# * `restart_language_server`: Restarts the language server, may be necessary when edits not through Serena happen. +# * `search_for_pattern`: Performs a search for a pattern in the project. +# * `summarize_changes`: Provides instructions for summarizing the changes made to the codebase. +# * `switch_modes`: Activates modes by providing a list of their names +# * `think_about_collected_information`: Thinking tool for pondering the completeness of collected information. +# * `think_about_task_adherence`: Thinking tool for determining whether the agent is still on track with the current task. +# * `think_about_whether_you_are_done`: Thinking tool for determining whether the task is truly completed. +# * `write_memory`: Writes a named memory (for future reference) to Serena's project-specific memory store. +excluded_tools: [] + +# initial prompt for the project. It will always be given to the LLM upon activating the project +# (contrary to the memories, which are loaded on demand). +initial_prompt: "" + +project_name: "tspublish" diff --git a/changelog.md b/changelog.md index bdc63ae..cabe8d3 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,13 @@ # Changelog +## 2025-08-08 - 1.10.0 - feat(logging) +Enhance logging and module publishing with color-coded output, progress tracking, and improved CLI startup + +- Refactored logging to introduce color-coded symbols and helper functions (logInfo, logWarn, logSuccess, logBuild, logPublish, etc.) +- Added visual components such as headers, separators, and progress indicators for better operational visibility +- Integrated enhanced logging into module publishing and CLI startup, replacing generic console logs +- Updated various configuration and documentation files to reflect new code style conventions and dependency updates + ## 2025-01-02 - 1.9.1 - fix(publishmodule) Fix incorrect CLI script path during publish module creation diff --git a/package.json b/package.json index 5a0b045..5a52e82 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "readme.md" ], "dependencies": { + "@push.rocks/consolecolor": "^2.0.3", "@push.rocks/smartcli": "^4.0.11", "@push.rocks/smartdelay": "^3.0.5", "@push.rocks/smartfile": "^11.0.21", @@ -68,5 +69,6 @@ "modularity", "module-management", "developer-tools" - ] + ], + "packageManager": "pnpm@10.11.0+sha512.6540583f41cc5f628eb3d9773ecee802f4f9ef9923cc45b69890fb47991d4b092964694ec3a4f738a420c918a333062c8b925d312f42e4f0c263eb603551f977" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9fd8c06..3523ca7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ importers: .: dependencies: + '@push.rocks/consolecolor': + specifier: ^2.0.3 + version: 2.0.3 '@push.rocks/smartcli': specifier: ^4.0.11 version: 4.0.11 @@ -479,8 +482,8 @@ packages: resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==} engines: {node: '>=12'} - '@push.rocks/consolecolor@2.0.2': - resolution: {integrity: sha512-IBwxCLX+YF3f5wB2N4LfuvFqm9WPlBMiEeSAfjN8YQCyYec6u1hlrR3EIj8vT300pppjeGrybJHK+GyjdGXZJw==} + '@push.rocks/consolecolor@2.0.3': + resolution: {integrity: sha512-hA+m0BMqEwZNSAS7c2aQFfoPkpX/dNdsHzkdLdeERUOy7BLacb9ItTUofGtjtginP0yDj4NSpqSjNYyX3Y8Y/w==} '@push.rocks/early@4.0.4': resolution: {integrity: sha512-ak6/vqZ1PlFV08fSFQ6UwiBrr+K6IsfieZWWzT7eex1Ls6GvWEi8wZ3REFDPJq/qckNLWSgEy0EsqzRtltkaCA==} @@ -3653,7 +3656,7 @@ snapshots: '@api.global/typedserver': 3.0.51 '@git.zone/tsbundle': 2.1.0 '@git.zone/tsrun': 1.3.3 - '@push.rocks/consolecolor': 2.0.2 + '@push.rocks/consolecolor': 2.0.3 '@push.rocks/smartbrowser': 2.0.6 '@push.rocks/smartdelay': 3.0.5 '@push.rocks/smartfile': 11.0.21 @@ -3765,13 +3768,13 @@ snapshots: '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 - '@push.rocks/consolecolor@2.0.2': + '@push.rocks/consolecolor@2.0.3': dependencies: ansi-256-colors: 1.1.0 '@push.rocks/early@4.0.4': dependencies: - '@push.rocks/consolecolor': 2.0.2 + '@push.rocks/consolecolor': 2.0.3 '@push.rocks/smartpromise': 4.0.4 '@push.rocks/isohash@2.0.1': @@ -3979,7 +3982,7 @@ snapshots: '@push.rocks/smartlog-destination-local@9.0.2': dependencies: - '@push.rocks/consolecolor': 2.0.2 + '@push.rocks/consolecolor': 2.0.3 '@push.rocks/smartlog-interfaces': 3.0.2 '@push.rocks/smartpromise': 4.0.4 @@ -4037,7 +4040,7 @@ snapshots: '@push.rocks/smartnpm@2.0.4': dependencies: - '@push.rocks/consolecolor': 2.0.2 + '@push.rocks/consolecolor': 2.0.3 '@push.rocks/levelcache': 3.0.8 '@push.rocks/smartarchive': 3.0.8 '@push.rocks/smartfile': 10.0.41 @@ -4242,7 +4245,7 @@ snapshots: '@push.rocks/tapbundle@5.3.0': dependencies: '@open-wc/testing': 4.0.0 - '@push.rocks/consolecolor': 2.0.2 + '@push.rocks/consolecolor': 2.0.3 '@push.rocks/qenv': 6.0.5 '@push.rocks/smartcrypto': 2.0.4 '@push.rocks/smartdelay': 3.0.5 diff --git a/ts/00_commitinfo_data.ts b/ts/00_commitinfo_data.ts index e91c443..ff5084e 100644 --- a/ts/00_commitinfo_data.ts +++ b/ts/00_commitinfo_data.ts @@ -3,6 +3,6 @@ */ export const commitinfo = { name: '@git.zone/tspublish', - version: '1.9.1', + version: '1.10.0', description: 'A tool to publish multiple, concise, and small packages from monorepos, specifically for TypeScript projects within a git environment.' } diff --git a/ts/classes.publishmodule.ts b/ts/classes.publishmodule.ts index a1bd046..e192533 100644 --- a/ts/classes.publishmodule.ts +++ b/ts/classes.publishmodule.ts @@ -1,6 +1,6 @@ import * as plugins from './plugins.js'; import * as paths from './paths.js'; -import { logger } from './logging.js'; +import { logger, logInfo, logSuccess, logWarn, logError, logBuild, logPublish, logOngoing, logStart, logDone } from './logging.js'; import { type ITsPublishJson } from './interfaces/index.js'; import type { TsPublish } from './classes.tspublish.js'; @@ -66,16 +66,15 @@ export class PublishModule { try { packageInfo = await smartnpmInstance.getPackageInfo(this.options.name); } catch (error) { - logger.log('warn', `package does not yet seem to exist. Proceeding in 10 seconds...`); + logWarn(`Package ${this.options.name} does not yet seem to exist. Proceeding in 10 seconds...`); await plugins.smartdelay.delayFor(10000); } if (packageInfo) { const availableVersions = packageInfo.allVersions.map((versionArg) => versionArg.version); - logger.log('info', `available versions are: ${availableVersions.toString()}`); + logInfo(`Available versions for ${this.options.name}: ${availableVersions.join(', ')}`); if (availableVersions.includes(this.options.version)) { - logger.log( - 'error', - `package ${this.options.name} already exists with version ${this.options.version}` + logError( + `Package ${this.options.name} already exists with version ${this.options.version}` ); process.exit(1); } @@ -162,6 +161,7 @@ export class PublishModule { } public async createPublishModuleDir() { + logOngoing(`Creating publish directory for ${this.options.name}`); this.options.publishModDirFullPath = plugins.path.join( this.options.monoRepoDir, `dist_publish_${this.options.packageSubFolder}` @@ -207,10 +207,12 @@ export class PublishModule { } public async build() { + logBuild(`Building ${this.options.name}...`); const smartshellInstance = new plugins.smartshell.Smartshell({ executor: 'bash', }); await smartshellInstance.exec(`cd ${this.options.publishModDirFullPath} && pnpm run build`); + logSuccess(`Build completed for ${this.options.name}`); } public async createBinCliSetup() { @@ -229,6 +231,7 @@ export class PublishModule { } public async publish() { + logPublish(`Publishing ${this.options.name} v${this.options.version}...`); const smartshellInstance = new plugins.smartshell.Smartshell({ executor: 'bash', }); @@ -242,5 +245,6 @@ export class PublishModule { } --no-git-checks --registry https://${registryUrl}` ); } + logSuccess(`Successfully published ${this.options.name} v${this.options.version}!`); } } diff --git a/ts/classes.tspublish.ts b/ts/classes.tspublish.ts index e107d56..22bafb9 100644 --- a/ts/classes.tspublish.ts +++ b/ts/classes.tspublish.ts @@ -1,4 +1,4 @@ -import { logger } from './logging.js'; +import { logger, logInfo, logSuccess, logWarn, logError, logHeader, logPackage, logProgress, logSeparator, logStart, logDone } from './logging.js'; import * as plugins from './plugins.js'; import * as interfaces from './interfaces/index.js'; @@ -15,24 +15,26 @@ export class TsPublish { } public async publish(monorepoDirArg: string) { + logHeader('TSPublish - Module Publisher'); const publishModules = await this.getModuleSubDirs(monorepoDirArg); - logger.log('info', `Found ${Object.keys(publishModules).length} publish modules:`); + logInfo(`Found ${Object.keys(publishModules).length} publish modules`); + logSeparator(); for (const publishModule of Object.keys(publishModules)) { - logger.log( - 'info', - `Publishing module: ${publishModule} -> ${publishModules[publishModule].name}` - ); + logPackage('Module found', `${publishModule} → ${publishModules[publishModule].name}`); } for (const publishModule of Object.keys(publishModules)) { // lets check wether there is a name if (!publishModules[publishModule].name) { - logger.log('warn', `no name found in tspublish.json for ${publishModule}. Skipping...`); + logWarn(`No name found in tspublish.json for ${publishModule}. Skipping...`); continue; } const publishModuleInstance = new PublishModule(this, { monoRepoDir: monorepoDirArg, packageSubFolder: publishModule, }); + const moduleCount = Object.keys(publishModules).indexOf(publishModule) + 1; + const totalCount = Object.keys(publishModules).length; + logProgress(moduleCount, totalCount, publishModules[publishModule].name || publishModule); await publishModuleInstance.init(); await publishModuleInstance.createPublishModuleDir(); await publishModuleInstance.build(); @@ -53,13 +55,13 @@ export class TsPublish { continue; } - logger.log('info', `found publish module: ${subDir}`); + logPackage('Found module', subDir); publishModules[subDir] = JSON.parse( plugins.smartfile.fs.toStringSync(plugins.path.join(subDir, 'tspublish.json')) ); } - logger.log('ok', `found ${Object.keys(publishModules).length} publish modules`); - logger.log('info', `Ordering publish modules...`); + logSuccess(`Found ${Object.keys(publishModules).length} publish modules`); + logInfo('Ordering publish modules...'); return publishModules; } diff --git a/ts/index.ts b/ts/index.ts index e296e02..214bfdc 100644 --- a/ts/index.ts +++ b/ts/index.ts @@ -1,10 +1,11 @@ import * as paths from './paths.js'; import { TsPublish } from './classes.tspublish.js'; +import { logStart } from './logging.js'; export * from './classes.tspublish.js'; export const runCli = async () => { - console.log('Starting tspublish...'); + logStart('tspublish'); const tspublish = new TsPublish(); await tspublish.publish(paths.cwd); }; diff --git a/ts/logging.ts b/ts/logging.ts index 10735ef..ef8a721 100644 --- a/ts/logging.ts +++ b/ts/logging.ts @@ -3,3 +3,102 @@ import * as commitinfo from './00_commitinfo_data.js'; export const logger = plugins.smartlog.Smartlog.createForCommitinfo(commitinfo.commitinfo); logger.enableConsole(); + +// Color-coded log level indicators +const logIcons = { + info: plugins.consolecolor.coloredString('ℹ', 'cyan'), + success: plugins.consolecolor.coloredString('✓', 'green'), + warn: plugins.consolecolor.coloredString('⚠', 'orange'), + error: plugins.consolecolor.coloredString('✖', 'red'), + start: plugins.consolecolor.coloredString('▶', 'blue'), + done: plugins.consolecolor.coloredString('✔', 'green'), + package: plugins.consolecolor.coloredString('📦', 'blue'), + build: plugins.consolecolor.coloredString('🔨', 'cyan'), + publish: plugins.consolecolor.coloredString('🚀', 'green'), +}; + +// Helper function for info messages with color +export const logInfo = (message: string, data?: any) => { + const coloredMessage = `${logIcons.info} ${plugins.consolecolor.coloredString(message, 'cyan')}`; + logger.log('info', coloredMessage, data); +}; + +// Helper function for success messages +export const logSuccess = (message: string, data?: any) => { + const coloredMessage = `${logIcons.success} ${plugins.consolecolor.coloredString(message, 'green')}`; + logger.log('ok', coloredMessage, data); +}; + +// Helper function for warning messages +export const logWarn = (message: string, data?: any) => { + const coloredMessage = `${logIcons.warn} ${plugins.consolecolor.coloredString(message, 'orange')}`; + logger.log('warn', coloredMessage, data); +}; + +// Helper function for error messages +export const logError = (message: string, data?: any) => { + const coloredMessage = `${logIcons.error} ${plugins.consolecolor.coloredString(message, 'red')}`; + logger.log('error', coloredMessage, data); +}; + +// Helper function for start of operations +export const logStart = (operation: string) => { + const coloredMessage = `${logIcons.start} ${plugins.consolecolor.coloredString(`Starting ${operation}...`, 'blue')}`; + logger.log('info', coloredMessage); +}; + +// Helper function for completion of operations +export const logDone = (operation: string) => { + const coloredMessage = `${logIcons.done} ${plugins.consolecolor.coloredString(`Completed ${operation}`, 'green')}`; + logger.log('ok', coloredMessage); +}; + +// Helper function for package-related messages +export const logPackage = (message: string, packageName: string) => { + const coloredMessage = `${logIcons.package} ${message}: ${plugins.consolecolor.coloredString(packageName, 'blue', 'white')}`; + logger.log('info', coloredMessage); +}; + +// Helper function for build-related messages +export const logBuild = (message: string) => { + const coloredMessage = `${logIcons.build} ${plugins.consolecolor.coloredString(message, 'cyan')}`; + logger.log('info', coloredMessage); +}; + +// Helper function for publish-related messages +export const logPublish = (message: string) => { + const coloredMessage = `${logIcons.publish} ${plugins.consolecolor.coloredString(message, 'green')}`; + logger.log('info', coloredMessage); +}; + +// Create a visual separator for different phases +export const logSeparator = () => { + const separator = plugins.consolecolor.coloredString('━'.repeat(60), 'cyan'); + console.log(separator); +}; + +// Create a header for major sections +export const logHeader = (title: string) => { + logSeparator(); + const header = plugins.consolecolor.coloredString(` ${title.toUpperCase()} `, 'white', 'blue'); + console.log(header); + logSeparator(); +}; + +// Helper for indicating ongoing operations +export const logOngoing = (text: string) => { + const spinnerIcon = plugins.consolecolor.coloredString('⟳', 'cyan'); + const coloredMessage = `${spinnerIcon} ${plugins.consolecolor.coloredString(text, 'cyan')}`; + logger.log('info', coloredMessage); +}; + +// Progress indicator helper +export const logProgress = (current: number, total: number, item: string) => { + const percentage = Math.round((current / total) * 100); + const progressBar = '█'.repeat(Math.floor(percentage / 5)) + '░'.repeat(20 - Math.floor(percentage / 5)); + const coloredProgress = plugins.consolecolor.coloredString( + `[${progressBar}] ${percentage}% - ${item}`, + percentage === 100 ? 'green' : 'blue' + ); + logger.log('info', coloredProgress); +}; diff --git a/ts/plugins.ts b/ts/plugins.ts index de995af..0877775 100644 --- a/ts/plugins.ts +++ b/ts/plugins.ts @@ -3,6 +3,7 @@ import * as path from 'path'; export { path }; // @push.rocks scope +import * as consolecolor from '@push.rocks/consolecolor'; import * as smartfile from '@push.rocks/smartfile'; import * as smartcli from '@push.rocks/smartcli'; import * as smartdelay from '@push.rocks/smartdelay'; @@ -12,4 +13,4 @@ import * as smartpath from '@push.rocks/smartpath'; import * as smartrequest from '@push.rocks/smartrequest'; import * as smartshell from '@push.rocks/smartshell'; -export { smartfile, smartcli, smartdelay, smartlog, smartnpm, smartpath, smartrequest, smartshell }; +export { consolecolor, smartfile, smartcli, smartdelay, smartlog, smartnpm, smartpath, smartrequest, smartshell };