Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions .wolf/anatomy.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# anatomy.md

> Auto-maintained by OpenWolf. Last scanned: 2026-05-30T22:11:44.072Z
> Files: 526 tracked | Anatomy hits: 0 | Misses: 0
> Auto-maintained by OpenWolf. Last scanned: 2026-05-31T14:40:06.660Z
> Files: 527 tracked | Anatomy hits: 0 | Misses: 0

## ../../../.claude/plans/

Expand Down Expand Up @@ -322,7 +322,7 @@

- `__init__.py` — Git integration utilities for DevAIFlow. (~14 tok)
- `pr_template.py` — AI-powered PR/MR template parsing and filling. (~3063 tok)
- `utils.py` — Git utilities for branch management. (~15440 tok)
- `utils.py` — Git utilities for branch management. (~15537 tok)

## devflow/github/

Expand Down Expand Up @@ -735,6 +735,7 @@
- `test_multiproject_prompt.py` — Test for multi-project session initial prompt generation. (~2569 tok)
- `test_open_command.py` — Tests for daf open command. (~23046 tok)
- `test_open_multiproject_selection.py` — Tests for multi-project selection in daf open _prompt_for_working_directory (Issue #177). (~1998 tok)
- `test_release_skill_helper.py` — create_test_repo, test_get_current_version, test_version_mismatch_detection, test_update_version (~2000 tok)
- `test_repository_selection_jira_new.py` — Tests for unified project selection used by 'daf jira new' and other commands. (~1260 tok)
- `test_repository_selection.py` — Tests for repository selection prompt in 'daf new' command (PROJ-61069). (~2576 tok)
- `test_skills_discovery.py` — Tests for skills discovery. (~3005 tok)
Expand Down
66 changes: 58 additions & 8 deletions .wolf/hooks/_session.json
Original file line number Diff line number Diff line change
@@ -1,12 +1,62 @@
{
"session_id": "session-2026-05-31-1020",
"started": "2026-05-31T14:20:50.775Z",
"files_read": {},
"files_written": [],
"edit_counts": {},
"anatomy_hits": 0,
"anatomy_misses": 0,
"repeated_reads_warned": 0,
"session_id": "session-2026-05-31-1037",
"started": "2026-05-31T14:37:29.316Z",
"files_read": {
"/Users/dvernier/.daf-sessions/ENTERPRISE.md": {
"count": 1,
"tokens": 0,
"first_read": "2026-05-31T14:37:35.685Z"
},
"/Users/dvernier/.daf-sessions/ORGANIZATION.md": {
"count": 1,
"tokens": 0,
"first_read": "2026-05-31T14:37:36.170Z"
},
"/Users/dvernier/.daf-sessions/TEAM.md": {
"count": 1,
"tokens": 0,
"first_read": "2026-05-31T14:37:36.183Z"
},
"/Users/dvernier/.daf-sessions/USER.md": {
"count": 1,
"tokens": 0,
"first_read": "2026-05-31T14:37:36.636Z"
},
"/Users/dvernier/development/devaiflow/devaiflow/devflow/cli/commands/new_command.py": {
"count": 7,
"tokens": 24373,
"first_read": "2026-05-31T14:37:52.280Z"
},
"/Users/dvernier/development/devaiflow/devaiflow/devflow/git/utils.py": {
"count": 2,
"tokens": 15440,
"first_read": "2026-05-31T14:38:36.785Z"
},
"/Users/dvernier/development/devaiflow/devaiflow/devflow/utils/backend_detection.py": {
"count": 2,
"tokens": 1809,
"first_read": "2026-05-31T14:38:49.375Z"
},
"/Users/dvernier/development/devaiflow/devaiflow/devflow/cli/commands/open_command.py": {
"count": 1,
"tokens": 48391,
"first_read": "2026-05-31T14:39:41.611Z"
}
},
"files_written": [
{
"file": "/Users/dvernier/development/devaiflow/devaiflow/devflow/git/utils.py",
"action": "edit",
"tokens": 241,
"at": "2026-05-31T14:40:06.671Z"
}
],
"edit_counts": {
"devflow/git/utils.py": 1
},
"anatomy_hits": 4,
"anatomy_misses": 4,
"repeated_reads_warned": 8,
"cerebrum_warnings": 0,
"stop_count": 1
}
17 changes: 17 additions & 0 deletions .wolf/memory.md
Original file line number Diff line number Diff line change
Expand Up @@ -742,3 +742,20 @@

| Time | Action | File(s) | Outcome | ~Tokens |
|------|--------|---------|---------|--------|

## Session: 2026-05-31 10:24

| Time | Action | File(s) | Outcome | ~Tokens |
|------|--------|---------|---------|--------|
| 10:25 | Edited tests/test_release_skill_helper.py | modified test_get_current_version() | ~108 |
| 10:26 | Edited tests/test_release_skill_helper.py | modified test_version_mismatch_detection() | ~190 |
| 10:26 | Edited tests/test_release_skill_helper.py | modified test_update_version() | ~134 |
| 10:26 | Session end: 3 writes across 1 files (test_release_skill_helper.py) | 3 reads | ~4258 tok |
| 10:27 | Session end: 3 writes across 1 files (test_release_skill_helper.py) | 3 reads | ~4258 tok |

## Session: 2026-05-31 10:37

| Time | Action | File(s) | Outcome | ~Tokens |
|------|--------|---------|---------|--------|
| 10:40 | Edited devflow/git/utils.py | modified match() | ~241 |
| 10:44 | Session end: 1 writes across 1 files (utils.py) | 8 reads | ~90254 tok |
186 changes: 178 additions & 8 deletions .wolf/token-ledger.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@
"version": 1,
"created_at": "2026-04-06T12:35:01.489Z",
"lifetime": {
"total_tokens_estimated": 991511,
"total_reads": 105,
"total_writes": 92,
"total_sessions": 101,
"anatomy_hits": 68,
"anatomy_misses": 29,
"repeated_reads_blocked": 58,
"estimated_savings_vs_bare_cli": 1017724
"total_tokens_estimated": 1090281,
"total_reads": 119,
"total_writes": 99,
"total_sessions": 103,
"anatomy_hits": 74,
"anatomy_misses": 37,
"repeated_reads_blocked": 66,
"estimated_savings_vs_bare_cli": 1182411
},
"sessions": [
{
Expand Down Expand Up @@ -1449,6 +1449,176 @@
"repeated_reads_blocked": 0,
"anatomy_lookups": 1
}
},
{
"id": "session-2026-05-31-1024",
"started": "2026-05-31T14:24:46.362Z",
"ended": "2026-05-31T14:26:25.854Z",
"reads": [
{
"file": "/Users/dvernier/development/devaiflow/devaiflow/tests/test_release_skill_helper.py",
"tokens_estimated": 0,
"was_repeated": false,
"anatomy_had_description": false
},
{
"file": "/Users/dvernier/development/devaiflow/devaiflow/release_helper.py",
"tokens_estimated": 0,
"was_repeated": false,
"anatomy_had_description": false
},
{
"file": "/Users/dvernier/development/devaiflow/devaiflow/.claude/skills/release/release_helper.py",
"tokens_estimated": 3826,
"was_repeated": false,
"anatomy_had_description": false
}
],
"writes": [
{
"file": "/Users/dvernier/development/devaiflow/devaiflow/tests/test_release_skill_helper.py",
"tokens_estimated": 108,
"action": "edit"
},
{
"file": "/Users/dvernier/development/devaiflow/devaiflow/tests/test_release_skill_helper.py",
"tokens_estimated": 190,
"action": "edit"
},
{
"file": "/Users/dvernier/development/devaiflow/devaiflow/tests/test_release_skill_helper.py",
"tokens_estimated": 134,
"action": "edit"
}
],
"totals": {
"input_tokens_estimated": 3826,
"output_tokens_estimated": 432,
"reads_count": 3,
"writes_count": 3,
"repeated_reads_blocked": 0,
"anatomy_lookups": 1
}
},
{
"id": "session-2026-05-31-1024",
"started": "2026-05-31T14:24:46.362Z",
"ended": "2026-05-31T14:27:14.236Z",
"reads": [
{
"file": "/Users/dvernier/development/devaiflow/devaiflow/tests/test_release_skill_helper.py",
"tokens_estimated": 0,
"was_repeated": false,
"anatomy_had_description": false
},
{
"file": "/Users/dvernier/development/devaiflow/devaiflow/release_helper.py",
"tokens_estimated": 0,
"was_repeated": false,
"anatomy_had_description": false
},
{
"file": "/Users/dvernier/development/devaiflow/devaiflow/.claude/skills/release/release_helper.py",
"tokens_estimated": 3826,
"was_repeated": false,
"anatomy_had_description": false
}
],
"writes": [
{
"file": "/Users/dvernier/development/devaiflow/devaiflow/tests/test_release_skill_helper.py",
"tokens_estimated": 108,
"action": "edit"
},
{
"file": "/Users/dvernier/development/devaiflow/devaiflow/tests/test_release_skill_helper.py",
"tokens_estimated": 190,
"action": "edit"
},
{
"file": "/Users/dvernier/development/devaiflow/devaiflow/tests/test_release_skill_helper.py",
"tokens_estimated": 134,
"action": "edit"
}
],
"totals": {
"input_tokens_estimated": 3826,
"output_tokens_estimated": 432,
"reads_count": 3,
"writes_count": 3,
"repeated_reads_blocked": 0,
"anatomy_lookups": 1
}
},
{
"id": "session-2026-05-31-1037",
"started": "2026-05-31T14:37:29.316Z",
"ended": "2026-05-31T14:44:08.897Z",
"reads": [
{
"file": "/Users/dvernier/.daf-sessions/ENTERPRISE.md",
"tokens_estimated": 0,
"was_repeated": false,
"anatomy_had_description": false
},
{
"file": "/Users/dvernier/.daf-sessions/ORGANIZATION.md",
"tokens_estimated": 0,
"was_repeated": false,
"anatomy_had_description": false
},
{
"file": "/Users/dvernier/.daf-sessions/TEAM.md",
"tokens_estimated": 0,
"was_repeated": false,
"anatomy_had_description": false
},
{
"file": "/Users/dvernier/.daf-sessions/USER.md",
"tokens_estimated": 0,
"was_repeated": false,
"anatomy_had_description": false
},
{
"file": "/Users/dvernier/development/devaiflow/devaiflow/devflow/cli/commands/new_command.py",
"tokens_estimated": 24373,
"was_repeated": true,
"anatomy_had_description": false
},
{
"file": "/Users/dvernier/development/devaiflow/devaiflow/devflow/git/utils.py",
"tokens_estimated": 15440,
"was_repeated": true,
"anatomy_had_description": false
},
{
"file": "/Users/dvernier/development/devaiflow/devaiflow/devflow/utils/backend_detection.py",
"tokens_estimated": 1809,
"was_repeated": true,
"anatomy_had_description": false
},
{
"file": "/Users/dvernier/development/devaiflow/devaiflow/devflow/cli/commands/open_command.py",
"tokens_estimated": 48391,
"was_repeated": false,
"anatomy_had_description": false
}
],
"writes": [
{
"file": "/Users/dvernier/development/devaiflow/devaiflow/devflow/git/utils.py",
"tokens_estimated": 241,
"action": "edit"
}
],
"totals": {
"input_tokens_estimated": 90013,
"output_tokens_estimated": 241,
"reads_count": 8,
"writes_count": 1,
"repeated_reads_blocked": 8,
"anatomy_lookups": 4
}
}
],
"daemon_usage": [],
Expand Down
12 changes: 8 additions & 4 deletions devflow/git/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -347,10 +347,14 @@ def generate_branch_name(
# For GitHub/GitLab, extract just the issue number
if backend in ["github", "gitlab"]:
# Parse formats: #123, owner/repo#123, 123
# Extract number from various formats
match = re.search(r'#?(\d+)$', issue_key)
if match:
return match.group(1) # Just the number
# Only extract if it looks like an actual issue reference,
# not an arbitrary session name that happens to end with digits
if re.match(r'^#?\d+$', issue_key) or re.match(r'^[\w.-]+/[\w.-]+#\d+$', issue_key):
match = re.search(r'#?(\d+)$', issue_key)
if match:
return match.group(1) # Just the number
# Not a recognized issue reference - use as-is (sanitized)
return GitUtils.slugify(issue_key)
# For JIRA or other backends, use lowercase issue key
return issue_key.lower()

Expand Down
Loading