chore: remove goham.md to add later with the slash commands PR (#1456)

This commit is contained in:
Ralph Khreish
2025-11-27 20:30:04 +01:00
committed by GitHub
parent e8802ffc76
commit 78720214eb
5 changed files with 27 additions and 377 deletions

View File

@@ -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 <brief url>`
- 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 <id>`, `tm set-status`, `tm update-task`, `tm auth refresh`, `tm context <brief url>`
- **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 <id> --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)

View File

@@ -58,8 +58,7 @@ export function createProfile(editorConfig) {
'rules/dev_workflow.mdc': `${taskmasterPrefix}dev_workflow${targetExtension}`, 'rules/dev_workflow.mdc': `${taskmasterPrefix}dev_workflow${targetExtension}`,
'rules/self_improve.mdc': `self_improve${targetExtension}`, 'rules/self_improve.mdc': `self_improve${targetExtension}`,
'rules/taskmaster.mdc': `${taskmasterPrefix}taskmaster${targetExtension}`, 'rules/taskmaster.mdc': `${taskmasterPrefix}taskmaster${targetExtension}`,
'rules/hamster.mdc': `${taskmasterPrefix}hamster${targetExtension}`, 'rules/hamster.mdc': `${taskmasterPrefix}hamster${targetExtension}`
'rules/goham.md': `${taskmasterPrefix}goham${targetExtension}`
}; };
// Build final fileMap - merge defaults with custom entries when includeDefaultRules is true // Build final fileMap - merge defaults with custom entries when includeDefaultRules is true

View File

@@ -8,7 +8,7 @@ import * as profilesModule from '../../../src/profiles/index.js';
/** /**
* Integration tests for hamster rules distribution across all profiles. * 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`. * to all profiles that include default rules when running `rules add`.
*/ */
describe('Hamster Rules Distribution', () => { describe('Hamster Rules Distribution', () => {
@@ -29,21 +29,17 @@ describe('Hamster Rules Distribution', () => {
(p) => !PROFILES_WITHOUT_DEFAULT_RULES.includes(p) (p) => !PROFILES_WITHOUT_DEFAULT_RULES.includes(p)
); );
// Get expected hamster file paths by reading from the actual profile object // Get expected hamster file path by reading from the actual profile object
const getExpectedHamsterPaths = (profileName, tempDir) => { const getExpectedHamsterPath = (profileName, tempDir) => {
const profile = profilesModule[`${profileName}Profile`]; const profile = profilesModule[`${profileName}Profile`];
if (!profile || !profile.fileMap) return null; if (!profile || !profile.fileMap) return null;
const rulesDir = profile.rulesDir; const rulesDir = profile.rulesDir;
const hamsterTarget = profile.fileMap['rules/hamster.mdc']; const hamsterTarget = profile.fileMap['rules/hamster.mdc'];
const gohamTarget = profile.fileMap['rules/goham.md'];
if (!hamsterTarget || !gohamTarget) return null; if (!hamsterTarget) return null;
return { return path.join(tempDir, rulesDir, hamsterTarget);
hamster: path.join(tempDir, rulesDir, hamsterTarget),
goham: path.join(tempDir, rulesDir, gohamTarget)
};
}; };
describe('Source files exist', () => { describe('Source files exist', () => {
@@ -57,11 +53,6 @@ describe('Hamster Rules Distribution', () => {
expect(fs.existsSync(hamsterPath)).toBe(true); 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', () => { test('hamster.mdc has correct frontmatter', () => {
const hamsterPath = path.join( const hamsterPath = path.join(
process.cwd(), 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 // Test each profile that should receive hamster rules
PROFILES_WITH_DEFAULT_RULES.forEach((profile) => { PROFILES_WITH_DEFAULT_RULES.forEach((profile) => {
test(`${profile} profile receives hamster rules via 'rules add'`, () => { test(`${profile} profile receives hamster rules via 'rules add'`, () => {
@@ -95,30 +86,20 @@ describe('Hamster Rules Distribution', () => {
env: { ...process.env, TASKMASTER_LOG_LEVEL: 'error' } env: { ...process.env, TASKMASTER_LOG_LEVEL: 'error' }
}); });
// Get expected paths for this profile // Get expected path for this profile
const expectedPaths = getExpectedHamsterPaths(profile, tempDir); const expectedPath = getExpectedHamsterPath(profile, tempDir);
if (expectedPaths) { // Strictly enforce that all profiles with default rules must have hamster mapping
// Verify hamster.* file exists expect(expectedPath).not.toBeNull();
expect(fs.existsSync(expectedPaths.hamster)).toBe(true);
// Verify goham.* file exists // Verify hamster.* file exists
expect(fs.existsSync(expectedPaths.goham)).toBe(true); expect(fs.existsSync(expectedPath)).toBe(true);
// Verify hamster file contains expected content // Verify hamster file contains expected content
const hamsterContent = fs.readFileSync( const hamsterContent = fs.readFileSync(expectedPath, 'utf8');
expectedPaths.hamster, expect(hamsterContent).toContain('Hamster Integration Workflow');
'utf8' expect(hamsterContent).toContain('tm list');
); expect(hamsterContent).toContain('tm set-status');
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');
}
} finally { } finally {
// Cleanup temp directory // Cleanup temp directory
fs.rmSync(tempDir, { recursive: true, force: true }); fs.rmSync(tempDir, { recursive: true, force: true });

View File

@@ -220,8 +220,7 @@ Use the .mdc extension for all rule files.`;
'rules/self_improve.mdc': 'self_improve.md', 'rules/self_improve.mdc': 'self_improve.md',
'rules/taskmaster.mdc': 'taskmaster.md', 'rules/taskmaster.mdc': 'taskmaster.md',
'rules/taskmaster_hooks_workflow.mdc': 'taskmaster_hooks_workflow.md', 'rules/taskmaster_hooks_workflow.mdc': 'taskmaster_hooks_workflow.md',
'rules/hamster.mdc': 'hamster.md', 'rules/hamster.mdc': 'hamster.md'
'rules/goham.md': 'goham.md'
}); });
}); });

View File

@@ -116,8 +116,7 @@ describe('Selective Rules Removal', () => {
.mockReturnValueOnce([ .mockReturnValueOnce([
'dev_workflow.mdc', // Task Master file in subdirectory 'dev_workflow.mdc', // Task Master file in subdirectory
'taskmaster.mdc', // Task Master file in subdirectory 'taskmaster.mdc', // Task Master file in subdirectory
'hamster.mdc', // Task Master file in subdirectory 'hamster.mdc' // Task Master file in subdirectory
'goham.mdc' // Task Master file in subdirectory
]) ])
// Third call - check remaining files after removal // Third call - check remaining files after removal
.mockReturnValueOnce([ .mockReturnValueOnce([
@@ -140,8 +139,7 @@ describe('Selective Rules Removal', () => {
'taskmaster/dev_workflow.mdc', 'taskmaster/dev_workflow.mdc',
'self_improve.mdc', 'self_improve.mdc',
'taskmaster/taskmaster.mdc', 'taskmaster/taskmaster.mdc',
'taskmaster/hamster.mdc', 'taskmaster/hamster.mdc'
'taskmaster/goham.mdc'
]); ]);
expect(result.notice).toContain('Preserved 2 existing rule files'); 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'), path.join(projectRoot, '.cursor/rules/taskmaster/taskmaster.mdc'),
{ force: true } { 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) // Verify rules directory was NOT removed (still has other files)
expect(mockRmSync).not.toHaveBeenCalledWith( expect(mockRmSync).not.toHaveBeenCalledWith(
@@ -221,8 +223,7 @@ describe('Selective Rules Removal', () => {
.mockReturnValueOnce([ .mockReturnValueOnce([
'dev_workflow.mdc', 'dev_workflow.mdc',
'taskmaster.mdc', 'taskmaster.mdc',
'hamster.mdc', 'hamster.mdc'
'goham.mdc'
]) ])
// Third call - check remaining files after removal (should be empty) // Third call - check remaining files after removal (should be empty)
.mockReturnValueOnce([]) // Empty after removal .mockReturnValueOnce([]) // Empty after removal
@@ -237,8 +238,7 @@ describe('Selective Rules Removal', () => {
'taskmaster/dev_workflow.mdc', 'taskmaster/dev_workflow.mdc',
'self_improve.mdc', 'self_improve.mdc',
'taskmaster/taskmaster.mdc', 'taskmaster/taskmaster.mdc',
'taskmaster/hamster.mdc', 'taskmaster/hamster.mdc'
'taskmaster/goham.mdc'
]); ]);
// The function may fail due to directory reading issues in the test environment, // The function may fail due to directory reading issues in the test environment,