diff --git a/.bundle/config b/.bundle/config deleted file mode 100644 index 2fbf0ffd..00000000 --- a/.bundle/config +++ /dev/null @@ -1 +0,0 @@ ---- {} diff --git a/.github/ISSUE_TEMPLATE/18f-team--basic-issue-tracking-template.md b/.github/ISSUE_TEMPLATE/18f-team--basic-issue-tracking-template.md index 7d5b442c..95cf6f6b 100644 --- a/.github/ISSUE_TEMPLATE/18f-team--basic-issue-tracking-template.md +++ b/.github/ISSUE_TEMPLATE/18f-team--basic-issue-tracking-template.md @@ -12,6 +12,17 @@ Before you submit your new issue, add labels so that we know which guide/site th While it might seem redundant, we have one team that manages issues across multiple products, and these labels help us keep our wires straight! _______________________________________________________ +**Point of contact** + + +**Timeline** +Does this need to happen in the next two weeks? + +- [ ] Yes +- [ ] No + +**How much time do you anticipate this work taking?** + **Background** _What should we consider when addressing this issue?_ diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..d24fa4c7 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,35 @@ +## Description of changes + +> Describe what this pull request is changing. Try to use plain language as much +> as possible to help teammates understand what they are reviewing. + +## Known issues + +> If this pull request introduces anything that needs to be addressed later, +> note it here. Some examples might be if you introduced a new link that fails +> tests but will work when another pull request is merged; you created a new +> method placeholder but it does not yet have content; or your change breaks +> something else that will be removed later. If you create any issues to +> address issues created by this pull request, this is a good place to list +> them! You can delete this section if the PR does not introduce any new issues. + +## Related issues + +> If this pull request is associated with any other issues or pull requests, +> lis them here. If this PR *closes* an issue, list it as `closes #issue` so +> the issue will automatically be closed when the PR is merged. If there are no +> related issues or PRs, you can delete this section. + +- +- + +## Reviewers: + +> In addition to assigning reviewers in the GitHub interface, please also list +> who you would like a review from here and, if applicable, what kind of review +> you would like from them. For example, you might ask one person to review +> content while someone else reviews visual layout. + +- [ ] @username: please review content +- [ ] +- [ ] diff --git a/.github/workflows/sync_milestones.yml b/.github/workflows/sync_milestones.yml new file mode 100644 index 00000000..b8e4c553 --- /dev/null +++ b/.github/workflows/sync_milestones.yml @@ -0,0 +1,67 @@ +name: sync milestones + +on: + milestone: + types: [created] + +jobs: + synchronize: + name: synchronize milestones + runs-on: ubuntu-latest + + steps: + # Rather than use a personal access token to interact with the project, we + # can use this GitHub App. There's an API for exchanging app credentials + # for a short-term token, and we use that API here. + - name: get token + uses: tibdex/github-app-token@v1 + id: app_token + with: + app_id: ${{ secrets.PROJECT_APP_ID }} + installation_id: ${{ secrets.PROJECT_INSTALLATION_ID }} + private_key: ${{ secrets.PROJECT_PRIVATE_KEY }} + + - name: sync milestones + uses: actions/github-script@v6 + with: + github-token: ${{ steps.app_token.outputs.token }} + script: | + // Get the metadata about this repo from the workflow context + const { owner, repo } = context.repo; + // And remove this repo from the list of repos to sync to. No need + // to sync myself with myself. + const syncTargets = ["methods", "ux-guide"].filter((r) => r !== repo); + + // Get a list of this repo's milestones + const myMilestones = await github + .paginate(`GET /repos/${owner}/${repo}/milestones`) + .then((milestones) => + milestones.map(({ title, description, due_on, state }) => ({ + title, + description, + due_on, + state, + })) + ); + + // Now for each sync target repo... + for await (const target of syncTargets) { + // Get the titles of their milestones, which we'll use to filter + // down to which milestones to synchronize + const theirMilestones = new Set( + await github + .paginate(`GET /repos/${owner}/${target}/milestones`) + .then((milestones) => milestones.map(({ title }) => title)) + ); + + for await (const milestone of myMilestones) { + // If a milestone with this title does NOT exist in the target + // repo, then we should create one. + if (!theirMilestones.has(milestone.title)) { + // Expand the milestone so we push the title, description, due + // date, and status (open/closed) all at once. + await github.rest.issues.createMilestone({ owner, repo: target, ...milestone }); + } + } + } + diff --git a/.gitignore b/.gitignore index d21578bc..69718c3c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,5 @@ _site/ .sass-cache/ .DS_store .*.swp -.ruby-version .jekyll-cache/ +.bundle diff --git a/.jekyll-metadata b/.jekyll-metadata new file mode 100644 index 00000000..ca152c2f Binary files /dev/null and b/.jekyll-metadata differ diff --git a/.ruby-version b/.ruby-version new file mode 100644 index 00000000..a603bb50 --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +2.7.5 diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 36d36c9c..00000000 --- a/.travis.yml +++ /dev/null @@ -1,19 +0,0 @@ -language: ruby -rvm: -- 2.1 -script: bundle exec jekyll build --config _config.yml,_config-production.yml ./_site -deploy: - provider: cloudfoundry - edge: true - api: https://api.cloud.gov - organization: 18f - space: methods - username: 18f-methods_deployer - password: - secure: ZuX5eljwlotWWq+68vzO9yDBObPPf9kv8TN4c/BwNxTONCAhOYNnhrJPvGk7WIdQ1FNd8kYsBmRJeOgf6TZa4W/8yTHqkKAgGMTk5t19A7zU1WUHa+KXgsSOlQT+/00LSMZVvdNtpc1k1Mk5N0a0GJSVVLIWpFscXsN2O5LZTuc= - on: - repo: 18F/methods - branch: master -branches: - only: - - master diff --git a/Gemfile b/Gemfile index b5bc44f1..f2f7f53e 100644 --- a/Gemfile +++ b/Gemfile @@ -1,13 +1,12 @@ source 'https://rubygems.org' -gem 'jekyll', '>= 4.2.0' -gem 'redcarpet' -gem 'rouge' -gem 'hash-joiner' -gem 'jekyll-last-modified-at', '>= 1.3.0' -gem 'jemoji', '>= 0.12.0' -gem 'jekyll-mentions', '>= 1.6.0' -gem 'jekyll-redirect-from', '>= 0.16.0' -gem 'jekyll-sitemap', '>= 1.4.0' -gem 'jekyll-autoprefixer' -gem 'jekyll-liquify' \ No newline at end of file +gem 'jekyll', '4.2.2' + +group :jekyll_plugins do + gem 'jekyll-last-modified-at', '>= 1.3.0' + gem 'jemoji', '>= 0.12.0' + gem 'jekyll-mentions', '>= 1.6.0' + gem 'jekyll-redirect-from', '>= 0.16.0' + gem 'jekyll-sitemap', '>= 1.4.0' + gem 'jekyll-liquify' +end \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index 232b68c5..97898f04 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,28 +1,23 @@ GEM remote: https://rubygems.org/ specs: - activesupport (7.0.3.1) + activesupport (7.0.4.3) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 1.6, < 2) minitest (>= 5.1) tzinfo (~> 2.0) - addressable (2.8.0) - public_suffix (>= 2.0.2, < 5.0) - autoprefixer-rails (9.8.6.5) - execjs + addressable (2.8.1) + public_suffix (>= 2.0.2, < 6.0) colorator (1.1.0) - concurrent-ruby (1.1.10) + concurrent-ruby (1.2.2) em-websocket (0.5.3) eventmachine (>= 0.12.9) http_parser.rb (~> 0) eventmachine (1.2.7) - execjs (2.7.0) ffi (1.15.5) forwardable-extended (2.6.0) - gemoji (3.0.1) - hash-joiner (0.0.7) - safe_yaml - html-pipeline (2.14.2) + gemoji (4.0.1) + html-pipeline (2.14.3) activesupport (>= 2) nokogiri (>= 1.4) http_parser.rb (0.8.0) @@ -43,8 +38,6 @@ GEM rouge (~> 3.0) safe_yaml (~> 1.0) terminal-table (~> 2.0) - jekyll-autoprefixer (1.0.2) - autoprefixer-rails (~> 9.3) jekyll-last-modified-at (1.3.0) jekyll (>= 3.7, < 5.0) posix-spawn (~> 0.3.9) @@ -62,33 +55,33 @@ GEM jekyll (>= 3.7, < 5.0) jekyll-watch (2.2.1) listen (~> 3.0) - jemoji (0.12.0) - gemoji (~> 3.0) + jemoji (0.13.0) + gemoji (>= 3, < 5) html-pipeline (~> 2.2) jekyll (>= 3.0, < 5.0) kramdown (2.4.0) rexml kramdown-parser-gfm (1.1.0) kramdown (~> 2.0) - liquid (4.0.3) - listen (3.7.1) + liquid (4.0.4) + listen (3.8.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) mercenary (0.4.0) - mini_portile2 (2.8.0) - minitest (5.16.2) - nokogiri (1.13.8) + mini_portile2 (2.8.1) + minitest (5.18.0) + nokogiri (1.14.3) mini_portile2 (~> 2.8.0) racc (~> 1.4) pathutil (0.16.2) forwardable-extended (~> 2.6) posix-spawn (0.3.15) - public_suffix (4.0.7) - racc (1.6.0) - rb-fsevent (0.11.1) + public_suffix (5.0.1) + racc (1.6.2) + rb-fsevent (0.11.2) rb-inotify (0.10.1) ffi (~> 1.0) - redcarpet (3.5.1) + redcarpet (3.6.0) rexml (3.2.5) rouge (3.30.0) safe_yaml (1.0.5) @@ -96,7 +89,7 @@ GEM ffi (~> 1.9) terminal-table (2.0.0) unicode-display_width (~> 1.1, >= 1.1.1) - tzinfo (2.0.5) + tzinfo (2.0.6) concurrent-ruby (~> 1.0) unicode-display_width (1.8.0) @@ -104,17 +97,13 @@ PLATFORMS ruby DEPENDENCIES - hash-joiner - jekyll (>= 4.2.0) - jekyll-autoprefixer + jekyll (= 4.2.2) jekyll-last-modified-at (>= 1.3.0) jekyll-liquify jekyll-mentions (>= 1.6.0) jekyll-redirect-from (>= 0.16.0) jekyll-sitemap (>= 1.4.0) jemoji (>= 0.12.0) - redcarpet - rouge BUNDLED WITH 2.1.4 diff --git a/README.md b/README.md index 138e627d..676389d9 100755 --- a/README.md +++ b/README.md @@ -4,11 +4,11 @@ The 18F Methods were created to describe how 18F puts human-centered design into ## Why methods? -In order to function well within cross-functional teams, designers need to know a few things: which methods they might choose from, why one particular method makes more sense than another at any given moment, and, once they’ve picked a method, how to actually execute it. 18F Methods collects this essential information as a series of cards. In practice, we’ve found the Methods can provide folks with a gateway into our work and build internal alignment around a shared vocabulary. +In order to function well within cross-functional teams, designers and other contributors need to know a few things: which methods they might choose from, why one particular method makes more sense than another at any given moment, and, once they’ve picked a method, how to actually execute it. 18F Methods collects this essential information as a series of cards. In practice, we’ve found the Methods can provide folks with a gateway into our work and build internal alignment around a shared vocabulary. ### Specific to 18F, specific to the federal government -It’s important to note that the 18F Methods are designed to account for two things that may not otherwise concern a more generic collection of design methods. First, these methods directly reflect and support 18F’s human-centered work. (They are also continuously updated in a human-centered way — how meta!) Second, 18F Methods are designed to keep federal employees on the happy side of the law. This collection specifically includes helpful information on topics for which designers working in the federal government may need clarification, such as privacy and the [Paperwork Reduction Act](pra.digital.gov). +It’s important to note that the 18F Methods are designed to account for two things that may not otherwise concern a more generic collection of design methods. First, these methods directly reflect and support 18F’s human-centered work. (They are also continuously updated in a human-centered way — how meta!) Second, 18F Methods are designed to keep federal employees on the happy side of the law. This collection specifically includes helpful information which designers working in the federal government may need, such as privacy and the [Paperwork Reduction Act](pra.digital.gov). ## Getting started @@ -24,6 +24,8 @@ For more information on contributing to the Methods (or even making a suggestion Learn more about our goals and the way we work in our [wiki](https://github.com/18F/methods/wiki). +## Development + ### Running the Methods website on your local machine #### Using Docker (recommended) @@ -56,19 +58,24 @@ $ jekyll serve You should be able to see the site at: `http://localhost:4000/` -## Current team +### Deploying + +The Methods guide uses a webhook to deploy to Cloud.gov pages. When viewing a pull request, expand "Show all checks." If pages/build is complete, click "details" for a link to a preview for that branch. + +## Current product owner +- Melissa Braxton + + +## Past contributors - Tiffany Andrews - Carly Jugler - Megan Reed - Peter Rowland - Julie Strothman - -## Past contributors - +- Anne Petersen - Amirah Aziz - Ana Monroe -- Melissa Braxton - Jeremy Canfield - Elisa Chen - Erica Deahl diff --git a/_config.yml b/_config.yml index c359a319..ec75db4e 100755 --- a/_config.yml +++ b/_config.yml @@ -43,7 +43,6 @@ plugins: - jekyll-mentions - jekyll-redirect-from - jekyll-sitemap - - jekyll-autoprefixer - jekyll-liquify google_analytics_ua: UA-48605964-19 diff --git a/_data/categories.yml b/_data/categories.yml index ed260b99..6368403c 100644 --- a/_data/categories.yml +++ b/_data/categories.yml @@ -12,6 +12,7 @@ - KJ method - Lean coffee - Stakeholder and user interviews + - Stakeholder influence mapping - category_name: Decide category_description: Elaborate on research from your Discovery phase. @@ -26,6 +27,7 @@ - Journey mapping - Mental modeling - Personas + - Service blueprint - Site mapping - Storyboarding - Style tiles diff --git a/_includes/footer.html b/_includes/footer.html index 2f072ebe..c2a553ab 100755 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -5,8 +5,8 @@ @@ -15,9 +15,16 @@ - Get in touch + Provide feedback + +
+ + + +
+