Code Monkey home page Code Monkey logo

wbs_markdown's Introduction

WBS Markdown

WBS Markdown is an NPM package designed to make it easier for software developers to create and manage a Work Breakdown Structure (WBS). A WBS can be a powerful tool in the estimation process. This is fully compatible with an Agile workflow.

Purpose

This tool is designed to be used by a software developer and assumes you are skilled at editing text files (markdown specifically). The breakdown structure is managed in a Markdown file format which you are probably already familiar with. Using your favorite editor you can collapse regions, perform mass updates, re-structure, and more.

The generated report is a static HTML file. It uses Vue.js components to add some interactive features.

Examples

Example reports that show different ways of using the WBS Markdown tool. These are the rendered static HTML reports that are created from a markdown file.

  • Bicycle Product Sample - Markdown file Example shows the breakdown of a the creation of a new bicycle product. This is an adaptation from an example given on the WBS Wikipedia page.
  • Rails Commerce Project - Markdown file Example shows a simple/small Rails e-Commerce project with a detailed breakdown of a new "Forgot my password" feature. This is a "high level of detail" breakdown and is an example of what that may look like. Remember, you choose the appropriate Level of Detail for your immediate need.

Background

How many times have you estimated a new feature and you ended up being way off? Yeah, I've been there too many times myself. Management and Project Managers need some idea of the amount of work something will be. This helps me give a better estimate so I don't forget parts of the system that are impacted by a change.

As we continue to build out the features and the product, the project file is checked in with our source code so it is shared and expanded to represent the code being created.

An additional benefit, I wanted to be able to track the progress of features being built. This allows for marking off tasks as being completed (which can be checked in with the implementing code). Since the report output is a static HTML file, a project build system can generate the report for what is committed on, say, the master branch and expose feature progress in that way as well.

I created this tool for myself and my team. I share it in the hopes it can help others as well.

Installation

Using npm:

npm install -g wbs-markdown

Using yarn: (NOTE: Installation using yarn currently doesn't work and is a known issue. The workaround for now is to install using npm.)

yarn global add wbs-markdown

Upgrading to a newer version:

yarn global upgrade wbs-markdown

Getting Started

Quick Start

These are the commands use:

  • wbsm init - One-time setup for a directory. Creates a configuration file.
  • wbsm new - Creates a new wbs.project.md markdown file.
  • wbsm r - Generates an HTML report from the default wbs.project.md file.
  • wbsm w - Watch for changes to the wbs.project.md file and auto-generate the HTML report.
  • wbsm o - Open the generated report in your default browser.

Initialize a new project configuration

wbsm init

This will create a file named .wbsm-config.json in your current working directory.

This is a sample configuration file:

{
  "reportTitle": "WBSM Project Report",
  "defaultWorkUnit": "d",
  "unitConversion": {
    "h": 1,
    "d": 6,
    "w": 30,
    "m": 120
  },
  "avgHoursPerDay": 4.5,
  "workUnitConfidencePct": {
    "h": 95,
    "d": 80,
    "w": 60,
    "m": 30
  }
}

Create New Markdown Project File

Create a new project markdown file. This file can be checked in with the sourcecode of your project.

wbsm new

Optionally specify the name of the new file to create. Defaults to wbs.project.md.

wbsm new wbs.my-project.md

This is helpful for generating the report explicitly when you want. For instance, a CI server could generate the report file based on a git hook commit to master.

Generate a Report

Basic version. Defaults to look for a markdown file titled wbs.project.md.

wbsm report
wbsm r

You can generate a report from a specifically named file using the -m flag and the filename.

wbsm report -m wbs.my-project.md
wbsm r -m wbs.my-project.md

You can override the generated HTML report output filename using the -r flag and the filename.

wbsm report -r custom-report-name.html
wbsm r -r custom-report-name.html

After generating the report, open it in the default system browser using the -o flag.

wbsm report --open
wbsm r -o

Watch for Changes and Auto-Generate Report

Basic version. Defaults to look for a markdown file titled wbs.project.md.

wbsm watch
wbsm w

This uses the same command options as wbsm report. You can override the markdown file to use and the output file to generate.

This is helpful when you are working on your project file and keep switching back to the report.

Get CLI Help

wbsm --help
wbsm new --help
wbsm report --help
wbsm watch --help
wbsm open --help

Upgrade Notes

If upgrading from a pre-1.0 version, you will want to add the "filter" component to your project file. This became a component which lets you customize the default display mode and the placement of the filter selection in your report.

Usage

The document uses a Markdown style. Anything you can create in Markdown is valid. This makes it easy to customize and create something that works and makes sense for your project and organization.

Components

There are a number of "components" to use for helping to get the most out of building a Work Breakdown Structure in Markdown.

Story Item

There are several valid ways to define a story item.

- Story description {story=StoryId}
- **StoryId**: Story description {story=StoryId}
- **StoryId**: Story description {story=StoryId group="Group Name"}

The first one is minimum for a Story. A story can optionally be linked to a group. The bold StoryId is just to help with usability in reading and interacting with the document.

Examples

- **ISSUE-123**: New Billing Integration Service  {story="ISSUE-123"}
- **[ISSUE-123](https://example.com/issue-link/ISSUE-123)**: New Billing Integration Service  {story="ISSUE-123"}

Remember that it is just Markdown, so it can contain links to external issue trackers or anything relevant.

Work Item

The work item is the heart of the document.

- [ ] Item description {work=1d link=987}
- [x] Item description {work=1h link=987 actual=1.5h note="note to self"}

Attributes:

  • [ ] - work item is incomplete
  • [x] - work item is complete
  • {link=(story)} - links a work item to a specific story
  • {work=(duration)} - estimated duration to complete. The more specific the estimate, the higher the confidence. There is higher confidence in 5d than in 1w.
    • Expressed as unit and time. Examples: 1d, 2.5h, 0.5w
      • Supported values:
        • h - hours
        • d - days
        • w - weeks
        • m - months
  • {actual=(duration)} - (optional) actual time required to complete (for personal documentation)
  • {confidence=(value)} - (optional) explicitly set the confidence for the work estimate. A default confidence percent is used based on the time used. An hour long estimate has a higher confidence value than a week long one.
  • {note="Text"} - (optional) note to associate with the work item. A note is visible on the rendered report on a work item through a "note" icon. It is also exposed in the "table" component's display of work items. Ex: {note="forgotten"}
  • {new=true} - (optional) explicitly signal that something in the project structure should be treated as "new" when filtering, even though it isn't a work item that is directly estimated. It can be added at the top-level "new" item and all contained child items will be hidden when switched to the "Existing Structure Only" filter view.

NOTE: Must be nested under a non work item.

Example:

- BillingSystem
  - Integrations
    - [ ] Quickbooks Online {work=1m link=987}
  - Email Templates
    - [x] Quickbooks Integration communication problem {work=2h link=987}

Filter Display

Displays a Filter radio group for changing the current filter or mode of the display.

The selection for the filter is written to the browsers local storage so it will remain the through a browser refresh.

filter {#display-filter}

Style Display Options

Displays a button that toggles the options that affect the style of the Work Breakdown Structure.

style {#display-style}
Options
  • Numbering - Uses the traditional WBS numbering style for the list. Traditional numbering uses an outline style like "1.1.1.2"
  • Bullets - Uses a bullet list for the WBS list.
  • Show colored deliverable checks - Work items appear with a "checkbox". This option determines if they are colored or not.
  • Show progress - Shows progress bars at the parent level for work items. It is cumulative for all work items nested under it.
  • Show totals - Display the computed work totals on the WBS or not.

Level of Detail Display

Displays a list of buttons for toggling the "Level of Detail" shown in the WBS. Helpful for "zooming out" to a higher level, then drilling down into a specific area to explore.

level {#detail-level}

Story Chart

Creates a chart that shows each story's work size, amount completed and optionally actual time spent.

chart {#stories-chart}

When stories are toggled on/off, they are included or removed from the chart.

Story Toggle

Creates a toggle link. Helpful for flipping the inclusion of a story. If you want to focus on 1 or 2 stories, you can toggle all of them off and just turn on the ones you wish to focus on.

toggle {#stories-toggle}

Story Totals

Creates a component that totals all the selected stories. Optionally it can be linked to a specific group. This is effectively a sub-total then. When no group link is set, it gives the total for all the checked stories.

totals {#stories-total}
totals {#stories-total group="Phase 1"}

Story Table

Generates a table with all the work items' details in an easy to access way.

table {#stories-table}

This helps get data out and easily copied into a spreadsheet or other system. When a developer is working on measuring their ability to improve at estimate accuracy over time, they need data. This helps collect that data for personal use.

This also exposes any "notes" on a work-item that otherwise aren't displayed.

Troubleshooting

Error notice about local storage

Google Chrome and Chromium

Settings > Search "content settings" > Content Settings > Cookies.

If you want to continue to "Block third-party cookies", then you can add an exception to allow access for local storage to specific files or all local HTML files. The following is a sample allow filter for all HTML pages that are loaded from your local machine.

file:///*

Features

  • Multiple chart options. A total/initial chart (where confidence represents what it was initially) and one that is "remaining".
  • Compute the confidence in the work that remains.
  • Give estimate on when the work might be completed based on previous estimates that are marked done.
  • Report more on estimated vs actual (where recorded)
  • For work marked done where no "actual" was entered, use the work value? Helps keep the "actual" line moving more correctly.

wbs_markdown's People

Contributors

brainlid avatar kensnyder avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

wbs_markdown's Issues

"totals" when has no group should display "Grand Total"

The "totals" component supports the "group" attribute. It would be helpful to display either group total or an overall total differently.

Perhaps when there is no group, display it as "Overall Total" or "Grand Total" or something.

Perhaps change the text to be "Group Total" for when used with a group? A hover "title" could be the group name.

Feature Request: Add CommandLine Option to pull Statistics from Graphs for subsequent usage

The idea here is that while the report html files are useful, sometimes an aggregate report of all projects is needed with simply "project name: percent progress" (and maybe other details, but simply this is the concept). So we would like a way to basically use the command line to generate that config for all the projects in a list of subdirectories (or specified) and then have the command line spit out (heres all those projects summary high level, with links to the sub reports for more granular details). the links to sub reports would just be the html files that get generated.

This is helpful so that we can track all our projects, but then also easily email a summary report for senior leadership

Windows 10: loader error

When attempting to run on Windows 10 I get the following error:

internal/modules/cjs/loader.js:626
throw err;

when running "wbsm init" the error detail is along the lines of can't fine file /index.wbsm-init.js
when running "wbsm report" the error detail is along the lines of can't fine file /index.wbsm-report.js
however I noticed that directly running

node .../lib/wbsm-init.js works. Same for /lib/wbsm-report.js

I tried renaming "index.wbsm.js" to "wbsm.js" and now behavior matches the documentation. works rather nicely

npm version
{
npm: '6.9.0',
ares: '1.15.0',
brotli: '1.0.7',
cldr: '35.1',
http_parser: '2.8.0',
icu: '64.2',
llhttp: '1.1.3',
modules: '72',
napi: '4',
nghttp2: '1.38.0',
node: '12.3.1',
openssl: '1.1.1b',
tz: '2019a',
unicode: '12.1',
uv: '1.29.1',
v8: '7.4.288.27-node.18',
zlib: '1.2.11'
}
hope this information is helpful I'm fairly new to node, but really interested in your tool

Feature Request: Regex of Markdown Files for the wbms report commandline

I have 1 template that says "here is the .wbsm-config.json for all my projects", and then each project has details. I'd like to run wbsm report -m *.md, so that all markdown files get a report generated for them in the same naming schema as with normal usage. This way though I can just run 1 command to generate them all.

The other use case is to point the utility towards a whole directory and say "all .md files in these subfolders need a report generated", this would be a regex pattern like something like "**/*.md"

"Level of Detail" component

Create new component for quickly changing the displayed level of detail in the WBS map. It will collapse the items below the desired level.

using `wbsm w` to watch and re-build reports is broken

Recently, the ability to watch a project file and auto-generate the report broke. There are no errors immediately evident. The re-generated report file has content but displays as blank.

The breakage appears to be when using a newer version of node or with updated dependencies. There were not code changes to wbsm that broke it.

The short-term workaround is to use wbsm r to generate the report. That works correctly.

"Traditional mode" that displays hierarchy using official WBS numbering structure

Requires a change to the "filter" component. Really, turns it into a "mode" component.

A "traditional" would use the official recommended numbering. Would hide the percent complete, but would roll up and compute the work sizes in the hierarchy.

Changing the filter component type would be a breaking change. Make it a 2.0 release or at least a larger release to indicate the break with old project files.

support toggling item by clicking on WBS number?

When an item is defined as "code" like_this.ext then the click event doesn't fire. Either fix that (so I can click the code text) or make it so the number display allows clicking to toggle the collapsed state.

"Best fit" should not show 0 when fractional.

A work item with 0.5h sums up to a rolled up total of 0. Especially when it is the only thing there. Uses "best" fit for the total and it rounds down. It's all still there in the totals, so it's not lost. But the "best" computation should show the fraction if <= 0.

Switching between reports has issues from localstorage loaded settings

Do I have the ability to detect that the report I'm looking at is the same as the last one or a different report entirely?

Issue: when switching between completely different reports, it sets the stories selection based on what it last saw and what is sees now. It will always deselect all the stories (except null). This is confusing and unexpected. Is there a way to create an ID or signature based on the generated filename/path and build that into the report? That ID value can be stored in localstorage whenever a setting is written.

Then when a different ID is encountered, delete all saved localstorage entries?

Phantom stories created from localstorage

While working with a report, the selected stories are written to local storage.

When the story is deleted from the markdown file, the story ID remains in localstorage.

When the values are read from localstorage, they are used even when no stories exist with that ID. These phantom story IDs show up in the Chart.

When loading from localstorage, it should do an intersection with what is computed from the markdown file and use that.

testing framework setup

Following npm best practices, setup a testing framework.

There are two parts:

  • CLI portion and report generation
  • Vue.js components and browser operation

This issue is around creating the initial test harness that supports these two different focuses.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.