diff --git a/.github/ISSUE_TEMPLATE/build-lab-issue-basics-template.md b/.github/ISSUE_TEMPLATE/build-lab-issue-basics-template.md new file mode 100644 index 0000000..43db626 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/build-lab-issue-basics-template.md @@ -0,0 +1,19 @@ +--- +name: Build Lab-Issue Basics template +about: 'This template was created to save typing in the ' +title: Investigate Issue Basics +labels: '' + +--- + +# Issue Basics + +This task describes the lab steps required to complete the "Issue Basics" tasks. As a template item, this description was filled out for you in advance (to save typing). Generally, you will use templates to get started with a standard format and content but add additional information. In this case, the issue is complete as-is... + +To complete this task you will: +- [x] Use an issue template (done) +- [x] Review markdown used to format content in GitHub. You're looking at it now, but if you aren't already familiar with markdown you can refer to [this link](https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github). If you've already saved it and want to review the source markdown you can edit the description to see the unformatted text. +- [ ] Apply Labels +- [ ] Apply Milestones +- [ ] Query Issues +- [ ] Verify automation triggered by issues diff --git a/.github/scripts/issue-seeds.json b/.github/scripts/issue-seeds.json new file mode 100644 index 0000000..e2a7efd --- /dev/null +++ b/.github/scripts/issue-seeds.json @@ -0,0 +1,23 @@ +[ + { "id": 0, "title": "Learning GitHub Issues Batch" }, + { "id": 1, "title": "Exercise Project Fundamentals", "type": "Feature"}, + { "title": "Create a new project", "type": "Task", "parent": 1}, + { "title": "Add all of the remaining issues", "type": "Task", "parent": 1}, + { "id": 2, "title": "Customize Status and Fields", "type": "Feature", "labels": "enhancement" }, + { "title": "Add priority field", "type": "Task", "parent": 2}, + { "title": "Add start and end date fields", "type": "Task", "parent": 2}, + { "title": "Add 'Paused' status", "type": "Task", "parent": 2}, + { "id": 3, "title": "Filter Project Data", "type": "Feature", "labels": "enhancement" }, + { "title": "Rename view 'Feature Planning'", "type": "Task", "parent": 3}, + { "title": "Add Feature/Bug filter", "type": "Task", "parent": 3}, + { "id": 4, "title": "Add 'Release Planning' view", "type": "Feature" }, + { "title": "Populate date fields", "type": "Task", "parent": 4}, + { "title": "Duplicate 'Feature Planning'", "type": "Task", "parent": 4}, + { "title": "Rename to 'Release Roadmap' and set 'Roadmap' view", "type": "Task", "parent": 4}, + { "title": "Scale to quarter and sort by End date", "type": "Task", "parent": 4}, + { "title": "Refine release dates", "type": "Task", "parent": 4}, + { "id": 5, "title": "Add Board view for tasks", "type": "Feature" }, + { "title": "Add a view named 'Task Board' filtered on Tasks and untyped issues", "type": "Task", "parent": 5}, + { "title": "Add a Parent Issue slice, Group by Assignees, and add the Labels field", "type": "Task", "parent": 5}, + { "title": "Fix the typo in the README file", "type": "Bug", "body": "The 'Abstract' header on line 3 is misspelled." } +] \ No newline at end of file diff --git a/.github/scripts/prepare-lab-env.sh b/.github/scripts/prepare-lab-env.sh new file mode 100755 index 0000000..719b564 --- /dev/null +++ b/.github/scripts/prepare-lab-env.sh @@ -0,0 +1,177 @@ +#!/bin/bash +# Bash script to set up GitHub lab environment dedicated to Issues and Projects. + +# If "--delete" is passed as an argument, delete all issues in the repository +if [[ "$1" == "--delete" || "$1" == "--seed-all" ]]; then + echo "Deleting all issues..." + gh issue list --limit 1000 | awk '{print $1}' | xargs -I {} gh issue delete {} --yes +fi + +# If "--seed" is passed as an argument, automatically create issues that are meant to be manually created +if [[ "$1" == "--seed-all" ]]; then + gh issue create \ + --title "Investigate Issue Basics" \ + --body " +# Issue Basics + +This task describes the lab steps required to complete the Issue Basics tasks. As a template item, this description was filled out for you in advance (to save typing). Generally, you will use templates to get started with a standard format and content but add additional information. In this case, the issue is complete as-is... + +To complete this task you will: +- [x] Use an issue template (done) +- [x] Review markdown used to format content in GitHub. You're looking at it now, but if you aren't already familiar with markdown you can refer to [this link](https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github). If you've already saved it and want to review the source markdown you can edit the description to see the unformatted text. +- [ ] Apply Labels +- [ ] Apply Milestones +- [ ] Query Issues +- [ ] Verify automation triggered by issues" \ + --assignee "@me" +fi + +# Function to load issue seeds from a JSON file +load_issue_seeds() { + # Check if jq is installed + if ! command -v jq &> /dev/null; then + echo "Error: jq is not installed. Please install it with: sudo apt-get install jq" >&2 + return 1 + fi + + # Check if file exists + local file_path="issue-seeds.json" + if [[ ! -f "$file_path" ]]; then + echo "Error: $file_path not found in current directory." >&2 + return 1 + fi + + # Read the JSON file and return the content + local json_content + json_content=$(jq '.' "$file_path") + + # Check if the JSON is valid + if [[ $? -ne 0 ]]; then + echo "Error: Failed to parse JSON file." >&2 + return 1 + fi + + # Echo the JSON content + echo "$json_content" + +} + +# Function to create a GitHub issue from a JSON issue object +create_issue_from_json() { + local issue_json="$1" + + # Extract issue properties with proper error handling + local id=$(echo "$issue_json" | jq -r '.id // empty') + local title=$(echo "$issue_json" | jq -r '.title // empty') + local body=$(echo "$issue_json" | jq -r '.body // empty') + # local labels=$(echo "$issue_json" | jq -r '.labels // [] | join(",")') + local labels=$(echo "$issue_json" | jq -r '.labels // empty') + local milestone=$(echo "$issue_json" | jq -r '.milestone // empty') + local parent=$(echo "$issue_json" | jq -r '.parent // empty') + + # Validate required fields + if [[ -z "$title" ]]; then + echo "Error: Issue title is required." >&2 + return 1 + fi + + echo "Creating issue: $title" + + # Build the gh issue create command + local cmd="gh issue create --title \"$title\" --body \"$body\"" + + # Add labels if provided + if [[ -n "$labels" && "$labels" != "" ]]; then + cmd="$cmd --label \"$labels\"" + fi + + # Add milestone if provided + if [[ -n "$milestone" && "$milestone" != "null" ]]; then + cmd="$cmd --milestone \"$milestone\"" + fi + + # Execute the command to create the issue + issue_url=$(eval "$cmd") + + # Check if issue was created successfully + if [[ $? -eq 0 ]]; then + echo "Successfully created issue: $issue_url" + + # Parse the issue number from the URL + issue_number=$(echo "$issue_url" | grep -oE '[0-9]+$') + + # Modify the URL to create the related API URL + api_url=$(echo "/repos/$issue_url" | sed 's/https:\/\/github.com\///') + + # Set the issue Type based on the JSON "type" field + issue_type=$(echo "$issue_json" | jq -r '.type // empty') + + # Use the GitHub CLI to call the api_url and apply the issue_type + echo "Setting issue type to: $issue_type" + gh api -X PATCH "$api_url" -f type="$issue_type" + + # Capture the parent issue number if provided + if [[ -n "$id" && "$id" != "null" ]]; then + echo "Capturing issue ID[$id] = $issue_number" + parent_issue_numbers[$id]=$issue_number + fi + + # If a parent issue is specified, create the relationship + if [[ -n "$parent" && "$parent" != "null" ]]; then + echo "Attempting to add relationship with parent issue: $parent" + + # Look up this issue's node_id + child_id=$(gh api -X GET "$api_url" | jq -r '.id // empty') + + # Check the parent issue number array + if [[ "${parent_issue_numbers[$parent]}" ]]; then + + # create a version of the API URL for the parent issue + parent_id=${parent_issue_numbers[$parent]} + parent_api_url=$(echo "$api_url" | sed -E "s|/([0-9]+)$|/$parent_id/sub_issues|") + + # Add the sub-issue relationship via the GitHub API + echo "Adding sub-issue relationship from $parent_id to $issue_number" + gh api $parent_api_url -X POST -F sub_issue_id=$child_id + fi + fi + + return 0 + else + echo "Failed to create issue: $title" >&2 + return 1 + fi +} + +# ------------------------------------------------------------ +# Seed automation issues required for the lab +# ------------------------------------------------------------ +if [[ "$1" == "" || "$1" == "--seed-all" ]]; then + + # Call the function and store the result in a variable + echo "Reading seed issues for the lab..." + issue_seeds_json=$(load_issue_seeds) + + if [[ $? -eq 0 ]]; then + echo "Successfully loaded $(echo "$issue_seeds_json" | jq 'length') issue seeds." + + # Initialize an array for parent issue numbers + declare -a parent_issue_numbers=() + + # Loop through each issue in the JSON array + for i in $(seq 0 $(( $(echo "$issue_seeds_json" | jq 'length') - 1 ))); do + # Extract the issue object + issue=$(echo "$issue_seeds_json" | jq ".[$i]") + + # Create issue from the JSON object + create_issue_from_json "$issue" + + # Optional: Add a small delay between issue creation to avoid rate limits + # sleep 1 + done + else + echo "Failed to load issue seeds JSON" + exit 1 + fi +fi + diff --git a/.github/workflows/.run-once b/.github/workflows/.run-once new file mode 100644 index 0000000..be5ce59 --- /dev/null +++ b/.github/workflows/.run-once @@ -0,0 +1 @@ +The purpose of this file is to cause a trigger of a workflow when this repo is first created from a template. If you modify this file later and commit the code, it will re-run that workflow, which may have unintended consequences. \ No newline at end of file diff --git a/.github/workflows/issue-ping.yml b/.github/workflows/issue-ping.yml new file mode 100644 index 0000000..f2547a6 --- /dev/null +++ b/.github/workflows/issue-ping.yml @@ -0,0 +1,27 @@ +name: Issue automation lab sample + +on: + issue_comment: + types: [created] + +permissions: + issues: write + contents: read + +jobs: + respond_to_ping: + runs-on: ubuntu-latest + if: contains(github.event.comment.body, 'ping') + + steps: + - name: Respond with pong + uses: actions/github-script@v6 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: 'pong' + }); \ No newline at end of file diff --git a/.github/workflows/lab-issue-automation.yml b/.github/workflows/lab-issue-automation.yml new file mode 100644 index 0000000..9b9fec8 --- /dev/null +++ b/.github/workflows/lab-issue-automation.yml @@ -0,0 +1,32 @@ +on: + # Manual run with parameter for what to do + workflow_dispatch: + inputs: + command: + required: false + type: choice + options: + - --delete + - --seed-all + # Automatic run when this is first created from a template + push: + branches: + - main + paths: + - .github/workflows/.run-once + +permissions: + issues: write + contents: read + +jobs: + seed_issues: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4.2.2 + - run: ./prepare-lab-env.sh $OPTION + shell: bash + working-directory: .github/scripts + env: + OPTION: ${{ inputs.command }} + GH_TOKEN: ${{ github.token }} diff --git a/CODE_OF_CONTENT.md b/CODE_OF_CONTENT.md new file mode 100644 index 0000000..5b0ae4d --- /dev/null +++ b/CODE_OF_CONTENT.md @@ -0,0 +1,74 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or +advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at opensource@github.com. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..5efcdfb --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,31 @@ +## Contributing + +[fork]: https://github.com/github/startups-content/fork +[pr]: https://github.com/github/startups-content/compare +[code-of-conduct]: CODE_OF_CONDUCT.md + +Hi there! We're thrilled that you'd like to contribute to this project. Your help is essential for keeping it great. + +Contributions to this project are [released](https://help.github.com/articles/github-terms-of-service/#6-contributions-under-repository-license) to the public under the [project's open source license](LICENSE.md). + +Please note that this project is released with a [Contributor Code of Conduct][code-of-conduct]. By participating in this project you agree to abide by its terms. + +## Prerequisites for running and testing code + +There are no external tools required to run and test this code. It only contains one Bash script and Actions YAML. The real value of this repo is the markdown documentation which doesn't require additional tools. + +## Submitting a pull request + +1. [Fork][fork] and clone the repository +2. Make your change +3. Push to your fork and [submit a pull request][pr] +4. Pat your self on the back and wait for your pull request to be reviewed and merged. + +- Keep your change as focused as possible. If there are multiple changes you would like to make that are not dependent upon each other, consider submitting them as separate pull requests. +- Write a [good commit message](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html). + +## Resources + +- [How to Contribute to Open Source](https://opensource.guide/how-to-contribute/) +- [Using Pull Requests](https://help.github.com/articles/about-pull-requests/) +- [GitHub Help](https://help.github.com) diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8f87fbf --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Dave McKinstry + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 59ba01c..b073b94 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,13 @@ -# managing-work -This lab will walk you through using GitHub Issues and GitHub Projects to manage work. +# Planning and tracking your work with GitHub Projects and Issues + +## Abstractttt + +Learn how GitHub Issues and project planning capabilities balance structure and flexibility for complex software development. Get hands-on with the redesigned GitHub Issues experience and other enhancements and discover practical techniques for leveraging markdown-based issue templates and custom sections that adapt to your team's unique workflows. Perfect for developers and DevOps practitioners seeking to streamline collaboration without sacrificing visibility or accountability. + +## About this lab + +This lab was created to support Microsoft Build 2025 (Lab 302) and execute within the lab environment. That said, you should be able to run it with little-to-no changes. One caveat - the Issue Type capabilities is only available from GitHub organizations (e.g., https://github.com/org-name) and not personal accounts (e.g., https://github.com/username). + +## Getting started + +To get started, leverage this repository as a **[Repository Template](https://docs.github.com/en/repositories/creating-and-managing-repositories/creating-a-template-repository)** to create a repository for performing the steps. When you create the target repo, it will automatically run a workflow to populate many of the issues that you'll need for this lab, including issue types, labels and relationships. \ No newline at end of file diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..7933b62 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,31 @@ +Thanks for helping make GitHub safe for everyone. + +## Security + +GitHub takes the security of our software products and services seriously, including all of the open source code repositories managed through our GitHub organizations, such as [GitHub](https://github.com/GitHub). + +Even though [open source repositories are outside of the scope of our bug bounty program](https://bounty.github.com/index.html#scope) and therefore not eligible for bounty rewards, we will ensure that your finding gets passed along to the appropriate maintainers for remediation. + +## Reporting Security Issues + +If you believe you have found a security vulnerability in any GitHub-owned repository, please report it to us through coordinated disclosure. + +**Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests.** + +Instead, please send an email to opensource-security[@]github.com. + +Please include as much of the information listed below as you can to help us better understand and resolve the issue: + + * The type of issue (e.g., buffer overflow, SQL injection, or cross-site scripting) + * Full paths of source file(s) related to the manifestation of the issue + * The location of the affected source code (tag/branch/commit or direct URL) + * Any special configuration required to reproduce the issue + * Step-by-step instructions to reproduce the issue + * Proof-of-concept or exploit code (if possible) + * Impact of the issue, including how an attacker might exploit the issue + +This information will help us triage your report more quickly. + +## Policy + +See [GitHub's Safe Harbor Policy](https://docs.github.com/en/github/site-policy/github-bug-bounty-program-legal-safe-harbor#1-safe-harbor-terms) diff --git a/SUPPORT.md b/SUPPORT.md new file mode 100644 index 0000000..363af00 --- /dev/null +++ b/SUPPORT.md @@ -0,0 +1,13 @@ +# Support + +## How to file issues and get help + +This project uses GitHub issues to track bugs and feature requests. Please search the existing issues before filing new issues to avoid duplicates. For new issues, file your bug or feature request as a new issue. + +For help or questions about using this project, please [file an issue](/issues) + +- **GitHub for Startups Workshops** is under active development and maintained by GitHub staff **AND THE COMMUNITY**. We will do our best to respond to support, feature requests, and community questions in a timely manner. + +## GitHub Support Policy + +Support for this project is limited to the resources listed above. diff --git a/docs/0-Setup.md b/docs/0-Setup.md new file mode 100644 index 0000000..4264f04 --- /dev/null +++ b/docs/0-Setup.md @@ -0,0 +1,15 @@ +### Create your repository + +Let's create the repository you'll use for your workshop. + +> [!TIP] +> Clicking on links in the instruction manual will open a browser tab on the host machine. This is fine for things like reviewing reference documents, but for the next step you'll want to interact directly with the browser in the VM. + +- [ ] Create a repository for this lab in the "Microsoft-Build-2025" organization based on the "github-samples/managing-work" template repository. + - Navigate to `https://github.com/github-samples/managing-work` in the browser. + - Click the **Use this template** > **Create a new repository** green buttons on the top-right of the page. + - For the owner, verify (or select) **Microsoft-Build-2025**. + - Enter a repository name that you'll use for this lab. You can accept the defaults for the rest of this form and click **Create repository**. + +> [!TIP] +> You can enter any valid repository name but remember that (1) others in this environment will see your repo and you'll see theirs (2) you may need to type the repo name later. Consider something that includes your and the lab number (e.g., "L302forDave"). diff --git a/docs/1-GettingStartedWithIssues.md b/docs/1-GettingStartedWithIssues.md new file mode 100644 index 0000000..9ee230b --- /dev/null +++ b/docs/1-GettingStartedWithIssues.md @@ -0,0 +1,37 @@ +## Working with GitHub Issues + +_In this section you'll learn the basics of GitHub issues, including issue creation, issue templates, working with labels and milestones, assignment, querying issues, issue hierarchies, issue types, and cross-repo collaboration._ + +### Getting started with GitHub Issues + +- [ ] Create your first issue, based on the "Build Lab-Issue Basics template" issue template using the default settings. + - Click the **Issues** tab in the top navigation bar of your GitHub repo in the browser (![Issues tab](./images/issues-tab.jpeg)). + - Click the green **New Issue** button on the right side of the browser screen. + - Select the **Build Lab-Issue Basics template**. + - Review markdown used in the "Description" to format content. + - Click the **Preview** tab for the "Add a description" text area to preview the markdown. + - Click the green **Create** button near the bottom of the form. The template you selected already had everything filled out so you don't need to make any changes. + +> [!TIP] +> If you aren't already familiar with markdown you can refer to the [GitHub docs](https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github) for more information. + +- [ ] Assign the new issue to yourself. + - On the right side of the issue, locate the **Assignees** section and click the **Assign to yourself** link. Alternatively, you can click the gear button (![Gear button](./images/gear.jpeg) in that section and search/filter/select to add assignees. + +- [ ] Apply the "enhancement" label to your new issue. + - Again in the right side, locate the **Labels** section. + - Click the gear icon in that section and select the **enhancement** checkbox. + - Click outside the selection area to close the menu. + +> [!TIP] +> Currently, only the default labels are available. If you're interested in how to create and manage labels in GitHub, refer to the [GitHub docs](https://docs.github.com/en/issues/using-labels-and-milestones-to-track-work/managing-labels). + +- [ ] Query issues to find and filter this issue and others in your repo. + - In the top-nav section of the page, click on the **Issues**. This will return a list of all open issues. Note that we have prepopulated a numerous issues for this workshop so that you'll have more to work with in later exercises. + - Notice the filter text bar; it defaults to the text `is:issue state:open`. Change that text to include text to filter for the enancement label (i.e., `is:issue state:open label:enhancement`) and press Enter. Notice that the list shortens to only show the issues labeled "enhancement". + - You can also filter using the dropdowns for **Author**, **Labels**, **Projects**, **Milestones**, **Assignees**, and the **Open** and **Closed** buttons. Click on the **Labels** dropdown and clear the enhancement checkbox to return to the original query; click outside of the dropdown to apply the changes. + - Feel free to play around with the filtering; if you'd like more information on filtering with Issues, refer to the [GitHub docs](https://docs.github.com/en/issues/tracking-your-work-with-issues/using-issues/filtering-and-searching-issues-and-pull-requests). diff --git a/docs/2-StructuringGitHubIssues.md b/docs/2-StructuringGitHubIssues.md new file mode 100644 index 0000000..58e1165 --- /dev/null +++ b/docs/2-StructuringGitHubIssues.md @@ -0,0 +1,53 @@ +### Structuring GitHub Issues + +_Most development teams need more than simple issues to manage development procedures. We've prepopulated a few more issues in your repo so that you can apply issue types and parent/child relationships._ + +- [ ] Create a new issue titled "Apply structure to GitHub Issues" using the blank issue template, with a **Task** Type and assigned to you. + - This is the same process as in the last exercise, using the green **New issue** button except that: + - You'll need to select the **Blank issue** template, and... + - You'll need to enter the title `Apply structure to GitHub Issues`. + - If you'd like to practice your Markdown, you can optionally enter a description. + - Scroll to the bottom of the form and notice there are buttons such as **Assignee**, **Label**, etc. Click the **Assignee** button and assign it to yourself. Again, click outside to popup menu to dismiss it. This is an alternate way from the last exercise to set issue data during the creation process. + - Repeat the process to set the **Issue Type** to **Task**. + - Click the green **Create** to complete the creation process. + +> [!TIP] +> Issue Types are available in [GitHub organization accounts](https://docs.github.com/en/get-started/learning-about-github/types-of-github-accounts) but not User accounts. + +- [ ] Locate the "Learning GitHub Issues Batch" issue, change it's type to Feature. + - Click the **Issues** tab on the top nav of the page to return to the Issues list. You can add the text "Learning" to the filter text to do a text search for the issue (i.e., `is:issue state:open Learning` and Enter). + - Click on the "Learning GitHub Issues Feature" issue to open it. + - Locate the **Type** section on the right side of the form; use the gear icon to select the **Feature** type. + +> [!TIP] +> GitHub defaults to types "Task", "Bug" and "Feature", but you can easily [create your own issue types](https://docs.github.com/en/enterprise-cloud@latest/issues/tracking-your-work-with-issues/configuring-issues/managing-issue-types-in-an-organization). + +- [ ] Add a new Task titled "Verify Issue Hierarchy" as a child of this feature. + - With the "Learning GitHub Issues Feature" issue still open, click the **Create sub-issue** button. + - Select **Blank Issue** as the template and enter `Verify Issue Hierarchy` as the title. + - Set the **Issue Type** to **Task** and click the **Create** button. +- [ ] Add the Task issues that you created earlier as children of this Feature. + - Click the dropdown arrow (image) on the **Create sub-issue** button, and select **Add existing issue**. + - Locate and select the "Investigate Issue Basics" task; you can use the **Search issues** text box if it is difficult to locate. + - Repeat the process to add the existing "Apply structure to GitHub Issues" task. + +> [!TIP] +> In an issue hierarchy, you can drag the handle to the left of the child issues to reorder the issues. + +- [ ] Add a parent Issue from a different repo. + - One of the powerful capabilities in GitHub Issues it the ability to seamlessly track work between repos. In the right column of the issue form, locate the "Relationships" section and click the gear icon. + - Click **Add parent** + - Notice that above the Search issues text there is an arrow with your repo name (e.g., <-- my-org/my-repo). ***TODO - Specify correct parent issue repo*** + - Click on the **left arrow** (![Left arrow](./images/left-arrow.jpeg)) to search for a different repo, and enter the text `Lab302-Template`. + - Select the **Lan302-Template** repo and then select the **Parent of all labs** issue as the new parent. +- [ ] Verify the issue hierarchy + - On the right side of the issue form, click on the parent issue that you just configured; this will open the parent issue that you just configured. + - From the parent issue, click the Expand/Collapse button next to your issue and verify the hierarchy is similar to the following and contains your issues: + ![Issue hierarchy](./images/parent-issue-hierarchy.jpeg) + Note that you may actually see issue hierarchies for other workshop participants; that is fine, as long as you can find the issue hierarchy that is associated with your repo. + - Click on the **Verify Issue Hierarchy** issue title to open that issue. + - On text area near the bottom of the form, enter `Verification Complete` and click the **Close with comment** button. + - Click on the **X** in the top-right of the form to dismiss it. + - Verify that in the hierarchy, the verification issue is now marked as closed (![Issue closed icon](./images/issue-closed.jpeg)). We could go back and close the other Tasks and the Feature itself as we've completed those exercises. But there is a more efficient way that we'll explore in the next exercise. + +In this exercise you've seen how issues can have types, parent-child relationships, and cross-repo linkage. Unlike some other systems, issue types are easily changed and we don't inherently force issue hierarchies by type (e.g., you could have a task that is a parent of a feature which is a parent of a bug)... how you track work is easily maleable to the way YOU want to work! diff --git a/docs/3-GettingStartedWithGitHubProjects.md b/docs/3-GettingStartedWithGitHubProjects.md new file mode 100644 index 0000000..a926dab --- /dev/null +++ b/docs/3-GettingStartedWithGitHubProjects.md @@ -0,0 +1,46 @@ +## Managing work with GitHub Projects +_GitHub Projects provide a management layer on top of Issues, including custom fields, workflows, visualizations, automation, and more! In this exercise we'll investigate creating projects, adding issues and drafts, customizing fields, and updating workflow status._ + +### Exercise Project Fundamentals +- [ ] Create a new project with a name that you'll recognize (e.g., "Dave's lab project"), starting from scratch as a Table. + - Click on **Projects** tab in the page's top-nav. + - Click on the **+ New project** green button on the right side above the (likely empty) project list; if you're prompted to get started, you can click **Jump right in**. + - Review the templates in the "Create project" dialog, but don't select one. Instead, select **Table** on the left side under "Start from scratch". + - Give the title a "Project name" that you'll recognize (e.g., "Dave's workshop project"). + - Click the green **Create project** button on the lower-right of the form. +- [ ] Add a new Task Issue to the project in your repo, using the "Blank Issue" template and with the title "Add an issue from the project board". + - Next to the "+" at the bottom of the table, type the title `Add an issue from the project board` and press Enter. + - Verify that your repo is selected in the top-left of the form, then select the **Blank Issue** template. + - At the bottom of the form, select the **Issue Type** > **Task**. + - Click the **Create** button to save the new issue. +- [ ] Add all of the remaining issues in your repo to the project. + - Next to the "+" at the bottom of the table, type the hash symbol (#) to open the repo selector. + - Click on your repo name. + - At the bottom of the popup list, select "Add items from *your-org/your repo*". + - In the top of the form, check **Select all items**. + - Click the green **Add selected items** button in the lower-right of the form. + - Click on the **X** on the top-right of the form to close it. +- [ ] Add a draft item named "Investigate draft issues" to the project; drafts do not have a backing issue and have fewer capabilities but are easier to work with and not tied to an individual repo. + - Click in the textbox next to the "+" at the bottom of the table. If your repo is listed, you'll need to delete it before proceeding. + - Type the title `Investigate draft issues` but don't complete yet! + - Note the popup menu includes **Create a draft**. Click that button or press Ctrl+Enter. + The draft has been added, as indicated but the draft icon (![Draft icon](./images/draft-icon.jpeg)). Drafts can be modified or removed, like any other item in the project, or converted into an issue. + +### Customize Status and Fields +- [ ] Add a new **Single select** project field for "Priority" + - Locate and click on the **+** in the header row of the far right column of the table, and select **+ New field**; you may need to scroll right in the browser to locate that column. + - Enter `Priority` as the "Field name" and select the "Field type" **Single select**. + - In the "Add option..." textbox, enter `:fire: High` and click the **Add** button. + - Repeat adding options for `:yellow_circle: Medium` and `:ice_cube: Not going to happen`. + - Click the green **Save** button to add the field. +- [ ] Repeat the process above to add Date fields for `Start` and `End`. + - As stated, the process is identical except that the names are different and the "Date" type doesn't require additional "Add option..." steps. +- [ ] Add a new Status for "Paused". + - In the table header, click on the elipses (**...**) button next to the "Status" header. + - Click on the **Field settings** option. + - In the **Add option...** textbox type `Paused` and click the **Add** button. + - If you'd like to change the item's color or add a description, you can do that by clicking the elipses (**...** to) the right of the item. + - In the top left of the screen, locate and click the left arrow (![Left arrow](./images/left-arrow.jpeg) button next to **Settings** to return to the project view. +- [ ] Pause work on the "Add 'Paused` status" issue. + - In the table view, locate the aforementioned issue; you can search for it using the filter textbox (![Magnifying glass](./images/magnifying-glass.jpeg)) if it helps. + - In the "Status" column for that issue, select **Paused** from the dropdown menu. diff --git a/docs/4-WorkingWithProjectViews.md b/docs/4-WorkingWithProjectViews.md new file mode 100644 index 0000000..6c92247 --- /dev/null +++ b/docs/4-WorkingWithProjectViews.md @@ -0,0 +1,62 @@ +## Working with Project Views +_One of the valuable components in Projects is the ability to customize how you view and interact with a group of related work. In this exercise we will filter, slice, and create a variety of different project views._ + +### Filter Project Data +If you're not already there, access the project board and the default view. If you modified the filters for the view, click **Discard** to return to the initial settings. +- [ ] Rename the first view as "Feature Planning". + - Locate the tab with the default name "View 1". + - Double-click on the **View 1** text; delete the existing name and replace it with the title `Feature Planning`. +- [ ] Add a filter to only show "Feature" and "Bug" type issues and display the "Type" field. + - In the filter textbox with the magnifying glass icon (image), enter the text `Type:Bug,Feature`. + - Click on the green **Save** button to the right of the filter textbox to save your changes. + - Click on the dropdown button on the **Feature Planning** tab (![Feature Planning tab](./images/feature-planning-tab.jpeg)), select **Fields** > **Type**. + - Click on the green on **Save** button in the "Layout" popup to save the displayed field; notice that the type is now shown in a new column in the table. + +> [!TIP] +> To make things easier to read, you can easily resize and reorder columns to suite your preferences. If you do reorder columns, you should click **Save** to keep your changes. + +### Add a Release Roadmap view +- [ ] Populate Feature issues with priorities and dates; using the existing "Feature Planning" view, set the Priority, Start and End dates in the grid as: + | Issue title | Priority | Start-End dates | + |---|---|---| + | "Learning GitHub Issues..." | High Priority | May 12-May 16, 2025 | + | "Exercise Project Fudamentals" | Medium Priority | May 15-May 21, 2025 | + | "Fix the typo in the README file | Medium Priority | May 21-May 23, 2025 | + +- [ ] Duplicate the current view with the name "Release Roadmap", the type "Roadmap", scaled to "Quarter" and sorted by "End". + - Click the dropdown button on the **Feature Planning** view. + - Click on **Duplicate view**. + - Double-click on the new view tab title (e.g., "View 2") and rename it to `Release Roadmap`. + - Click the dropdown button on the **Release Roadmap** tab view and select the Roadmap button (![Roadmap button](./images/roadmap-button.jpeg)) at the top-right of the popup. + - Change the **Month** scaling button (![Scaling button](./images/month-scale-button.jpeg)) to **Quarter** so that you can see a longer timeline. + - Change the **Sort** button (![Sort button](./images/roadmap-sort-button.jpeg)) to use the **End** date field. + - Click the green **Save** button next to the filter textbox. +- [ ] Adjust release dates + - Drag the "Exercise Project Fundamentals" issue so that it starts immediately after the "Learn GitHub Issues Batch" is complete. + - Drag the right side (end) of the "Fix the typo in the README file" issue so that it is only one day in duration. + - Hit the **+** button next to "Customize Status and Fields" issue; drag and stretch the issue so that it is a few days duration, starting after the "Fix the typo in the README file" issue. + +### Add a Board view for tasks +- [ ] Add a new view named "Task Board" with the type "Board", filtered to show tasks and untyped issues. + - Click the **+ New view** button next to the "Release Roadmap" tab and select the **Board** view. + - Rename the new tab to `Tasks`. + - In the "Filter by keyword or by field" textbox enter `-Type:Feature,Bug`; note that dash is used to indicate the Boolean logical "not". We're using this notation on the types so that we can pick up untyped issues in addition to Tasks. +- [ ] Add a "Parent issue" slicer, group by "Assignees", and add "Labels" to the fields. + - Click the dropdown next to the **Tasks** tab, then the **Slice by:** button, and select **Parent issue**. + - Repeat the process to add a **Group by:** with the value **Assignees**. + - Repeat the process, selecting **Fields:** and adding the **Labels** field. A couple of the prepopulated tasks have labels which you should now see on their cards. + - Click the green **Save** button to save changes. +- [ ] Verify board interactions + - Drag one of the issues from the "No Assignees" group into your assignee row; verify that it is now assigned to you (i.e., the user icon on the top-right of that card). + - Click on the **Learning GitHub Issues** parent issue; verify that it filters only show the three child issues assigned to that parent. + - Click on that parent issue again, or click on **deselect** in the slicer, and verify that all cards are shown again + - Drag the "Investigate Issue Basics" issue to the "Done" column + - Verify that the **Learning GitHub Issues Batch** in the Parent issue has been updated to show "2 / 3" or 66% complete. + - Verify that the issue status icon on the "Done" card has changed from an open (![Open icon](./images/issue-open.jpeg)) to closed (![Closed icon](./images/issue-closed.jpeg)). + + NOTE: The fact that the issue was closed when it was dragged to "Done" was not through magic; it happend through automation... which we'll investigate next! + + + + + diff --git a/docs/5-LeveragingProjectAutomation.md b/docs/5-LeveragingProjectAutomation.md new file mode 100644 index 0000000..f55698d --- /dev/null +++ b/docs/5-LeveragingProjectAutomation.md @@ -0,0 +1,53 @@ +## Projects and Automation +_As noted in the last exercise, the act of closing an issue and changing the a project status are different things, but automation enables us to couple them. In this exercise we'll work with the built-in automations and explore the other ways that Issues and Projects can be automated._ + +### Explore built-in workflows +- [ ] Access the "Workflows" project settings and review currently active automations. + - While viewing the project, click on the elipses (**...**) button in project settings (![Project settings](./images/project-settings.jpeg)) on the top-right of the page. + - Click on **Workflows**. +- [ ] Review the active default workflows. + - Review the list of "Default workflows" on the left side of the page. Notice that the green dot identifies active workflows. + - Click on the **Item closed** workflow and review the actual workflow; it provides a simple event flow, where when the event in the top box occurs, it triggers the activity in the lower box. In this case, if an issue orpull request in the project is closed, it will be set to a "Done" status. + - Click on and review the **Auto-close issue** workflow. This is the automation that we used in the last exercise: when a status is changed to "Done", the underlying issue is closed. +- [ ] Add a workflow to automatically add new issues or PRs to this project. + - Click on the "Auto-add to project" default workflow. + - Click the Edit button near the top-right of the page. + - Ensure that your repo is selected in the Filters section of the top box. + - Change the filter to remove the label, so that the new filter text is `is:issue,pr is:open`; in this workshop we've been using purely issues but in the next exercise we'll look at PRs. + - Click the **Save and turn on workflow** green button on the top-right of the page. +- [ ] Add a new "Verify project automation" issue to verify the automation. + - On the top-nav of the page, search for your repo by entering portions of the name. Select your repository name to **jump to** to it. + - Click on the **Issues** tab and then click the green **New issue** button. + - Use the **Blank issue** template with the issue title `Verify project automation`; click **Create** to save the new issue. + - In the right column of the newly created issue, verify that your project is visible in the "Projects" section. The fact that it shows up verifies that the automation has run and this issue was added to the project. + - Expand the project box to reveal the custom project fields, for example: + ![Project fields example](./images/project-fields.jpeg). + +> [!TIP] +> You can manipulate any of the custom project fields directly from this area of an issue. +> [!TIP] +> Issues can also appear on multiple projects, each with their own custom fields. + +### Review advanced automation options +- [ ] Review API and command line automation options. + - The [GitHub CLI](https://cli.github.com/) provides commands to directly [read and manipulate Issues](https://cli.github.com/manual/gh_issue) and [Projects](https://cli.github.com/manual/gh_project). + - GitHub provides powerful REST APIs to programmatically interact with [Issues](https://docs.github.com/en/rest/issues); you can call these from the programming language of your choice, a variety of tools, and/or the GitHub CLI. + - In addition, GitHub provides GraphQL APIs for both [Issues](https://docs.github.com/en/issues/planning-and-tracking-with-projects/automating-your-project/using-the-api-to-manage-projects) and [Projects](https://docs.github.com/en/issues/planning-and-tracking-with-projects/automating-your-project/using-the-api-to-manage-projects). +- [ ] Review the scripted Issues automation used in this lab. + This lab used the GitHub CLI in a script to create issues, set their types, and associate parent-child relationships. Review the "prepare-lab-env.sh" script to learn how the CLI was used to create and manipulate issues, both directly and via the REST APIs. + - Return to your repo in the browser; if you are already viewing the issue from the last exercise, you are there. If not, you can use the browser back button or the GitHub menu in the top-left of the page. + - Click on the **<> Code** button in the top-nav of the page. + - Click on the **.github** folder and then into the **scripts** folder. + - Click on the **prepare-lab-end.sh** file to review the contents. Lines 12 shows an example of directly creating an issue with the GitHub CLI. Line 111 shows calling an API via the GitHub CLI to set the issue ttype. Line 135 shows creating a parent/child relationship. +- [ ] Review and verify the "issue-ping" GitHub Actions workflow + - On the left-nav for the page, drill into the ".github/workflows/" folder; if you don't see the left-nav you can click on **workflows** link on the breadcrumbs under the top-nav. + - Click on the **issue-ping.yml** file; GitHub Actions supports a wide variety of triggers for [Issues](https://docs.github.com/en/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows#issues). Note that this workflow triggers when an issue comment is created: + + ![Action trigger code](./images/action-trigger.jpeg) + + Review the rest of the short workflow file to see you simple it can be to automate based on issue triggers. + - From the top-nav of the page, click on the **Issues** tab. + - Drill into an issue (it doesn't matter which one) and add the comment `ping` to the text area near the bottom of the form. + - Click on the green **Comment** button below the textarea. This will trigger the actions workflow we reviewed earlier. It may take a few moments to complete but the workflow will add a response comment "pong" to the issue. + - If you wish, you can wait for it to complete, and/or you can click on **Actions** tab in the top-nav and watch/review the workflow logs for this automation. + diff --git a/docs/6-LinkingIssuesToCode.md b/docs/6-LinkingIssuesToCode.md new file mode 100644 index 0000000..4370aa3 --- /dev/null +++ b/docs/6-LinkingIssuesToCode.md @@ -0,0 +1,31 @@ +## Linking Issues to Code +_Linking code to issues is a common pattern within GitHub. It is frequently used to associate code changes with the issues that caused them (bugs, feature requests, etc.). This exercise walks you through fixing a small Bug and how the code and issues are related._ + +### Fix the README Bug +- [ ] Open the Bug issue and review the contents + - If you're not already in your repo, use the menu button on the top-left of the page to navigate to your repo. + - Click on **Issues** in the top-nav and filter to show Bug issue type (e.g., `type:Bug`). + - Open the **Fix the typo in the README file** issue and review the description. +- [ ] Open the README file and fix the typo. + - Click on the **<> Code** button in the top-nav. + - Click on the **README.md** file in file list. + - Click on the "Edit this file" (i.e., **pencil** ![Pencil](./images/bare-pencil.png)) button near the top-right of the page. + - Fix the text on line 3 so that it correctly reads `## Abstract`. +- [ ] Commit the file to a branch and open a Pull Request referencing the bug issue. + - Click on the green **Commit changes...** button near the top-right of the page. + - In the "Extended description" textarea, type `Fixes `; there are [multiple keywords](https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/using-keywords-in-issues-and-pull-requests) that can be used to link issues to code changes. + - The **#** key is used to bring up issue reference. Press **#** and review the list of issues. Even if you see your issue, continue to the next step. + - You could type the issue number directly, reference an issue in a differnt repo, or type text to filter the issue list. Complete typing "README" so that the list filters to show your issue (i.e., `Fixes #README`). + - Click on the bug issue to complete the linkage; it will insert the issue number for you. + - ***IMPORTANT:*** Change the radio button on the bottom of the form to select "Create a **new branch**..."; you can accept the default branch name or enter a different name if you'd like. + - Click the **Propose changes** button. + - You can accept the defaults; click the **Create pull request** button . +- [ ] Merge the pull request and review the results. + - Although this would generally trigger a peer review, possibly Copilot-review, and possible automated checks, for this exercise we are just going to merge the code. Click the **Merge pull request** button. + - You can modify anything or accept the defaults, then click **Confirm merge**. + - Since we added automation in an earlier exercise for the project, this pull request (PR) is automatically added to your project. In the right-column of the page, click on the name of your project under the "Projects" section. + - If not already selected, click on the **Feature Planning** tab. + - Locate the bug; note that it's status was updated to done through a series of events: merging the PR with the "fixes" keyword closed the issue, and the project automation updated the status to "Done". + - Click on the bug to open it; scan down in the on the right column and look for the "Deveopment" section. + - Verify that the link to the PR in that section has the "merged" icon (![Merged icon](./images/merged-icon.jpeg)) showing that the merge is complete. + - If you'd like, click on the PR to drill into it. You can review all files, individually changed lines, and review feedabck in the PR as associated with this issue, and seamlessly move between the issue and the code changes. diff --git a/docs/7-GatheringProjectInsights.md b/docs/7-GatheringProjectInsights.md new file mode 100644 index 0000000..5c62481 --- /dev/null +++ b/docs/7-GatheringProjectInsights.md @@ -0,0 +1,24 @@ +## Gathering Project Insights +_GitHub offers a rich array of APIs and logging mechanisms to build your own data warehouse and custom reports. However, not everyone has the time or interest in such an endeavor, so we also offer basic reporting out-of-the-box!_ + +### Investigate Insights +- [ ] Browse to the Project Insights and review the default "Burn up" chart. + - If not already there, browse to your Project. + - In the top-right of the page, click on the **Insights** button (![Insights button](./images/project-insights.jpeg)) in the project setting. + - Review the default "Burn up" chart. Since this is a time-based chart and the lab is likely within a single day, it is likely that this chart is fairly boring. The following shows a sample of an actual production burn up chart with the default settings. This is just for reference - your chart will **NOT** look like this: + ![Sample burn up chart](./images/burn-up.jpeg) + - Note that you can easily change which project items are captured by changing the filter text (e.g., `is:issue Status:Paused`) to report on any project fields. Also note that for time-based charts you can customize date ranges; the default is for the most recent 2-weeks. +- [ ] Create a "Issue status by type" Stacked bar chart. + - On the left side of the page, click on the **+ New chart** button. + - Click the **Edit the chart name** (![Pencil](./images/bare-pencil.png)) and enter the name `Issue status by type` and click **Save**. + - Click on the **Configure** button on the top-right of the page. + - Click on the dropdown menu under "Layout" and review the options; select **Stacked bar**. + - Click on the **X-axis** dropdown and review the options; select **Type**. + - Click on the **Group by (optional)** dropdown and review the options; select **Status**. + - Click on the **Y-Axis** dropdown and review the options. Note that only the currently selected "Count of items" is available; the remaining options require that the target field (e.g., Status) be a numeric type (e.g., a customer "Story points" or "Effort" field). + - Click the **Save** button in the "Configure chart" form. If it is hidden by the "Y-axis" menu, click outside of the menu. + - Finally, enter the value `is:issue` in the filter textbox so ensure only issues are reported and click the **Save** button. + +Although your results will vary based on the specifics of earlier exercises, your resulting Insights chart should look similar to this: +![Customized insights](./images/insights-customized.jpeg) + diff --git a/docs/8-ConcludingTheWorkshop.md b/docs/8-ConcludingTheWorkshop.md new file mode 100644 index 0000000..114771a --- /dev/null +++ b/docs/8-ConcludingTheWorkshop.md @@ -0,0 +1,19 @@ +## In Conclusion + +At this point you've had the chance to learn about how GitHub's native Issues and Projects mechanisms can be used to manage work. GitHub has optimized to a development team experience and not necessarily project management, meaning it isn't likely the same as your current work management tools. But many teams will find it better for their day-to-day management activities. + +### Optional exercises +And while you have this playground available available and proctors to answer your questions (and don't have other demands on your time), we invite you to solify your new knowledge. Here are some unscripted exercises you may want to try. + +- Customize the project fields based on data you are likely to track. +- Add a project view to show a missing but expected data item (e.g., "Type") so that it is easy to identify and populate missing data. +- Configure [Milestones](https://docs.github.com/en/issues/using-labels-and-milestones-to-track-work/about-milestones) and/or [Labels](https://docs.github.com/en/issues/using-labels-and-milestones-to-track-work/managing-labels). to be consistent with what you'd likely use in your daily work. +- Launch a [Codespace](https://docs.github.com/en/codespaces/about-codespaces/what-are-codespaces) on your repo, and use the [GH CLI](https://cli.github.com/manual/index) to programatically add, view, and/or modify issue data. + +### Resources +Here are a few links that will help you further your study of GitHub Issues and Projects: +- [Markdown (GitHub Docs)](https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github) +- [Labels (GitHub Docs)](https://docs.github.com/en/issues/using-labels-and-milestones-to-track-work/managing-labels) +- [Milestones (Github Docs)](https://docs.github.com/en/issues/using-labels-and-milestones-to-track-work/about-milestones) +- [Filtering Issues (GitHub Docs)](https://docs.github.com/en/issues/tracking-your-work-with-issues/using-issues/filtering-and-searching-issues-and-pull-requests). + diff --git a/docs/images/action-trigger.jpeg b/docs/images/action-trigger.jpeg new file mode 100644 index 0000000..cc1caa3 Binary files /dev/null and b/docs/images/action-trigger.jpeg differ diff --git a/docs/images/bare-pencil.png b/docs/images/bare-pencil.png new file mode 100644 index 0000000..8fe60e0 Binary files /dev/null and b/docs/images/bare-pencil.png differ diff --git a/docs/images/burn-up.jpeg b/docs/images/burn-up.jpeg new file mode 100644 index 0000000..df072db Binary files /dev/null and b/docs/images/burn-up.jpeg differ diff --git a/docs/images/create-new.jpeg b/docs/images/create-new.jpeg new file mode 100644 index 0000000..dc3b9fb Binary files /dev/null and b/docs/images/create-new.jpeg differ diff --git a/docs/images/draft-icon.jpeg b/docs/images/draft-icon.jpeg new file mode 100644 index 0000000..bcdd739 Binary files /dev/null and b/docs/images/draft-icon.jpeg differ diff --git a/docs/images/feature-planning-tab.jpeg b/docs/images/feature-planning-tab.jpeg new file mode 100644 index 0000000..3c3c29d Binary files /dev/null and b/docs/images/feature-planning-tab.jpeg differ diff --git a/docs/images/gear.jpeg b/docs/images/gear.jpeg new file mode 100644 index 0000000..3092421 Binary files /dev/null and b/docs/images/gear.jpeg differ diff --git a/docs/images/insights-customized.jpeg b/docs/images/insights-customized.jpeg new file mode 100644 index 0000000..2df938a Binary files /dev/null and b/docs/images/insights-customized.jpeg differ diff --git a/docs/images/issue-closed.jpeg b/docs/images/issue-closed.jpeg new file mode 100644 index 0000000..b75bd80 Binary files /dev/null and b/docs/images/issue-closed.jpeg differ diff --git a/docs/images/issue-open.jpeg b/docs/images/issue-open.jpeg new file mode 100644 index 0000000..676cbed Binary files /dev/null and b/docs/images/issue-open.jpeg differ diff --git a/docs/images/issues-tab.jpeg b/docs/images/issues-tab.jpeg new file mode 100644 index 0000000..23ffe06 Binary files /dev/null and b/docs/images/issues-tab.jpeg differ diff --git a/docs/images/left-arrow.jpeg b/docs/images/left-arrow.jpeg new file mode 100644 index 0000000..f576332 Binary files /dev/null and b/docs/images/left-arrow.jpeg differ diff --git a/docs/images/magnifying-glass.jpeg b/docs/images/magnifying-glass.jpeg new file mode 100644 index 0000000..195c64a Binary files /dev/null and b/docs/images/magnifying-glass.jpeg differ diff --git a/docs/images/menu.jpeg b/docs/images/menu.jpeg new file mode 100644 index 0000000..d683d1b Binary files /dev/null and b/docs/images/menu.jpeg differ diff --git a/docs/images/merged-icon.jpeg b/docs/images/merged-icon.jpeg new file mode 100644 index 0000000..faa5ba5 Binary files /dev/null and b/docs/images/merged-icon.jpeg differ diff --git a/docs/images/month-scale-button.jpeg b/docs/images/month-scale-button.jpeg new file mode 100644 index 0000000..711bfa5 Binary files /dev/null and b/docs/images/month-scale-button.jpeg differ diff --git a/docs/images/parent-issue-hierarchy.jpeg b/docs/images/parent-issue-hierarchy.jpeg new file mode 100644 index 0000000..b07dd5b Binary files /dev/null and b/docs/images/parent-issue-hierarchy.jpeg differ diff --git a/docs/images/project-fields.jpeg b/docs/images/project-fields.jpeg new file mode 100644 index 0000000..2c5f54d Binary files /dev/null and b/docs/images/project-fields.jpeg differ diff --git a/docs/images/project-insights.jpeg b/docs/images/project-insights.jpeg new file mode 100644 index 0000000..bd7f9a5 Binary files /dev/null and b/docs/images/project-insights.jpeg differ diff --git a/docs/images/project-settings.jpeg b/docs/images/project-settings.jpeg new file mode 100644 index 0000000..3c85d3d Binary files /dev/null and b/docs/images/project-settings.jpeg differ diff --git a/docs/images/roadmap-button.jpeg b/docs/images/roadmap-button.jpeg new file mode 100644 index 0000000..bf76acf Binary files /dev/null and b/docs/images/roadmap-button.jpeg differ diff --git a/docs/images/roadmap-sort-button.jpeg b/docs/images/roadmap-sort-button.jpeg new file mode 100644 index 0000000..fc9c2e4 Binary files /dev/null and b/docs/images/roadmap-sort-button.jpeg differ