From 78720214eb0d4245074bb7ebe6239a55d1225146 Mon Sep 17 00:00:00 2001 From: Ralph Khreish <35776126+Crunchyman-ralph@users.noreply.github.com> Date: Thu, 27 Nov 2025 20:30:04 +0100 Subject: [PATCH] chore: remove goham.md to add later with the slash commands PR (#1456) --- assets/rules/goham.md | 329 ------------------ src/profiles/base-profile.js | 3 +- .../hamster-rules-distribution.test.js | 53 +-- .../profiles/rule-transformer-kiro.test.js | 3 +- .../selective-profile-removal.test.js | 16 +- 5 files changed, 27 insertions(+), 377 deletions(-) delete mode 100644 assets/rules/goham.md diff --git a/assets/rules/goham.md b/assets/rules/goham.md deleted file mode 100644 index d1333b48..00000000 --- a/assets/rules/goham.md +++ /dev/null @@ -1,329 +0,0 @@ -# Start Working with Hamster Brief - -End-to-end workflow for working on tasks from a connected Hamster brief. All tasks from the brief are worked on in a single branch, with one PR created at the end. - -## Step 1: Verify Connection & Authentication - -```bash -# Check current context and authentication status -tm context -``` - -If not connected or authentication fails: -- Get brief URL from user if not available -- Connect: `tm context ` -- Refresh token if needed: `tm auth refresh` - -## Step 2: List Available Tasks - -```bash -# View all tasks from the brief -tm list -``` - -Review the task list to understand what needs to be done. Note the total number of tasks. - -## Step 3: Initialize Git Branch for Brief - -```bash -# Ensure you're on dev branch and pull latest -git checkout dev -git pull origin dev - -# Create a single branch for the entire brief (e.g., hamster-brief-YYYY-MM-DD or brief-specific name) -git checkout -b hamster-brief - -# Verify branch creation -git branch -``` - -**Note**: This branch will be used for ALL tasks in the brief. Do not create separate branches per task. - -## Step 4: Task Loop (Repeat for Each Task) - -Work through all tasks sequentially in the same branch: - -### 4.1: Read Task Details - -```bash -# Get detailed information about the task -tm show 1 - -# If task has subtasks, examine them all -tm show 1,1.1,1.2,1.3 # Adjust IDs as needed -``` - -### 4.2: Log Initial Context - -```bash -# Document task understanding and initial findings -tm update-task -i 1 --append --prompt="Starting task implementation. - -Initial context: -- Task requirements: [summarize key requirements] -- Dependencies identified: [list any dependencies] -- Files that may need modification: [list relevant files] -- Approach planned: [brief implementation approach]" -``` - -### 4.3: Mark Task as In-Progress - -```bash -# Mark task and first subtask (if exists) as in-progress -tm set-status -i 1,1.1 -s in-progress -``` - -### 4.4: Subtask Implementation Loop - -For each subtask (1.1, 1.2, 1.3, etc.): - -#### 4.4.1: Read Subtask Details -```bash -tm show 1.1 # Replace with current subtask ID -``` - -#### 4.4.2: Log Research & Context Gathering -```bash -# Document findings during implementation -tm update-task -i 1 --append --prompt="Subtask 1.1 - Context gathered: - -- Code exploration findings: [what you discovered] -- Implementation approach: [how you plan to implement] -- Key decisions made: [important choices] -- Challenges encountered: [any blockers or issues]" -``` - -#### 4.4.3: Implement Subtask -- Write code following the subtask requirements -- Make necessary changes to files - -#### 4.4.4: Quality Verification -```bash -# Run linting -pnpm lint - -# Run type checking -pnpm typecheck - -# If either fails, fix issues and re-run until both pass -``` - -#### 4.4.5: CodeRabbit Review -```bash -# Generate code review (wait for plain text results) -coderabbit --prompt-only - -# Review the output and address any critical issues if needed -``` - -#### 4.4.6: Log Implementation Completion -```bash -# Document what was completed -tm update-task -i 1 --append --prompt="Subtask 1.1 - Implementation complete: - -- Files modified: [list files changed] -- Key changes: [summary of implementation] -- CodeRabbit feedback addressed: [if any issues were fixed] -- Ready for commit" -``` - -#### 4.4.7: Commit Subtask Work -```bash -# Stage changes -git add . - -# Commit with detailed message following git_workflow.mdc format -git commit -m "feat(task-1): Complete subtask 1.1 - [Subtask Title] - -- Implementation details -- Key changes made -- Files modified: [list files] -- CodeRabbit review completed - -Subtask 1.1: [Brief description of what was accomplished] -Relates to Task 1: [Main task title]" -``` - -#### 4.4.8: Mark Subtask as Done -```bash -tm set-status -i 1.1 -s done -``` - -#### 4.4.9: Move to Next Subtask -Repeat steps 4.4.1 through 4.4.8 for the next subtask (1.2, 1.3, etc.) - -### 4.5: Complete Parent Task - -After all subtasks are complete: - -#### 4.5.1: Final Quality Checks -```bash -# Final linting -pnpm lint - -# Final type checking -pnpm typecheck - -# Final CodeRabbit review -coderabbit --prompt-only - -# Address any remaining issues if critical -``` - -#### 4.5.2: Log Task Completion -```bash -# Document final task completion -tm update-task -i 1 --append --prompt="Task 1 - Complete: - -- All subtasks completed: [list all subtasks] -- Final verification passed: lint, typecheck, CodeRabbit review -- Files changed: [comprehensive list] -- Committed to brief branch" -``` - -#### 4.5.3: Mark Parent Task as Done -```bash -tm set-status -i 1 -s done -``` - -**Note**: Do NOT push or create PR yet. Continue to next task in the same branch. - -### 4.6: Move to Next Task - -```bash -# Verify remaining tasks -tm list - -# Continue with next task (e.g., Task 2) -# Repeat steps 4.1 through 4.5 for Task 2, then Task 3, etc. -``` - -## Step 5: Complete All Tasks - -Continue working through all tasks (Steps 4.1-4.6) until all tasks in the brief are complete. All work is committed to the same `hamster-brief` branch. - -## Step 6: Final Verification & PR Creation - -After ALL tasks are complete: - -### 6.1: Verify All Tasks Complete -```bash -# Verify all tasks are done -tm list - -# Should show all tasks with status 'done' -``` - -### 6.2: Final Quality Checks -```bash -# Final comprehensive checks -pnpm lint -pnpm typecheck -coderabbit --prompt-only - -# Address any remaining issues if critical -``` - -### 6.3: Push Branch -```bash -# Push the brief branch to remote -git push origin hamster-brief -``` - -### 6.4: Create Pull Request to Dev -```bash -# Get all task titles (adjust task IDs as needed) -# Create comprehensive PR description - -gh pr create \ - --base dev \ - --title "Hamster Brief: Complete Implementation" \ - --body "## Brief Overview -Completed all tasks from Hamster brief. - -## Tasks Completed -- [x] Task 1: [Task 1 title] - - Subtasks: 1.1, 1.2, 1.3 -- [x] Task 2: [Task 2 title] - - Subtasks: 2.1, 2.2 -- [x] Task 3: [Task 3 title] - - [Continue listing all tasks] - -## Implementation Summary -- Total tasks: [number] -- Total subtasks: [number] -- Files modified: [comprehensive list] -- All quality checks passed - -## Quality Checks -- ✅ Linting passed (pnpm lint) -- ✅ Type checking passed (pnpm typecheck) -- ✅ CodeRabbit review completed for all changes - -## Testing -- [ ] Manual testing completed -- [ ] All checks passing - -Complete implementation of Hamster brief tasks" -``` - -## Step 7: Cleanup - -```bash -# After PR is merged, switch back to dev -git checkout dev -git pull origin dev - -# Delete local branch (optional) -git branch -d hamster-brief -``` - -## Important Notes - -- **Use ONLY**: `tm list`, `tm show `, `tm set-status`, `tm update-task`, `tm auth refresh`, `tm context ` -- **DON'T use MCP tools** - not compatible with Hamster integration -- **Single branch per brief**: All tasks work in the same branch (`hamster-brief`) -- **Single PR per brief**: One PR created after all tasks are complete -- **Always target dev branch** - never main branch -- **Regular logging**: Use `tm update-task -i --append` frequently to document: - - Context gathered during exploration - - Implementation decisions made - - Challenges encountered - - Completion status -- **Quality gates**: Never skip lint, typecheck, or CodeRabbit review -- **Commit format**: Follow git_workflow.mdc commit message standards -- **PR format**: Always use `--base dev` when creating PRs - -## Workflow Summary - -``` -1. Verify connection → tm context -2. List tasks → tm list -3. Create single branch → git checkout -b hamster-brief -4. For each task (in same branch): - a. Read task → tm show X - b. Log context → tm update-task -i X --append - c. Mark in-progress → tm set-status -i X,X.Y -s in-progress - d. For each subtask: - - Read → tm show X.Y - - Log context → tm update-task -i X --append - - Implement code - - Verify → pnpm lint && pnpm typecheck - - Review → coderabbit --prompt-only - - Log completion → tm update-task -i X --append - - Commit → git commit (following git_workflow.mdc format) - - Mark done → tm set-status -i X.Y -s done - e. Final checks → pnpm lint && pnpm typecheck && coderabbit --prompt-only - f. Log completion → tm update-task -i X --append - g. Mark task done → tm set-status -i X -s done - h. Continue to next task (same branch) -5. After ALL tasks complete: - a. Final verification → pnpm lint && pnpm typecheck && coderabbit --prompt-only - b. Push branch → git push origin hamster-brief - c. Create PR → gh pr create --base dev -``` - -## References - -- Full guidelines: [hamster.mdc](mdc:.cursor/rules/hamster.mdc) -- Git workflow: [git_workflow.mdc](mdc:.cursor/rules/git_workflow.mdc) diff --git a/src/profiles/base-profile.js b/src/profiles/base-profile.js index 9de69cd0..4544e76a 100644 --- a/src/profiles/base-profile.js +++ b/src/profiles/base-profile.js @@ -58,8 +58,7 @@ export function createProfile(editorConfig) { 'rules/dev_workflow.mdc': `${taskmasterPrefix}dev_workflow${targetExtension}`, 'rules/self_improve.mdc': `self_improve${targetExtension}`, 'rules/taskmaster.mdc': `${taskmasterPrefix}taskmaster${targetExtension}`, - 'rules/hamster.mdc': `${taskmasterPrefix}hamster${targetExtension}`, - 'rules/goham.md': `${taskmasterPrefix}goham${targetExtension}` + 'rules/hamster.mdc': `${taskmasterPrefix}hamster${targetExtension}` }; // Build final fileMap - merge defaults with custom entries when includeDefaultRules is true diff --git a/tests/integration/profiles/hamster-rules-distribution.test.js b/tests/integration/profiles/hamster-rules-distribution.test.js index d03c4951..c76f6a41 100644 --- a/tests/integration/profiles/hamster-rules-distribution.test.js +++ b/tests/integration/profiles/hamster-rules-distribution.test.js @@ -8,7 +8,7 @@ import * as profilesModule from '../../../src/profiles/index.js'; /** * Integration tests for hamster rules distribution across all profiles. * - * These tests verify that hamster.mdc and goham.md are correctly distributed + * These tests verify that hamster.mdc is correctly distributed * to all profiles that include default rules when running `rules add`. */ describe('Hamster Rules Distribution', () => { @@ -29,21 +29,17 @@ describe('Hamster Rules Distribution', () => { (p) => !PROFILES_WITHOUT_DEFAULT_RULES.includes(p) ); - // Get expected hamster file paths by reading from the actual profile object - const getExpectedHamsterPaths = (profileName, tempDir) => { + // Get expected hamster file path by reading from the actual profile object + const getExpectedHamsterPath = (profileName, tempDir) => { const profile = profilesModule[`${profileName}Profile`]; if (!profile || !profile.fileMap) return null; const rulesDir = profile.rulesDir; const hamsterTarget = profile.fileMap['rules/hamster.mdc']; - const gohamTarget = profile.fileMap['rules/goham.md']; - if (!hamsterTarget || !gohamTarget) return null; + if (!hamsterTarget) return null; - return { - hamster: path.join(tempDir, rulesDir, hamsterTarget), - goham: path.join(tempDir, rulesDir, gohamTarget) - }; + return path.join(tempDir, rulesDir, hamsterTarget); }; describe('Source files exist', () => { @@ -57,11 +53,6 @@ describe('Hamster Rules Distribution', () => { expect(fs.existsSync(hamsterPath)).toBe(true); }); - test('goham.md exists in assets/rules', () => { - const gohamPath = path.join(process.cwd(), 'assets', 'rules', 'goham.md'); - expect(fs.existsSync(gohamPath)).toBe(true); - }); - test('hamster.mdc has correct frontmatter', () => { const hamsterPath = path.join( process.cwd(), @@ -78,7 +69,7 @@ describe('Hamster Rules Distribution', () => { }); }); - describe('Rules add command distributes hamster files', () => { + describe('Rules add command distributes hamster file', () => { // Test each profile that should receive hamster rules PROFILES_WITH_DEFAULT_RULES.forEach((profile) => { test(`${profile} profile receives hamster rules via 'rules add'`, () => { @@ -95,30 +86,20 @@ describe('Hamster Rules Distribution', () => { env: { ...process.env, TASKMASTER_LOG_LEVEL: 'error' } }); - // Get expected paths for this profile - const expectedPaths = getExpectedHamsterPaths(profile, tempDir); + // Get expected path for this profile + const expectedPath = getExpectedHamsterPath(profile, tempDir); - if (expectedPaths) { - // Verify hamster.* file exists - expect(fs.existsSync(expectedPaths.hamster)).toBe(true); + // Strictly enforce that all profiles with default rules must have hamster mapping + expect(expectedPath).not.toBeNull(); - // Verify goham.* file exists - expect(fs.existsSync(expectedPaths.goham)).toBe(true); + // Verify hamster.* file exists + expect(fs.existsSync(expectedPath)).toBe(true); - // Verify hamster file contains expected content - const hamsterContent = fs.readFileSync( - expectedPaths.hamster, - 'utf8' - ); - expect(hamsterContent).toContain('Hamster Integration Workflow'); - expect(hamsterContent).toContain('tm list'); - expect(hamsterContent).toContain('tm set-status'); - - // Verify goham file contains expected content - const gohamContent = fs.readFileSync(expectedPaths.goham, 'utf8'); - expect(gohamContent).toContain('Start Working with Hamster Brief'); - expect(gohamContent).toContain('tm context'); - } + // Verify hamster file contains expected content + const hamsterContent = fs.readFileSync(expectedPath, 'utf8'); + expect(hamsterContent).toContain('Hamster Integration Workflow'); + expect(hamsterContent).toContain('tm list'); + expect(hamsterContent).toContain('tm set-status'); } finally { // Cleanup temp directory fs.rmSync(tempDir, { recursive: true, force: true }); diff --git a/tests/unit/profiles/rule-transformer-kiro.test.js b/tests/unit/profiles/rule-transformer-kiro.test.js index 137f681c..9c39a11d 100644 --- a/tests/unit/profiles/rule-transformer-kiro.test.js +++ b/tests/unit/profiles/rule-transformer-kiro.test.js @@ -220,8 +220,7 @@ Use the .mdc extension for all rule files.`; 'rules/self_improve.mdc': 'self_improve.md', 'rules/taskmaster.mdc': 'taskmaster.md', 'rules/taskmaster_hooks_workflow.mdc': 'taskmaster_hooks_workflow.md', - 'rules/hamster.mdc': 'hamster.md', - 'rules/goham.md': 'goham.md' + 'rules/hamster.mdc': 'hamster.md' }); }); diff --git a/tests/unit/profiles/selective-profile-removal.test.js b/tests/unit/profiles/selective-profile-removal.test.js index ece8625e..ba7945ef 100644 --- a/tests/unit/profiles/selective-profile-removal.test.js +++ b/tests/unit/profiles/selective-profile-removal.test.js @@ -116,8 +116,7 @@ describe('Selective Rules Removal', () => { .mockReturnValueOnce([ 'dev_workflow.mdc', // Task Master file in subdirectory 'taskmaster.mdc', // Task Master file in subdirectory - 'hamster.mdc', // Task Master file in subdirectory - 'goham.mdc' // Task Master file in subdirectory + 'hamster.mdc' // Task Master file in subdirectory ]) // Third call - check remaining files after removal .mockReturnValueOnce([ @@ -140,8 +139,7 @@ describe('Selective Rules Removal', () => { 'taskmaster/dev_workflow.mdc', 'self_improve.mdc', 'taskmaster/taskmaster.mdc', - 'taskmaster/hamster.mdc', - 'taskmaster/goham.mdc' + 'taskmaster/hamster.mdc' ]); expect(result.notice).toContain('Preserved 2 existing rule files'); @@ -172,6 +170,10 @@ describe('Selective Rules Removal', () => { path.join(projectRoot, '.cursor/rules/taskmaster/taskmaster.mdc'), { force: true } ); + expect(mockRmSync).toHaveBeenCalledWith( + path.join(projectRoot, '.cursor/rules/taskmaster/hamster.mdc'), + { force: true } + ); // Verify rules directory was NOT removed (still has other files) expect(mockRmSync).not.toHaveBeenCalledWith( @@ -221,8 +223,7 @@ describe('Selective Rules Removal', () => { .mockReturnValueOnce([ 'dev_workflow.mdc', 'taskmaster.mdc', - 'hamster.mdc', - 'goham.mdc' + 'hamster.mdc' ]) // Third call - check remaining files after removal (should be empty) .mockReturnValueOnce([]) // Empty after removal @@ -237,8 +238,7 @@ describe('Selective Rules Removal', () => { 'taskmaster/dev_workflow.mdc', 'self_improve.mdc', 'taskmaster/taskmaster.mdc', - 'taskmaster/hamster.mdc', - 'taskmaster/goham.mdc' + 'taskmaster/hamster.mdc' ]); // The function may fail due to directory reading issues in the test environment,