All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
adoboards unstage <files...>- new command to remove files from the staging area;unstage .clears all staged filesadoboards gen---assignee <email>,--project <path>flags; idea argument now accepts absolute paths,~/paths, relative paths, or a bare name resolved from~/.adoboards/gen/YEAR/; addedgithub-copilotas a supported AI provideradoboards clone- URL is now optional; falls back toorgUrl+projectfrom configadoboards pull---forceflag exposed in CLI entry pointmarkedadded as a runtime dependency
adoboards diff- rewritten to produce git-style unified diff output (diff --adoboards a/… b/…,---/+++headers,@@hunks) using an LCS algorithm with 3-line context; hash-based quick check skips unchanged files; origin is reconstructed from stored ADO fields viaadoToMarkdownadoboards status- redesigned with git-style section output (replaces the previouscli-table3table); change detection now uses SHA-256 hash comparison with a semantic fallback for older clones without stored hashes; staged files are deduplicated against the pending listadoboards gen- optimised prompts for epic and feature generation; hierarchy prompt now instructs the model to produce full Epic -> Feature -> Story trees with richer frontmatter fields- CLI version is now read dynamically from
package.jsoninstead of being hardcoded clonedescription updated;genhelp text extended with usage examples and idea resolution order
adoboards pull --force- DuplicatecleanedUpvariable declaration causing syntax error
adoboards pull --force- Now auto-cleans up items that exist in local refs but are no longer returned by ADO (deleted/removed online). Deletes the local file and removes the ref entry. Summary showsCleaned up: N (removed from ADO)newCountcounter fixed - new items downloaded during pull are now counted correctly
adoboards add .- Now only stages files that actually have changes (modified, new, or deleted) - likegit add .. Previously staged all 145 tracked files regardless of changes- Added
isChanged()helper: compares file hash against stored ref;id: pendingand untracked files always count as changed
- Deletion workflow - stage and push locally deleted files to remove them from ADO:
adoboards add <path>- accepts paths that no longer exist on disk if tracked in refsadoboards add .- automatically includes tracked deletions (files in refs but not on disk)adoboards push- detects staged deletions, sets state toRemovedin ADO, cleans refs- Push summary shows
Removed: N
adoboards pull --force- Unconditionally overwrites all fetched items (removedhasLocalEditsguard that was preventing reset of some files)adoboards pull --force- Addedelse if (force && hasLocalEdits)branch for files in the correct location with local edits but no remote changes - these were skipped by the previous logicadoboards pull --force- Now bypasseslastSyncfilter and fetches ALL items from ADO. Previously--forcestill used the incremental filter and only reset recently-changed itemsadoboards pull --force- Missing closing}forelseblock causingSyntaxError: Unexpected end of input
adoboards pull --force- New flag that overwrites all local edits with remote state (likegit checkout .):- Fetches all ADO items (no
sincedate filter) - Discards local edits unconditionally - no conflict files created
- Clears the staged index after running
- Summary shows
Forced: local edits discarded - Normal
pullwithout--forceis unchanged
- Fetches all ADO items (no
adoboards report- Added missingCommittedstate (was completely absent from all report logic)adoboards report- Replaced fakeDonelabel with real ADO state names (Closed,Resolved,Active,Committed,New) - each state shown individually with its own item count and pointsadoboards report- Summary rows only shown when the state has items (no empty rows)adoboards report- Attention flags no longer incorrectly flagResolveditems for missing story pointsadoboards report-findCurrentSprintnow includesCommitteditems when detecting the active sprint
adoboards push- Parent linking now works correctly: ADO relation URLs requireworkItems(capitalI) - lowercaseworkitemswas silently rejected by ADOadoboards push- Parent link errors now shown as warnings instead of being silently swallowedadoboards push(update path) - Now also callsaddParentLinkwhen updating existing items - re-pushing a story fixes a missing parent linkadoboards push- "Already linked" response from ADO is suppressed silently (safe to push multiple times)adoboards push- Removed unnecessary emptyupdateWorkItemcall at the start ofaddParentLink
- Epic fields fully mapped end-to-end:
priority-Microsoft.VSTS.Common.Priority(1=High, 2=Medium, 3=Low, 4=Very Low)complexity-Microsoft.VSTS.Common.Complexity(1–10)timeCriticality-Microsoft.VSTS.Common.TimeCriticality(1–10)- All added to mapper read/write,
FIELD_MAP, andgen-epic.mdtemplate with AI guidance
- Date parsing fixed: ADO dates like
1/1/2023 1:00 AMnow correctly converted toYYYY-MM-DDusingnew Date(val).toISOString().slice(0,10)instead of.slice(0,10)on the raw string - Date push fixed:
toAdoDate()helper convertsYYYY-MM-DDuser input to full ISO 8601 for ADO API
risk,startDate,targetDate,finishDatefields added end-to-end:mapper.js- read from ADO on pull/clone (Microsoft.VSTS.Common.Risk,Microsoft.VSTS.Scheduling.StartDate/TargetDate/FinishDate)ado.js-FIELD_MAPentries for push/updategen-feature.md- Feature getsrisk,startDate,targetDate; Story getsrisk,startDate,finishDategen-epic.md- same fields added to both Feature and Story templates- Dates stored as
YYYY-MM-DDstrings; empty""when not set
adoboards push(update path) - Rich-text fields (description,acceptanceCriteria, etc.) are now always included in updates when present - previously skipped because refs store HTML while the file has markdown, making string comparison unreliableadoboards push(update path) - Pending folders/files are now renamed to real IDs on update too (not only on create), fixing items pushed before 0.3.35
- Added
markeddependency for Markdown -> HTML conversion
adoboards push- Description, Acceptance Criteria, Repro Steps, and System Info are now converted from Markdown to HTML before sending to ADO. Previously sent as plain text causing compressed display and "We support markdown, you can convert this field" prompt in ADO web UI
adoboards push- Pending folders and files are renamed to real IDs after successful creation:FEAT-pending-slug/->FEAT-XXXXXXX-slug/(folder-based: Epic, Feature)STORY-pending-slug.md->STORY-2821854-slug.md(flat files: Story, Bug, Task)- Staged and refs paths are updated automatically to match the new names
adoboards status- Staged pending files no longer appear in the "New work items" section - once staged they only show under "Changes staged for push"
adoboards config- Now asks forYour email(stored asuserEmail) and shows it in the summary - this is used as the default assignee inadoboards genadoboards pull- Automatically refreshesuserEmailfrom ADO'sconnectionDataon every pull, keeping it in sync if company email changes. No manual update needed
adoboards status- Paths containing spaces are now wrapped in double quotes in all output sections (staged, modified, new, moved, deleted, warnings) so they can be safely copy-pasted intoadoboards add/adoboards unstage
adoboards unstage- Fixedstaged.clear is not a functioncrash -readStagedreturns an array, not a Set; unstage now uses array filtering correctly
adoboards unstage- New command to remove files from the staging areaadoboards unstage .- clears everything stagedadoboards unstage path/to/file.md- removes a specific file- Multiple files supported:
adoboards unstage file1.md file2.md
adoboards gen- Stories/Bugs/Tasks now written flat in backlog (alongside Feature folders), matching the real pulled structure. Reverted incorrect nesting inside feature folder introduced in 0.3.27adoboards push- Parent placeholder resolution updated to match flat structure:FEAT-> first feature created in this push,FEAT-1/FEAT-2-> 1-based index into features created in order. Enables correct multi-feature epic push (Epic -> Feature-1, Feature-2 -> Stories resolve by index)
adoboards gen- Stories/Bugs/Tasks are now written inside their parent Feature folder (FEAT-pending-slug/STORY-pending-slug.md) instead of the backlog root. TrackslastFeatureFolderas files are processed in order - works correctly for both--type feature(one feature + its stories) and--type epic(multiple features each with their own stories)
adoboards --version- Version is now read dynamically frompackage.jsoninstead of being hardcoded inbin/adoboards.js- was stuck at0.3.14regardless ofnpm version patchbumpsadoboards gen- Generated files now re-serialized through gray-matter so frontmatter format (especiallytags) matches pull/clone output - block list (- item) instead of inline brackets ([item1, item2]). Assignee injection also migrated to this re-serialization step (no regex replace needed)
effortfield for Features - added togen-feature.mdandgen-epic.mdprompts, mapper read (Microsoft.VSTS.Scheduling.Effort), andFIELD_MAPinado.jsso it round-trips correctly through push/pull
businessValuemissing from generated Features - added to Feature frontmatter template in bothgen-feature.mdandgen-epic.md
adoboards gen- Assignee now reliably injected into all generated files (Feature, Stories, etc.) via post-processing after AI response - AI can no longer silently outputassignee: ""when a userEmail is configured
adoboards push- Pending items in a hierarchy are now created in correct dependency order- Sorts staged pending items: Epic -> Feature -> Story/Bug/Task before pushing
- Resolves
parent: FEATplaceholder to the real ADO ID of the feature just created in the same folder - Resolves
parent: EPICplaceholder to the real ADO ID of the epic created in the same push batch - Already-tracked (non-pending) items preserve their original order
adoboards gen --type epic- Now generates full hierarchy: Epic + Features + Stories (was single Epic only)adoboards gen --type feature- Now generates Feature + Stories (was single Feature only)adoboards gen(no type /--type hierarchy) - unchanged, still generates Epic + Features + Storiesadoboards gen --type story- unchanged, still generates a single Story
adoboards gen- Feature/story body (description, acceptance criteria) no longer stripped from generated files- Root cause: multi-frontmatter split regex was splitting on the closing
---of the frontmatter, separating the body into a discarded second block - Fixed: split only when
---is followed by known YAML keys (id:,type:,title:, etc.)
- Root cause: multi-frontmatter split regex was splitting on the closing
adoboards gen- Assignee now defaults to user email (config.userEmail-> globaluserEmail-> empty)adoboards gen- Skip message now correctly reports which field is missing (type or title)adoboards clone- User email saved to global config sogencan resolve the assignee from any directory
adoboards gen --assignee <email>- Override the default assignee
adoboards gen- Idea file in current working directory now checked before~/.adoboards/gen/YEAR/
adoboards gen-CHANGELOG.mdadded to npm packagefilesfield- Removed empty dead file
src/core/differ.js
adoboards gen- Flexible idea resolution from any path- Relative paths (e.g.
./ideas/feature.md) resolve from current working directory - Absolute paths and
~/paths read file directly - Names with or without
.mdextension (no slashes) resolve from~/.adoboards/gen/YEAR/ - Plain inline text still works as before
- Resolution order documented in
--help
- Relative paths (e.g.
adoboards gen- Idea file year fallback: searches current year back 2 years so ideas written in a previous year are still found
adoboards gen- Idea file support: store elaborate ideas as markdown files instead of inline text- Names resolve from
~/.adoboards/gen/YEAR/NAME.mdautomatically --project <path>flag to rungenfrom outside an adoboards project- Falls back to global
defaultProjectPathconfig when not inside a project
- Names resolve from
adoboards config- New settingsdefaultProjectPath: set once, runadoboards genfrom anywhere- Provider-specific idea file formatting tips shown after selecting AI provider
adoboards gen --help- Extended help with idea file pattern and examples
adoboards pull- Storeparentwork item ID inrefs.jsonentries so the VS Code extension can reconstruct the original markdown correctly
adoboards status- Move detection and structural folder warnings- Files moved to a different folder now show as
movedormoved + modifiedinstead ofdeleted - Matches files by frontmatter
idagainst refs, not just by path - Shows old path -> new path with a tip to stage and push
- Detects renamed structural folders (e.g.
itnersinstead ofiterations) and warns - Exits with error if
areas/folder is missing or renamed
- Files moved to a different folder now show as
adoboards diff- Finds moved files by frontmatter ID- Previously showed "not tracked" for files moved from their original path
- Now matches by frontmatter
idagainst refs when path lookup fails
adoboards pull- Moves files back to their correct location- Scans the entire project (not just
areas/) by frontmatteridto find files wherever they are - Moved files with no local edits are overwritten with remote content at the correct path
- Moved files with local edits are moved back to the correct path with edits preserved
- Moved files with local edits AND remote changes trigger a conflict (
.remote.md) - Cleans up empty directories after moving files back
- Blocks pull if there are staged files not yet pushed (prevents accidental overwrites)
- Summary now shows
Moved backcount
- Scans the entire project (not just
adoboards add- Move warnings when staging relocated files- Shows old path -> new path when staging a file that was moved from its ref location
adoboards clone- Guardrail for nested cloning- Blocks clone if already inside an adoboards project (detects
.adoboards/in parent dirs) - New
--iteration <path>flag to filter iterations at clone time
- Blocks clone if already inside an adoboards project (detects
- Folder structure guardrails on
addandpush- Files must be under
areas/and inside abacklog/oriterations/folder - Catches misspelled folder names (e.g.
iteratoins-> "did you mean iterations?") via Levenshtein distance - Rejects files in unknown structural folders with clear error messages
- Supports nested area paths (e.g.
areas/Team/Backend/backlog/)
- Files must be under
adoboards config- New wizard optionsiterationFilter: set a root iteration path to exclude other teams' iterations (e.g.Project\TeamA)allowFolderEdits: toggle folder creation protection (default: protected)
adoboards pull- Full field comparison for local edit detection- Now checks all frontmatter fields (title, state, area, iteration, storyPoints, businessValue) and body sections (description, acceptance criteria, repro steps, system info)
- Previously only checked title and state, which caused silent overwrites of other local edits
adoboards report- Offline sprint summary from local files- Auto-detects current sprint (most Active items) or use
--sprint <name|number> - Shows progress bar, points breakdown by state, items per state
- Flags items without story points or assignee
- Overview mode shows all sprints with progress bars when no sprint specified
- No API calls - works fully offline
- Auto-detects current sprint (most Active items) or use
adoboards diff [file]- Field-level diff vs last known remote state- Compares frontmatter fields and body sections against refs.json snapshot
- Shows red (remote) / green (local) for changed fields
- Single file or all modified files
- Handles description, acceptance criteria, repro steps, system info
- New items (id: pending) show helpful message instead of error
adoboards gen <idea>- Generate work items from an idea using AI- Types: hierarchy (epic+features+stories), epic, feature, story
--parent,--area,--dir,--providerflags- Parses AI response into individual markdown files with frontmatter
adoboards optimize [path]- AI-optimize work item content- Preview mode (default) shows diff,
--applywrites changes - Improves descriptions, acceptance criteria - never modifies frontmatter
- Preview mode (default) shows diff,
adoboards plan- AI-powered sprint planning- Collects unassigned stories, distributes across sprints by capacity
- Shows capacity bar per sprint,
--applywrites iteration to files
src/api/ai.js- AI provider abstraction with prompt templating- Anthropic (Claude), OpenAI (GPT-4o), Google (Gemini), Azure OpenAI providers
{{variable}}interpolation in prompt templates
- Azure OpenAI provider - Corporate-compliant AI via your company's Azure subscription
- Uses Azure-specific API format with endpoint, deployment name, and api-version
- API key stored in KeePass as
adoboards/azure-openai-keyor env varADOBOARDS_AZURE_OPENAI_KEY - Config wizard prompts for endpoint and deployment name
- Use with
--provider azure-openaior set as default in config
- AI Persona config - Configurable role and team context for AI prompts
- Config wizard prompts for role/title and team description
- AI adapts tone and domain language to your job (not hardcoded)
- Defaults to "engineer" / "software development" if not set
adoboards new <type>- Create work items from templates without AI- Supports: epic, feature, story, bug, task
--title,--area,--iteration,--parent,--assignee,--dirflags- Auto-populates area and assignee from clone config
- Dedicated templates per type with inline comments
- File naming:
PREFIX-pending-slug.md(e.g.STORY-pending-deploy-dns.md)
-
Templates match ADO field types - each type has its own template with correct sections
- Epic/Task/Issue:
## Description - Feature/Story:
## Description+## Acceptance Criteria - Bug:
## Repro Steps+## System Info - Dedicated
bug.mdandtask.mdtemplates added
- Epic/Task/Issue:
-
adoboards push- Pre-push validation- Type-aware heading validation (e.g. Bug with
## Descriptionis flagged) - Catches typos like
## Desciptionwith "did you mean?" suggestions - Assignee format validation (must be an email)
- Better ADO API error messages for invalid assignees
- Shows valid headings per type when errors found
- Type-aware heading validation (e.g. Bug with
-
adoboards new- Auto-populates assignee from your identity (resolved during clone) -
adoboards clone- Resolves your ADO identity via connectionData API and saves email -
AI is now optional - CLI works fully without an AI provider
- Config wizard defaults to
nonefor AI provider, with clear skip guidance - README updated to clarify AI features (
gen,optimize,plan) are opt-in - Only
ado-patis required in KeePass - AI keys are optional
- Config wizard defaults to
- All commands - Now work from any subdirectory inside the project (walks up to find
.adoboards/, like git) adoboards status- No longer shows false untracked/deleted items after clone- Only scans
areas/directory (where work items live), skips templates/ and root .md files - Files without
id: pendingin non-tracked paths are silently ignored
- Only scans
adoboards add- Rejects files with errors instead of staging them- Shows clear error + fix instructions per file (missing type, id, title, etc.)
- Only valid work items are staged
adoboards clone- Improved year-filtering regex for iteration folders- Now catches patterns like
Q1 2025,Y21-A1,FY25, and year with space/dash boundaries - Previous regex only matched years bounded by path separators, missing common ADO iteration naming patterns
- Now catches patterns like
adoboards status- Show modified, staged, new (id: pending), deleted, and untracked work items- Compares local frontmatter against refs.json snapshot
- Works fully offline - no ADO API calls
adoboards add <files...>- Stage files for push- Supports individual files, directories, or
.for all markdown files - Deduplicates staged entries
- Supports individual files, directories, or
adoboards push [file]- Push work items to Azure DevOps- Creates new items (
id: pending-> POST, writes back real ID to file) - Updates existing items (PATCH only changed fields for minimal API calls)
- Parent linking via
System.LinkTypes.Hierarchy-Reverserelations - Clears staging after successful push
- Creates new items (
adoboards pull- Pull remote changes from Azure DevOps- Fetches items modified since last sync using saved filters (area, state, assignee)
- Conflict detection: local + remote changes -> writes
.remote.mdfor manual diff - Updates refs.json and lastSync timestamp
adoboards config- Interactive setup wizard with step-by-step guidance- ADO org URL and project name configuration
- Secrets backend selection (KeePass / keytar / env vars)
- KeePass
.kdbxpath configuration with entry setup instructions - Clickable links to PAT generation page and AI provider API key pages
- AI provider selection (Anthropic / OpenAI / Gemini)
- Team capacity settings (team size, velocity, sprint length)
- Direct override:
adoboards config --secrets <backend>
adoboards clone <url>- Clone ADO Boards to local markdown files- Parses project from URL (supports
dev.azure.comandvisualstudio.com) --areaflag to scope clone to a specific area path and all sub-areas- Builds full folder hierarchy:
areas/->backlog/anditerations/ - Epics, Features get their own folders; Stories/Bugs/Tasks are individual files
- Saves state to
.adoboards/config.jsonandrefs.json
- Parses project from URL (supports
src/core/secrets.js- Pluggable secrets backend- KeePass via
keepassxc-cliwith interactive master password prompt (masked input) - Master password cached per session (type once, read all secrets)
- Auto-detection of unlocked KeePassXC desktop (no prompt needed)
- Keytar (macOS Keychain / Windows Credential Manager) support
- Environment variable fallback for CI/CD
- Detailed error messages for common KeePass issues (entry not found, database locked, wrong password)
- KeePass via
src/api/ado.js- Azure DevOps REST API client- PAT-based authentication (Base64 header, key never stored)
- Areas and iterations fetch (
$depth=10) - WIQL queries with area filtering (
UNDERoperator) - Work item CRUD (get, create, update) with 200-item batch support
json-patch+jsonformat for create/update operations
src/core/mapper.js- ADO JSON to markdown conversion- Frontmatter extraction with field mapping (title, state, area, iteration, story points, t-shirt size, business value, assignee, tags, parent)
- Separate
## Descriptionand## Acceptance Criteriasections - HTML to markdown conversion for ADO rich text fields
- Hierarchy-aware file naming (
EPIC-001-slug,FEAT-012-slug,STORY-045-slug) - Parent-aware folder placement via relation links
src/core/state.js- Local state management for.adoboards/foldersrc/core/config.js- Persistent user config viaconfwith schema validation- Cross-platform
keepassxc-cliPATH setup instructions (macOS, Windows, Linux) .env.examplewith security warnings and setup instructions- Initial release of Markdown templates for Epic, Feature, and Story work items